Files
MarietjeDjango/marietje/marietje/management/commands/importhistory.py
2017-11-03 19:46:15 +01:00

66 lines
2.6 KiB
Python

import json
from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
from songs.models import Song
from queues.models import PlaylistSong
from ...utils import get_first_queue
QUEUEDB_FORMAT = b'RequestID TrackID RequestedBy Played\n'
class Command(BaseCommand):
help = 'Import history from a JSON file exported from a previous version of Marietje.'
def add_arguments(self, parser):
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('--json_file')
group.add_argument('--tsv_file')
def handle(self, *args, **options):
if options['json_file']:
filename = options['json_file']
User = get_user_model()
with open(filename) as fp:
for line in fp:
request = json.loads(line)
# Ignore random queue and requests without media (?).
if request['b'] is None or request['m'] is None:
continue
song = Song.objects.filter(old_id=request['m']['$oid']).first()
user = User.objects.filter(username=request['b']).first()
playlist = get_first_queue().playlist
if song is None or user is None or playlist is None:
continue
playlist_song = PlaylistSong(playlist=playlist, song=song, user=user, state=2, order=0)
playlist_song.save()
if options['tsv_file']:
filename = options['tsv_file']
User = get_user_model()
with open(filename, 'rb') as fp:
line = fp.readline()
assert line == QUEUEDB_FORMAT, "invalid file header: {}".format(line)
for line in fp:
# RequestID TrackID RequestedBy Played
import_req = line.strip(b'\n').split(b'\t')
song = Song.objects.filter(old_id=import_req[1]).first()
user = User.objects.filter(username=import_req[3]).first()
if song is None or user is None or playlist is None:
continue
playlist_song = PlaylistSong(
playlist=get_first_queue().playlist,
song=song, user=user,
state=2, # already played
order=0)
try:
playlist_song.save()
except OperationalError as e:
print('Error: {}'.format(e))
continue
print('Done importing history.')