def get_property(self, interface, name): if interface == MediaObject.IFACE: if name == "Parent": return BASE_PATH + "/" + self.__prefix elif name == "Type": return "music" elif name == "Path": path = SongObject.PATH path += "/" + self.__prefix + "/" + str(id(self.__song)) return path elif name == "DisplayName": return unival(self.__song.comma("title")) elif interface == MediaItem.IFACE: if name == "URLs": return [self.__song("~uri")] elif name == "MIMEType": mimes = self.__song.mimes return mimes and mimes[0] elif name == "Size": return self.__song("~#filesize") elif name == "Artist": return unival(self.__song.comma("artist")) elif name == "Album": return unival(self.__song.comma("album")) elif name == "Date": return unival(self.__song.comma("date")) elif name == "Genre": return unival(self.__song.comma("genre")) elif name == "Duration": return self.__song("~#length") elif name == "TrackNumber": return self.__song("~#track", 0)
def get_property(self, interface, name): if interface == MediaContainer.IFACE: if name == "ChildCount" or name == "ItemCount": return len(self.__album.songs) elif name == "ContainerCount": return 0 elif name == "Searchable": return False elif interface == MediaObject.IFACE: if name == "Parent": return self.parent.PATH elif name == "Type": return "container" elif name == "Path": return self.PATH elif name == "DisplayName": return unival(self.__pattern % self.__album)
def __get_metadata_real(self): """ https://www.freedesktop.org/wiki/Specifications/mpris-spec/metadata/ """ metadata = {} metadata["mpris:trackid"] = self.__get_current_track_id() def ignore_overflow(dbus_type, value): try: return dbus_type(value) except OverflowError: return 0 song = app.player.info if not song: return metadata metadata["mpris:length"] = ignore_overflow( dbus.Int64, song("~#length") * 10 ** 6) if self.__cover is not None: self.__cover.close() self.__cover = None cover = app.cover_manager.get_cover(song) if cover: is_temp = cover.name.startswith(tempfile.gettempdir()) if is_temp: self.__cover = cover metadata["mpris:artUrl"] = fsn2uri(cover.name) # All list values list_val = {"artist": "artist", "albumArtist": "albumartist", "comment": "comment", "composer": "composer", "genre": "genre", "lyricist": "lyricist"} for xesam, tag in iteritems(list_val): vals = song.list(tag) if vals: metadata["xesam:" + xesam] = listmap(unival, vals) # All single values sing_val = {"album": "album", "title": "title", "asText": "~lyrics"} for xesam, tag in iteritems(sing_val): vals = song.comma(tag) if vals: metadata["xesam:" + xesam] = unival(vals) # URI metadata["xesam:url"] = song("~uri") # Integers num_val = {"audioBPM": "bpm", "discNumber": "disc", "trackNumber": "track", "useCount": "playcount"} for xesam, tag in iteritems(num_val): val = song("~#" + tag, None) if val is not None: metadata["xesam:" + xesam] = ignore_overflow(dbus.Int32, val) # Rating metadata["xesam:userRating"] = ignore_overflow( dbus.Double, song("~#rating")) # Dates ISO_8601_format = "%Y-%m-%dT%H:%M:%S" tuple_time = time.gmtime(song("~#lastplayed")) iso_time = time.strftime(ISO_8601_format, tuple_time) metadata["xesam:lastUsed"] = iso_time year = song("~year") if year: try: tuple_time = time.strptime(year, "%Y") iso_time = time.strftime(ISO_8601_format, tuple_time) except ValueError: pass else: metadata["xesam:contentCreated"] = iso_time return metadata
def _get_metadata(song): #http://xmms2.org/wiki/MPRIS_Metadata#MPRIS_v1.0_Metadata_guidelines metadata = dbus.Dictionary(signature="sv") if not song: return metadata # Missing: "audio-samplerate", "video-bitrate" strings = { "location": "~uri", "title": "title", "artist": "artist", "album": "album", "tracknumber": "tracknumber", "genre": "genre", "comment": "comment", "asin": "asin", "puid fingerprint": "musicip_puid", "mb track id": "musicbrainz_trackid", "mb artist id": "musicbrainz_artistid", "mb artist sort name": "artistsort", "mb album id": "musicbrainz_albumid", "mb release date": "date", "mb album artist": "albumartist", "mb album artist id": "musicbrainz_albumartistid", "mb album artist sort name": "albumartistsort", } for key, tag in iteritems(strings): val = song.comma(tag) if val: metadata[key] = unival(val) nums = [("audio-bitrate", 1024, "~#bitrate"), ("rating", 5, "~#rating"), ("year", 1, "~#year"), ("time", 1, "~#length"), ("mtime", 1000, "~#length")] for target, mul, key in nums: value = song(key, None) if value is None: continue value = int(value * mul) # dbus uses python types to guess the dbus type without # checking maxint, also we need uint (dbus always trys int) try: value = dbus.UInt32(value) except OverflowError: continue metadata[target] = value year = song("~year") if year: try: tuple_time = time.strptime(year, "%Y") except ValueError: pass else: try: date = int(time.mktime(tuple_time)) date = dbus.UInt32(date) except (ValueError, OverflowError): pass else: metadata["date"] = date return metadata
def __get_metadata(self): """http://xmms2.org/wiki/MPRIS_Metadata""" metadata = {} metadata["mpris:trackid"] = self.__get_current_track_id() song = app.player.info if not song: return metadata metadata["mpris:length"] = dbus.Int64(song("~#length") * 10**6) self.__cover = cover = app.cover_manager.get_cover(song) is_temp = False if cover: name = cover.name is_temp = name.startswith(tempfile.gettempdir()) # This doesn't work for embedded images.. the file gets unlinked # after loosing the file handle metadata["mpris:artUrl"] = str(URI.frompath(name)) if not is_temp: self.__cover = None # All list values list_val = { "artist": "artist", "albumArtist": "albumartist", "comment": "comment", "composer": "composer", "genre": "genre", "lyricist": "lyricist" } for xesam, tag in list_val.iteritems(): vals = song.list(tag) if vals: metadata["xesam:" + xesam] = map(unival, vals) # All single values sing_val = {"album": "album", "title": "title", "asText": "~lyrics"} for xesam, tag in sing_val.iteritems(): vals = song.comma(tag) if vals: metadata["xesam:" + xesam] = unival(vals) # URI metadata["xesam:url"] = song("~uri") # Integers num_val = { "audioBPM": "bpm", "discNumber": "disc", "trackNumber": "track", "useCount": "playcount" } for xesam, tag in num_val.iteritems(): val = song("~#" + tag, None) if val is not None: metadata["xesam:" + xesam] = int(val) # Rating metadata["xesam:userRating"] = float(song("~#rating")) # Dates ISO_8601_format = "%Y-%m-%dT%H:%M:%S" tuple_time = time.gmtime(song("~#lastplayed")) iso_time = time.strftime(ISO_8601_format, tuple_time) metadata["xesam:lastUsed"] = iso_time year = song("~year") if year: try: tuple_time = time.strptime(year, "%Y") iso_time = time.strftime(ISO_8601_format, tuple_time) except ValueError: pass else: metadata["xesam:contentCreated"] = iso_time return metadata
def _get_metadata(song): #http://xmms2.org/wiki/MPRIS_Metadata#MPRIS_v1.0_Metadata_guidelines metadata = dbus.Dictionary(signature="sv") if not song: return metadata # Missing: "audio-samplerate", "video-bitrate" strings = {"location": "~uri", "title": "title", "artist": "artist", "album": "album", "tracknumber": "tracknumber", "genre": "genre", "comment": "comment", "asin": "asin", "puid fingerprint": "musicip_puid", "mb track id": "musicbrainz_trackid", "mb artist id": "musicbrainz_artistid", "mb artist sort name": "artistsort", "mb album id": "musicbrainz_albumid", "mb release date": "date", "mb album artist": "albumartist", "mb album artist id": "musicbrainz_albumartistid", "mb album artist sort name": "albumartistsort", } for key, tag in strings.items(): val = song.comma(tag) if val: metadata[key] = unival(val) nums = [("audio-bitrate", 1024, "~#bitrate"), ("rating", 5, "~#rating"), ("year", 1, "~#year"), ("time", 1, "~#length"), ("mtime", 1000, "~#length")] for target, mul, key in nums: value = song(key, None) if value is None: continue value = int(value * mul) # dbus uses python types to guess the dbus type without # checking maxint, also we need uint (dbus always tries int) try: value = dbus.UInt32(value) except OverflowError: continue metadata[target] = value year = song("~year") if year: try: tuple_time = time.strptime(year, "%Y") except ValueError: pass else: try: date = int(time.mktime(tuple_time)) date = dbus.UInt32(date) except (ValueError, OverflowError): pass else: metadata["date"] = date return metadata
def __get_metadata(self): """http://xmms2.org/wiki/MPRIS_Metadata""" metadata = {} metadata["mpris:trackid"] = self.__get_current_track_id() song = app.player.info if not song: return metadata metadata["mpris:length"] = dbus.Int64(song("~#length") * 10 ** 6) self.__cover = cover = app.cover_manager.get_cover(song) is_temp = False if cover: name = cover.name is_temp = name.startswith(tempfile.gettempdir()) # This doesn't work for embedded images.. the file gets unlinked # after loosing the file handle metadata["mpris:artUrl"] = str(URI.frompath(name)) if not is_temp: self.__cover = None # All list values list_val = { "artist": "artist", "albumArtist": "albumartist", "comment": "comment", "composer": "composer", "genre": "genre", "lyricist": "lyricist", } for xesam, tag in list_val.iteritems(): vals = song.list(tag) if vals: metadata["xesam:" + xesam] = map(unival, vals) # All single values sing_val = {"album": "album", "title": "title", "asText": "~lyrics"} for xesam, tag in sing_val.iteritems(): vals = song.comma(tag) if vals: metadata["xesam:" + xesam] = unival(vals) # URI metadata["xesam:url"] = song("~uri") # Integers num_val = {"audioBPM": "bpm", "discNumber": "disc", "trackNumber": "track", "useCount": "playcount"} for xesam, tag in num_val.iteritems(): val = song("~#" + tag, None) if val is not None: metadata["xesam:" + xesam] = int(val) # Rating metadata["xesam:userRating"] = float(song("~#rating")) # Dates ISO_8601_format = "%Y-%m-%dT%H:%M:%S" tuple_time = time.gmtime(song("~#lastplayed")) iso_time = time.strftime(ISO_8601_format, tuple_time) metadata["xesam:lastUsed"] = iso_time year = song("~year") if year: try: tuple_time = time.strptime(year, "%Y") iso_time = time.strftime(ISO_8601_format, tuple_time) except ValueError: pass else: metadata["xesam:contentCreated"] = iso_time return metadata