Merge branch 'master' into develop

This commit is contained in:
Eliot Berriot 2019-02-07 16:40:56 +01:00
commit 5758ab4c43
No known key found for this signature in database
GPG Key ID: DD6965E2476E5C27
7 changed files with 653 additions and 35 deletions

View File

@ -18,7 +18,7 @@ https://docs.funkwhale.audio/index.html
Fix Gzip compression to avoid BREACH exploit [security] [manual action required] Fix Gzip compression to avoid BREACH exploit [security] [manual action required]
-------------------------------------------------------------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
In the 0.18 release, we've enabled Gzip compression by default for various In the 0.18 release, we've enabled Gzip compression by default for various
content types, including HTML and JSON. Unfortunately, enabling Gzip compression content types, including HTML and JSON. Unfortunately, enabling Gzip compression
@ -62,7 +62,7 @@ For convenience, you can also replace the whole setting with the following snipp
Many thanks to @jibec for the report! Many thanks to @jibec for the report!
Fix Apache configuration file for 0.18 [manual action required] Fix Apache configuration file for 0.18 [manual action required]
---------------------------------------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The way front is served has changed since 0.18. The Apache configuration can't serve 0.18 properly, leading to blank screens. The way front is served has changed since 0.18. The Apache configuration can't serve 0.18 properly, leading to blank screens.

View File

@ -49,7 +49,8 @@ django-dynamic-preferences>=1.7,<1.8
raven>=6.5,<7 raven>=6.5,<7
python-magic==0.4.15 python-magic==0.4.15
ffmpeg-python==0.1.10 ffmpeg-python==0.1.10
channels>=2.1,<2.2 # XXX: until https://github.com/django/channels/issues/1240 is fixed
channels==2.1.6
channels_redis>=2.3,<2.4 channels_redis>=2.3,<2.4
daphne>=2.2,<2.3 daphne>=2.2,<2.3

View File

