11import logging
22import os
33
4- from . import dataprovider
5- from .datastore import DataStore
4+ from prodj . data . exceptions import FatalQueryError
5+ from prodj . data .datastore import DataStore
66from prodj .pdblib .pdbdatabase import PDBDatabase
77from prodj .pdblib .usbanlzdatabase import UsbAnlzDatabase
88from prodj .network .rpcreceiver import ReceiveTimeout
@@ -16,6 +16,15 @@ def __init__(self, reason):
1616 def __str__ (self ):
1717 return self .reason
1818
19+ def wrap_get_name_from_db (call , id ):
20+ if id == 0 :
21+ return ""
22+ try :
23+ return call (id ).name
24+ except KeyError as e :
25+ logging .warning (f'Broken database: { e } ' )
26+ return "?"
27+
1928class PDBProvider :
2029 def __init__ (self , prodj ):
2130 self .prodj = prodj
@@ -39,7 +48,7 @@ def delete_pdb(self, filename):
3948 def download_pdb (self , player_number , slot ):
4049 player = self .prodj .cl .getClient (player_number )
4150 if player is None :
42- raise dataprovider . FatalQueryError ("player {} not found in clientlist" .format (player_number ))
51+ raise FatalQueryError ("player {} not found in clientlist" .format (player_number ))
4352 filename = "databases/player-{}-{}.pdb" .format (player_number , slot )
4453 self .delete_pdb (filename )
4554 try :
@@ -49,7 +58,7 @@ def download_pdb(self, player_number, slot):
4958 logging .debug ("default pdb path not found on player %d, trying MacOS path" , player_number )
5059 self .prodj .nfs .enqueue_download (player .ip_addr , slot , "/.PIONEER/rekordbox/export.pdb" , filename , sync = True )
5160 except (RuntimeError , ReceiveTimeout ) as e :
52- raise dataprovider . FatalQueryError ("database download from player {} failed: {}" .format (player_number , e ))
61+ raise FatalQueryError ("database download from player {} failed: {}" .format (player_number , e ))
5362 return filename
5463
5564 def download_and_parse_pdb (self , player_number , slot ):
@@ -58,27 +67,27 @@ def download_and_parse_pdb(self, player_number, slot):
5867 try :
5968 db .load_file (filename )
6069 except RuntimeError as e :
61- raise dataprovider . FatalQueryError ("PDBProvider: failed to parse \" {}\" : {}" .format (filename , e ))
70+ raise FatalQueryError ("PDBProvider: failed to parse \" {}\" : {}" .format (filename , e ))
6271 return db
6372
6473 def get_db (self , player_number , slot ):
6574 if (player_number , slot ) not in self .dbs :
6675 try :
6776 db = self .download_and_parse_pdb (player_number , slot )
68- except dataprovider . FatalQueryError as e :
77+ except FatalQueryError as e :
6978 db = InvalidPDBDatabase (str (e ))
7079 finally :
7180 self .dbs [player_number , slot ] = db
7281 else :
7382 db = self .dbs [player_number , slot ]
7483 if isinstance (db , InvalidPDBDatabase ):
75- raise dataprovider . FatalQueryError (f'PDB database not available: { db } ' )
84+ raise FatalQueryError (f'PDB database not available: { db } ' )
7685 return db
7786
7887 def download_and_parse_usbanlz (self , player_number , slot , anlz_path ):
7988 player = self .prodj .cl .getClient (player_number )
8089 if player is None :
81- raise dataprovider . FatalQueryError ("player {} not found in clientlist" .format (player_number ))
90+ raise FatalQueryError ("player {} not found in clientlist" .format (player_number ))
8291 dat = self .prodj .nfs .enqueue_buffer_download (player .ip_addr , slot , anlz_path )
8392 ext = self .prodj .nfs .enqueue_buffer_download (player .ip_addr , slot , anlz_path .replace ("DAT" , "EXT" ))
8493 db = UsbAnlzDatabase ()
@@ -99,16 +108,15 @@ def get_anlz(self, player_number, slot, track_id):
99108 def get_metadata (self , player_number , slot , track_id ):
100109 db = self .get_db (player_number , slot )
101110 track = db .get_track (track_id )
102- artist = db .get_artist (track .artist_id ).name if track .artist_id > 0 else ""
103- album = db .get_album (track .album_id ).name if track .album_id > 0 else ""
104- key = db .get_key (track .key_id ).name if track .key_id > 0 else ""
105- genre = db .get_genre (track .genre_id ).name if track .genre_id > 0 else ""
106- color_name = colors [track .color_id ] if track .color_id > 0 else ""
107- if track .color_id > 0 :
108- color = db .get_color (track .color_id )
109- color_text = color .name
110- else :
111- color_text = ""
111+ artist = wrap_get_name_from_db (db .get_artist , track .artist_id )
112+ album = wrap_get_name_from_db (db .get_album , track .album_id )
113+ key = wrap_get_name_from_db (db .get_key , track .key_id )
114+ genre = wrap_get_name_from_db (db .get_genre , track .genre_id )
115+ color_text = wrap_get_name_from_db (db .get_color , track .color_id )
116+
117+ color_name = ""
118+ if track .color_id in range (1 , len (colors )):
119+ color_name = colors [track .color_id ]
112120
113121 metadata = {
114122 "track_id" : track .id ,
@@ -135,7 +143,7 @@ def get_metadata(self, player_number, slot, track_id):
135143 def get_artwork (self , player_number , slot , artwork_id ):
136144 player = self .prodj .cl .getClient (player_number )
137145 if player is None :
138- raise dataprovider . FatalQueryError ("player {} not found in clientlist" .format (player_number ))
146+ raise FatalQueryError ("player {} not found in clientlist" .format (player_number ))
139147 db = self .get_db (player_number , slot )
140148 try :
141149 artwork = db .get_artwork (artwork_id )
@@ -222,30 +230,26 @@ def convert_and_sort_track_list(self, db, track_list, sort_mode):
222230 else :
223231 col2_name = sort_mode
224232 for track in track_list :
225- try :
226- if col2_name in ["title" , "artist" ]:
227- col2_item = db .get_artist (track .artist_id ).name if track .artist_id > 0 else ""
228- elif col2_name == "album" :
229- col2_item = db .get_album (track .album_id ).name if track .album_id > 0 else ""
230- elif col2_name == "genre" :
231- col2_item = db .get_genre (track .genre_id ).name if track .genre_id > 0 else ""
232- elif col2_name == "label" :
233- col2_item = db .get_label (track .label_id ).name if track .label_id > 0 else ""
234- elif col2_name == "original_artist" :
235- col2_item = db .get_artist (track .original_artist_id ).name if track .original_artist_id > 0 else ""
236- elif col2_name == "remixer" :
237- col2_item = db .get_artist (track .remixer_id ).name if track .remixer_id > 0 else ""
238- elif col2_name == "key" :
239- col2_item = db .get_key (track .key_id ).name if track .key_id > 0 else ""
240- elif col2_name == "bpm" :
241- col2_item = track .bpm_100 / 100
242- elif col2_name in ["rating" , "comment" , "duration" , "bitrate" , "play_count" ]: # 1:1 mappings
243- col2_item = track [col2_name ]
244- else :
245- raise dataprovider .FatalQueryError ("unknown sort mode {}" .format (sort_mode ))
246- except KeyError as e :
247- logging .warning (f'Broken database: { e } ' )
248- col2_item = "?"
233+ if col2_name in ["title" , "artist" ]:
234+ col2_item = wrap_get_name_from_db (db .get_artist , track .artist_id )
235+ elif col2_name == "album" :
236+ col2_item = wrap_get_name_from_db (db .get_album , track .album_id )
237+ elif col2_name == "genre" :
238+ col2_item = wrap_get_name_from_db (db .get_genre , track .genre_id )
239+ elif col2_name == "label" :
240+ col2_item = wrap_get_name_from_db (db .get_label , track .label_id )
241+ elif col2_name == "original_artist" :
242+ col2_item = wrap_get_name_from_db (db .get_artist , track .original_artist_id )
243+ elif col2_name == "remixer" :
244+ col2_item = wrap_get_name_from_db (db .get_artist , track .remixer_id )
245+ elif col2_name == "key" :
246+ col2_item = wrap_get_name_from_db (db .get_key , track .key_id )
247+ elif col2_name == "bpm" :
248+ col2_item = track .bpm_100 / 100
249+ elif col2_name in ["rating" , "comment" , "duration" , "bitrate" , "play_count" ]: # 1:1 mappings
250+ col2_item = track [col2_name ]
251+ else :
252+ raise FatalQueryError ("unknown sort mode {}" .format (sort_mode ))
249253 converted += [{
250254 "title" : track .title ,
251255 col2_name : col2_item ,
@@ -399,4 +403,4 @@ def handle_request(self, request, params):
399403 elif request == "mount_info" :
400404 return self .get_mount_info (* params )
401405 else :
402- raise dataprovider . FatalQueryError ("invalid request type {}" .format (request ))
406+ raise FatalQueryError ("invalid request type {}" .format (request ))
0 commit comments