# Author: Mr_Orange # URL: http://code.google.com/p/sickbeard/ # # This file is part of Sick Beard. # # Sick Beard is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Sick Beard is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Sick Beard. If not, see . from __future__ import with_statement import time import sys import os import traceback import urllib, urlparse import re import datetime import sickbeard import generic from sickbeard.common import Quality, cpu_presets from sickbeard.name_parser.parser import NameParser, InvalidNameException from sickbeard import logger from sickbeard import tvcache from sickbeard import helpers from sickbeard import db from sickbeard import classes from sickbeard.show_name_helpers import allPossibleShowNames, sanitizeSceneName from sickbeard.exceptions import ex from sickbeard import encodingKludge as ek from sickbeard import clients from lib import requests from lib.requests import exceptions from bs4 import BeautifulSoup from lib.unidecode import unidecode class PublicHDProvider(generic.TorrentProvider): def __init__(self): generic.TorrentProvider.__init__(self, "PublicHD") self.supportsBacklog = True self.enabled = False self.ratio = None self.minseed = None self.minleech = None self.cache = PublicHDCache(self) self.url = 'http://phdproxy.com/' self.searchurl = self.url + 'index.php?page=torrents&search=%s&active=0&category=%s&order=5&by=2' #order by seed self.categories = {'Season': ['23'], 'Episode': ['7', '14', '24'], 'RSS': ['7', '14', '23', '24']} def isEnabled(self): return self.enabled def imageName(self): return 'publichd.png' def getQuality(self, item): quality = Quality.sceneQuality(item[0]) return quality def _get_season_search_strings(self, ep_obj): search_string = {'Season': []} for show_name in set(allPossibleShowNames(self.show)): if ep_obj.show.air_by_date or ep_obj.show.sports: ep_string = show_name + str(ep_obj.airdate)[:7] else: ep_string = show_name + ' S%02d' % int(ep_obj.scene_season) #1) showName SXX -SXXE search_string['Season'].append(ep_string) if ep_obj.show.air_by_date or ep_obj.show.sports: ep_string = show_name + ' Season ' + str(ep_obj.airdate)[:7] else: ep_string = show_name + ' Season ' + str(ep_obj.scene_season) #2) showName Season X search_string['Season'].append(ep_string) return [search_string] def _get_episode_search_strings(self, ep_obj, add_string=''): search_string = {'Episode': []} if not ep_obj: return [] if self.show.air_by_date: for show_name in set(allPossibleShowNames(self.show)): ep_string = sanitizeSceneName(show_name) + ' ' + \ str(ep_obj.airdate).replace('-', '|') search_string['Episode'].append(ep_string) elif self.show.sports: for show_name in set(allPossibleShowNames(self.show)): ep_string = sanitizeSceneName(show_name) + ' ' + \ str(ep_obj.airdate).replace('-', '|') + '|' + \ ep_obj.airdate.strftime('%b') search_string['Episode'].append(ep_string) else: for show_name in set(allPossibleShowNames(self.show)): ep_string = sanitizeSceneName(show_name) + ' ' + \ sickbeard.config.naming_ep_type[2] % {'seasonnumber': ep_obj.scene_season, 'episodenumber': ep_obj.scene_episode} for x in add_string.split('|'): to_search = re.sub('\s+', ' ', ep_string + ' %s' % x) search_string['Episode'].append(to_search) return [search_string] def _doSearch(self, search_params, epcount=0, age=0): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} for mode in search_params.keys(): for search_string in search_params[mode]: if mode == 'RSS': searchURL = self.url + 'index.php?page=torrents&active=1&category=%s' % ( ';'.join(self.categories[mode])) logger.log(u"PublicHD cache update URL: " + searchURL, logger.DEBUG) else: searchURL = self.searchurl % ( urllib.quote(unidecode(search_string)), ';'.join(self.categories[mode])) logger.log(u"Search string: " + searchURL, logger.DEBUG) html = self.getURL(searchURL) if not html: continue #remove unneccecary