@ -0,0 +1 @@
Fixed Embed component name that could lead to issue when developping on OSX (#696)

View File

@ -0,0 +1 @@
Downgraded channels dependency to 2.1.6 to fix denied uploads (#697)

View File

@ -1,4 +1,4 @@
openapi: "3.0" openapi: "3.0.0"
info: info:
description: "Documentation for [Funkwhale](https://funkwhale.audio) API. The API is **not** stable yet." description: "Documentation for [Funkwhale](https://funkwhale.audio) API. The API is **not** stable yet."
version: "1.0.0" version: "1.0.0"
@ -7,8 +7,17 @@ info:
servers: servers:
- url: https://demo.funkwhale.audio/api/v1 - url: https://demo.funkwhale.audio/api/v1
description: Demo server description: Demo server
- url: https://node1.funkwhale.test/api/v1 - url: https://{domain}/api/v1
description: Node 1 (local) description: Custom server
variables:
domain:
default: yourdomain
description: Your Funkwhale Domain
protocol:
enum:
- 'http'
- 'https'
default: 'https'
components: components:
securitySchemes: securitySchemes:
@ -50,47 +59,472 @@ paths:
/artists/: /artists/:
get: get:
summary: List artists
tags: tags:
- "artists" - "artists"
parameters: parameters:
- name: "q" - name: "q"
in: "query" in: "query"
default: null
description: "Search query used to filter artists" description: "Search query used to filter artists"
schema: schema:
required: false required: false
type: "string" type: "string"
example: "carpenter" example: "carpenter"
- name: "listenable" - allOf:
in: "query" - $ref: "#/parameters/Ordering"
description: "Filter/exclude artists with listenable tracks" - default: "-creation_date"
schema: schema:
required: false required: false
type: "boolean" type: "string"
example: "creation_date"
enum:
- creation_date
- id
- name
- $ref: "#/parameters/Playable"
- $ref: "#/parameters/PageNumber"
- $ref: "#/parameters/PageSize"
responses: responses:
200: 200:
content: content:
application/json: application/json:
schema: schema:
type: "object" allOf:
- $ref: "#/definitions/ResultPage"
- type: "object"
properties: properties:
count:
$ref: "#/properties/resultsCount"
results: results:
type: "array" type: "array"
items: items:
$ref: "#/definitions/ArtistWithAlbums" $ref: "#/definitions/Artist"
/artists/{id}/:
get:
summary: Retrieve a single artist
parameters:
- $ref: "#/parameters/ObjectId"
properties: tags:
resultsCount: - "artists"
responses:
200:
content:
application/json:
schema:
$ref: "#/definitions/Artist"
404:
content:
application/json:
schema:
$ref: "#/definitions/ResourceNotFound"
/artists/{id}/libraries/:
get:
summary: List available user libraries containing work from this artist
parameters:
- $ref: "#/parameters/ObjectId"
- $ref: "#/parameters/PageNumber"
- $ref: "#/parameters/PageSize"
tags:
- "artists"
- "libraries"
responses:
200:
content:
application/json:
schema:
$ref: "#/definitions/LibraryPage"
404:
content:
application/json:
schema:
$ref: "#/definitions/ResourceNotFound"
/albums/:
get:
summary: List albums
tags:
- "albums"
parameters:
- name: "q"
in: "query"
default: null
description: "Search query used to filter albums"
schema:
required: false
type: "string"
example: "carpenter"
- name: "artist"
in: "query"
default: null
description: "Only include albums by the requested artist"
schema:
required: false
type: "integer" type: "integer"
format: "int64" format: "int64"
description: "The total number of resources matching the request" - allOf:
- $ref: "#/parameters/Ordering"
- default: "-creation_date"
schema:
required: false
type: "string"
example: "creation_date"
enum:
- creation_date
- release_date
- title
- $ref: "#/parameters/Playable"
- $ref: "#/parameters/PageNumber"
- $ref: "#/parameters/PageSize"
responses:
200:
content:
application/json:
schema:
allOf:
- $ref: "#/definitions/ResultPage"
- type: "object"
properties:
results:
type: "array"
items:
$ref: "#/definitions/Album"
/albums/{id}/:
get:
summary: Retrieve a single album
parameters:
- $ref: "#/parameters/ObjectId"
tags:
- "albums"
responses:
200:
content:
application/json:
schema:
$ref: "#/definitions/Album"
404:
content:
application/json:
schema:
$ref: "#/definitions/ResourceNotFound"
/albums/{id}/libraries/:
get:
summary: List available user libraries containing tracks from this album
parameters:
- $ref: "#/parameters/ObjectId"
- $ref: "#/parameters/PageNumber"
- $ref: "#/parameters/PageSize"
tags:
- "albums"
- "libraries"
responses:
200:
content:
application/json:
schema:
$ref: "#/definitions/LibraryPage"
404:
content:
application/json:
schema:
$ref: "#/definitions/ResourceNotFound"
/tracks/:
get:
summary: List tracks
tags:
- "tracks"
parameters:
- name: "q"
in: "query"
default: null
description: "Search query used to filter tracks"
schema:
required: false
type: "string"
example: "carpenter"
- name: "artist"
in: "query"
default: null
description: "Only include tracks by the requested artist"
schema:
required: false
type: "integer"
format: "int64"
- name: "album"
in: "query"
default: null
description: "Only include tracks from the requested album"
schema:
required: false
type: "integer"
format: "int64"
- name: "license"
in: "query"
description: "Only include tracks with the given license"
default: null
schema:
example: "cc-by-sa-4.0"
required: false
type: "string"
- allOf:
- $ref: "#/parameters/Ordering"
- default: "-creation_date"
schema:
required: false
type: "string"
example: "creation_date"
enum:
- creation_date
- release_date
- title
- $ref: "#/parameters/Playable"
- $ref: "#/parameters/PageNumber"
- $ref: "#/parameters/PageSize"
responses:
200:
content:
application/json:
schema:
allOf:
- $ref: "#/definitions/ResultPage"
- type: "object"
properties:
results:
type: "array"
items:
$ref: "#/definitions/Track"
/tracks/{id}/:
get:
summary: Retrieve a single track
parameters:
- $ref: "#/parameters/ObjectId"
tags:
- "tracks"
responses:
200:
content:
application/json:
schema:
$ref: "#/definitions/Track"
404:
content:
application/json:
schema:
$ref: "#/definitions/ResourceNotFound"
/tracks/{id}/libraries/:
get:
summary: List available user libraries containing given track
parameters:
- $ref: "#/parameters/ObjectId"
- $ref: "#/parameters/PageNumber"
- $ref: "#/parameters/PageSize"
tags:
- "tracks"
- "libraries"
responses:
200:
content:
application/json:
schema:
$ref: "#/definitions/LibraryPage"
404:
content:
application/json:
schema:
$ref: "#/definitions/ResourceNotFound"
/licenses/:
get:
summary: List licenses
tags:
- "licenses"
parameters:
- $ref: "#/parameters/PageNumber"
- $ref: "#/parameters/PageSize"
responses:
200:
content:
application/json:
schema:
allOf:
- $ref: "#/definitions/ResultPage"
- type: "object"
properties:
results:
type: "array"
items:
$ref: "#/definitions/License"
/licenses/{code}/:
get:
summary: Retrieve a single license
parameters:
- name: code
in: path
description: License code
required: true
schema:
type: string
example: cc0-1.0
tags:
- "licenses"
responses:
200:
content:
application/json:
schema:
$ref: "#/definitions/License"
404:
content:
application/json:
schema:
$ref: "#/definitions/ResourceNotFound"
parameters:
ObjectId:
name: id
in: path
description: Object ID
required: true
schema:
type: integer
format: int64
Ordering:
name: "ordering"
in: "query"
description: "Ordering for the results, prefix with - for DESC ordering"
PageNumber:
in: query
name: page
schema:
type: "integer"
format: "int64"
example: 1
default: 1
minimum: 1
PageSize:
in: query
name: page_size
schema:
type: "integer"
format: "int64"
example: 16
default: 25
minimum: 1
maximum: 25
Playable:
name: "playable"
in: "query"
default: null
description: "Filter/exclude resources with playable tracks"
schema:
required: false
type: "boolean"
properties:
mbid: mbid:
type: "string" type: "string"
formats: "uuid" formats: "uuid"
description: "A musicbrainz ID" description: "A musicbrainz ID"
definitions: definitions:
Artist: ResultPage:
type: "object"
properties:
count:
type: "integer"
format: "int64"
example: 42
description: "The total number of results (all pages included)"
next:
type: "string"
format: "uri"
description: "Link to the next page of results"
previous:
type: "string"
format: "uri"
description: "Link to the previous page of results"
Image:
type: "object"
properties:
original:
type: "string"
description: "URL to the original image"
example: "https://mydomain/media/albums/covers/ec2c53aeaac6.jpg"
small_square_crop:
type: "string"
description: "URL to a small, squared thumbnail of the image"
example: "https://mydomain/media/__sized__/albums/covers/ec2c53aeaac6-crop-c0-5__0-5-50x50-70.jpg"
medium_square_crop:
type: "string"
description: "URL to a medium, squared thumbnail of the image"
example: "https://mydomain/media/__sized__/albums/covers/ec2c53aeaac6-crop-c0-5__0-5-200x200-70.jpg"
square_crop:
type: "string"
description: "URL to a large, squared thumbnail of the image"
example: "https://mydomain/media/__sized__/albums/covers/ec2c53aeaac6-crop-c0-5__0-5-400x400-70.jpg"
Actor:
type: object
description: "A federation/ ActivityPub actor"
properties:
fid:
type: string
format: uri
description: "The actor Federation ID (unique accross federation)"
uuid:
type: string
format: uuid
description: "Local ID of the library"
creation_date:
type: "string"
format: "date-time"
preferred_username:
type: "string"
example: "alice"
name:
type: string
example: "Alice Unicorn"
last_fetch_date:
type: "string"
format: "date-time"
description: "Last time the actor profile was fetched on its origin server"
domain:
type: "string"
format: "hostname"
example: "open.audio"
type:
type: "string"
example: "Person"
enum:
- Person
- Application
- Group
- Organization
manually_approves_followers:
type: "boolean"
full_username:
type: string
example: "alice@open.audio"
BaseArtist:
type: "object" type: "object"
properties: properties:
mbid: mbid:
@ -106,10 +540,10 @@ definitions:
creation_date: creation_date:
type: "string" type: "string"
format: "date-time" format: "date-time"
ArtistWithAlbums: Artist:
type: "object" type: "object"
allOf: allOf:
- $ref: "#/definitions/Artist" - $ref: "#/definitions/BaseArtist"
- type: "object" - type: "object"
properties: properties:
albums: albums:
@ -117,7 +551,7 @@ definitions:
items: items:
$ref: "#/definitions/ArtistAlbum" $ref: "#/definitions/ArtistAlbum"
Album: BaseAlbum:
type: "object" type: "object"
properties: properties:
mbid: mbid:
@ -142,19 +576,112 @@ definitions:
required: false required: false
format: "date" format: "date"
example: "2001-01-01" example: "2001-01-01"
is_playable:
type: "boolean"
cover:
$ref: "#/definitions/Image"
Album:
type: "object"
allOf:
- $ref: "#/definitions/BaseAlbum"
- type: "object"
properties:
tracks:
type: "array"
items:
$ref: "#/definitions/AlbumTrack"
ArtistAlbum: ArtistAlbum:
type: "object" type: "object"
allOf: allOf:
- $ref: "#/definitions/Album" - $ref: "#/definitions/BaseAlbum"
- type: "object" - type: "object"
properties: properties:
tracks_count: tracks_count:
type: "integer" type: "integer"
format: "int64" format: "int64"
example: 16 example: 16
Library:
type: "object"
properties:
fid:
type: string
format: uri
description: "The library Federation ID (unique accross federation)"
uuid:
type: string
format: uuid
description: "Local ID of the library"
name:
type: string
example: "My awesome library"
description:
type: string
nullable: true
example: "This library contains all the stuff I love!"
uploads_count:
type: "integer"
format: "int64"
example: 687
privacy_level:
type: string
example: "me"
enum:
- "me"
- "instance"
- "everyone"
actor:
$ref: "#/definitions/Actor"
LibraryPage:
allOf:
- $ref: "#/definitions/ResultPage"
- type: "object"
properties:
results:
type: "array"
items:
$ref: "#/definitions/Library"
Track: License:
type: "object"
properties:
id:
type: string
format: uri
example: http://creativecommons.org/publicdomain/zero/1.0/
description: "The license ID"
url:
type: string
format: uri
example: http://creativecommons.org/publicdomain/zero/1.0/
description: "The license url (can be different than the ID)"
code:
type: string
description: "A unique code to identify the license"
example: cc0-1.0
redistribute:
type: boolean
example: true
description: "Does the license allow free redistribution?"
derivative:
type: boolean
example: true
description: "Does the license allow the creation of derivative work?"
commercial:
type: boolean
example: true
description: "Does the license allow commercial use?"
attribution:
type: boolean
example: false
description: "Does the license requires crediting the author?"
copyleft:
type: boolean
example: false
description: "Does the license enforce a similar license of derivative work?"
BaseTrack:
type: "object" type: "object"
properties: properties:
mbid: mbid:
@ -181,6 +708,94 @@ definitions:
type: "number" type: "number"
minimum: 1 minimum: 1
example: 1 example: 1
creation_date: disc_number:
required: false
type: "number"
minimum: 1
example: 1
listen_url:
type: "string" type: "string"
format: "date-time" format: "uri"
description: "URL to stream the track"
copyright:
type: "string"
example: "Creative Commons Attribution-NonCommercial-NoDerivatives 4.0: http://creativecommons.org/licenses/by-nc-nd/4.0/"
description: "Copyright information as extracted from upload tags"
license:
type: "string"
description: "Identifier of the license that is linked to the track"
example: "cc-by-nc-nd-4.0"
AlbumTrack:
type: "object"
allOf:
- $ref: "#/definitions/BaseTrack"
- type: "object"
properties:
artist:
$ref: "#/definitions/BaseArtist"
uploads:
type: "array"
description: "List of uploads associated with this track"
items:
$ref: "#/definitions/Upload"
Track:
type: "object"
allOf:
- $ref: "#/definitions/BaseTrack"
- type: "object"
properties:
album:
$ref: "#/definitions/Album"
artist:
$ref: "#/definitions/BaseArtist"
uploads:
type: "array"
description: "List of uploads associated with this track"
items:
$ref: "#/definitions/Upload"
Upload:
type: "object"
properties:
uuid:
type: string
format: uuid
size:
type: "integer"
format: "int64"
example: 278987000
description: "Size of the file, in bytes"
duration:
type: "integer"
format: "int64"
example: 184
description: "Duration of the audio, in seconds"
bitrate:
type: "integer"
format: "int64"
example: 128000
description: "Bitrate of the file, in bytes/s"
mimetype:
type: string
example: "audio/ogg"
enum:
- "audio/ogg"
- "audio/mpeg"
- "audio/x-flac"
- "audio/flac"
extension:
type: string
example: "ogg"
description: "File extension of the upload"
listen_url:
type: "string"
format: "uri"
description: "URL to stream the upload"
ResourceNotFound:
type: "object"
properties:
detail:
type: "string"
example: "Not found."

View File

@ -1,6 +1,6 @@
import Vue from 'vue' import Vue from 'vue'
import Embed from './Embed' import EmbedFrame from './EmbedFrame'
import VuePlyr from 'vue-plyr' import VuePlyr from 'vue-plyr'
Vue.use(VuePlyr) Vue.use(VuePlyr)
@ -10,6 +10,6 @@ Vue.config.productionTip = false
/* eslint-disable no-new */ /* eslint-disable no-new */
new Vue({ new Vue({
el: '#app', el: '#app',
template: '<Embed/>', template: '<EmbedFrame/>',
components: { Embed } components: { EmbedFrame }
}) })