SeriesPlugin 1.0: First public version
[enigma2-plugins.git] / seriesplugin / src / Cacher.py
1 #######################################################################
2 #
3 #    Series Plugin for Enigma-2
4 #    Coded by betonme (c) 2012 <glaserfrank(at)gmail.com>
5 #    Support: http://www.i-have-a-dreambox.com/wbb2/thread.php?threadid=TBD
6 #
7 #    This program is free software; you can redistribute it and/or
8 #    modify it under the terms of the GNU General Public License
9 #    as published by the Free Software Foundation; either version 2
10 #    of the License, or (at your option) any later version.
11 #
12 #    This program is distributed in the hope that it will be useful,
13 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
14 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 #    GNU General Public License for more details.
16 #
17 #######################################################################
18
19 import sys
20 from time import time
21
22 from Components.config import *
23
24 from Logger import splog
25
26
27 # Max Age (in seconds) of each feed in the cache
28 INTER_QUERY_TIME = 60*60*24
29
30 # Global cache
31 # Do we have to cleanup it
32 cache = {}
33
34
35 class Cacher(object):
36         def __init__(self):
37                 # This dict structure will be the following:
38                 # { 'URL': (TIMESTAMP, value) }
39                 #self.cache = {}
40                 #global cache
41                 #cache = {}
42                 pass
43
44         def getCached(self, url, expires):
45                 #pullCache
46                 global cache
47                 
48                 if not config.plugins.seriesplugin.caching.value:
49                         return
50                 
51                 # Try to get the tuple (TIMESTAMP, FEED_STRUCT) from the dict if it has
52                 # already been downloaded. Otherwise assign None to already_got
53                 already_got = cache.get(url, None)
54                 
55                 # Ok guys, we got it cached, let's see what we will do
56                 if already_got:
57                         # Well, it's cached, but will it be recent enough?
58                         elapsed_time = time() - already_got[0]
59                         
60                         # Woooohooo it is, elapsed_time is less than INTER_QUERY_TIME so I
61                         # can get the page from the memory, recent enough
62                         if elapsed_time < expires:
63                                 #splog("####SPCACHE GET ", already_got)
64                                 return already_got[1]
65                         
66                         else:   
67                                 # Uhmmm... actually it's a bit old, I'm going to get it from the
68                                 # Net then, then I'll parse it and then I'll try to memoize it
69                                 # again
70                                 return None
71                         
72                 else: 
73                         # Well... We hadn't it cached in, so we need to get it from the Net
74                         # now, It's useless to check if it's recent enough, it's not there.
75                         return None
76
77         def doCacheInternal(self, url, page):
78                 #pushCache
79                 global cache
80                 
81                 #splog("####SPCACHE DO ", url, page)
82                 
83                 if not config.plugins.seriesplugin.caching.value:
84                         return
85                 cache[url] = ( time(), page )
86         
87         def doCache(self, url, page):
88                 # Temporarily disabled
89                 return
90
91         def isCached(self, url):
92                 global cache
93                 
94                 if not config.plugins.seriesplugin.caching.value:
95                         return
96                 
97                 return (url in cache)