-
Notifications
You must be signed in to change notification settings - Fork 1
/
check_all.py
75 lines (59 loc) · 2.88 KB
/
check_all.py
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
"""Checks all existing tracks are appropriately sorted. This means that every
track that is in any of the concerned playlists should be in "WCS all", exactly
one tempo playlist and at least one genre playlist. Reports on any that aren't
consistent with this and prompts a fix. Does not look at status or special
playlists.
"""
import argparse
import itertools
import tekore
from sort import PlaylistSorter
from update import update_cached_playlists
from utils import format_artists, get_spotify_object
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--tekore-cfg", '-T', type=str, default='tekore.cfg',
help="file to use to store Tekore (Spotify) user token (default tekore.cfg)")
parser.add_argument("--playback-start", '-s', type=float, default=15,
help="start playback this far through the song (default 15)")
parser.add_argument("--list", '-l', action='store_true', default=False,
help="list offending tracks, don't rectify")
parser.add_argument("--skip-update-cache", '-v', action='store_false', default=True, dest='update_cache',
help="skip updating the cache (use this if you ran update.py just now)")
parser.add_argument("--browser", type=str, default="wslview",
help="browser to open searches in (default wslview)")
args = parser.parse_args()
def print_quick_info(track):
already_in = sorter.all_cached_playlists.playlists_containing_track(track.id)
names = [playlist.name for playlist in already_in]
names = [name[4:] if name.startswith("WCS ") else name for name in names]
names = ", ".join(names)
print(f"- {track.name} \033[90m{format_artists(track.artists)} \033[0;34m{names}\033[0m")
scope = tekore.Scope(tekore.scope.user_modify_playback_state, tekore.scope.playlist_modify_public)
sp = get_spotify_object(args.tekore_cfg, scope=scope)
if args.update_cache:
print("\033[1;36mUpdating the cache (skip this using the -v option)\033[0m")
update_cached_playlists(sp)
sorter = PlaylistSorter(sp,
prompt_for_all=True,
playback_start_position_ms=args.playback_start * 1000,
browser=args.browser)
# Collate all tracks in relevant list
all_track_ids = set()
all_track_ids.update(sorter.all_playlist.track_ids)
for playlist in itertools.chain(sorter.tempo_playlists, sorter.genre_playlists):
all_track_ids.update(playlist.track_ids)
# Find the tracks that aren't properly sorted
offending_track_ids = []
for track_id in all_track_ids:
if not sorter.is_track_properly_sorted(track_id):
offending_track_ids.append(track_id)
print(f"There are {len(all_track_ids)} tracks in total ({len(sorter.all_playlist)} in WCS all),")
print(f"of which {len(offending_track_ids)} tracks have some inconsistent filing.")
with sp.chunked(True):
offending_tracks = sp.tracks(offending_track_ids)
for track in offending_tracks:
if args.list:
print_quick_info(track)
else:
sorter.sort_track(track)
print()