]> git.0d.be Git - django-panik-nonstop.git/blob - nonstop/management/commands/import-tracks.py
add import-tracks management command
[django-panik-nonstop.git] / nonstop / management / commands / import-tracks.py
1 import datetime
2 import os
3
4 import mutagen
5 from django.core.files.storage import default_storage
6 from django.core.management.base import BaseCommand
7 from django.utils.timezone import now
8 from emissions.models import Nonstop
9
10 from ...models import Artist, NonstopFile, Track
11
12
13 class Command(BaseCommand):
14     def add_arguments(self, parser):
15         parser.add_argument('--directory', metavar='DIRECTORY')
16         parser.add_argument('--zone', metavar='ZONE')
17
18     def handle(self, verbosity, directory, zone=None, **kwargs):
19         monthdir = datetime.datetime.today().strftime('%Y-%m')
20
21         nonstop_zone = Nonstop.objects.get(slug=zone) if zone else None
22
23         filepaths = []
24         for basedir, dirnames, filenames in os.walk(directory):
25             filepaths.extend(
26                 [
27                     os.path.join(basedir, x)
28                     for x in filenames
29                     if os.path.splitext(x)[-1] in ('.mp3', '.ogg', '.flac', '.opus')
30                 ]
31             )
32         filepaths.sort()
33
34         total = len(filepaths)
35
36         for i, filepath in enumerate(filepaths):
37             try:
38                 metadata = mutagen.File(filepath, easy=True)
39             except:
40                 print('failed to get metadata', filepath)
41                 continue
42             if not metadata or not metadata.get('artist') or not metadata.get('title'):
43                 print('missing metadata', filepath)
44                 continue
45
46             artist_name = metadata.get('artist')[0]
47             track_title = metadata.get('title')[0]
48
49             if verbosity:
50                 print('[%s/%s] %s - %s' % (i, total, artist_name, track_title))
51
52             new_filepath = '%s/%s - %s - %s%s' % (
53                 monthdir,
54                 datetime.datetime.today().strftime('%y%m%d'),
55                 artist_name[:50].replace('/', ' ').strip(),
56                 track_title[:80].replace('/', ' ').strip(),
57                 os.path.splitext(filepath)[-1],
58             )
59
60             artist, created = Artist.objects.get_or_create(name=artist_name)
61             track, created = Track.objects.get_or_create(
62                 title=track_title,
63                 artist=artist,
64             )
65             if created or not track.file_exists():
66                 with open(filepath, 'rb') as fd:
67                     default_storage.save(os.path.join('nonstop', 'tracks', new_filepath), content=fd)
68                 nonstop_file = NonstopFile()
69                 nonstop_file.set_track_filepath(new_filepath)
70                 nonstop_file.track = track
71                 nonstop_file.save()
72
73                 if nonstop_zone:
74                     track.nonstop_zones.add(nonstop_zone)
75                 if not track.added_to_nonstop_timestamp:
76                     track.added_to_nonstop_timestamp = now()
77                 track.save()
78             else:
79                 if nonstop_zone:
80                     track.nonstop_zones.add(nonstop_zone)
81                 if not track.added_to_nonstop_timestamp:
82                     track.added_to_nonstop_timestamp = now()
83                 track.save()