(no commit message) master
authorChristian Weiske <cweiske@cweiske.de>
Sun, 9 Jul 2017 11:42:27 +0000 (13:42 +0200)
committerChristian Weiske <cweiske@cweiske.de>
Sun, 9 Jul 2017 11:42:27 +0000 (13:42 +0200)
0-patch.diff

index 28db46a5e7a177a0425be73772df2210d4f50003..05817465e28224c457a1bd72809d52752e784228 100644 (file)
@@ -1,5 +1,5 @@
 diff --git a/plugins/lyrics/lyrics.py b/plugins/lyrics/lyrics.py
-index 13124b3..6c93944 100644
+index 13124b3..c0f8de1 100644
 --- a/plugins/lyrics/lyrics.py
 +++ b/plugins/lyrics/lyrics.py
 @@ -32,6 +32,7 @@ import urllib.request
@@ -10,46 +10,126 @@ index 13124b3..6c93944 100644
  
  import LyricsParse
  from LyricsConfigureDialog import LyricsConfigureDialog
-@@ -142,10 +143,41 @@ class LyricGrabber(object):
+@@ -132,22 +133,33 @@ def build_cache_path(artist, title):
+       return os.path.join(artist_folder, title[:128] + '.lyric')
+ class LyricGrabber(object):
++      """
++      Fetch lyrics from several sources.
++
++      1. Local cache file
++      2. Lyric tags in file meta data
++      3. Online services
++      """
+       def __init__(self, db, entry):
+               self.db = db
+               self.entry = entry
+-              
++
+               (self.artist, self.title) = parse_song_data(self.db, self.entry)
+               self.cache_path = build_cache_path(self.artist, self.title)
  
        def verify_lyric(self):
                return os.path.exists(self.cache_path)
+-        
 +
+       def search_lyrics(self, callback, cache_only=False):
++              """
++              Fetch lyrics from cache.
 +
-+      def lyric_from_tag(self):
++              If no cache file exist, tag extraction is tried next.
 +              """
-+              Extract lyrics from the file meta data (tags)
-+              Currently supported formats:
-+              - ogg/vorbis files with "LYRICS" and "SYNCLYRICS" tag
+               self.callback = callback
+-              
++
+               status = self.verify_lyric()
+-              
+               if status:
+                       f = open(self.cache_path, 'rt')
+                       text = f.read()
+@@ -155,20 +167,73 @@ class LyricGrabber(object):
+                       self.callback(text)
+               elif cache_only:
+                       self.callback(_("No lyrics found"))
+-              elif self.artist == "" and self.title == "":
+-                      self.callback(_("No lyrics found"))
+               else:
+-                      def lyric_callback (text):
+-                              if text is not None:
+-                                      f = open(self.cache_path, 'wt')
+-                                      f.write (text)
+-                                      f.close ()
+-                                      self.callback(text)
+-                              else:
+-                                      self.callback(_("No lyrics found"))
++                      self.search_tags()
++
++      def search_tags(self):
++              """
++              Initiate fetching meta tags.
++
++              Result will be handled in search_tags_result
 +              """
 +              location = self.entry.get_playback_uri()
-+              print("discovering %s" % location)
-+              self.discoverer = GstPbutils.Discoverer(timeout=Gst.SECOND*1)
-+              info = self.discoverer.discover_uri(location)
++              self.discoverer = GstPbutils.Discoverer(timeout=Gst.SECOND*3)
++              self.discoverer.connect('discovered', self.search_tags_result)
++              self.discoverer.start()
++              self.discoverer.discover_uri_async(location)
++
++      def search_tags_result(self, discoverer, info, error):
++              """
++              Extract lyrics from the file meta data (tags).
++
++              If no lyrics tags are found, online services are tried next.
++
++              Supported file formats and lyrics tags:
++              - ogg/vorbis files with "LYRICS" and "SYNCLYRICS" tag
++              """
 +              tags = info.get_tags()
 +              if tags is None:
++                      self.search_online()
 +                      return
-+
 +              for i in range(tags.get_tag_size("extended-comment")):
 +                      (exists, value) = tags.get_string_index("extended-comment", i)
 +                      #ogg/vorbis unsynchronized lyrics
 +                      if exists and value.startswith("LYRICS"):
 +                              text = value.replace("LYRICS=", "")
-+                              return text
++                              self.lyrics_found(text)
++                              return
 +                      #ogg/vorbis synchronized lyrics
 +                      elif exists and value.startswith("SYNCLYRICS"):
 +                              text = value.replace("SYNCLYRICS=", "")
-+                              return text
-         
-       def search_lyrics(self, callback, cache_only=False):
-               self.callback = callback
--              
++                              self.lyrics_found(text)
++                              return
 +
-+              text = self.lyric_from_tag()
++              self.search_online()
++
++      def search_online(self):
++              """Initiate searching the online lyrics services"""
++              if self.artist == "" and self.title == "":
++                      self.callback(_("No lyrics found"))
++              else:
+                       parser = LyricsParse.Parser(self.artist, self.title)
+-                      parser.get_lyrics(lyric_callback)
++                      parser.get_lyrics(self.search_online_result)
++
++      def search_online_result(self, text):
++              """Handle the result of searching online lyrics services"""
 +              if text is not None:
-+                      self.callback(text)
-+                      return
++                      self.lyrics_found(text)
++              else:
++                      self.callback(_("No lyrics found"))
 +
-               status = self.verify_lyric()
-               
-               if status:
++
++      def lyrics_found(self, text):
++              f = open(self.cache_path, 'wt')
++              f.write(text)
++              f.close()
++
++              self.callback(text)
++
+ class LyricPane(object):
+       def __init__(self, db, song_info):