diff --git a/README.md b/README.md index c410179..3733357 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,6 @@ # funkwlplay -basic functional for create playlist tracks. Be simple as possible. No implement player and tui. Just bare cli solution. -Random powered, good luck :3 - -Example usage: -``` -./funkwlplay.py # just get random tracks from instances - -./funkwlplay.py -s 'dance with the dead' # search on instances - -./funkwlplay.py -t house # search tag house on instances - -./funkwlplay.py -r 1 -d 10 -i funk.deko.cloud # get 10 pages random tracks from instance - -$YOUR_FAVORITE_PLAYER playlist.m3u8 # just plays tracks. Remember at this moment playlist will be rewriten after every call ./funkwlplay.py -``` +basic functional for create playlist tracks. Be simple as possible. No implement player and tui. Just bare cli solution. [1]**Warning:** may content _unofficial instances_ **Warning 2:** This software not userfriendly. Maybe developerfriendly. diff --git a/funkwlplay.py b/funkwlplay.py index 3f37866..5332974 100755 --- a/funkwlplay.py +++ b/funkwlplay.py @@ -34,12 +34,13 @@ def create_playlist_file(track_list): def filter_tracks(tracks): def remove_unreach_tracks(track): try: - r = requests.head(track['listen_url'], timeout=2, headers={'Content-Encoding': 'gzip'}) + r = requests.head(track['listen_url'], timeout=1) r.raise_for_status() return 1 except: return 0 with concurrent.futures.ThreadPoolExecutor(max_workers=50) as executor: + before = len(tracks) res = [executor.submit(remove_unreach_tracks, track) for track in tracks] concurrent.futures.wait(res) avalaible = [] @@ -48,6 +49,8 @@ def filter_tracks(tracks): if is_avalaible == 1: avalaible.append(track) tracks = avalaible + after = before - len(tracks) + print(f'-{after} unreach tracks') Path('filter_tags').touch() Path('filter_artists').touch() @@ -60,7 +63,7 @@ def filter_tracks(tracks): with open('filter_raw_urls') as raw_urls_file: block_raw_urls = raw_urls_file.read().strip().split('\n') - filtred_tracks = [] + for i in tracks: if [tag.lower() for tag in i['tags']] in block_tags: continue @@ -68,15 +71,14 @@ def filter_tracks(tracks): continue if i['listen_url'].lower() in block_raw_urls: continue - filtred_tracks.append(i) - return filtred_tracks + tracks_stor.append(i) + def search_tracks_on_instance(instance, tag='', query='', recursion=args.recursion): r = requests.get(f'https://{instance}/api/v1/tracks', params={'tag': tag, 'q': query, - 'local': True, 'playable': True, - 'ordering': 'random', 'scope': 'all'}, - timeout=10, headers={'Content-Encoding': 'gzip'}) + 'local': True, 'playable': True, + 'ordering': 'random'}, timeout=10) r.raise_for_status() tracks = r.json() @@ -109,16 +111,10 @@ with concurrent.futures.ThreadPoolExecutor(max_workers=50) as executor: for idx, instance in enumerate(instances): try: tracks = res[idx].result() - before_filter = len(tracks['results']) - filtred_tracks = filter_tracks(tracks['results']) - after_filter = before_filter - len(filtred_tracks) - print(f'{after_filter} tracks filtred on {instance}') - tracks_stor += filtred_tracks + filter_tracks(tracks['results']) except Exception as E: print(E) for track in tracks_stor: - artist, album, title, play_url, track_duration, fid = track['artist']['name'], track['album']['title'], track['title'], track['listen_url'], track.get('duration'), track['fid'] - if not track_duration: - track_duration = -1 - playlist_files.append(f'#EXTINF:{track_duration},{artist} - {album} - {title} url="{fid}"\n{play_url}') + 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)