Code Duplication    Length = 22-26 lines in 4 locations

comics.py 4 locations

@@ 434-455 (lines=22) @@
431
        }
432
433
434
class GenericLeMondeBlog(GenericNavigableComic):
435
    """Generic class to retrieve comics from Le Monde blogs."""
436
    _categories = ('LEMONDE', 'FRANCAIS')
437
    get_navi_link = get_link_rel_next
438
    get_first_comic_link = simulate_first_link
439
    first_url = NotImplemented
440
441
    @classmethod
442
    def get_comic_info(cls, soup, link):
443
        """Get information about a particular comics."""
444
        url2 = soup.find('link', rel='shortlink')['href']
445
        title = soup.find('meta', property='og:title')['content']
446
        date_str = soup.find("span", class_="entry-date").string
447
        day = string_to_date(date_str, "%d %B %Y", "fr_FR.utf8")
448
        imgs = soup.find_all('meta', property='og:image')
449
        return {
450
            'title': title,
451
            'url2': url2,
452
            'img': [convert_iri_to_plain_ascii_uri(i['content']) for i in imgs],
453
            'month': day.month,
454
            'year': day.year,
455
            'day': day.day,
456
        }
457
458
@@ 1004-1029 (lines=26) @@
1001
        }
1002
1003
1004
class MyExtraLife(GenericNavigableComic):
1005
    """Class to retrieve My Extra Life comics."""
1006
    name = 'extralife'
1007
    long_name = 'My Extra Life'
1008
    url = 'http://www.myextralife.com'
1009
    get_navi_link = get_link_rel_next
1010
1011
    @classmethod
1012
    def get_first_comic_link(cls):
1013
        """Get link to first comics."""
1014
        return get_soup_at_url(cls.url).find('a', class_='comic_nav_link first_comic_link')
1015
1016
    @classmethod
1017
    def get_comic_info(cls, soup, link):
1018
        """Get information about a particular comics."""
1019
        title = soup.find("h1", class_="comic_title").string
1020
        date_str = soup.find("span", class_="comic_date").string
1021
        day = string_to_date(date_str, "%B %d, %Y")
1022
        imgs = soup.find_all("img", class_="comic")
1023
        assert all(i['alt'] == i['title'] == title for i in imgs)
1024
        return {
1025
            'title': title,
1026
            'img': [i['src'] for i in imgs if i["src"]],
1027
            'day': day.day,
1028
            'month': day.month,
1029
            'year': day.year
1030
        }
1031
1032
@@ 3516-3537 (lines=22) @@
3513
class MacadamValley(GenericNavigableComic):
3514
    """Class to retrieve Macadam Valley comics."""
3515
    name = 'macadamvalley'
3516
    long_name = 'Macadam Valley'
3517
    url = 'http://macadamvalley.com'
3518
    get_navi_link = get_a_rel_next
3519
    get_first_comic_link = simulate_first_link
3520
    first_url = 'http://macadamvalley.com/le-debut-de-la-fin/'
3521
3522
    @classmethod
3523
    def get_comic_info(cls, soup, link):
3524
        """Get information about a particular comics."""
3525
        title = soup.find("h1", class_="entry-title").string
3526
        img = soup.find('div', class_='entry-content').find('img')
3527
        date_str = soup.find('time', class_='entry-date')['datetime']
3528
        date_str = date_str[:10]
3529
        day = string_to_date(date_str, "%Y-%m-%d")
3530
        author = soup.find('a', rel='author').string
3531
        return {
3532
            'title': title,
3533
            'img': [i['src'] for i in [img]],
3534
            'day': day.day,
3535
            'month': day.month,
3536
            'year': day.year,
3537
            'author': author,
3538
        }
3539
3540
@@ 2349-2370 (lines=22) @@
2346
class PeterLauris(GenericNavigableComic):
2347
    """Class to retrieve Peter Lauris comics."""
2348
    name = 'peterlauris'
2349
    long_name = 'Peter Lauris'
2350
    url = 'http://peterlauris.com/comics'
2351
    get_navi_link = get_a_rel_next
2352
    get_first_comic_link = simulate_first_link
2353
    first_url = 'http://peterlauris.com/comics/just-in-case/'
2354
2355
    @classmethod
2356
    def get_comic_info(cls, soup, link):
2357
        """Get information about a particular comics."""
2358
        title = soup.find('meta', attrs={'name': 'twitter:title'})['content']
2359
        date_str = soup.find('meta', property='article:published_time')['content'][:10]
2360
        day = string_to_date(date_str, "%Y-%m-%d")
2361
        imgs = soup.find_all('meta', property='og:image')
2362
        return {
2363
            'title': title,
2364
            'img': [i['content'] for i in imgs],
2365
            'month': day.month,
2366
            'year': day.year,
2367
            'day': day.day,
2368
        }
2369
2370
2371
class RandomCrab(GenericNavigableComic):
2372
    """Class to retrieve Random Crab comics."""
2373
    name = 'randomcrab'