From 5c3e459cfebb5032fa413879e8e062274285315a Mon Sep 17 00:00:00 2001 From: localhost_frssoft Date: Wed, 9 Nov 2022 04:01:02 +0300 Subject: [PATCH] 'Bare bones' channels support; added federated search by url (scrapped from network monitor inspector) --- funkwhale_cli.py | 17 +++++++++++++++-- src/fw_albums.py | 6 +++--- src/fw_api.py | 33 +++++++++++++++++++++++++++++---- src/fw_channels.py | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 src/fw_channels.py diff --git a/funkwhale_cli.py b/funkwhale_cli.py index 8285ed4..3c32511 100644 --- a/funkwhale_cli.py +++ b/funkwhale_cli.py @@ -1,7 +1,8 @@ -from src.fw_api import s, select_instance, instance +from src.fw_api import s, select_instance, instance, federate_search_by_url from src.fw_radios import list_radios from src.fw_artists import list_artists from src.fw_albums import list_albums +from src.fw_channels import list_channels import json, sys from loguru import logger from pyfzf.pyfzf import FzfPrompt @@ -13,10 +14,14 @@ def main(): logger.add(sys.stderr, filter='src.fw_api') logger.add(sys.stderr, filter='src.fw_radios') logger.add(sys.stderr, filter='src.fw_artists') + logger.add(sys.stderr, filter='src.fw_albums') + logger.add(sys.stderr, filter='src.fw_channels') while True: menu = ['Radios', 'Artists', - 'Albums', + 'Albums', + 'Channels', + 'Search', 'Switch instance'] if not s.headers.get('Authorization'): menu.append('Sign in') @@ -29,6 +34,14 @@ def main(): list_artists() if selected == 'Albums': list_albums() + if selected == 'Channels': + list_channels() + if selected == 'Search': + search_type = fzf.prompt(('Federated', 'All types'))[0] + if search_type == 'Federated': + print('Input url:') + returned_obj = federate_search_by_url(input()) + if selected == 'Switch instance': with open('config.json', 'rt') as f: conf = json.loads(f.read()) diff --git a/src/fw_albums.py b/src/fw_albums.py index bfc9917..e33129f 100644 --- a/src/fw_albums.py +++ b/src/fw_albums.py @@ -7,12 +7,12 @@ from loguru import logger fzf = FzfPrompt() @logger.catch -def list_albums(albums=None, pg=None, search=None): +def list_albums(albums=None, pg=None, search=None, artist=None, include_channels=None): albums_next = None albums_prev = None play_artist_albums = False if not albums: - albums = get_albums(q=search, pg=pg) + albums = get_albums(q=search, artist=artist, include_channels=include_channels, pg=pg) albums_next = albums.get('next') albums_prev = albums.get('previous') albums_results = albums.get('results') @@ -46,7 +46,7 @@ def list_albums(albums=None, pg=None, search=None): def play_album(album_id): - tracks = get_tracks(album=album_id) + tracks = get_tracks(album=album_id, include_channels=True) tracks_results = tracks.get('results') storage = {} for i in tracks_results: diff --git a/src/fw_api.py b/src/fw_api.py index 898ff8f..3dcae95 100644 --- a/src/fw_api.py +++ b/src/fw_api.py @@ -45,14 +45,15 @@ def concatinate_endpoint(endpoint): @logger.catch -def get_tracks(page=None, q=None, artist=None, album=None, favourites=None, pg=None): +def get_tracks(page=None, q=None, artist=None, album=None, favourites=None, include_channels=None, pg=None): '''This function get tracks by params''' params = { 'page': page, 'q': q, 'artist': artist, 'album': album, - 'favourites': favourites + 'favourites': favourites, + 'include_channels': include_channels } if pg: r = s.get(pg) @@ -79,12 +80,13 @@ def get_artists(page=None, q=None, artist=None, album=None, favourites=None, pg= @logger.catch -def get_albums(page=None, q=None, artist=None, pg=None): +def get_albums(page=None, q=None, artist=None, include_channels=None, pg=None): '''This function get artists by params''' params = { 'page': page, 'q': q, - 'artist': artist + 'artist': artist, + 'include_channels': include_channels } if pg: r = s.get(pg) @@ -93,6 +95,20 @@ def get_albums(page=None, q=None, artist=None, pg=None): return r.json() +@logger.catch +def get_channels(page=None, q=None, tag=None, pg=None): + params = { + 'page': page, + 'q': q, + 'tag': tag + } + if pg: + r = s.get(pg) + else: + r = s.get(f'https://{instance}/api/v1/channels', params=params) + return r.json() + + @logger.catch def list_libraries(page=None, page_size=None, q=None, scope='all', pg=None): params = { @@ -108,6 +124,15 @@ def list_libraries(page=None, page_size=None, q=None, scope='all', pg=None): return r.json() +@logger.catch +def federate_search_by_url(object): + params = { + 'object': object + } + r = s.post(f'https://{instance}/api/v1/federation/fetches', json=params) + return r.json() + + @logger.catch def favorite_track(track_id): r = s.post(f'https://{instance}/api/v1/favorites/tracks', json={'track': int(track_id)}) diff --git a/src/fw_channels.py b/src/fw_channels.py new file mode 100644 index 0000000..84d1f04 --- /dev/null +++ b/src/fw_channels.py @@ -0,0 +1,34 @@ +from src.fw_api import get_channels +from src.fw_albums import list_albums +from loguru import logger +from pyfzf.pyfzf import FzfPrompt + +fzf = FzfPrompt() + + +@logger.catch +def list_channels(pg=None, search=None): + channels = get_channels(q=search, pg=pg) + channels_next = channels.get('next') + channels_prev = channels.get('previous') + channels_results = channels.get('results') + view = ['Search'] + if channels_next: + view.append('Next page') + if channels_prev: + view.append('Prev page') + + for i in channels_results: + index = channels_results.index(i) + channel_name = i.get('artist').get('name') + view.append(f'{index}.{channel_name}') + select = fzf.prompt(view)[0].split('.', 1)[0] + if select == 'Next page': + list_channels(pg=channels_next) + elif select == 'Prev page': + list_channels(pg=channels_prev) + elif select == 'Search': + print('Search by channel:') + list_channels(search=input()) + else: + list_albums(artist=channels_results[int(select)].get('artist').get('id'), include_channels=True)