-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmigrator.py
executable file
·86 lines (67 loc) · 2.93 KB
/
migrator.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
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/env python
import configparser
import argparse
import logging
# export providers
from providers.ym import YandexMusic
from providers.youtube import Youtube
# init configuration
config = configparser.ConfigParser()
parser = argparse.ArgumentParser(description='Just another one script for migration music library')
parser.add_argument('-c', '--config', metavar='CONFIG', required=True, type=str, nargs=1, help='path to config.ini')
parser.add_argument('-i', '--import', required=True, dest='_import', type=str, nargs=1, choices=['spotify', 'youtube'], help='Where we will migrate our library?')
parser.add_argument('-e', '--export', type=str, nargs=1, choices=['ym', 'deezer'], help='provider to use on conflict')
parser.add_argument('-d', '--dry-run', const=True, default=False, nargs='?', help='just export without touching anything')
parser.add_argument('-v', '--verbose', action='count', default=0)
args = parser.parse_args()
config.read(args.config)
# setup logger
log_levels = [logging.INFO, logging.DEBUG]
log_level = log_levels[min(len(log_levels) - 1, args.verbose)]
logging.basicConfig(
filename='migrator.log',
level=log_level,
datefmt='%Y-%m-%d %H:%M:%S',
format="%(asctime)s %(message)s" if log_level > logging.DEBUG else "%(asctime)s %(levelno)s %(module)s: %(message)s"
)
# Too much spam here
logging.getLogger('yandex_music.base').setLevel(logging.ERROR if log_level < logging.ERROR else log_level)
logging.getLogger('yandex_music.client').setLevel(logging.ERROR if log_level < logging.ERROR else log_level)
logging.getLogger('spotipy').setLevel(logging.INFO if log_level < logging.INFO else log_level)
logging.getLogger('ytmusicapi').setLevel(logging.INFO if log_level < logging.INFO else log_level)
if not args._import:
parser.print_help()
exit(1)
# setup exporter
logging.info('initialize export provider')
pdict = {}
if 'deezer' in config: pdict['deezer'] = Deezer(**config['deezer'])
if 'ym' in config: pdict['ym'] = YandexMusic(**config['ym'])
if len(pdict) > 1 and not args.export:
parser.print_help()
exit(1)
name = args.export if len(pdict) > 1 else next(iter(pdict))
provider = pdict[name]
if 'spotify' in args._import:
logging.info(f'initialize {"spotify"}')
sp = Spotify(**config['spotify'])
# import tracks
logging.info('import favorites')
sp.import_favorites(provider.favorites, dry_run=args.dry_run)
# import playlists
for pl in provider.playlists:
logging.info(f'import playlist: {pl.title}')
sp.import_playlist(pl, dry_run=args.dry_run)
elif 'youtube' in args._import:
# setup importer
logging.info(f'initialize {"youtube"}')
yt = Youtube()
logging.info('import favorites')
yt.import_playlist(provider.favorites, dry_run=args.dry_run)
# import playlists
for pl in provider.playlists:
logging.info(f'import playlist: {pl.title}')
yt.import_playlist(pl, dry_run=args.dry_run)
else:
parser.print_help()
exit(1)