diff --git a/funkwlplay.py b/funkwlplay.py index 75c94e4..465e2b2 100644 --- a/funkwlplay.py +++ b/funkwlplay.py @@ -1,17 +1,74 @@ import requests import concurrent.futures +import argparse +from pathlib import Path tracks_stor = [] with open('instances') as instances: - instances = instances.read().split('\n') + instances = instances.read().strip().split('\n') + + +parser = argparse.ArgumentParser( + prog='funkwhale playlist', + description='Create playlist from query or just random playlist tracks from funkwhale instances') +parser.add_argument('-s', '--search') +parser.add_argument('-t', '--tag') +args = parser.parse_args() + + +def create_playlist_file(track_list): + with open('playlist.m3u8', 'w') as file: + file.write('#EXTM3U\n') + for i in track_list: + file.write('\n' + i) + + +def filter_tracks(tracks): + Path('filter_tags').touch() + Path('filter_artists').touch() + Path('filter_raw_urls').touch() + with open('filter_tags') as tags_file: + block_tags = tags_file.read().strip().split('\n') + + with open('filter_artists') as artists_file: + block_artists = artists_file.read().strip().split('\n') + + with open('filter_raw_urls') as raw_urls_file: + block_raw_urls = raw_urls_file.read().strip().split('\n') + + for i in tracks: + if [tag.lower() for tag in i['tags']] in block_tags: + continue + if i['artist']['name'].lower() in block_artists: + continue + if i['listen_url'].lower() in block_raw_urls: + continue + tracks_stor.append(i) def search_tracks_on_instance(instance, tag='', query=''): - tracks = requests.get(f'https://{instance}/api/v1/tracks', params={'tag': tag, 'q': query}).json() + tracks = requests.get(f'https://{instance}/api/v1/tracks', params={'tag': tag, 'q': query, + 'local': True, 'playable': True, + 'ordering': 'random'}, timeout=10).json() + tracks_replacer = [] + for track in tracks['results']: + track['listen_url'] = f'https://{instance}' + track['listen_url'] + tracks_replacer.append(track) + tracks['results'] = tracks_replacer return tracks - #filter_tracks(tracks) -with concurrent.futures.ThreadPoolExecutor() as executor: # optimally defined number of threads - res = [executor.submit(search_tracks_on_instance, instance, '', '') for instance in instances] + +with concurrent.futures.ThreadPoolExecutor(max_workers=50) as executor: + res = [executor.submit(search_tracks_on_instance, instance, args.tag, args.search) for instance in instances] concurrent.futures.wait(res) - + playlist_files = [] + for idx, instance in enumerate(instances): + try: + tracks = res[idx].result() + filter_tracks(tracks['results']) + except Exception as E: + print(E) + for track in tracks_stor: + artist, album, title, play_url = track['artist']['name'], track['album']['title'], track['title'], track['listen_url'] + playlist_files.append(f'#EXTINF:-1,{artist} - {album} - {title}\n{play_url}') + create_playlist_file(playlist_files)