#!/usr/bin/env python3 from src.fw_api import current_instance, get_instance_settings, get_node_info from src.fw_radios import list_radios from src.fw_artists import list_artists from src.fw_albums import list_albums from src.fw_tracks import list_tracks from src.fw_channels import list_channels from src.fw_playlists import list_playlists from src.fw_recents import list_fav_or_history import src.settings as settings import src.mpv_control import json import os from shlex import quote from pyfzf.pyfzf import FzfPrompt fzf = FzfPrompt() def main(): while True: support_message = '' instance_title = '' menu = ['Radios', 'Artists', 'Albums', 'Tracks', 'Channels', 'Playlists', 'Favorites', 'Recently listened', 'About instance', 'Switch instance'] try: ins_nodeinfo = get_node_info() support_message = ins_nodeinfo['metadata']['instanceSupportMessage'] instance_title = ins_nodeinfo['metadata']['nodeName'] instance_stats = [] for k, v in ins_nodeinfo['metadata']['library'].items(): if k == 'anonymousCanListen' and v == False and not current_instance.s.headers.get('Authorization'): instance_stats.append(f'!!! {k}: {v} !!!') menu = ['Switch instance', 'About instance'] continue instance_stats.append(f'{k}: {v}') instance_stats.append(ins_nodeinfo['software']['version']) instance_stats = '\n'.join(instance_stats) main_menu_header = quote(f'''{instance_title}\n{instance_stats}'''.strip()) except Exception as E: splitted = ':\n'.join(str(E).split(':')) main_menu_header = quote(f'''Connection failed:\n{splitted}'''.strip()) menu = ['Switch instance'] if not current_instance.s.headers.get('Authorization'): menu.append('Sign in') if support_message != '': menu.append('Donate') if src.mpv_control.player.playlist_playing_pos != -1: menu.insert(0, 'Player') selected = fzf.prompt(menu, f"--header={main_menu_header}") if selected == []: print('bye-bye :3') break else: selected = selected[0] if selected == 'Radios': list_radios() if selected == 'Artists': list_artists() if selected == 'Albums': list_albums() if selected == 'Tracks': list_tracks() if selected == 'Channels': list_channels() if selected == 'Playlists': list_playlists() if selected == 'Favorites': list_fav_or_history() if selected == 'Recently listened': list_fav_or_history(is_history_view=True) if selected == 'Switch instance': with open('config.json', 'rt') as f: conf = json.loads(f.read()) public_server_list_instances = settings.get_new_funkwhale_servers() new_ins_count = len(settings.get_new_funkwhale_servers()) list_instances = conf.get( 'public_list_instances') + public_server_list_instances settings.set_config('public_list_instances', list_instances) instance = fzf.prompt(list_instances, '--header='+quote(f'Select instance\nServer instances: +{new_ins_count}')) if instance == []: continue else: instance = instance[0] current_instance.select_instance(instance) if selected == 'Sign in': print(f''' If You want sign in, please visit: https://{current_instance.instance}/settings/applications/new And fill Name funkwhale-cli Scopes: Read | Write (optional): write:libraries write:favorites write:listenings write:follows write:filters Insert token from "Access token" here''') register_token = input() with open('.auth.json', 'rt') as f: tkns = json.loads(f.read()) with open('.auth.json', 'wt') as f: tkns[current_instance.instance] = register_token f.write(json.dumps(tkns)) del tkns del register_token del f os.system('clear') current_instance.select_instance(current_instance.instance) if selected == 'Donate': os.system(f'less <