-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcli.py
More file actions
167 lines (150 loc) · 7.4 KB
/
Copy pathcli.py
File metadata and controls
167 lines (150 loc) · 7.4 KB
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
import click
import tqdm
from rich.console import Console
from rich.table import Table
from services.artist_service import ArtistNotFoundError
console = Console()
class CLI:
def __init__(
self,
services,
repositories,
):
self.artist_repository = repositories.artist
self.artist_service = services.artist_service
self.spotify_service = services.spotify_service
self.youtube_service = services.youtube_service
self.stats_service = services.stats_service
self.report_service = services.report_service
self.setup_cli_commands()
def setup_cli_commands(self):
@click.group()
def cli():
pass
@cli.command()
@click.option('--name', prompt='Artist name', help='Artist name')
@click.option('--spotify_id', prompt='Spotify ID', help='Artist Spotify ID', required=False, default="")
@click.option('--youtube_id', prompt='YouTube ID', help='Artist YouTube Channel ID', required=False, default="")
@click.option('--deezer_id', prompt='Deezer ID', help='Artist Deezer ID', required=False, default="")
@click.option('--apple_music_id', prompt='Apple Music ID', help='Artist Apple Music ID', required=False, default="")
@click.option('--amazon_music_id', prompt='Amazon Music ID', help='Artist Amazon Music ID', required=False, default="")
@click.option('--tidal_id', prompt='Tidal ID', help='Artist Tidal ID', required=False, default="")
def add_artist(
name,
spotify_id,
youtube_id,
deezer_id,
apple_music_id,
amazon_music_id,
tidal_id
):
self.artist_service.insert_artist(
name,
spotify_id,
youtube_id,
deezer_id,
apple_music_id,
amazon_music_id,
tidal_id
)
console.print(f"Artist {name} added successfully", style="green")
@cli.command()
@click.option('--artist_id', prompt='Artist ID', help='Artist ID', required=True)
@click.option('--name', prompt='Artist name', help='Artist name', required=False, default="")
@click.option('--spotify_id', prompt='Spotify ID', help='Artist Spotify ID', required=False, default="")
@click.option('--youtube_id', prompt='YouTube ID', help='Artist YouTube Channel ID', required=False, default="")
@click.option('--deezer_id', prompt='Deezer ID', help='Artist Deezer ID', required=False, default="")
@click.option('--apple_music_id', prompt='Apple Music ID', help='Artist Apple Music ID', required=False, default="")
@click.option('--amazon_music_id', prompt='Amazon Music ID', help='Artist Amazon Music ID', required=False, default="")
@click.option('--tidal_id', prompt='Tidal ID', help='Artist Tidal ID', required=False, default="")
def update_artist(
artist_id,
name,
spotify_id,
youtube_id,
deezer_id,
apple_music_id,
amazon_music_id,
tidal_id
):
try:
artist = self.artist_service.update_artist(
artist_id,
name,
spotify_id,
youtube_id,
deezer_id,
apple_music_id,
amazon_music_id,
tidal_id
)
console.print(f"Artist {artist.name} updated successfully", style="green")
except ArtistNotFoundError as e:
console.print_exception(e)
@cli.command()
@click.option('--artist_id', prompt='Artist ID', help='Artist ID', required=True)
@click.option('--skip_spotify', is_flag=True, help='Skip Spotify')
@click.option('--skip_youtube', is_flag=True, help='Skip YouTube')
def update_artist_stats(artist_id, skip_spotify, skip_youtube):
artist = self.artist_repository.get_artist(artist_id)
console.print(f"Updating stats for artist {artist.name}", style="green")
if not artist:
console.print_exception(ArtistNotFoundError(f"Artist with id {artist_id} not found"))
return
self.stats_service.update_artist_stats(artist, skip_spotify, skip_youtube)
@cli.command()
@click.option('--skip_spotify', is_flag=True, help='Skip Spotify')
@click.option('--skip_youtube', is_flag=True, help='Skip YouTube')
@click.option('--only_without_stats', is_flag=True, help='Update only artists without stats')
def update_all_artists_stats(skip_spotify, skip_youtube, only_without_stats):
artists = self.artist_repository.get_all_artists() \
if not only_without_stats else self.artist_repository.get_artists_without_stats()
with tqdm.tqdm(total=len(artists), desc="Updating artists stats") as pbar:
for artist in artists:
console.print(f"Updating stats for artist {artist.name}", style="green")
self.stats_service.update_artist_stats(artist, skip_spotify, skip_youtube)
pbar.update(1)
@cli.command()
def list_artists():
table = Table(title="Artists")
table.add_column("Name", style="cyan")
table.add_column("ID", style="green")
table.add_column("Last stats update", style="blue")
table.add_column("Spotify ID", style="magenta")
table.add_column("YouTube ID", style="yellow")
table.add_column("Deezer ID", style="red")
table.add_column("Apple Music ID", style="blue")
table.add_column("Amazon Music ID", style="green")
table.add_column("Tidal ID", style="magenta")
artists = self.artist_repository.get_all_artists()
for artist in artists:
table.add_row(
artist.name,
str(artist.id),
str(artist.last_stats_update),
artist.spotify_id,
artist.youtube_id,
artist.deezer_id,
artist.apple_music_id,
artist.amazon_music_id,
artist.tidal_id
)
console.print(table)
@cli.command()
@click.option('--artist_id', prompt='Artist ID', help='Artist ID', required=True)
def show_youtube_report(artist_id):
self.report_service.show_youtube_artist_report(artist_id)
@cli.command()
@click.option('--artist_id', prompt='Artist ID', help='Artist ID', required=True)
def show_spotify_report(artist_id):
self.report_service.show_spotify_artist_report(artist_id)
@cli.command()
@click.option('--artist_id_1', prompt='Artist ID 1', help='Artist ID 1', required=True)
@click.option('--artist_id_2', prompt='Artist ID 2', help='Artist ID 2', required=True)
@click.option('--save_to_file', is_flag=True, help='Save to file')
def compare_artists(artist_id_1, artist_id_2, save_to_file):
try:
self.report_service.compare_artist_reports(artist_id_1, artist_id_2, save_to_file=save_to_file)
except ArtistNotFoundError as e:
console.print_exception(e)
self.cli = cli