1+ import argparse
2+ from core import YandexMusicExporter
3+ from core import YoutubeImoirter
4+ import json
5+
6+
7+ def parse_args () -> argparse .Namespace :
8+ parser = argparse .ArgumentParser (description = 'Train a model' )
9+ parser .add_argument (
10+ '--yandex' , type = str , help = 'Yandex Music token'
11+ )
12+ parser .add_argument (
13+ '--output' , type = str , default = 'tracks.json' , help = 'Output json file'
14+ )
15+ parser .add_argument (
16+ '--youtube' , type = str , default = 'youtube.json' ,
17+ help = 'Youtube Music credentials file. If file not exists, it will be created.'
18+ )
19+ return parser .parse_args ()
20+
21+
22+ def move_tracks (
23+ importer : YandexMusicExporter , exporter : YoutubeImoirter , out_path : str
24+ ) -> None :
25+ data = {
26+ 'liked_tracks' : [],
27+ 'not_found' : [],
28+ 'errors' : [],
29+ }
30+
31+ print ('Exporting liked tracks from Yandex Music...' )
32+ tracks = importer .export_liked_tracks ()
33+ tracks .reverse ()
34+
35+ for track in tracks :
36+ data ['liked_tracks' ].append ({
37+ 'artist' : track .artist ,
38+ 'name' : track .name
39+ })
40+
41+ print ('Importing liked tracks to Youtube Music...' )
42+ not_found , errors = exporter .import_liked_tracks (tracks )
43+
44+ for track in not_found :
45+ data ['not_found' ].append ({
46+ 'artist' : track .artist ,
47+ 'name' : track .name
48+ })
49+ print (f'{ track .artist } - { track .name } ' )
50+
51+ for track in errors :
52+ data ['errors' ].append ({
53+ 'artist' : track .artist ,
54+ 'name' : track .name
55+ })
56+
57+ print (f'{ len (not_found )} not found tracks, { len (errors )} errors.' )
58+
59+ str_data = json .dumps (data )
60+ with open (out_path , 'w' , encoding = 'utf-8' ) as f :
61+ f .write (str_data )
62+
63+
64+ def main () -> None :
65+ args = parse_args ()
66+ importer = YandexMusicExporter (args .yandex )
67+ exporter = YoutubeImoirter (args .youtube )
68+ move_tracks (importer , exporter , args .output )
69+
70+
71+ if __name__ == '__main__' :
72+ main ()
0 commit comments