maloja/maloja/upgrade.py

91 lines
2.9 KiB
Python

# This module should take care of recognizing old install data and upgrading it before the actual server deals with it
import os
import re
import csv
from doreah.logging import log
from doreah.io import col
from .pkg_global.conf import data_dir, dir_settings
from .apis import _apikeys
# Dealing with old style tsv files - these should be phased out everywhere
def read_tsvs(path,types):
result = []
for f in os.listdir(path):
if f.split('.')[-1].lower() != 'tsv': continue
filepath = os.path.join(path,f)
result += read_tsv(filepath,types)
return result
def read_tsv(filename,types):
with open(filename,'r') as filed:
reader = csv.reader(filed,delimiter="\t")
rawentries = [[col for col in entry if col] for entry in reader if len(entry)>0 and not entry[0].startswith('#')]
converted_entries = [[coltype(col) for col,coltype in zip(entry,types)] for entry in rawentries]
return converted_entries
def upgrade_apikeys():
oldfile = os.path.join(dir_settings['config'],"clients","authenticated_machines.tsv")
if os.path.exists(oldfile):
try:
entries = read_tsv(oldfile)
for key,identifier in entries:
_apikeys.apikeystore[identifier] = key
os.remove(oldfile)
except Exception:
pass
def upgrade_db(callback_add_scrobbles):
oldfolder = os.path.join(dir_settings['state'],"scrobbles")
newfolder = os.path.join(dir_settings['state'],".v2scrobbles")
os.makedirs(newfolder,exist_ok=True)
if os.path.exists(oldfolder):
scrobblefiles = [f for f in os.listdir(oldfolder) if f.endswith(".tsv")]
if len(scrobblefiles) > 0:
log("Upgrading v2 Database to v3 Database. This could take a while...",color='yellow')
idx = 0
for sf in scrobblefiles:
idx += 1
if re.match(r"[0-9]+_[0-9]+\.tsv",sf):
origin = 'legacy'
elif sf == "lastfmimport.tsv":
origin = 'import:lastfm'
elif sf == "spotifyimport.tsv":
origin = 'import:spotify'
else:
origin = 'unknown'
scrobbles = read_tsv(os.path.join(oldfolder,sf),[int,str,str,str,str])
#scrobbles = tsv.parse(os.path.join(oldfolder,sf),"int","string","string","string","string",comments=False)
scrobblelist = []
log(f"\tImporting from {sf} ({idx}/{len(scrobblefiles)}) - {len(scrobbles)} Scrobbles")
for scrobble in scrobbles:
timestamp, artists, title, album, duration, *_ = scrobble + [None,None]
if album in ('-',''): album = None
if duration in ('-',''): duration = None
scrobblelist.append({
"time":int(timestamp),
"track":{
"artists":artists.split(''),
"title":title,
"length":None
},
"duration":duration,
"origin":origin,
"extra":{
"album_name":album
# saving this in the scrobble instead of the track because for now it's not meant
# to be authorative information, just payload of the scrobble
}
})
callback_add_scrobbles(scrobblelist)
os.rename(os.path.join(oldfolder,sf),os.path.join(newfolder,sf))
log("Done!",color='yellow')