Guest User

Untitled

a guest
Jul 21st, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.13 KB | None | 0 0
  1. from app.config.cplog import CPLog
  2. from app.config.db import Session as Db, History
  3. from app.lib.provider.rss import rss
  4. from app.lib.qualities import Qualities
  5. from sqlalchemy.sql.expression import and_
  6. import re
  7. import time
  8.  
  9. log = CPLog(__name__)
  10.  
  11.  
  12.  
  13.  
  14. class nzbBase(rss):
  15.  
  16.     config = None
  17.     type = 'nzb'
  18.     name = ''
  19.  
  20.     nameScores = [
  21.         'proper:2', 'repack:2',
  22.         'unrated:1',
  23.         'x264:1',
  24.         'DTS:4', 'AC3:2',
  25.         '720p:10', '1080p:10', 'bluray:10', 'dvd:1', 'dvdrip:1', 'brrip:1', 'bdrip:1',
  26.         'imbt:1', 'cocain:1', 'vomit:1', 'fico:1', 'arrow:1', 'pukka:1', 'prism:1', 'devise:1',
  27.         'metis:1', 'diamond:1', 'wiki:1', 'cbgb:1', 'crossbow:1', 'sinners:1', 'amiable:1', 'refined:1', 'twizted:1', 'felony:1', 'hubris:1', 'machd:1',
  28.         'german:-10', 'french:-10', 'spanish:-10', 'swesub:-20', 'danish:-10'
  29.     ]
  30.  
  31.     catIds = {}
  32.     catBackupId = ''
  33.  
  34.     cache = {}
  35.  
  36.     sizeGb = ['gb', 'gib']
  37.     sizeMb = ['mb', 'mib']
  38.     sizeKb = ['kb', 'kib']
  39.  
  40.     def parseSize(self, size):
  41.  
  42.         sizeRaw = size.lower()
  43.         size = re.sub(r'[^0-9.]', '', size).strip()
  44.  
  45.         for s in self.sizeGb:
  46.             if s in sizeRaw:
  47.                 return float(size) * 1024
  48.  
  49.         for s in self.sizeMb:
  50.             if s in sizeRaw:
  51.                 return float(size)
  52.  
  53.         for s in self.sizeKb:
  54.             if s in sizeRaw:
  55.                 return float(size) / 1024
  56.  
  57.         return 0
  58.  
  59.     def calcScore(self, nzb, movie):
  60.         ''' Calculate the score of a NZB, used for sorting later '''
  61.  
  62.         score = 0
  63.         if nzb.name:
  64.             score = self.nameScore(nzb.name, movie)
  65.             score += self.nameRatioScore(nzb.name, movie.name)
  66.  
  67.         return score
  68.  
  69.     def nameScore(self, name, movie):
  70.         ''' Calculate score for words in the NZB name '''
  71.  
  72.         score = 0
  73.         name = name.lower()
  74.  
  75.         #give points for the cool stuff
  76.         for value in self.nameScores:
  77.             v = value.split(':')
  78.             add = int(v.pop())
  79.             if v.pop() in name:
  80.                 score = score + add
  81.  
  82.         #points if the year is correct
  83.         if str(movie.year) in name:
  84.             score = score + 1
  85.  
  86.         # Contains preferred word
  87.         nzbWords = re.split('\W+', self.toSearchString(name).lower())
  88.         preferredWords = self.config.get('global', 'preferredWords').split(',')
  89.         for word in preferredWords:
  90.             if word.strip() and word.strip().lower() in nzbWords:
  91.                 score = score + 100
  92.  
  93.         return score
  94.  
  95.     def nameRatioScore(self, nzbName, movieName):
  96.  
  97.         nzbWords = re.split('\W+', self.toSearchString(nzbName).lower())
  98.         movieWords = re.split('\W+', self.toSearchString(movieName).lower())
  99.  
  100.         # Replace .,-_ with space
  101.         leftOver = len(nzbWords) - len(movieWords)
  102.         if 2 <= leftOver <= 6:
  103.             return 4
  104.         else:
  105.             return 0
  106.  
  107.     def isCorrectMovie(self, item, movie, qualityType, imdbResults = False, singleCategory = False):
  108.  
  109.         # Ignore already added.
  110.         if self.alreadyTried(item, movie.id):
  111.             log.info('Already tried this one, ignored: %s' % item.name)
  112.             return False
  113.  
  114.         def get_words(text):
  115.             return filter(None, re.split('\W+', text.lower()))
  116.  
  117.         nzbWords = get_words(item.name)
  118.         requiredWords = get_words(self.config.get('global', 'requiredWords'))
  119.         missing = set(requiredWords) - set(nzbWords)
  120.         if missing:
  121.             log.info("NZB '%s' misses the following required words: %s" %
  122.                             (item.name, ", ".join(missing)))
  123.             return False
  124.  
  125.         ignoredWords = get_words(self.config.get('global', 'ignoreWords'))
  126.         blacklisted = set(ignoredWords).intersection(set(nzbWords))
  127.         if blacklisted:
  128.             log.info("NZB '%s' contains the following blacklisted words: %s" %
  129.                             (item.name, ", ".join(blacklisted)))
  130.             return False
  131.  
  132.         q = Qualities()
  133.         type = q.types.get(qualityType)
  134.  
  135.         # Contains lower quality string
  136.         if self.containsOtherQuality(item.name, type, singleCategory):
  137.             log.info('Wrong: %s, contains other quality, looking for %s' % (item.name, type['label']))
  138.             return False
  139.  
  140.         # Outsize retention
  141.         if item.type is 'nzb':
  142.             if item.date < time.time() - (int(self.config.get('NZB', 'retention')) * 24 * 60 * 60):
  143.                 log.info('Found but outside %s retention: %s' % (self.config.get('NZB', 'retention'), item.name))
  144.                 return False
  145.  
  146.         # File to small
  147.         minSize = q.minimumSize(qualityType)
  148.         if minSize > item.size:
  149.             log.info('"%s" is too small to be %s. %sMB instead of the minimal of %sMB.' % (item.name, type['label'], item.size, minSize))
  150.             return False
  151.  
  152.         # File to large
  153.         maxSize = q.maximumSize(qualityType)
  154.         if maxSize < item.size:
  155.             log.info('"%s" is too large to be %s. %sMB instead of the maximum of %sMB.' % (item.name, type['label'], item.size, maxSize))
  156.             return False
  157.  
  158.         if imdbResults:
  159.             return True
  160.  
  161.         # Check if nzb contains imdb link
  162.         if self.checkIMDB([item.content], movie.imdb):
  163.             return True
  164.  
  165.         # if no IMDB link, at least check year range 1
  166.         if len(movie.name.split(' ')) > 2 and self.correctYear([item.name], movie.year, 1) and self.correctName(item.name, movie.name):
  167.             return True
  168.  
  169.         # if no IMDB link, at least check year
  170.         if len(movie.name.split(' ')) == 2 and self.correctYear([item.name], movie.year, 0) and self.correctName(item.name, movie.name):
  171.             return True
  172.  
  173.         log.info("Wrong: %s, undetermined naming. Looking for '%s (%s)'" % (item.name, movie.name, movie.year))
  174.         return False
  175.  
  176.     def alreadyTried(self, nzb, movie):
  177.         return Db.query(History).filter(and_(History.movie == movie, History.value == str(nzb.id) + '-' + str(nzb.size), History.status == u'ignore')).first()
  178.  
  179.     def containsOtherQuality(self, name, preferedType, singleCategory = False):
  180.  
  181.         nzbWords = re.split('\W+', self.toSearchString(name).lower())
  182.  
  183.         found = {}
  184.         for type in Qualities.types.itervalues():
  185.             # Main in words
  186.             if type['key'].lower() in nzbWords:
  187.                 found[type['key']] = True
  188.  
  189.             # Alt in words
  190.             for alt in type['alternative']:
  191.                 if alt.lower() in nzbWords:
  192.                     found[type['key']] = True
  193.  
  194.         # Allow other qualities
  195.         for allowed in preferedType['allow']:
  196.             if found.get(allowed):
  197.                 del found[allowed]
  198.  
  199.         if (len(found) == 0 and singleCategory):
  200.             return False
  201.  
  202.         return not (found.get(preferedType['key']) and len(found) == 1)
  203.  
  204.     def checkIMDB(self, haystack, imdbId):
  205.  
  206.         for string in haystack:
  207.             if 'imdb.com/title/' + imdbId in string:
  208.                 return True
  209.  
  210.         return False
  211.  
  212.     def correctYear(self, haystack, year, range):
  213.  
  214.         for string in haystack:
  215.             if str(year) in string or str(int(year) + range) in string or str(int(year) - range) in string: # 1 year of is fine too
  216.                 return True
  217.  
  218.         return False
  219.  
  220.     def getCatId(self, prefQuality):
  221.         ''' Selecting category by quality '''
  222.  
  223.         for id, quality in self.catIds.iteritems():
  224.             for q in quality:
  225.                 if q == prefQuality:
  226.                     return id
  227.  
  228.         return self.catBackupId
  229.  
  230.     def getCatIdNewznab(self, prefQuality, amountCat):
  231.         ''' Selecting category by quality '''
  232.         retval = ''
  233.         for id, quality in self.catIds.iteritems():
  234.             for q in quality:
  235.                 if q == prefQuality:
  236.                     if retval != '':
  237.                         retval = retval + ','
  238.                     retval = retval + str(id)
  239.                     amountCat[0]=amountCat[0] + len(self.catIds.get(id))
  240.         if retval != '':
  241.             return retval
  242.         return str(self.catBackupId)
  243.  
  244.  
  245. #    def getCatIdNewznab(self, prefQuality):
  246. #        for id, quality in self.catIds.iteritems():
  247. #            for q in quality:
  248. #                if q == prefQuality:
  249. #                    retval = retval + id
  250. #                if (retval != "")
  251. #                    return retval
  252. #        return str(self.catBackupId)
  253.  
  254.     def downloadLink(self, id):
  255.         return self.downloadUrl % (id, self.getApiExt())
  256.  
  257.     def nfoLink(self, id):
  258.         return self.nfoUrl % id
  259.  
  260.     def detailLink(self, id):
  261.         return self.detailUrl % id
  262.  
  263.     def getApiExt(self):
  264.         return ''
  265.  
  266.     def cleanCache(self):
  267.         try:
  268.             tempcache = {}
  269.             for x, cache in self.cache.iteritems():
  270.                 if cache['time'] + 300 > time.time():
  271.                     tempcache[x] = self.cache[x]
  272.                 else:
  273.                     log.debug('Removing cache %s' % x)
  274.  
  275.             self.cache = tempcache
  276.         except:
  277.             self.cache = {}
  278.  
  279. class torrentBase(nzbBase):
  280.  
  281.     type = 'torrent'
Add Comment
Please, Sign In to add comment