rhythmbox lyrics WIP

revision b04d50ab9535eef35dd7f58d5fb5ad5c02fb86f6

raw

0-patch.diff

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
52
53
54
diff --git a/plugins/lyrics/lyrics.py b/plugins/lyrics/lyrics.py
index 13124b3..7333f2f 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,39 @@ 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
+
+               def fetags (list, tag):
+                       print("tag: %s" % tag)
+               tags.foreach(fetags)
+               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:
 
raw

1-command.sh

1
 ./shell/rhythmbox --debug-match lyrics filename.ogg
raw

2-output.txt

(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
raw

4-other.txt

$ gst-discoverer-1.0 file.ogg

https://lazka.github.io/pgi-docs/GstPbutils-1.0/classes/DiscovererInfo.html#GstPbutils.DiscovererInfo
raw

5-copiedcode.py

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
 
raw

6-printalltags.py

1
2
3
               def fetags (list, tag):
                       print("tag: %s" % tag)
               tags.foreach(fetags)

History