[senscritique] improve module code

This commit is contained in:
Bezleputh 2014-12-19 15:59:02 +01:00 committed by Florent Fourcot
commit 26e9763d51
4 changed files with 24 additions and 49 deletions

View file

@ -19,7 +19,6 @@
from weboob.browser import PagesBrowser, URL from weboob.browser import PagesBrowser, URL
from weboob.browser.profiles import Firefox from weboob.browser.profiles import Firefox
from .calendar import SensCritiquenCalendarEvent
from .pages import AjaxPage, EventPage, JsonResumePage from .pages import AjaxPage, EventPage, JsonResumePage
import re import re
@ -71,7 +70,7 @@ class SenscritiqueBrowser(PagesBrowser):
def set_package_settings(self, package, channels): def set_package_settings(self, package, channels):
url = 'http://www.senscritique.com/sc/tv_guides/saveSettings.json' url = 'http://www.senscritique.com/sc/tv_guides/saveSettings.json'
#do not use a dict because there are several same keys # do not use a dict because there are several same keys
params = "network=%s" % package params = "network=%s" % package
params += ''.join(["&channels%%5B%%5D=%d" % (channel) for channel in channels]) params += ''.join(["&channels%%5B%%5D=%d" % (channel) for channel in channels])
self.open(url, data=params) self.open(url, data=params)
@ -115,26 +114,28 @@ class SenscritiqueBrowser(PagesBrowser):
while True: while True:
self.DATA['page'] = '%d' % page_nb self.DATA['page'] = '%d' % page_nb
page = self.ajax_page.open(data=self.DATA) page = self.ajax_page.open(data=self.DATA)
event = page.list_events(_id=_id) try:
event = page.list_events(_id=_id).next()
except StopIteration:
event = None
nb_events = page.count_events() nb_events = page.count_events()
if event or nb_events < self.LIMIT or page >= self.LIMIT_NB_PAGES: if event or nb_events < self.LIMIT or page_nb >= self.LIMIT_NB_PAGES:
break break
page += 1 page_nb += 1
if event: if event:
if not isinstance(event, SensCritiquenCalendarEvent): _id = _id.split('#')[0]
event = event.next()
event._resume = self.get_resume(_id)
self._setup_session(Firefox()) self._setup_session(Firefox())
event = self.event_page.go(_id=_id).get_event(obj=event) event = self.event_page.go(_id=_id).get_event(obj=event)
resume = self.get_resume(_id)
if resume:
event.description += self.get_resume(_id)
return event return event
def get_resume(self, _id): def get_resume(self, _id):
self.set_json_header() self.set_json_header()
re_id = re.compile('^/?.*/(.*)', re.DOTALL) re_id = re.compile('^/?.*/(.*)', re.DOTALL)
a_id = re_id.search(_id.split('#')[0]).group(1) _id = re_id.search(_id).group(1)
return self.json_page.go(_id=a_id).get_resume() return self.json_page.go(_id=_id).get_resume()

View file

@ -111,7 +111,7 @@ class SenscritiqueModule(Module, CapCalendarEvent):
for item in self.browser.list_events(date_from, date_to, package, channels): for item in self.browser.list_events(date_from, date_to, package, channels):
items.append(item) items.append(item)
items.sort(key=lambda o:o.start_date) items.sort(key=lambda o: o.start_date)
return items return items
def get_event(self, _id, event=None): def get_event(self, _id, event=None):

View file

@ -17,14 +17,13 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>. # along with weboob. If not, see <http://www.gnu.org/licenses/>.
from weboob.tools.html import html2text
from .calendar import SensCritiquenCalendarEvent from .calendar import SensCritiquenCalendarEvent
from datetime import date, datetime, time, timedelta from datetime import date, datetime, timedelta
from weboob.browser.pages import HTMLPage, JsonPage from weboob.browser.pages import HTMLPage, JsonPage
from weboob.browser.elements import ItemElement, ListElement, method from weboob.browser.elements import ItemElement, ListElement, method
from weboob.browser.filters.standard import Filter, CleanText, Regexp, Join, Format from weboob.browser.filters.standard import Filter, CleanText, Regexp, Join, Format, BrowserURL, Env
from weboob.browser.filters.html import Link, Attr from weboob.browser.filters.html import Link, Attr
@ -131,10 +130,6 @@ class AjaxPage(HTMLPage):
return False return False
class CombineDate(Filter):
def filter(self, _date):
return datetime.combine(_date, time.max)
class Summary(Filter): class Summary(Filter):
def filter(self, el): def filter(self, el):
title = Regexp(Attr('div/img', 'alt'), '^Affiche(.*)')(el[0]) title = Regexp(Attr('div/img', 'alt'), '^Affiche(.*)')(el[0])
@ -146,7 +141,6 @@ class AjaxPage(HTMLPage):
FormatDate("%Y%m%d%H%M", Date('div/div[@class="elgr-data-diffusion"]')), FormatDate("%Y%m%d%H%M", Date('div/div[@class="elgr-data-diffusion"]')),
CleanText(Channel('.'), replace=[(' ', '-')])) CleanText(Channel('.'), replace=[(' ', '-')]))
obj_start_date = Date('div/div[@class="elgr-data-diffusion"]') obj_start_date = Date('div/div[@class="elgr-data-diffusion"]')
obj_end_date = CombineDate(obj_start_date)
obj_summary = CleanText(Summary('.')) obj_summary = CleanText(Summary('.'))
@ -161,30 +155,13 @@ class Description(Filter):
Join(u'- %s\n', "%s/ul/li" % section))(el[0]) Join(u'- %s\n', "%s/ul/li" % section))(el[0])
class Resume(Filter):
def filter(self, el):
_resume = el[0].xpath("p[@data-rel='full-resume']")
if not _resume:
_resume = el[0].xpath("p[@data-rel='small-resume']")
if _resume:
resume = html2text(CleanText(_resume[0])(self))[6:]
return resume
class EventPage(HTMLPage): class EventPage(HTMLPage):
@method @method
class get_event(ItemElement): class get_event(ItemElement):
klass = SensCritiquenCalendarEvent klass = SensCritiquenCalendarEvent
def parse(self, el): obj_url = BrowserURL('event_page', _id=Env('_id'))
event = self.obj obj_description = Description('.')
event.url = self.page.url
resume = Resume('//section[@class="pvi-productDetails"]')(self)
if not resume:
resume = self.obj._resume
description = Description('.')(self)
event.description = u'%s%s' % (description, resume)
return event
class JsonResumePage(JsonPage): class JsonResumePage(JsonPage):

View file

@ -18,7 +18,7 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>. # along with weboob. If not, see <http://www.gnu.org/licenses/>.
from weboob.tools.test import BackendTest, SkipTest from weboob.tools.test import BackendTest
from datetime import datetime from datetime import datetime
@ -26,10 +26,7 @@ class SenscritiqueTest(BackendTest):
MODULE = 'senscritique' MODULE = 'senscritique'
def test_senscritique(self): def test_senscritique(self):
try: l = list(self.backend.list_events(datetime.now()))
l = list(self.backend.list_events(datetime.now())) assert len(l)
assert len(l) event = self.backend.get_event(l[0].id)
event = self.backend.get_event(l[0].id) self.assertTrue(event.url, 'URL for event "%s" not found: %s' % (event.id, event.url))
self.assertTrue(event.url, 'URL for event "%s" not found: %s' % (event.id, event.url))
except StopIteration:
raise SkipTest("Max iteration reach")