예제 #1
0
    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
예제 #2
0
    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
예제 #3
0
 def getcontents(self):
     songs = hub.request(
         requests.getsongs(self.songdbid,
                           filters=self.filters,
                           sort=self.order))
     self.nrsongs = len(songs)
     return songs
예제 #4
0
파일: songdb.py 프로젝트: indera/PyTone
 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)))
예제 #5
0
파일: item.py 프로젝트: indera/PyTone
 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]
예제 #6
0
파일: sqlite.py 프로젝트: indera/PyTone
    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
예제 #7
0
 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]
예제 #8
0
 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)))
예제 #9
0
파일: sqlite.py 프로젝트: indera/PyTone
    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))
예제 #10
0
 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
예제 #11
0
 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
예제 #12
0
파일: item.py 프로젝트: indera/PyTone
 def getcontentsrecursiverandom(self):
     return hub.request(requests.getsongs(self.songdbid, sort=self.order, filters=self.filters, random=True))
예제 #13
0
파일: item.py 프로젝트: indera/PyTone
 def getcontents(self):
     return hub.request(requests.getsongs(self.songdbid, sort=self.order, filters=self.filters))
예제 #14
0
파일: item.py 프로젝트: indera/PyTone
 def getcontents(self):
     songs = hub.request(requests.getsongs(self.songdbid, filters=self.filters, sort=self.order))
     self.nrsongs = len(songs)
     return songs
예제 #15
0
파일: item.py 프로젝트: indera/PyTone
 def getcontentsrecursive(self):
     return hub.request(requests.getsongs(self.songdbid, filters=self.filters))
예제 #16
0
 def getcontents(self):
     songs = hub.request(
         requests.getsongs(self.songdbid,
                           sort=self.order,
                           filters=self.filters))
     return songs
예제 #17
0
 def getcontents(self):
     return hub.request(
         requests.getsongs(self.songdbid,
                           filters=self.filters,
                           sort=self.order))
예제 #18
0
 def getcontentsrecursive(self):
     return hub.request(
         requests.getsongs(self.songdbid, filters=self.filters))
예제 #19
0
 def getcontentsrecursiverandom(self):
     return hub.request(
         requests.getsongs(self.songdbid, filters=self.filters,
                           random=True))