1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | diff --git a/plugins/lyrics/lyrics.py b/plugins/lyrics/lyrics.py index 13124b3..45b054a 100644 --- a/plugins/lyrics/lyrics.py +++ b/plugins/lyrics/lyrics.py @@ -32,6 +32,7 @@ import urllib.request import rb from gi.repository import Gtk, Gio, GObject, Peas from gi.repository import RB +from gi.repository import Gst, GstPbutils import LyricsParse from LyricsConfigureDialog import LyricsConfigureDialog @@ -142,10 +143,36 @@ class LyricGrabber(object): def verify_lyric(self): return os.path.exists(self.cache_path) + + + def lyric_from_tag(self): + """ + Extract lyrics from the file meta data (tags) + Currently supported formats: + - ogg/vorbis files with "LYRICS" tag + """ + location = self.entry.get_playback_uri() + print("discovering %s" % location) + self.discoverer = GstPbutils.Discoverer(timeout=Gst.SECOND*1) + info = self.discoverer.discover_uri(location) + tags = info.get_tags() + if tags is None: + return + + for i in range(tags.get_tag_size("extended-comment")): + (exists, value) = tags.get_string_index("extended-comment", i) + if exists and value.startswith("LYRICS"): + text = value.replace("LYRICS=", "") + return text def search_lyrics(self, callback, cache_only=False): self.callback = callback - + + text = self.lyric_from_tag() + if text is not None: + self.callback(text) + return + status = self.verify_lyric() if status: |
1 | ./shell/rhythmbox --debug-match lyrics filename.ogg |
(14:13:55) [0x1c7bb20] [LyricGrabber.search_lyrics] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:299: discovering file:///home/cweiske/Musik/neu/Britney%20Spears/Femme%20Fatale/Britney%20Spears%20-%20Femme%20Fatale%20-%2003%20-%20Inside%20Out.ogg (14:13:55) [0x1c7bb20] [LyricGrabber.search_lyrics] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:303: abc (14:13:55) [0x1c7bb20] [fetags] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:317: tag: title (14:13:55) [0x1c7bb20] [fetags] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:317: tag: artist (14:13:55) [0x1c7bb20] [fetags] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:317: tag: album (14:13:55) [0x1c7bb20] [fetags] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:317: tag: datetime (14:13:55) [0x1c7bb20] [fetags] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:317: tag: track-number (14:13:55) [0x1c7bb20] [fetags] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:317: tag: track-count (14:13:55) [0x1c7bb20] [fetags] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:317: tag: genre (14:13:55) [0x1c7bb20] [fetags] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:317: tag: image (14:13:55) [0x1c7bb20] [fetags] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:317: tag: extended-comment (14:13:55) [0x1c7bb20] [fetags] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:317: tag: encoder (14:13:55) [0x1c7bb20] [fetags] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:317: tag: encoder-version (14:13:55) [0x1c7bb20] [fetags] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:317: tag: audio-codec (14:13:55) [0x1c7bb20] [fetags] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:317: tag: nominal-bitrate (14:13:55) [0x1c7bb20] [fetags] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:317: tag: bitrate (14:13:55) [0x1c7bb20] [fetags] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:317: tag: container-format (14:13:55) [0x1c7bb20] [LyricGrabber.search_lyrics] /home/cweiske/php/rhythmbox/rhythmbox/data/../plugins/lyrics/lyrics.py:311: found lyrics tag: LYRICS=Said you're gonna be here in a minute Sitting in the mirror getting pretty Gotta look my best if we're gonna break up Gotta look my best if we're gonna break up
$ gst-discoverer-1.0 file.ogg https://lazka.github.io/pgi-docs/GstPbutils-1.0/classes/DiscovererInfo.html#GstPbutils.DiscovererInfo
1 2 3 4 5 6 7 | for i in range(tags.get_tag_size("extended-comment")): (exists, read) = tags.get_string_index("extended-comment", i) if exists and read.startswith("DISCSUBTITLE"): discname = read.replace("DISCSUBTITLE=", "") break return discname |
1 2 3 | def fetags (list, tag): print("tag: %s" % tag) tags.foreach(fetags) |