flexget.plugins.input_scenereleases
Covered: 21 lines
Missed: 56 lines
Skipped 26 lines
Percent: 27 %
  1
import logging
  2
from flexget.feed import Entry
  3
from flexget.plugin import *
  4
from flexget.utils.soup import get_soup
  5
from flexget.utils.cached_input import cached
  6
from BeautifulSoup import NavigableString
  7
from flexget.utils.tools import urlopener
  9
log = logging.getLogger('scenereleases')
 12
class InputScenereleases:
 13
    """
 14
        Uses scenereleases.info category url as input.
 16
        Example:
 18
        scenereleases: http://scenereleases.info/category/movies/movies-dvd-rip
 19
    """
 21
    def validator(self):
 22
        from flexget import validator
 23
        return validator.factory('url')
 25
    def parse_site(self, url, feed):
 26
        """Parse configured url and return releases array"""
 28
        page = urlopener(url, log)
 29
        soup = get_soup(page)
 31
        releases = []
 32
        for entry in soup.findAll('div', attrs={'class': 'entry'}):
 33
            release = {}
 34
            title = entry.find('h2')
 35
            if not title:
 36
                log.debug('No h2 entrytitle')
 37
                continue
 38
            release['title'] = title.a.contents[0].strip()
 40
            log.debug('Processing title %s' % (release['title']))
 42
            for link in entry.findAll('a'):
 44
                if not link.contents:
 45
                    continue
 46
                link_name = link.contents[0]
 47
                if link_name is None:
 48
                    continue
 49
                if not isinstance(link_name, NavigableString):
 50
                    continue
 51
                link_name = link_name.strip().lower()
 52
                if link.has_key('href'):
 53
                    link_href = link['href']
 54
                else:
 55
                    continue
 56
                log.debug('found link %s -> %s' % (link_name, link_href))
 58
                if link_name.lower() == 'imdb':
 59
                    log.debug('found imdb link %s' % link_href)
 60
                    release['imdb_url'] = link_href
 63
                temp = {}
 64
                temp['title'] = release['title']
 65
                temp['url'] = link_href
 66
                urlrewriting = get_plugin_by_name('urlrewriting')
 67
                if urlrewriting['instance'].url_rewritable(feed, temp):
 68
                    release['url'] = link_href
 69
                    log.debugall('--> accepting %s (resolvable)' % link_href)
 70
                else:
 71
                    log.debugall('<-- ignoring %s (non-resolvable)' % link_href)
 74
            if not 'url' in release:
 75
                from flexget.utils.log import log_once
 76
                log_once('%s skipped due to missing or unsupported (unresolvable) download link' % (release['title']), log)
 77
            else:
 78
                releases.append(release)
 80
        return releases
 82
    @cached('scenereleases', 'url')
 83
    @internet(log)
 84
    def on_feed_input(self, feed):
 85
        releases = self.parse_site(feed.get_input_url('scenereleases'), feed)
 87
        for release in releases:
 89
            entry = Entry()
 91
            def apply_field(d_from, d_to, f):
 92
                if d_from.has_key(f):
 93
                    if d_from[f] is None:
 94
                        return # None values are not wanted!
 95
                    d_to[f] = d_from[f]
 97
            for field in ['title', 'url', 'imdb_url', 'imdb_score', 'imdb_votes']:
 98
                apply_field(release, entry, field)
100
            feed.entries.append(entry)
102
register_plugin(InputScenereleases, 'scenereleases')