class UpdaterAgent(AgentThreadedBase): INTERVAL = 10 * 15 def __init__(self): """ @param interval: interval in seconds """ AgentThreadedBase.__init__(self) self.count = 0 self.db = None def h_shutdown(self): print "Updater - shutdown" def h_tick(self, _count): self.count += 1 if self.count > self.INTERVAL: self.do_update() self.count = 0 def _setupDb(self): if self.db is None: try: self.db = UserTracksDb() except: self.db = None def do_update(self): self._setupDb() if self.db is None: return batch = self.db.findNextToUpdate() self.pub("track_batch", batch) total = self.db.getToUpdateCount() self.pub("toUpdateCount", total) if total > 0: self.pub("log", "Updater - # tracks to update: %s" % str(total)) def h_track_info(self, track_info): track = track_info["name"] artist = track_info["artist.name"] # print "updater.track_info: artist(%s) track(%s)" % (artist, track) try: playcount = int(track_info["userplaycount"]) except Exception, e: self.pub( "log", "warning", "Updater - track_info with missing field(%s), artist(%s) track(%s)" % (e, artist, track), ) playcount = 0 ts = int(time.time()) self.pub("track_to_update", ts, track, artist, playcount)
class DbWriter(AgentThreadedBase): def __init__(self): """ @param interval: interval in seconds """ AgentThreadedBase.__init__(self) self.db=None def _setup(self): try: self.db=UserTracksDb() except: self.db=None def h_shutdown(self): try: self.db.close() except: pass def h_track_to_update(self, ts, track, artist, playcount): self._setup() if self.db is None: return try: count=self.db.updateOne(ts, track, artist, playcount) except Exception,e: self.pub("errorDbWriting", "DbWriter - "+str(e)) return self.pub("updated", (artist, track, playcount, count)) try: count=self.db.UniqueTracks_InsertIfNotExists(playcount, track, "", artist, "", "", "") self.pub("log", "Updated artist(%s) track(%s) playcount(%s)" % (artist, track, playcount)) except Exception,e: self.pub("errorDbWriting", "DbWriter - "+str(e)) return
class SignalRx(dbus.service.Object): """ DBus signals for the /Player path """ PATH="/Records" def __init__(self): dbus.service.Object.__init__(self, dbus.SessionBus(), self.PATH) self.db=None dbus.Bus().add_signal_receiver(self.sQRecords, signal_name="qRecords", dbus_interface="com.jldupont.lastfm.proxy", bus_name=None, path="/Records" ) dbus.Bus().add_signal_receiver(self.sQRecordsLatest, signal_name="qRecordsLatest", dbus_interface="com.jldupont.lastfm.proxy", bus_name=None, path="/Records" ) @dbus.service.signal(dbus_interface="com.jldupont.lastfm.proxy", signature="aa{sv}") def Records(self, list_dic): """ Result 'output' signal A list of dictionaries i.e. array of array of {string:variant} entries """ @dbus.service.signal(dbus_interface="com.jldupont.lastfm.proxy", signature="aa{sv}") def RecordsLatest(self, list_dic): """ Result 'output' signal A list of dictionaries i.e. array of array of {string:variant} entries """ def sQRecords(self, ts_start, limit): """ DBus signal handler - /Records/qRecords @todo: more user friendly error reporting... """ try: ts=int(ts_start) except: print "** expecting integer 'ts_start'" return try: l=int(limit) except: print "** expecting integer 'limit'" return #print "sQRecords: ts_start: %s -- limit: %s" % (ts_start, limit) self.setup() try: records=self.db.getRecords(ts, l) except: records=None rs=self.formatRecordSet(records) self.Records(rs) def sQRecordsLatest(self, ts_start, limit): """ DBus signal handler - /Records/qRecordsLatest @todo: more user friendly error reporting... """ try: ts=int(ts_start) except: print "** expecting integer 'ts_start'" return try: l=int(limit) except: print "** expecting integer 'limit'" return #print "sQRecords: ts_start: %s -- limit: %s" % (ts_start, limit) self.setup() try: records=self.db.getRecordsLatest(ts, l) except: records=None #print records rs=self.formatRecordSet(records) self.RecordsLatest(rs) def formatRecordSet(self, records): rs=[] for r in records: id, created, updated, playcount, track_name, track_mbid, artist_name, artist_mbid, album_name, album_mbid=r entry={} entry["id"]=id entry["created"]=created entry["updated"]=updated entry["playcount"]=playcount entry["track_name"]=track_name entry["track_mbid"]=track_mbid entry["artist_name"]=artist_name entry["artist_mbid"]=artist_mbid entry["album_name"]=album_name entry["album_mbid"]=album_mbid rs.append(entry) return rs def setup(self): if self.db is not None: return try: self.db=UserTracksDb() except: self.db=None def shutdown(self): try: self.db.close() except: pass
def setup(self): if self.db is not None: return try: self.db=UserTracksDb() except: self.db=None
def _setup(self): try: self.db=UserTracksDb() except: self.db=None
def _setupDb(self): if self.db is None: try: self.db = UserTracksDb() except: self.db = None