def parse_entry(self, session, entry): """ Parse RSS entry data for qualified torrents to download :param session: DB Session :type session: sqlalchemy.orm.session.Session :param entry: RSS Feed entry data :type entry: dict :return: A parsed release object ready to load into backend client or None on fail :rtype: release.TorrentData, None """ release_name = entry.get('title', "") if not release_name: self.log.warning("No title parsed from RSS feed. Malformed?") return False release_info = parser.parse_release(release_name) if not release_info.release_key: self.log.warning("No release key parsed from release name: {}".format(release_name)) return False release_key = release_info.release_key section_name = parser.validate_section(release_info) if not section_name or section_name == "section_movie": return False if self.exists(session, release_key) and not self.is_replacement(release_info): return False torrent_data = net.http_request(entry['link'], json=False) if not torrent_data: self.log.error("Failed to download torrent data from server: {0}".format(entry['link'])) return False data = release.TorrentData(bytes(release_name), torrent_data, section_name), release_info torrent = Torrent.from_str(torrent_data) if not parser.valid_size(torrent, section_name): return False return data
def find_matches(self): if not self._authenticated or not self.enabled: return [] try: resp = self.session.get(self.endpoint + '/torrents.php?json=noredirect') if "login" in resp.url: raise AuthenticationError("Must login to site") data = resp.json() except requests.ConnectionError as err: pass else: for movie in data['Movies']: for torrent in movie['Torrents']: if not torrent['UploadTime'] == movie['LastUploadTime']: continue name = '.'.join([ movie['Title'], movie['Year'], torrent['Resolution'], torrent['Codec'] ]) release_name = parser.normalize(name) release_key = datastore.generate_release_key(release_name) if not release_key: continue section = parser.validate_section(release_name)
def test_validate_section(self): test_data = [ ["section_tv", self.release_a, {'title': 'The.Mentalist', 'episode': 10, 'season': 2}], ["section_tv", self.release_c, {'title': 'Falcon', 'episode': 4, 'season': 1}], [False, "Teen.Wolf.1985.720P.BRRIP.XVID.AC3-MAJESTiC", {'title': 'Teen.Wolf', 'year': 1985}], [False, self.release_b, {'title': 'Homeland', 'episode': 11, 'season': 2}], [False, self.release_d, {'title': 'Easy.Money', 'year': 2010}], ] config.set("filter_ignore", "string11", "blahhh") # fix other test causing this to fail, fix later for params in test_data: release_info = parser.ReleaseInfo.from_internal_parser(params[1], **params[2]) found_section = parser.validate_section(release_info) self.assertEqual(params[0], found_section, "{} -> {}".format(params[1], found_section))
def fetch_releases(self, session, scene_only=True): """ Generator which yields torrent data to be loaded into backend daemons :param session: :type session: sqlalchemy.orm.session.Session :param scene_only: Only fetch scene releases :type scene_only: bool :return: Matched Downloaded torrents :rtype: TorrentData[] """ found = [] try: releases = list(self.get_torrents_browse(50)['torrents'].values()) except (TypeError, KeyError) as err: self.log.debug("Failed to fetch releases") else: if scene_only: releases = [ rls for rls in releases if rls['Origin'] == "Scene" ] for entry in releases: release_name = entry['ReleaseName'] release_info = parser.parse_release( release_name, guess_type=constants.MEDIA_TV) if not release_info: continue section_name = parser.validate_section(release_info) if not section_name: continue if self.exists(session, release_info.release_key ) and not self.is_replacement(release_info): continue #dl_url = self.get_torrent_url(entry['TorrentID']) torrent_data = net.http_request(entry['DownloadURL'], json=False) if not torrent_data: self.log.error( "Failed to download torrent data from server: {0}". format(entry['link'])) continue data = release.TorrentData(str(release_name), torrent_data, section_name) torrent = Torrent.from_str(torrent_data) if not parser.valid_size(torrent, section_name): continue yield data, release_info
def find_matches(self): if not self._authenticated or not self.enabled: return [] try: resp = self.session.get(self.endpoint + '/torrents.php?json=noredirect') if "login" in resp.url: raise AuthenticationError("Must login to site") data = resp.json() except requests.ConnectionError as err: pass else: for movie in data['Movies']: for torrent in movie['Torrents']: if not torrent['UploadTime'] == movie['LastUploadTime']: continue name = '.'.join([movie['Title'], movie['Year'], torrent['Resolution'], torrent['Codec']]) release_name = parser.normalize(name) release_key = datastore.generate_release_key(release_name) if not release_key: continue section = parser.validate_section(release_name)
def parse_entry(self, session, entry): """ Parse RSS entry data for qualified torrents to download :param session: DB Session :type session: sqlalchemy.orm.session.Session :param entry: RSS Feed entry data :type entry: dict :return: A parsed release object ready to load into backend client or None on fail :rtype: release.TorrentData, None """ release_name = entry.get('title', "") if not release_name: self.log.warning("No title parsed from RSS feed. Malformed?") return False release_info = parser.parse_release(release_name) if not release_info.release_key: self.log.warning( "No release key parsed from release name: {}".format( release_name)) return False release_key = release_info.release_key section_name = parser.validate_section(release_info) if not section_name or section_name == "section_movie": return False if self.exists(session, release_key) and not self.is_replacement(release_info): return False torrent_data = net.http_request(entry['link'], json=False) if not torrent_data: self.log.error( "Failed to download torrent data from server: {0}".format( entry['link'])) return False data = release.TorrentData(bytes(release_name), torrent_data, section_name), release_info torrent = Torrent.from_str(torrent_data) if not parser.valid_size(torrent, section_name): return False return data
def fetch_releases(self, session, scene_only=True): """ Generator which yields torrent data to be loaded into backend daemons :param session: :type session: sqlalchemy.orm.session.Session :param scene_only: Only fetch scene releases :type scene_only: bool :return: Matched Downloaded torrents :rtype: TorrentData[] """ found = [] try: releases = self.get_torrents_browse(50)['torrents'].values() except (TypeError, KeyError) as err: self.log.debug("Failed to fetch releases") else: if scene_only: releases = [rls for rls in releases if rls['Origin'] == "Scene"] for entry in releases: release_name = entry['ReleaseName'] release_info = parser.parse_release(release_name, guess_type=constants.MEDIA_TV) if not release_info: continue section_name = parser.validate_section(release_info) if not section_name: continue if self.exists(session, release_info.release_key) and not self.is_replacement(release_info): continue #dl_url = self.get_torrent_url(entry['TorrentID']) torrent_data = net.http_request(entry['DownloadURL'], json=False) if not torrent_data: self.log.error("Failed to download torrent data from server: {0}".format(entry['link'])) continue data = release.TorrentData(str(release_name), torrent_data, section_name) torrent = Torrent.from_str(torrent_data) if not parser.valid_size(torrent, section_name): continue yield data, release_info