aboutsummaryrefslogtreecommitdiff

PyFunkwhale

A simple funkwhale API client library

Since API is not frozen, this client library is written for the version 1.0.1.

Install

Only for dev for the momement:

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

Use

First you to select an authentification method, two are actually available Plain HTTP and OAuth2.

Plain HTTP authentification

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env python
# -*- condig: utf-8 -*-

from pyfunkwhale.funkwhale import Funkwhale
from pyfunkwhale.client import InvalidTokenError

client_name = "pyfunkwhale"

redirect_uri = "urn:ietf:wg:oauth:2.0:oob"

# This is your instance and login information
username = "demo"
password = "demo"
domain = "https://demo.funkwhale.audio"

authorization_endpoint = domain + "/authorize"
login_endpoint = domain + "/api/v1/oauth/token/"

login_endpoint = domain + "/api/v1/token/"

funkwhale = Funkwhale(
    client_name,
    redirect_uri,
    username,
    password,
    domain,
    login_endpoint,
)

artists = funkwhale.artists()

print(artists)

OAuth2 Authorization Code flow

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/env python
# -*- condig: utf-8 -*-

from pyfunkwhale.funkwhale import Funkwhale
from pyfunkwhale.client import InvalidTokenError

client_name = "pyfunkwhale"

redirect_uri = "urn:ietf:wg:oauth:2.0:oob"

# Obviously dont copy past and check the doc for how to get it:
# https://docs.funkwhale.audio/developers/authentication.html#create-an-app
client_id = "IFQuq6iB7Ta5LVxCUV8ibo65x588bgtI4rsa46cgm"
client_secret = "RMurKpQsoaZKbVpbse5o2wrJ5E4dMbvDs54JMsK5fDY5AK2QP8tJxoN7ApjryoCdWBUk02dExNTxzgUOZHFmSRcYdbJXbkLghXn6mvQMs9J8uIMpFIrehBp"

# This is your instance and login information
# This example is based on https://docs.funkwhale.audio/swagger/
username = "demo"
password = "demo"
domain = "https://demo.funkwhale.audio"

scopes = "read"

authorization_endpoint = domain + "/authorize"
login_endpoint = domain + "/api/v1/oauth/token/"

# Save the OAuth2 infos in file, this is ugly yup
token_filename = 'oauth_token.data'

# You need to handle the invalidity of a token and ask for a new one
def _ask_new_auth(funkwhale, message):
  print(message)
  authorization_code = input("Enter response code: ")
  funkwhale.client._set_token(authorization_code)

funkwhale = Funkwhale(
    client_name,
    redirect_uri,
    username,
    password,
    domain,
    login_endpoint,
    client_secret,
    scopes,
    client_id,
    authorization_endpoint,
    token_filename,
)

try:
  artists = funkwhale.artists()
except InvalidTokenError as e:
  _ask_new_auth(funkwhale, e.message)
  artists = funkwhale.artists()

print(artists)

Examples

In case you ask, their is an example for downloading a song

r = funkwhale.listen("f9d02c64-bafa-43cb-8e1e-fa612e7c5dab")

with open('/tmp/test.mp3', 'wb') as f:
    for chunk in r.iter_content(chunk_size=8192):
        if chunk:
            f.write(chunk)

Features

List of features implemented or planned:

  • [/] Auth
  • [x] OAuth2 Authorization Code flow
    • [x] Login
    • [x] Register an application
    • [x] Get an JWT token
  • [x] Simple Authentication
    • [x] Login
  • [ ] Create an account
  • [ ] Request a password request
  • [x] Retrieve user information
  • [x] Retrieve rate-limit information and current usage status
  • [x] Artists
  • [x] List artists
  • [x] Retrieve a single artist
  • [x] List available user libraries containing work from this artist
  • [x] Albums
  • [x] List albums
  • [x] Retrieve a single album
  • [x] List available user libraries containing work from this album
  • [x] Tracks
  • [x] List tracks
  • [x] Retrieve a single tracks
  • [x] List available user libraries containing work from this track
  • [x] Download the audio file matching the given track uuid
  • [x] License
  • [x] List licences
  • [x] Retrieve a single license
  • [ ] libraries
  • [ ] List owned libraries
  • [ ] Create a new librarie
  • [ ] Retrieve a librarie
  • [ ] Update a librarie
  • [ ] Update a librarie
  • [ ] Delete a librarie and all associated password
  • [ ] Uploads
  • [ ] List owned upload
  • [ ] Upload a new file in a library
  • [ ] Retrieve an upload
  • [ ] Delete a an upload
  • [x] favorites
  • [x] List favorites
  • [x] Mark a given track as favorite
  • [x] Remove a given track from favorites