def _checksong(self, song): # it is ok if the song is contained in a local song database, so we first # check whether this is the case. # XXX make this behaviour configurable? stats = hub.request(requests.getdatabasestats(song.songdbid)) if isinstance(song, item.song): if stats.type == "local": return song return song # XXX do we really need this # currently it does not work anymore if os.path.isfile(song.path): # first we try to access the song via its filesystem path return hub.request(requests.queryregistersong(self.songdbid, song.path)) if song.artist != dbitem.UNKNOWN and song.album != dbitem.UNKNOWN: # otherwise we use the artist and album tags and try to obtain the song via # the database songs = hub.request(requests.getsongs(self.songdbid, artist=song.artist, album=song.album)) for asong in songs: if asong.title == song.title: return asong # song not found # XXX start transmitting song return
def _checksong(self, song): # it is ok if the song is contained in a local song database, so we first # check whether this is the case. # XXX make this behaviour configurable? stats = hub.request(requests.getdatabasestats(song.songdbid)) if isinstance(song, item.song): if stats.type == "local": return song return song # XXX do we really need this # currently it does not work anymore if os.path.isfile(song.path): # first we try to access the song via its filesystem path return hub.request( requests.queryregistersong(self.songdbid, song.path)) if song.artist != dbitem.UNKNOWN and song.album != dbitem.UNKNOWN: # otherwise we use the artist and album tags and try to obtain the song via # the database songs = hub.request( requests.getsongs(self.songdbid, artist=song.artist, album=song.album)) for asong in songs: if asong.title == song.title: return asong # song not found # XXX start transmitting song return
def getcontents(self): songs = hub.request( requests.getsongs(self.songdbid, filters=self.filters, sort=self.order)) self.nrsongs = len(songs) return songs
def getnumberofsongs(self, request): if request.songdbid is not None and request.songdbid not in self.songdbids: log.error("songdbmanager: invalid songdbid '%r' for database request" % request.songdbid) # XXX use filters in sqlite instead if request.songdbid is not None and request.filters is None: return self.songdbhub.request(request) else: return len(self.dbrequestsongs(requests.getsongs(songdbid=request.songdbid, filters=request.filters)))
def getcontents(self): songs = [] while len(songs)<self.maxnr: newsongs = hub.request(requests.getsongs(self.songdbid, filters=self.filters, random=True)) if len(newsongs) > 0: songs.extend(newsongs) else: break return songs[:self.maxnr]
def _registerorupdatesong(self, path, force): """ register or update song in database and return it If force is set, the mtime of the song file is ignored. """ if not path.startswith(self.basedir): log.error("Path of song not in basedir of database") return None # generate url corresponding to song if self.basedir.endswith("/"): relpath = path[len(self.basedir):] else: relpath = path[len(self.basedir)+1:] song_url = u"file://" + encoding.decode_path(relpath) urlfilter = item.filters((item.urlfilter(song_url),)) songs = self._request(requests.getsongs(self.songdbid, filters=urlfilter)) if songs: # there is exactly one resulting song song = songs[0] song.song_metadata = self._request(requests.getsong_metadata(self.songdbid, song.id)) try: if force or song.song_metadata.date_updated < os.stat(path).st_mtime: # the song has changed since the last update newsong_metadata = metadata.metadata_from_file(relpath, self.basedir, self.tracknrandtitlere, self.postprocessors) song.song_metadata.update(newsong_metadata) self._notify(events.update_song(self.songdbid, song)) log.debug("registerer: song '%r' rescanned" % song_url) else: log.debug("registerer: not scanning unchanged song '%r'" % song_url) except (IOError, OSError, RuntimeError): log.debug("registerer: song '%r' can no longer be read. deleting it from db" % song_url) self._notify(events.delete_song(self.songdbid, song)) else: # song was not stored in database newsong_metadata = metadata.metadata_from_file(relpath, self.basedir, self.tracknrandtitlere, self.postprocessors) self._notify(events.add_song(self.songdbid, newsong_metadata)) # fetch new song from database song = self._request(requests.getsongs(self.songdbid, filters=urlfilter))[0] return song
def getcontents(self): songs = [] while len(songs) < self.maxnr: newsongs = hub.request( requests.getsongs(self.songdbid, filters=self.filters, random=True)) if len(newsongs) > 0: songs.extend(newsongs) else: break return songs[:self.maxnr]
def getnumberofsongs(self, request): if request.songdbid is not None and request.songdbid not in self.songdbids: log.error( "songdbmanager: invalid songdbid '%r' for database request" % request.songdbid) # XXX use filters in sqlite instead if request.songdbid is not None and request.filters is None: return self.songdbhub.request(request) else: return len( self.dbrequestsongs( requests.getsongs(songdbid=request.songdbid, filters=request.filters)))
def autoregistersongs(self, event): if self.songdbid == event.songdbid: oldsongs = set(hub.request(requests.getsongs(self.songdbid))) log.info(_("database %r: scanning for songs in %r (currently %d songs registered)") % (self.songdbid, self.basedir, len(oldsongs))) # scan for all songs in the filesystem log.debug("database %r: searching for new songs" % self.songdbid) self.registerdirtree(self.basedir, oldsongs, event.force) # remove songs which have not yet been scanned and thus are not accesible anymore log.info(_("database %r: removing %d stale songs") % (self.songdbid, len(oldsongs))) for song in oldsongs: self._notify(events.delete_song(self.songdbid, song)) nrsongs = hub.request(requests.getnumberofsongs(self.songdbid)) log.info(_("database %r: rescan finished (%d songs registered)") % (self.songdbid, nrsongs))
def playlist_requestnextsong(self, request): if request.playlistid != self.id: raise hub.DenyRequest if not request.previous: nextitem = self._playnext() if not nextitem: if self.autoplaymode == "random": # add some randomly selected song to the end of the playlist randomsongs = hub.request(requests.getsongs("main", random=True)) if randomsongs: self._addsongs(randomsongs[0:1]) nextitem = self._playnext() elif self.autoplaymode == "repeat": self._markallunplayed() nextitem = self._playnext() else: nextitem = self._playprevious() self.notifyplaylistchanged() return nextitem
def playlist_requestnextsong(self, request): if request.playlistid != self.id: raise hub.DenyRequest if not request.previous: nextitem = self._playnext() if not nextitem: if self.autoplaymode == "random": # add some randomly selected song to the end of the playlist randomsongs = hub.request( requests.getsongs("main", random=True)) if randomsongs: self._addsongs(randomsongs[0:1]) nextitem = self._playnext() elif self.autoplaymode == "repeat": self._markallunplayed() nextitem = self._playnext() else: nextitem = self._playprevious() self.notifyplaylistchanged() return nextitem
def getcontentsrecursiverandom(self): return hub.request(requests.getsongs(self.songdbid, sort=self.order, filters=self.filters, random=True))
def getcontents(self): return hub.request(requests.getsongs(self.songdbid, sort=self.order, filters=self.filters))
def getcontents(self): songs = hub.request(requests.getsongs(self.songdbid, filters=self.filters, sort=self.order)) self.nrsongs = len(songs) return songs
def getcontentsrecursive(self): return hub.request(requests.getsongs(self.songdbid, filters=self.filters))
def getcontents(self): songs = hub.request( requests.getsongs(self.songdbid, sort=self.order, filters=self.filters)) return songs
def getcontents(self): return hub.request( requests.getsongs(self.songdbid, filters=self.filters, sort=self.order))
def getcontentsrecursive(self): return hub.request( requests.getsongs(self.songdbid, filters=self.filters))
def getcontentsrecursiverandom(self): return hub.request( requests.getsongs(self.songdbid, filters=self.filters, random=True))