Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.12 KB | None | 0 0
  1. === modified file 'plugins/lyricsviewer/__init__.py'
  2. --- plugins/lyricsviewer/__init__.py    2010-07-11 13:21:09 +0000
  3. +++ plugins/lyricsviewer/__init__.py    2011-02-12 00:39:20 +0000
  4. @@ -196,7 +196,7 @@
  5.          webbrowser.open_new_tab(url)
  6.  
  7.      def on_refresh_button_clicked(self, button):
  8. -        self.update_lyrics()
  9. +        self.update_lyrics(refresh=True)
  10.  
  11.      def on_combo_active_changed(self, combobox):
  12.          """
  13. @@ -206,19 +206,19 @@
  14.         if self.lyrics_found:
  15.             self.update_lyrics_text()
  16.  
  17. -    def update_lyrics(self):
  18. +    def update_lyrics(self, refresh=False):
  19.         self.track_text_buffer.set_text("")
  20.         self.lyrics_text_buffer.set_text("")
  21.         self.lyrics_source_text_buffer.set_text("")
  22.         self.lyrics_found=[]
  23.         if player.PLAYER.current:
  24.             self.set_top_box_widgets(False)
  25. -            self.get_lyrics(player.PLAYER, player.PLAYER.current)
  26. +            self.get_lyrics(player.PLAYER, player.PLAYER.current, refresh)
  27.         else:
  28.             glib.idle_add(self.lyrics_text_buffer.set_text, _('Not playing.'))
  29.  
  30.     @common.threaded
  31. -    def get_lyrics(self, player, track):
  32. +    def get_lyrics(self, player, track, refresh=False):
  33.         lyrics_found=[]
  34.         try:
  35.             try:
  36. @@ -227,7 +227,7 @@
  37.             except Exception:
  38.                 raise LyricsNotFoundException
  39.             self.track_text_buffer.set_text(text_track)
  40. -            lyrics_found = self.exaile.lyrics.find_all_lyrics(track)
  41. +            lyrics_found = self.exaile.lyrics.find_all_lyrics(track, refresh)
  42.         except LyricsNotFoundException:
  43.             lyrics_found=[]
  44.             return
  45.  
  46. === modified file 'xl/lyrics.py'
  47. --- xl/lyrics.py    2010-05-12 23:21:59 +0000
  48. +++ xl/lyrics.py    2011-02-12 00:14:06 +0000
  49. @@ -27,13 +27,72 @@
  50.  
  51. #Lyrics manager.
  52. #
  53. -from xl import providers, event
  54. +from xl import providers, event, xdg
  55. from xl import settings
  56. from xl.nls import gettext as _
  57. +from datetime import datetime, timedelta
  58. +import threading
  59. +import shelve
  60. +import os
  61.  
  62. class LyricsNotFoundException(Exception):
  63.     pass
  64.  
  65. +class LyricsCache:
  66. +    '''
  67. +        Basically just a thread-safe shelf for convinience.  
  68. +        Supports container syntax.
  69. +    '''
  70. +    def __init__(self, location, default=None):
  71. +        '''
  72. +            @param location: specify the shelve file location
  73. +            
  74. +            @param default: can specify a default to return from getter when
  75. +                there is nothing in the shelve
  76. +        '''
  77. +        self.location = location
  78. +        self.db = shelve.open(location, flag='c', protocol=2, writeback=False)
  79. +        self.lock = threading.Lock()
  80. +        self.default = default
  81. +
  82. +    def keys(self):
  83. +        '''
  84. +            Return the shelve keys
  85. +        '''
  86. +        return self.db.keys()
  87. +        
  88. +    def _get(self, key, default=None):
  89. +        with self.lock:
  90. +            try:
  91. +                return self.db[key]
  92. +            except:
  93. +                return default if default is not None else self.default
  94. +                
  95. +    def _set(self, key, value):
  96. +        with self.lock:
  97. +            self.db[key] = value
  98. +            # force save, wasn't auto-saving...
  99. +            self.db.sync()
  100. +                
  101. +    def __getitem__(self, key):
  102. +        return self._get(key)
  103. +        
  104. +    def __setitem__(self, key, value):
  105. +        self._set(key, value)
  106. +        
  107. +    def __contains__(self, key):
  108. +        return key in self.db
  109. +
  110. +    def __delitem__(self, key):
  111. +        with self.lock:
  112. +            del self.db[key]
  113. +
  114. +    def __iter__(self):
  115. +        return self.db.__iter__()
  116. +        
  117. +    def __len__(self):
  118. +        return len(self.db)
  119. +
  120. class LyricsManager(providers.ProviderHandler):
  121.     """
  122.          Lyrics Manager
  123. @@ -47,6 +106,7 @@
  124.          self.preferred_order = settings.get_option(
  125.                  'lyrics/preferred_order', [])
  126.          self.add_defaults()
  127. +        self.cache = LyricsCache(os.path.join(xdg.get_data_dirs()[0],'lcache.dat'))
  128.  
  129.      def get_method_names(self):
  130.          """
  131. @@ -145,7 +205,7 @@
  132.         """
  133.          self.add_search_method(LocalLyricSearch())
  134.  
  135. -    def find_lyrics(self, track):
  136. +    def find_lyrics(self, track, refresh=False):
  137.          """
  138.             Fetches lyrics for a track either from
  139.                 1. a backend lyric plugin
  140. @@ -153,6 +213,9 @@
  141.  
  142.             :param track: the track we want lyrics for, it
  143.                 must have artist/title tags
  144. +                
  145. +            :param refresh: if True, try to refresh cached data even if
  146. +                not expired
  147.  
  148.             :return: tuple of the following format (lyrics, source, url)
  149.                 where lyrics are the lyrics to the track
  150. @@ -166,9 +229,10 @@
  151.         lyrics = None
  152.         source = None
  153.         url = None
  154. +
  155.         for method in self.get_methods():
  156.             try:
  157. -                (lyrics, source, url) = method.find_lyrics(track)
  158. +                (lyrics, source, url) = self._find_cached_lyrics(method, track, refresh)
  159.             except LyricsNotFoundException:
  160.                 pass
  161.             if lyrics:
  162. @@ -182,7 +246,7 @@
  163.  
  164.         return (lyrics, source, url)
  165.  
  166. -    def find_all_lyrics(self, track):
  167. +    def find_all_lyrics(self, track, refresh=False):
  168.         """
  169.              Like find_lyrics but fetches all sources and returns
  170.              a list of lyrics.
  171. @@ -190,6 +254,9 @@
  172.              :param track: the track we want lyrics for, it
  173.                  must have artist/title tags
  174.  
  175. +            :param refresh: if True, try to refresh cached data even if
  176. +                not expired
  177. +
  178.              :return: list of tuples in the same format as
  179.                  find_lyrics's return value
  180.  
  181. @@ -203,7 +270,7 @@
  182.             source = None
  183.             url = None
  184.             try:
  185. -                (lyrics, source, url) = method.find_lyrics(track)
  186. +                (lyrics, source, url) = self._find_cached_lyrics(method, track, refresh)
  187.             except LyricsNotFoundException:
  188.                 pass
  189.             if lyrics:
  190. @@ -215,6 +282,55 @@
  191.             raise LyricsNotFoundException()
  192.  
  193.         return lyrics_found
  194. +        
  195. +    def _find_cached_lyrics(self, method, track, refresh=False):
  196. +        """
  197. +            Checks the cache for lyrics.  If found and not expired, returns
  198. +            cached results, otherwise tries to fetch from method.
  199. +            
  200. +            :param method: the LyricSearchMethod to fetch lyrics from.
  201. +            
  202. +            :param track: the track we want lyrics for, it
  203. +                must have artist/title tags
  204. +                
  205. +            :param refresh: if True, try to refresh cached data even if
  206. +                not expired
  207. +                
  208. +            :return: list of tuples in the same format as
  209. +                find_lyric's return value
  210. +                
  211. +            :raise LyricsNotFoundException: when lyrics are not found
  212. +                in cache or fetched from method
  213. +        """
  214. +        lyrics = None
  215. +        source = None
  216. +        url = None
  217. +        cache_time = settings.get_option('lyrics/cache_time', 720) # in hours
  218. +        key = str(track.get_loc_for_io()+method.display_name)
  219. +
  220. +        try:
  221. +            # check cache for lyrics
  222. +            if key in self.cache:
  223. +                (lyrics, source, url, time) = self.cache[key]
  224. +                # return if they are not expired
  225. +                now = datetime.now()
  226. +                if (now-time < timedelta(hours=cache_time) and not refresh):
  227. +                    return (lyrics, source, url)
  228. +
  229. +            (lyrics, source, url) = method.find_lyrics(track)
  230. +        except LyricsNotFoundException:
  231. +            pass
  232. +        else:
  233. +            if lyrics:
  234. +                # update cache
  235. +                time = datetime.now()
  236. +                self.cache[key] = (lyrics, source, url, time)
  237. +                
  238. +        if not lyrics:
  239. +            # no lyrcs were found, raise an exception
  240. +            raise LyricsNotFoundException()
  241. +
  242. +        return (lyrics, source, url)        
  243.  
  244. class LyricSearchMethod(object):
  245.     """
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement