summaryrefslogtreecommitdiffstats
path: root/module/plugins/hooks/WarezWorld.py
diff options
context:
space:
mode:
Diffstat (limited to 'module/plugins/hooks/WarezWorld.py')
-rw-r--r--module/plugins/hooks/WarezWorld.py277
1 files changed, 0 insertions, 277 deletions
diff --git a/module/plugins/hooks/WarezWorld.py b/module/plugins/hooks/WarezWorld.py
deleted file mode 100644
index b097af8b2..000000000
--- a/module/plugins/hooks/WarezWorld.py
+++ /dev/null
@@ -1,277 +0,0 @@
-import httplib
-import re
-import StringIO
-import sys
-import traceback
-import urllib
-import urllib2
-from bs4 import BeautifulSoup as Soup
-from datetime import datetime
-from module.plugins.internal.Addon import Addon
-from pytz import timezone
-
-
-UNIX_EPOCH = timezone('UTC').localize(datetime(1970, 1, 1))
-
-
-def notifyPushover(**kwargs):
- Data = kwargs
- Connection = httplib.HTTPSConnection('api.pushover.net:443')
- Connection.request('POST', '/1/messages.json', urllib.urlencode(Data),
- {'Content-type': 'application/x-www-form-urlencoded'})
- Response = Connection.getresponse()
-
-def replaceUmlauts(title):
- title = title.replace(unichr(228), 'ae').replace(unichr(196), 'Ae')
- title = title.replace(unichr(252), 'ue').replace(unichr(220), 'Ue')
- title = title.replace(unichr(246), 'oe').replace(unichr(214), 'Oe')
- title = title.replace(unichr(223), 'ss')
- title = title.replace('&', '&')
- return title
-
-def getUnixTimestamp(String):
- String = re.search(r'^.*(\d{2}.\d{2}.\d{4})(\d{1,2}):(\d{2}).*$', String)
- if String:
- String = String.group(1) + \
- ('0' + String.group(2) if String.group(2) < '10' else String.group(2)) + \
- String.group(3)
- String = String.replace('.', '')
-
- UnixTimestamp = (
- timezone('Europe/Berlin').localize(datetime.strptime(String, '%d%m%Y%H%M')).astimezone(timezone('UTC'))
- - UNIX_EPOCH
- ).total_seconds()
- return UnixTimestamp
-
-
-class WarezWorld(Addon):
- __name__ = 'WarezWorld'
- __type__ = 'hook'
- __status__ = 'testing'
- __author_name__ = ('Arno-Nymous')
- __author_mail__ = ('Arno-Nymous@users.noreply.github.com')
- __version__ = '1.2'
- __description__ = 'Get new movies from Warez-World.org'
- __config__ = [
- ('activated', 'bool', 'Active', 'False'),
- ('interval', 'int', 'Waiting time until next run in minutes', '60'),
- ('minYear', 'long', 'No movies older than year', '1970'),
- ('pushoverAppToken', 'str', 'Pushover app token', ''),
- ('pushoverUserToken', 'str', 'Pushover user token', ''),
- ('preferredHosters', 'str', 'Preferred hosters (seperated by;)','Share-online.biz'),
- ('quality', '720p;1080p', 'Video quality', '720p'),
- ('ratingCollector', 'float', 'Send releases to link collector with an IMDb rating of (or higher)', '6.5'),
- ('ratingQueue', 'float', 'Send releases to queue with an IMDb rating of (or higher)', '8.0'),
- ('rejectGenres', 'str', 'Reject movies of an of the following genres (seperated by ;)', 'Anime;Documentary;Family'),
- ('rejectReleaseTokens', 'str', 'Reject releases containing any of the following tokens (seperated by ;)', '.ts.;.hdts.'),
- ('soundError', ';none;alien;bike;bugle;cashregister;classical;climb;cosmic;echo;falling;gamelan;incoming;intermission;magic;mechanical;persistent;pianobar;pushover;siren;spacealarm;tugboat;updown', 'Use this sound for errors pushed via Pushover (empty for default)', ''),
- ('soundNotification', ';none;alien;bike;bugle;cashregister;classical;climb;cosmic;echo;falling;gamelan;incoming;intermission;magic;mechanical;persistent;pianobar;pushover;siren;spacealarm;tugboat;updown', 'Use this sound for notifications pushed via Pushover (empty for default)', '')
- ]
-
- UrlOpener = urllib2.build_opener()
- RejectGenres = []
- RejectReleaseTokens = []
- LastReleaseTimestamp = None
- # Initialize dictionary keys here to enable quick access on keys via augmented operators
- # in later code without further code magic
- Statistics = {'Total': 0, 'Added': 0, 'Skipped': 0, 'AlreadyProcessed': 0}
-
- def __init__(self, *args, **kwargs):
- super(WarezWorld, self).__init__(*args, **kwargs)
- self.start_periodical(self.get_config('interval'))
-
- def periodical(self):
- self.log_info(u'Start periodical run...')
-
- self.interval = self.get_config('interval') * 60
- self.RejectGenres = self.get_config('rejectGenres').split(';')
- self.PreferredHosters = self.get_config('preferredHosters').lower().split(';')
- self.RejectReleaseTokens = self.get_config('rejectReleaseTokens').lower().split(';')
- self.LastReleaseTimestamp = float(self.retrieve('LastReleaseTimestamp', 0))
- # Setting statistics to 0 by iterating over dictionary items
- # instead of recreating dictionary over and over
- for Key in self.Statistics:
- self.Statistics[Key] = 0
-
- try:
- Request = urllib2.Request('http://warez-world.org/kategorie/filme', 'html5lib')
- Request.add_header('User-Agent', 'Mozilla/5.0')
- Page = Soup(self.UrlOpener.open(Request).read())
- Items = Page.findAll('li', class_='main-single')
- Releases = []
-
- for Item in Items:
- Releases.append({
- 'MovieName': Item.find('span', class_='main-rls').text,
- 'ReleaseName': re.search(r'<br/>(.*)</span>', unicode(Item.find('span', class_='main-rls'))).group(1),
- 'ReleaseLink': unicode(Item.find('span', class_='main-rls').a['href']),
- 'ReleaseDate': getUnixTimestamp(unicode(Item.find(class_='main-date').text))
- })
- self.log_info(u'{0} releases found'.format(len(Releases)))
-
- for Release in Releases[::-1]:
- if (Release['ReleaseDate'] < self.LastReleaseTimestamp):
- self.log_debug(u'Release already processed \"{0}\"'.format (Release['ReleaseName']))
- self.Statistics['AlreadyProcessed'] += 1
- continue
- self.log_debug(u'Processing release \"{0}\"'.format(Release['ReleaseName']))
- Release['MovieYear'] = 1900
- Release['MovieRating'] = 0
- Release['MovieGenres'] = []
- if self.parseRelease(Release):
- self.downloadRelease(Release)
-
- self.store('LastReleaseTimestamp', Releases[0]['ReleaseDate'])
- self.log_debug(u'Last parsed release timestamp is {0}'.format(Releases[0]['ReleaseDate']))
-
- self.Statistics['Total'] = sum(self.Statistics.itervalues())
- self.log_info(u'Periodical run finished. Statistics: {0} total, {1} added, {2} skipped, {3} already processed'.format(
- self.Statistics['Total'],
- self.Statistics['Added'],
- self.Statistics['Skipped'],
- self.Statistics['AlreadyProcessed']
- ))
- except:
- exc_type, exc_value, exc_traceback = sys.exc_info()
- output = StringIO.StringIO()
- traceback.print_exception(exc_type, exc_value, exc_traceback, file=output)
- if 'Release' in locals():
- msg = '<b>Stacktrace</b>\n{0}\n<b>Release</b>\n{1}\n\n<b>Date</b>\n{2}'.format(
- output.getvalue(), Release['ReleaseName'].encode('utf-8'), Release['ReleaseDate']
- )
- else:
- msg = '<b>Stacktrace</b>\n{0}'.format(output.getvalue())
- notifyPushover(
- token=self.get_config('pushoverAppToken'),
- user=self.get_config('pushoverUserToken'),
- title='Error in script \"WarezWorld.py\"',
- message=msg,
- sound=self.get_config('soundError'),
- html=1
- )
- raise
-
- def parseRelease(self, Release):
- if any([
- set(re.split(r'[\. ]', Release['ReleaseName'].lower())) & set(self.RejectReleaseTokens),
- not(self.get_config('quality').lower() in Release['ReleaseName'].lower())
- ]):
- self.log_debug(u'...Skip release ({0})'.format("Release name contains unwanted tokens or quality mismatch"))
- self.Statistics['Skipped'] += 1
- return False
-
- Request = urllib2.Request(Release['ReleaseLink'], 'html5lib')
- Request.add_header('User-Agent', 'Mozilla/5.0')
- ReleasePage = Soup(self.UrlOpener.open(Request).read())
-
- DownloadLinks = ReleasePage.findAll('div', id='download-links')
- if DownloadLinks:
- for DownloadLink in DownloadLinks:
- if DownloadLink.a.string and DownloadLink.a.string.lower() in self.PreferredHosters:
- Release['DownloadLink'] = DownloadLink.a['href']
- break
- if 'DownloadLink' not in Release:
- self.log_debug('...No download link of preferred hoster found')
- return False
-
- ReleaseNfo = ReleasePage.find('div', class_='spoiler')
- ImdbUrl = re.search(r'(http://)?.*(imdb\.com/title/tt\d+)\D', unicode(ReleaseNfo))
- if ImdbUrl:
- Release['ImdbUrl'] = 'http://www.' + ImdbUrl.group(2)
- self.addImdbData(Release)
- else:
- for Div in ReleasePage.findAll('div', class_='ui2'):
- if Div.a and Div.a.string == 'IMDb-Seite':
- Request = urllib2.Request(urllib.quote_plus(Div.a['href'].encode('utf-8'), '/:?='))
- ImdbPage = Soup(self.UrlOpener.open(Request).read())
- if ImdbPage.find('table', class_='findList'):
- Release['ImdbUrl'] = 'http://www.imdb.com' + \
- ImdbPage.find('td', class_='result_text').a['href']
- self.addImdbData(Release)
- else:
- self.log_debug(u'...Could not obtain IMDb data for release...Send to link collector')
- self.Statistics['Added'] += 1
- break
-
- if all([Release['MovieYear'] >= self.get_config('minYear'),
- Release['MovieRating'] >= self.get_config('ratingCollector'),
- not(set(Release['MovieGenres']) & set(self.RejectGenres))]):
- return True
- else:
- self.log_debug(u'...Skip release ({0})'.format('Movie too old, poor IMDb rating or unwanted genres'))
- self.Statistics['Skipped'] += 1
- return False
-
- def addImdbData(self, Release):
- self.log_debug(u'...Fetching IMDb data for release ({0})'.format(Release['ImdbUrl']))
-
- Request = urllib2.Request(Release['ImdbUrl'])
- Request.add_header('User-Agent', 'Mozilla/5.0')
- ImdbPage = Soup(self.UrlOpener.open(Request).read())
-
- MovieName = ImdbPage.find('span', {'itemprop': 'name'}).string
- # For the year it has to be done a tiny bit of BeautifulSoup magic as it sometimes can
- # be formatted as a link on IMDb and sometimes not
- try:
- MovieYear = ImdbPage.find('h1', class_='header').find('span', class_='nobr').find(
- text=re.compile(r'\d{4}')
- ).strip(u' ()\u2013')
- except:
- MovieYear = 0
- self.log_debug('...Could not parse movie year ({0})'.format(Release['ImdbUrl']))
- try:
- MovieRating = ImdbPage.find('span', {'itemprop': 'ratingValue'}).string.replace(',', '.')
- except:
- MovieRating = 0
- self.log_debug(u'...Could not parse movie rating ({0})'.format(MovieName, Release['ImdbUrl']))
- MovieGenres = []
- try:
- for Genre in ImdbPage.find('div', {'itemprop': 'genre'}).findAll('a'):
- MovieGenres.append(Genre.string.strip())
- except:
- self.log_debug(u'...Could not parse movie genres ({0})'.format(Release['ImdbUrl']))
-
- Release['MovieName'] = MovieName
- Release['MovieYear'] = MovieYear
- Release['MovieRating'] = MovieRating
- Release['MovieGenres'] = MovieGenres
-
- def downloadRelease(self, Release):
- Storage = self.retrieve(u'{0} ({1})'.format(Release['MovieName'], Release['MovieYear']))
-
- if Storage == '1':
- self.log_debug(u'Skip release ({0})'.format('already downloaded'))
- self.Statistics['Skipped'] += 1
- else:
- Storage = u'{0} ({1})'.format(Release['MovieName'], Release['MovieYear'])
- if Release['MovieRating'] >= self.get_config('ratingQueue'):
- self.pyload.api.addPackage(Storage + ' IMDb: ' + Release['MovieRating'],
- [Release['DownloadLink']], 1)
- PushoverTitle = 'New movie added to queue'
- self.log_info(u'New movie added to queue ({0})'.format(Storage))
- else:
- self.pyload.api.addPackage(Storage + ' IMDb: ' + Release['MovieRating'],
- [Release['DownloadLink']], 0)
- PushoverTitle = 'New movie added to link collector'
- self.log_info(u'New movie added to link collector ({0})'.format(Storage))
-
- self.Statistics['Added'] += 1
-
- notifyPushover(
- token=self.get_config('pushoverAppToken'),
- user=self.get_config('pushoverUserToken'),
- title=PushoverTitle,
- message='<b>{0} ({1})</b>\n<i>Rating:</i> {2}\n<i>Genres:</i> {3}\n\n<i>{4}</i>'.format(
- Release['MovieName'].encode('utf-8'),
- Release['MovieYear'].encode('utf-8'),
- Release['MovieRating'].encode('utf-8'),
- ', '.join(Release['MovieGenres']).encode('utf-8'),
- Release['ReleaseName'].encode('utf-8')
- ),
- sound=self.get_config('soundNotification'),
- url=(Release['ImdbUrl'].encode('utf-8') if 'ImdbUrl' in Release else ''),
- url_title='View on IMDb',
- html=1
- )
-
- self.store(Storage, '1')