Code Duplication    Length = 29-31 lines in 2 locations

comics.py 2 locations

@@ 1433-1463 (lines=31) @@
1430
        return None if img is None else img.parent
1431
1432
    @classmethod
1433
    def get_comic_info(cls, soup, link):
1434
        """Get information about a particular comics."""
1435
        date_str = soup.find('font', face='Arial,Helvetica,Geneva,Swiss,SunSans-Regular', color='white').string.strip()
1436
        try:
1437
            day = string_to_date(date_str, '%m/%d/%Y')
1438
        except ValueError:
1439
            print("Invalid date %s" % date_str)
1440
            day = date.today()
1441
        title = soup.find('meta', attrs={'name': 'twitter:title'})['content']
1442
        return {
1443
            'year': day.year,
1444
            'month': day.month,
1445
            'day': day.day,
1446
            'img': [soup.find('img', id='comic')['src']],
1447
            'title': title,
1448
        }
1449
1450
1451
class Octopuns(GenericEmptyComic, GenericNavigableComic):
1452
    """Class to retrieve Octopuns comics."""
1453
    # Also on http://octopuns.tumblr.com
1454
    name = 'octopuns'
1455
    long_name = 'Octopuns'
1456
    url = 'http://www.octopuns.net'
1457
1458
    @classmethod
1459
    def get_first_comic_link(cls):
1460
        """Get link to first comics."""
1461
        return get_soup_at_url(cls.url).find('img', src=re.compile('.*/First.png')).parent
1462
1463
    @classmethod
1464
    def get_navi_link(cls, last_soup, next_):
1465
        """Get link to next or previous comic."""
1466
        link = last_soup.find('img', src=re.compile('.*/Next.png' if next_ else '.*/Back.png')).parent
@@ 1987-2015 (lines=29) @@
1984
    """Class to retrieve Poorly Drawn Lines comics."""
1985
    # Also on http://pdlcomics.tumblr.com
1986
    name = 'poorlydrawn'
1987
    long_name = 'Poorly Drawn Lines'
1988
    url = 'http://poorlydrawnlines.com'
1989
    _categories = ('POORLYDRAWN', )
1990
    get_url_from_archive_element = get_href
1991
1992
    @classmethod
1993
    def get_comic_info(cls, soup, link):
1994
        """Get information about a particular comics."""
1995
        imgs = soup.find('div', class_='post').find_all('img')
1996
        assert len(imgs) <= 1
1997
        return {
1998
            'img': [i['src'] for i in imgs],
1999
            'title': imgs[0].get('title', "") if imgs else "",
2000
        }
2001
2002
    @classmethod
2003
    def get_archive_elements(cls):
2004
        archive_url = urljoin_wrapper(cls.url, 'archive')
2005
        url_re = re.compile('^%s/comic/.' % cls.url)
2006
        return reversed(get_soup_at_url(archive_url).find_all('a', href=url_re))
2007
2008
2009
class LoadingComics(GenericNavigableComic):
2010
    """Class to retrieve Loading Artist comics."""
2011
    name = 'loadingartist'
2012
    long_name = 'Loading Artist'
2013
    url = 'http://www.loadingartist.com/latest'
2014
2015
    @classmethod
2016
    def get_first_comic_link(cls):
2017
        """Get link to first comics."""
2018
        return get_soup_at_url(cls.url).find('a', title="First")