~vincent-vandevyvre/qarte/trunk

« back to all changes in this revision

Viewing changes to parsers.py

  • Committer: Vincent Vande Vyvre
  • Date: 2016-01-26 11:17:25 UTC
  • Revision ID: vincent.vandevyvre@oqapy.eu-20160126111725-mthsyiu1z3gs3vnk
Fix bug 1537785

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
# This file is part of Qarte
5
5
#    
6
6
# Author : Vincent Vande Vyvre <vincent.vandevyvre@oqapy.eu>
7
 
# Copyright: 2011-2015 Vincent Vande Vyvre
 
7
# Copyright: 2011-2016 Vincent Vande Vyvre
8
8
# Licence: GPL3
9
9
# Home page : https://launchpad.net/qarte
10
10
#
33
33
class ArteTVParser(QObject):
34
34
    parsingFinished = pyqtSignal(list)
35
35
    updatingFinished = pyqtSignal()
36
 
    URL_ALL = ["http://www.arte.tv/guide/fr/plus7/"
37
 
               ,"http://www.arte.tv/guide/fr/plus7/toutes-les-videos?date=j-1"
38
 
               ,"http://www.arte.tv/guide/fr/plus7/toutes-les-videos?date=j-2"
39
 
               ,"http://www.arte.tv/guide/fr/plus7/toutes-les-videos?date=j-3"
40
 
               ,"http://www.arte.tv/guide/fr/plus7/toutes-les-videos?date=j-4"
41
 
               ,"http://www.arte.tv/guide/fr/plus7/toutes-les-videos?date=j-5"
42
 
               ,"http://www.arte.tv/guide/fr/plus7/toutes-les-videos?date=j-6"
43
 
               ,"http://www.arte.tv/guide/fr/plus7/toutes-les-videos?date=j-7"]
 
36
    URL_ALL = ["http://www.arte.tv/guide/fr/plus7/",
 
37
               "http://www.arte.tv/guide/fr/plus7/toutes-les-videos?date=j-1",
 
38
               "http://www.arte.tv/guide/fr/plus7/toutes-les-videos?date=j-2",
 
39
               "http://www.arte.tv/guide/fr/plus7/toutes-les-videos?date=j-3",
 
40
               "http://www.arte.tv/guide/fr/plus7/toutes-les-videos?date=j-4",
 
41
               "http://www.arte.tv/guide/fr/plus7/toutes-les-videos?date=j-5",
 
42
               "http://www.arte.tv/guide/fr/plus7/toutes-les-videos?date=j-6",
 
43
               "http://www.arte.tv/guide/fr/plus7/toutes-les-videos?date=j-7"]
44
44
    ALL_VIDEOS = re.compile("(?:(?<=require\('js/page/home'\)\()|(?<=require\('js/page/collection'\)\())(.*?)(?=</script>)", re.DOTALL)
 
45
    ALL_VIDEOS_1 = re.compile("(?<=highlightedVideos:)(.*?)(?=clusters)", re.DOTALL)
 
46
    ALL_VIDEOS_2 = re.compile("(?<=videoSet:)(.*?)(?=clusters)", re.DOTALL)
45
47
    ALL_FORMATS = re.compile('(?<=<div class="video-container")(.*?)'
46
48
                            '(?=<div class="overlay">)', re.DOTALL)
47
49
    ALL_FORMATS_2 = re.compile('(?<=<div class="video-container")(.*?)'
94
96
                logger.info(u"Read Error: {0}".format(error))
95
97
                continue
96
98
 
97
 
            json = self.extract_json(page)
98
 
            if not json:
99
 
                continue
100
 
 
101
99
            if not idx:
102
100
                # First page
 
101
                json = self.extract_json(page)
 
102
                if not json:
 
103
                    continue
103
104
                json = self.prepare_json(json)
104
105
 
105
106
            else:
106
107
                # all other pages, not the same json!
 
108
                json = self.extract_json2(page)
 
109
                if not json:
 
110
                    continue
107
111
                json = self.sanitize_json(json)
108
112
 
109
113
            dct = self.read_json(json)
148
152
 
149
153
    def extract_json(self, text):
150
154
        logger.info(u'Extract json code')
151
 
        videos = self.ALL_VIDEOS.search(text)
 
155
        videos = self.ALL_VIDEOS_1.search(text)
 
156
        if videos is not None:
 
157
            return videos.group(0)
 
158
 
 
159
        logger.info(u'Regex ALL_VIDEOS failed')
 
160
        return False
 
161
 
 
162
    def extract_json2(self, text):
 
163
        logger.info(u'Extract json code')
 
164
        videos = self.ALL_VIDEOS_2.search(text)
152
165
        if videos is not None:
153
166
            return videos.group(0)
154
167
 
156
169
        return False
157
170
 
158
171
    def prepare_json(self, jsn):
159
 
        for item in ['highlightedVideos', 'currentLive', 
 
172
        jsn = '{"highlightedVideos": ' + jsn.strip().rstrip(',') + '}'
 
173
        for item in ['currentLive', 
160
174
                     'dailyMostViewedVideos', 'mostViewedVideos', 
161
175
                     'latestVideos', 'nextExpiringVideos',
162
 
                     'categoriesVideos', 'videoSet','clusters']:
 
176
                     'categoriesVideos', 'videoSet', 'clusters']:
163
177
            jsn = jsn.replace(item, '"%s"' % item)
164
178
        jsn = jsn.rstrip(',;) \n')
165
179
        return jsn
166
180
 
167
181
    def sanitize_json(self, jsn):
168
 
        jsn = jsn.split('videoSet:')[1].lstrip()
 
182
        #jsn = jsn.split('videoSet:')[1].lstrip()
 
183
        jsn = jsn.strip()
169
184
        jsn = jsn.split('}]}')[0] + '}]}'
170
185
        return jsn
171
186
 
174
189
            return json.loads(text.decode('utf8', 'ignore'))
175
190
        except Exception as why:
176
191
            logger.warning(u'json read error: %s' % why)
 
192
            #with open('parser.log', 'w') as outf:
 
193
                #outf.write(text)
177
194
            return False
178
195
 
179
196
    def get_recent_videos(self, dct, videos):