예제 #1
0
    def index(self):

        # Releases
        theater = Db.query(MovieETA) \
            .join(MovieETA.Movie)  \
            .filter(MovieETA.theater <= time.time() + 1814400) \
            .filter(MovieETA.theater >= time.time()) \
            .filter(or_(Movie.status == 'want', Movie.status == 'waiting')) \
            .order_by(MovieETA.theater) \
            .all()

        dvd = Db.query(MovieETA) \
            .join(MovieETA.Movie)  \
            .filter(MovieETA.dvd <= time.time() + 3628800) \
            .filter(MovieETA.dvd >= time.time()) \
            .filter(or_(Movie.status == 'want', Movie.status == 'waiting')) \
            .order_by(MovieETA.dvd) \
            .all()

        dvdNow = Db.query(MovieETA) \
            .join(MovieETA.Movie)  \
            .filter(MovieETA.dvd <= time.time()) \
            .filter(MovieETA.dvd > 0) \
            .filter(or_(Movie.status == 'want', Movie.status == 'waiting')) \
            .order_by(MovieETA.dvd) \
            .all()

        return self.render({
            'dvd': dvd,
            'theater': theater,
            'dvdNow': dvdNow,
            'running': self.cron.get('eta').isRunning()
        })
예제 #2
0
    def index(self):

        # Releases
        theater = Db.query(MovieETA) \
            .join(MovieETA.Movie)  \
            .filter(MovieETA.theater <= time.time() + 1814400) \
            .filter(MovieETA.theater >= time.time()) \
            .filter(or_(Movie.status == 'want', Movie.status == 'waiting')) \
            .order_by(MovieETA.theater) \
            .all()

        dvd = Db.query(MovieETA) \
            .join(MovieETA.Movie)  \
            .filter(MovieETA.dvd <= time.time() + 3628800) \
            .filter(MovieETA.dvd >= time.time()) \
            .filter(or_(Movie.status == 'want', Movie.status == 'waiting')) \
            .order_by(MovieETA.dvd) \
            .all()

        dvdNow = Db.query(MovieETA) \
            .join(MovieETA.Movie)  \
            .filter(MovieETA.dvd <= time.time()) \
            .filter(MovieETA.dvd > 0) \
            .filter(or_(Movie.status == 'want', Movie.status == 'waiting')) \
            .order_by(MovieETA.dvd) \
            .all()

        return self.render({'dvd': dvd, 'theater':theater, 'dvdNow': dvdNow, 'running': self.cron.get('eta').isRunning()})
예제 #3
0
    def doJSONCheck(self):
        """
        Go find movies and add them!
        """

        if self.isDisabled():
            log.debug("Trakt has been disabled")
            return

        log.info("Starting Trakt check")
        trakt = Trakt()
        watchlist = trakt.getWatchlist()
        if not watchlist:
            log.info("Could not get watchlist. Please add a password if you have a protected account")
            return

        MyMovieController = MovieController()

        for movie in watchlist:
            if self.abort:  # this loop takes a while, stop when the program needs to close
                log.info("Aborting trakt watchlist check")
                return

            time.sleep(5)  # give the system some slack
            if self.conf("dontaddcollection"):
                if "in_collection" in movie:
                    if movie.get("in_collection"):
                        log.debug('Movie "%s" already in collection, ignoring' % movie.get("title"))
                        continue

            log.debug('Searching for movie: "%s".' % movie.get("title"))
            result = False
            try:
                if movie.get("tmdb_id") != "":
                    result = self.searcher["movie"].findById(movie.get("tmdb_id"))
                elif movie.get("imdb_id") != "":
                    result = self.searcher["movie"].findByImdbId(movie.get("imdb_id"))
                else:
                    log.info('Trakt has no tmdb or imdb Id for movie: "%s".' % movie.get("title"))
                    continue
            except Exception:
                result = False
            if not result:
                log.info('Movie not found: "%s".' % movie.get("title"))
                continue
            log.debug("Checking movie: %s." % movie.get("title") + " (" + str(movie.get("year")) + ")")
            try:
                # Check and see if the movie is in CP already, if so, ignore it.
                cpMovie = Db.query(Movie).filter_by(imdb=movie.get("imdb_id")).first()
                if cpMovie:
                    log.debug('Movie found in CP Database, ignore: "%s".' % movie.get("title"))
                    continue
                log.info("Adding movie to queue: %s." % movie.get("title") + " (" + str(movie.get("year")) + ")")
                quality = Db.query(QualityTemplate).filter_by(name=self.config.get("Quality", "default")).one()
                MyMovieController._addMovie(result, quality.id)
            except:
                log.info(
                    'MovieController unable to add this movie: "%s". %s' % (movie.get("title"), traceback.format_exc())
                )
예제 #4
0
    def _addMovie(self, movie, quality, year=None):

        if self._checkMovieExists(movie=movie, qualityId=quality):
            return

        log.info('Adding movie to database: %s' % movie.name)

        if movie.id:
            exists = Db.query(Movie).filter_by(movieDb=movie.id).first()
        else:
            exists = Db.query(Movie).filter_by(imdb=movie.imdb).first()

        if exists:
            log.info('Movie already exists, do update.')

            # Delete old qualities
            for x in exists.queue:
                x.active = False
                Db.flush()

            new = exists
        else:
            new = Movie()
            Db.add(new)

        # Update the stuff
        new.status = u'want'
        new.name = movie.name
        new.imdb = movie.imdb
        new.movieDb = movie.id
        new.quality = quality
        new.year = year if year and movie.year == 'None' else movie.year
        Db.flush()

        # Add qualities to the queue
        quality = Db.query(QualityTemplate).filter_by(id=quality).one()
        for type in quality.types:
            queue = MovieQueue()
            queue.qualityType = type.type
            queue.movieId = new.id
            queue.order = type.order
            queue.active = True
            queue.completed = False
            queue.waitFor = 0 if type.markComplete else quality.waitFor
            queue.markComplete = type.markComplete
            Db.add(queue)
            Db.flush()

        #Get xml from themoviedb and save to cache
        self.searchers.get('movie').getExtraInfo(new.id, overwrite=True)

        #gogo find nzb for added movie via Cron
        self.cron.get('yarr').forceCheck(new.id)

        self.flash.add('movie-' + str(new.id),
                       '"%s" (%s) added.' % (new.name, new.year))
예제 #5
0
    def _addMovie(self, movie, quality, year = None):

        if self._checkMovieExists(movie=movie):
           return

        log.info('Adding movie to database: %s' % movie.name)

        if movie.id:
            exists = Db.query(Movie).filter_by(movieDb = movie.id).first()
        else:
            exists = Db.query(Movie).filter_by(imdb = movie.imdb).first()

        if exists:
            log.info('Movie already exists, do update.')

            # Delete old qualities
            for x in exists.queue:
                x.active = False
                Db.flush()

            new = exists
        else:
            new = Movie()
            Db.add(new)

        # Update the stuff
        new.status = u'want'
        new.name = movie.name
        new.imdb = movie.imdb
        new.movieDb = movie.id
        new.quality = quality
        new.year = year if year and movie.year == 'None' else movie.year
        Db.flush()

        # Add qualities to the queue
        quality = Db.query(QualityTemplate).filter_by(id = quality).one()
        for type in quality.types:
            queue = MovieQueue()
            queue.qualityType = type.type
            queue.movieId = new.id
            queue.order = type.order
            queue.active = True
            queue.completed = False
            queue.waitFor = 0 if type.markComplete else quality.waitFor
            queue.markComplete = type.markComplete
            Db.add(queue)
            Db.flush()

        #Get xml from themoviedb and save to cache
        self.searchers.get('movie').getExtraInfo(new.id, overwrite = True)

        #gogo find nzb for added movie via Cron
        self.cron.get('yarr').forceCheck(new.id)

        self.flash.add('movie-' + str(new.id), '"%s" (%s) added.' % (new.name, new.year))
예제 #6
0
    def determineMovie(self, files):
        '''
        Try find movie based on folder names and MovieQueue table
        '''

        for file in files['files']:
            dirnames = file['path'].split(os.path.sep)
            dirnames.append(file['filename'])
            dirnames.reverse()

            for dir in dirnames:
                dir = latinToAscii(dir)

                # check and see if name is in queue
                queue = Db.query(MovieQueue).filter_by(name = dir).first()
                if queue:
                    log.info('Found movie via MovieQueue.')
                    return {
                        'queue': queue,
                        'movie': queue.Movie
                    }

                # last resort, match every word in path to db
                lastResort = {}
                dir = dir.replace('.', ' ').lower()
                dirSplit = dir.split(' ')
                for s in dirSplit:
                    if s:
                        results = Db.query(Movie).filter(Movie.name.like('%' + s + '%')).all()
                        for r in results:
                            lastResort[r.id] = r

                for x in lastResort:
                    l = lastResort[x]
                    wordCount = 0
                    words = l.name.lower().split(' ')
                    for word in words:
                        if word.lower() in dir:
                            wordCount += 1

                    if wordCount == len(words) and len(words) > 0:
                        log.info('Found via last resort searching.')
                        return {
                            'queue': None,
                            'movie': l
                        }
            # Try finding movie on theMovieDB
            # more checking here..

        return False
예제 #7
0
    def doCsvCheck(self):
        '''
        Go find movies and add them!
        '''

        if self.isDisabled():
            log.debug('IMDB Watchlist has been disabled')
            return

        log.info('Starting IMDB Watchlist check')
        wl = ImdbWl()
        # Retrieve defined watchlists into one list
        watchlist = wl.getWatchlists()
        if not watchlist:
            log.info("Could not get any info from IMDB Watchlists. Check log for more information.")
            return

        # log.info('Watchlist is "%s"' % watchlist)

        MyMovieController = MovieController()

        for movie in watchlist:
            if self.abort: #this loop takes a while, stop when the program needs to close
                log.info('Aborting IMDB watchlist check')
                return

            time.sleep(5) # give the system some slack

            log.debug('Searching for movie: "%s".' % movie['title'])
            result = False
            try:
                result = self.searcher['movie'].findByImdbId(movie['imdb'])
            except Exception:
                result = False
            if not result:
                log.info('Movie not found: "%s".' % movie['title'])
                continue
            try:
                # Check and see if the movie is in CP already, if so, ignore it.
                cpMovie = Db.query(Movie).filter_by(imdb = movie['imdb']).first()
                if cpMovie:
                    log.info('IMDB Watchlist: Movie found in CP Database, ignore: "%s".' % movie['title'])
                    continue
                log.info('Adding movie to queue: %s.' % movie['title'])
                quality = Db.query(QualityTemplate).filter_by(name = self.config.get('Quality', 'default')).one()
                MyMovieController._addMovie(result, quality.id)
            except:
                log.info('MovieController unable to add this movie: "%s". %s' % (movie['title'], traceback.format_exc()))
        log.info('Finished processing IMDB Watchlist(s)')
예제 #8
0
    def run(self):
        log.info('ETA thread is running.')

        timeout = 0.1 if self.debug else 1
        while True and not self.abort:

            try:
                queue = etaQueue.get(timeout=timeout)
                if queue.get('id'):
                    movie = Db.query(Movie).filter_by(
                        id=queue.get('id')).first()
                else:
                    movie = queue.get('movie')

                if not cherrypy.config.get('debug'):
                    #do a search
                    self.running = True
                    result = self.search(movie)
                    if result:
                        self.save(movie, result)
                    self.running = False

                etaQueue.task_done()
                time.sleep(timeout)
            except Queue.Empty:
                pass

        log.info('ETA thread shutting down.')
예제 #9
0
    def reAdd(self, id, **data):
        '''
        Re-add movie and force search
        '''

        movie = Db.query(Movie).filter_by(id = id).one()

        if data.get('failed'):
            for history in movie.history:
                if history.status == u'snatched':
                    history.status = u'ignore'
                    Db.flush()

        for x in movie.queue:
            if x.completed == True:
                x.completed = False
                Db.flush()
                break

        #set status
        movie.status = u'want'
        Db.flush()

        #gogo find nzb for added movie via Cron
        self.cron.get('yarr').forceCheck(id)
        self.searchers.get('etaQueue').put({'id':id})

        self.flash.add('movie-' + str(movie.id), '"%s" re-added.' % (movie.name))
        return redirect(url(controller = 'movie', action = 'index'))
예제 #10
0
    def reAdd(self, id, **data):
        '''
        Re-add movie and force search
        '''

        movie = Db.query(Movie).filter_by(id=id).one()

        if data.get('failed'):
            for history in movie.history:
                if history.status == u'snatched':
                    history.status = u'ignore'
                    Db.flush()

        for x in movie.queue:
            if x.completed == True:
                x.completed = False
                Db.flush()
                break

        #set status
        movie.status = u'want'
        Db.flush()

        #gogo find nzb for added movie via Cron
        self.cron.get('yarr').forceCheck(id)
        self.searchers.get('etaQueue').put({'id': id})

        self.flash.add('movie-' + str(movie.id),
                       '"%s" re-added.' % (movie.name))
        return redirect(url(controller='movie', action='index'))
예제 #11
0
파일: yarr.py 프로젝트: Ne0tr0n/CouchPotato
    def run(self):
        log.info('YarrCron thread is running.')

        self.setInterval(self.config.get('Intervals', 'search'))
        self.forceCheck()

        if not self.debug:
            time.sleep(10)

        wait = 0.1 if self.debug else 10
        while True and not self.abort:

            #check single movie
            try:
                for movieId in self.checkTheseMovies:
                    movie = Db.query(Movie).filter_by(id = movieId).one()
                    self._search(movie, True)
                    self.checkTheseMovies.pop(0)
            except Exception, e:
                log.error('Something went wrong with checkTheseMovies: %s' % e)

            #check all movies
            try:
                now = time.time()
                if (self.lastChecked + self.intervalSec) < now: # and not self.debug:
                    self.lastChecked = now
                    self.searchAll()
            except Exception, e:
                log.error('Something went wrong with searchAll: %s' % e)
예제 #12
0
    def run(self):
        log.info('MovieETA thread is running.')

        timeout = 0.1 if self.debug else 1
        while True and not self.abort:
            try:
                queue = etaQueue.get(timeout = timeout)
                if queue.get('id'):
                    movie = Db.query(Movie).filter_by(id = queue.get('id')).first()
                else:
                    movie = queue.get('movie')

                if not cherrypy.config.get('debug'):
                    #do a search
                    self.running = True
                    result = self.search(movie)
                    if result:
                        self.save(movie, result)

                etaQueue.task_done()
                time.sleep(timeout)
                self.running = False
            except Queue.Empty:
                pass

        log.info('MovieETA thread shutting down.')
예제 #13
0
    def run(self):
        log.info('TrailerCron thread is running.')

        self.tempdir = cherrypy.config.get('cachePath')

        # Sources
        self.sources.append(HdTrailers(self.config))
        #self.sources.append(Youtube(self.config))

        timeout = 0.1 if self.debug else 1
        while True and not self.abort:
            try:
                movie = trailerQueue.get(timeout = timeout)

                # Thread fix
                if movie.get('movieId'):
                    movie['movie'] = Db.query(Movie).filter_by(id = movie.get('movieId')).one()

                #do a search
                self.running = True
                self.search(movie['movie'], movie['destination'])
                self.running = False

                trailerQueue.task_done()
            except Queue.Empty:
                pass

        log.info('TrailerCron shutting down.')
예제 #14
0
파일: config.py 프로젝트: andme/CouchPotato
    def save(self, **data):
        '''
        Save all config settings
        '''
        config = cherrypy.config.get('config')

        # catch checkboxes
        for bool in ['Renamer.enabled', 'Renamer.trailerQuality', 'Renamer.cleanup', 'global.launchbrowser', 'Torrents.enabled', 'NZB.enabled', 'NZBMatrix.enabled', 'NZBsorg.enabled', 'newznab.enabled']:
            if not data.get(bool):
                data[bool] = False

        # Do quality order
        order = data.get('Quality.order').split(',')
        for id in order:
            qo = Db.query(QualityTemplate).filter_by(id = int(id)).one()
            qo.order = order.index(id)
            Db.flush()
        del data['Quality.order']

        # Save templates
        if data.get('Quality.templates'):
            templates = json.loads(data.get('Quality.templates'))
            Qualities().saveTemplates(templates)
        del data['Quality.templates']

        # Save post data
        for name in data:
            section = name.split('.')[0]
            var = name.split('.')[1]
            config.set(section, var, data[name])

        # Change cron interval
        self.cron.get('yarr').setInterval(config.get('Intervals', 'search'))

        config.save()
예제 #15
0
    def run(self):
        log.info('YarrCron thread is running.')

        self.setInterval(self.config.get('Intervals', 'search'))
        self.forceCheck()

        if not self.debug:
            time.sleep(10)

        wait = 0.1 if self.debug else 1
        while True and not self.abort:

            #check single movie
            for movieId in self.checkTheseMovies:
                movie = Db.query(Movie).filter_by(id = movieId).one()
                self._search(movie, True)
                self.checkTheseMovies.pop(0)

            #check all movies
            now = time.time()
            if (self.lastChecked + self.intervalSec) < now: # and not self.debug:
                self.lastChecked = now
                self.searchAll()

            time.sleep(wait)

        log.info('YarrCron has shutdown.')
예제 #16
0
    def imdbAdd(self, **data):
        '''
        Add movie by imdbId
        '''

        id = 'tt' + data.get('id').replace('tt', '')
        success = False

        result = Db.query(Movie).filter_by(imdb=id, status=u'want').first()
        if result:
            success = True

        if data.get('add'):
            result = self.searchers.get('movie').findByImdbId(id)

            self._addMovie(result, data.get('quality'), data.get('year'))
            log.info('Added : %s' % result.name)
            success = True

        return self.render({
            'id': id,
            'result': result,
            'success': success,
            'year': data.get('year')
        })
예제 #17
0
    def reAdd(self, id, **data):
        """
        Re-add movie and force search
        """

        movie = Db.query(Movie).filter_by(id=id).one()

        if data.get("failed"):
            for history in movie.history:
                if history.status == u"snatched":
                    history.status = u"ignore"
                    Db.flush()

        for x in movie.queue:
            if x.completed == True:
                x.completed = False
                Db.flush()
                break

        # set status
        movie.status = u"want"
        Db.flush()

        # gogo find nzb for added movie via Cron
        self.cron.get("yarr").forceCheck(id)
        self.searchers.get("etaQueue").put({"id": id})

        self.flash.add("movie-" + str(movie.id), '"%s" re-added.' % (movie.name))
        return redirect(url(controller="movie", action="index"))
예제 #18
0
    def save(self, **data):
        '''
        Save all config settings
        '''
        config = cherrypy.config.get('config')

        # catch checkboxes
        bools = filter(lambda s: not data.get(s),
            [
              'global.launchbrowser', 'global.updater',
              'XBMC.enabled', 'XBMC.onSnatch',
              'NMJ.enabled',
              'PLEX.enabled',
              'PROWL.enabled', 'PROWL.onSnatch',
              'GROWL.enabled', 'GROWL.onSnatch',
              'Notifo.enabled', 'Notifo.onSnatch',
              'NMA.enable', 'NMA.onSnatch',
              'Meta.enabled',
              'MovieETA.enabled',
              'Renamer.enabled', 'Renamer.trailerQuality', 'Renamer.cleanup',
              'Torrents.enabled',
              'NZB.enabled',
              'NZBMatrix.enabled', 'NZBMatrix.english', 'NZBMatrix.ssl',
              'NZBsRUS.enabled',
              'newzbin.enabled',
              'NZBsorg.enabled',
              'newznab.enabled',
              'Subtitles.enabled', 'Subtitles.addLanguage',
              'MovieRSS.enabled',
            ]
        )
        data.update(data.fromkeys(bools, False))

        # Do quality order
        order = data.get('Quality.order').split(',')
        for id in order:
            qo = Db.query(QualityTemplate).filter_by(id = int(id)).one()
            qo.order = order.index(id)
            Db.flush()
        del data['Quality.order']

        # Save templates
        if data.get('Quality.templates'):
            templates = json.loads(data.get('Quality.templates'))
            Qualities().saveTemplates(templates)
        del data['Quality.templates']

        # Save post data
        for name in data:
            section = name.split('.')[0]
            var = name.split('.')[1]
            config.set(section, var, data[name])

        # Change cron interval
        self.cron.get('yarr').setInterval(config.get('Intervals', 'search'))

        config.save()

        self.flash.add('config', 'Settings successfully saved.')
        return redirect(cherrypy.request.headers.get('referer'))
예제 #19
0
    def run(self):
        log.info('YarrCron thread is running.')

        self.setInterval(self.config.get('Intervals', 'search'))
        self.forceCheck()

        if not self.debug:
            time.sleep(10)

        wait = 0.1 if self.debug else 10
        while True and not self.abort:

            #check single movie
            try:
                for movieId in self.checkTheseMovies:
                    movie = Db.query(Movie).filter_by(id=movieId).one()
                    self._search(movie, True)
                    self.checkTheseMovies.pop(0)
            except Exception, e:
                log.error('Something went wrong with checkTheseMovies: %s' % e)

            #check all movies
            try:
                now = time.time()
                if (self.lastChecked +
                        self.intervalSec) < now:  # and not self.debug:
                    self.lastChecked = now
                    self.searchAll()
            except Exception, e:
                log.error('Something went wrong with searchAll: %s' % e)
예제 #20
0
파일: movie.py 프로젝트: rb2k/CouchPotato
 def clear_downloaded(self):
     """Clear downloaded movies."""
     qMovie = Db.query(Movie)
     downloaded = qMovie.filter_by(status=u"downloaded").all()
     for movie in downloaded:
         movie.status = u"deleted"
     Db.flush()
     return redirect(url(controller="movie", action="index"))
예제 #21
0
    def saveTemplates(self, templates):
        log.debug('Saving Templates %s' % templates)

        # get all items
        delete = {'templates': [], 'types': []}
        for item in self.all(custom=True):
            delete['templates'].append(item.id)
            for type in item.types:
                delete['types'].append(type.id)

        for template in templates:

            # Don't delete
            try:
                delete['templates'].remove(int(template['id']))
            except (ValueError, TypeError):
                pass

            if int(template['id']) == 0:
                template['id'] = template['name']

            for type in template['types']:
                # Don't delete
                try:
                    delete['types'].remove(int(type['id']))
                except (ValueError, TypeError):
                    pass

            self.create(template['id'],
                        template['name'],
                        template['types'],
                        waitFor=template['waitFor'])

        # remove all non used custom
        if delete['templates']:
            [
                Db.delete(x) for x in Db.query(QualityTemplate).filter(
                    QualityTemplate.id.in_(delete['templates'])).all()
            ]
            Db.flush()
        if delete['types']:
            [
                Db.delete(x) for x in Db.query(QualityTemplateType).filter(
                    QualityTemplateType.id.in_(delete['types'])).all()
            ]
            Db.flush()
예제 #22
0
 def getMovieByIMDB(self, imdbId):
     '''
     Get movie based on IMDB id.
     If not in local DB, go fetch it from theMovieDb
     '''
     m = Db.query(Movie).filter_by(imdb=imdbId).first()
     if m:
         return m
예제 #23
0
 def getMovieByIMDB(self, imdbId):
     """
     Get movie based on IMDB id.
     If not in local DB, go fetch it from theMovieDb
     """
     m = Db.query(Movie).filter_by(imdb=imdbId).first()
     if m:
         return m
예제 #24
0
 def clear_downloaded(self):
     """Clear downloaded movies."""
     qMovie = Db.query(Movie)
     downloaded = qMovie.filter_by(status=u'downloaded').all()
     for movie in downloaded:
         movie.status = u'deleted'
     Db.flush()
     return redirect(url(controller='movie', action='index'))
예제 #25
0
 def clear_downloaded(self):
     """Clear downloaded movies."""
     qMovie = Db.query(Movie)
     downloaded = qMovie.filter_by(status = u'downloaded').all()
     for movie in downloaded:
       movie.status = u'deleted'
     Db.flush()
     return redirect(url(controller = 'movie', action = 'index'))
예제 #26
0
    def saveExtra(self, id, name, value):

        exists = Db.query(MovieExtra).filter(and_(MovieExtra.movieId == id, MovieExtra.name == name)).first()
        if not exists:
            exists = MovieExtra()
            Db.add(exists)

        exists.movieId = id
        exists.name = name
        exists.value = value
        Db.flush()
예제 #27
0
파일: base.py 프로젝트: censer/CouchPotato
    def alreadyDownloaded(self, movie, file, key):
        key = self.getKey(key)
        movieId = 0 if not movie else movie.id

        results = Db.query(SubtitleHistory).filter(and_(SubtitleHistory.subtitle == key, SubtitleHistory.movie == movieId, SubtitleHistory.file == file)).all()

        for h in results:
            h.status = u'ignored'
            Db.flush()

        return len(results) > 0
예제 #28
0
    def saveExtra(self, id, name, value):

        exists = Db.query(MovieExtra).filter(and_(MovieExtra.movieId == id, MovieExtra.name == name)).first()
        if not exists:
            exists = MovieExtra()
            Db.add(exists)

        exists.movieId = id
        exists.name = name
        exists.value = value
        Db.flush()
예제 #29
0
    def index(self):
        '''
        Show all wanted, snatched, downloaded movies
        '''

        qMovie = Db.query(Movie)
        movies = qMovie.order_by(Movie.name).filter(or_(Movie.status == u'want', Movie.status == u'waiting')).all()
        snatched = qMovie.order_by(desc(Movie.dateChanged), Movie.name).filter_by(status = u'snatched').all()
        downloaded = qMovie.order_by(desc(Movie.dateChanged), Movie.name).filter_by(status = u'downloaded').all()

        return self.render({'movies': movies, 'snatched':snatched, 'downloaded':downloaded})
예제 #30
0
    def searchAll(self):
        log.info('Searching for new downloads, for all movies.')
        self.doCheck()

        #get all wanted movies
        movies = Db.query(Movie).filter(or_(Movie.status == 'want', Movie.status == 'waiting')).all()
        for movie in movies:
            if not self.abort and not self.stop:
                self._search(movie)

        self.doCheck(False)
        log.info('Finished search.')
예제 #31
0
    def save(self, **data):
        """
        Save all config settings
        """
        config = cherrypy.config.get("config")

        # catch checkboxes
        for bool in [
            "XBMC.enabled",
            "Meta.enabled",
            "Renamer.enabled",
            "Renamer.trailerQuality",
            "Renamer.cleanup",
            "global.launchbrowser",
            "global.updater",
            "Torrents.enabled",
            "NZB.enabled",
            "NZBMatrix.enabled",
            "NZBsorg.enabled",
            "newznab.enabled",
            "Newzbin.enabled" "Subtitles.enabled",
            "Subtitles.addLanguage",
        ]:
            if not data.get(bool):
                data[bool] = False

        # Do quality order
        order = data.get("Quality.order").split(",")
        for id in order:
            qo = Db.query(QualityTemplate).filter_by(id=int(id)).one()
            qo.order = order.index(id)
            Db.flush()
        del data["Quality.order"]

        # Save templates
        if data.get("Quality.templates"):
            templates = json.loads(data.get("Quality.templates"))
            Qualities().saveTemplates(templates)
        del data["Quality.templates"]

        # Save post data
        for name in data:
            section = name.split(".")[0]
            var = name.split(".")[1]
            config.set(section, var, data[name])

        # Change cron interval
        self.cron.get("yarr").setInterval(config.get("Intervals", "search"))

        config.save()

        self.flash.add("config", "Settings successfully saved.")
        return redirect(cherrypy.request.headers.get("referer"))
예제 #32
0
    def getMovie(self, imdbId):
        '''
        Get movie based on IMDB id.
        If not in local DB, go fetch it from theMovieDb
        '''

        movie = Db.query(Movie).filter_by(imdb = imdbId).first()

        if not movie:
            movie = self.searcher.get('movie').findByImdbId(imdbId)

        return movie
예제 #33
0
파일: yarr.py 프로젝트: Ne0tr0n/CouchPotato
    def searchAll(self):
        log.info('Searching for new downloads, for all movies.')
        self.doCheck()

        #get all wanted movies
        movies = Db.query(Movie).filter(or_(Movie.status == 'want', Movie.status == 'waiting')).all()
        for movie in movies:
            if not self.abort and not self.stop:
                self._search(movie)

        self.doCheck(False)
        log.info('Finished search.')
예제 #34
0
    def all(self, custom = None, enabled = None):
        q = Db.query(QualityTemplate).order_by(QualityTemplate.order)

        # Get only enabled
        if enabled:
            q = q.filter(~QualityTemplate.name.in_(self.conf('hide').split(',')))

        # Only show custom
        if custom != None:
            q = q.filter(QualityTemplate.custom == custom)

        return q.all()
예제 #35
0
    def saveTemplates(self, templates):
        log.debug("Saving Templates %s" % templates)

        # get all items
        delete = {"templates": [], "types": []}
        for item in self.all(custom=True):
            delete["templates"].append(item.id)
            for type in item.types:
                delete["types"].append(type.id)

        for template in templates:

            # Don't delete
            try:
                delete["templates"].remove(int(template["id"]))
            except (ValueError, TypeError):
                pass

            if int(template["id"]) == 0:
                template["id"] = template["name"]

            for type in template["types"]:
                # Don't delete
                try:
                    delete["types"].remove(int(type["id"]))
                except (ValueError, TypeError):
                    pass

            self.create(template["id"], template["name"], template["types"], waitFor=template["waitFor"])

        # remove all non used custom
        if delete["templates"]:
            [Db.delete(x) for x in Db.query(QualityTemplate).filter(QualityTemplate.id.in_(delete["templates"])).all()]
            Db.flush()
        if delete["types"]:
            [
                Db.delete(x)
                for x in Db.query(QualityTemplateType).filter(QualityTemplateType.id.in_(delete["types"])).all()
            ]
            Db.flush()
예제 #36
0
    def downloaded(self, id):
        """
        Mark movie as downloaded
        """

        movie = Db.query(Movie).filter_by(id=id).one()

        # set status
        movie.status = u"downloaded"
        Db.flush()

        self.flash.add("movie-" + str(movie.id), '"%s" marked as downloaded.' % (movie.name))
        return redirect(url(controller="movie", action="index"))
예제 #37
0
    def save(self, movie, result):

        row = Db.query(MovieETA).filter_by(movieId=movie.id).first()
        if not row:
            row = MovieETA()
            Db.add(row)

        row.movieId = movie.id
        row.theater = result.get('theater')
        row.dvd = result.get('dvd')
        row.bluray = result.get('bluray')
        row.lastCheck = result.get('expires')
        Db.flush()
예제 #38
0
    def downloaded(self, id):
        '''
        Mark movie as downloaded
        '''

        movie = Db.query(Movie).filter_by(id = id).one()

        #set status
        movie.status = u'downloaded'
        Db.flush()

        self.flash.add('movie-' + str(movie.id), '"%s" marked as downloaded.' % (movie.name))
        return redirect(url(controller = 'movie', action = 'index'))
예제 #39
0
파일: eta.py 프로젝트: 05sonicblue/Gamez
    def save(self, movie, result):

        row = Db.query(MovieETA).filter_by(movieId = movie.id).first()
        if not row:
            row = MovieETA()
            Db.add(row)

        row.movieId = movie.id
        row.theater = result.get('theater')
        row.dvd = result.get('dvd')
        row.bluray = result.get('bluray')
        row.lastCheck = result.get('expires')
        Db.flush()
예제 #40
0
    def all(self, custom=None, enabled=None):
        q = Db.query(QualityTemplate).order_by(QualityTemplate.order)

        # Get only enabled
        if enabled:
            q = q.filter(
                ~QualityTemplate.name.in_(self.conf('hide').split(',')))

        # Only show custom
        if custom != None:
            q = q.filter(QualityTemplate.custom == custom)

        return q.all()
예제 #41
0
    def create(self, name, label, types, waitFor=0, custom=True, order=0):

        newQ = QualityTemplate()
        exists = Db.query(QualityTemplate).filter(
            or_(QualityTemplate.name == name,
                QualityTemplate.id == name)).first()
        if not exists:
            log.info('Creating custom=%s quality: %s' % (custom, name))
            newQ.name = name
            newQ.label = label
            newQ.custom = custom
            newQ.waitFor = waitFor
            newQ.order = order
            Db.add(newQ)
            Db.flush()
            exists = Db.query(QualityTemplate).filter_by(name=name).first()
        else:
            exists.label = label
            exists.waitFor = waitFor
            Db.flush()

        nr = 1
        for type in types:

            # Update if needed
            newT = Db.query(QualityTemplateType).filter_by(
                quality=exists.id, type=type['type']).first()
            if not newT:
                newT = QualityTemplateType()

            newT.quality = exists.id
            newT.order = nr
            newT.type = type['type']
            newT.markComplete = type['markComplete']
            nr += 1
            Db.add(newT)
            Db.flush()

        return True
예제 #42
0
    def downloaded(self, id):
        '''
        Mark movie as downloaded
        '''

        movie = Db.query(Movie).filter_by(id=id).one()

        #set status
        movie.status = u'downloaded'
        Db.flush()

        self.flash.add('movie-' + str(movie.id),
                       '"%s" marked as downloaded.' % (movie.name))
        return redirect(url(controller='movie', action='index'))
예제 #43
0
    def index(self):
        """
        Show all wanted, snatched, downloaded movies
        """

        if cherrypy.request.path_info == "/":
            return redirect("movie/")

        qMovie = Db.query(Movie)
        movies = qMovie.order_by(Movie.name).filter(or_(Movie.status == u"want", Movie.status == u"waiting")).all()
        snatched = qMovie.order_by(desc(Movie.dateChanged), Movie.name).filter_by(status=u"snatched").all()
        downloaded = qMovie.order_by(desc(Movie.dateChanged), Movie.name).filter_by(status=u"downloaded").all()

        return self.render({"movies": movies, "snatched": snatched, "downloaded": downloaded})
예제 #44
0
    def save(self, movie, result):

        row = Db.query(MovieETA).filter_by(movieId = movie.id).first()
        if not row:
            row = MovieETA()
            Db.add(row)

        row.movieId = movie.id
        row.videoEtaId = result.get('id', 0)
        row.theater = result.get('theater', 0)
        row.dvd = result.get('dvd', 0)
        row.bluray = result.get('bluray', 0)
        row.lastCheck = int(time.time())
        Db.flush()
예제 #45
0
    def index(self):
        '''
        Show all wanted, snatched, downloaded movies
        '''

        if cherrypy.request.path_info == '/':
            return redirect('movie/')

        qMovie = Db.query(Movie)
        movies = qMovie.order_by(Movie.name).filter(or_(Movie.status == u'want', Movie.status == u'waiting')).all()
        snatched = qMovie.order_by(desc(Movie.dateChanged), Movie.name).filter_by(status = u'snatched').all()
        downloaded = qMovie.order_by(desc(Movie.dateChanged), Movie.name).filter_by(status = u'downloaded').all()

        return self.render({'movies': movies, 'snatched':snatched, 'downloaded':downloaded})
예제 #46
0
    def alreadyDownloaded(self, movie, file, key):
        key = self.getKey(key)
        movieId = 0 if not movie else movie.id

        file = latinToAscii(file)
        results = Db.query(SubtitleHistory).filter(and_(SubtitleHistory.subtitle == key, SubtitleHistory.movie == movieId, SubtitleHistory.file == file)).all()

        if cherrypy.config.get('debug'):
            log.debug('%s already downloaded.' % results)
            return False
        else:
            for h in results:
                h.status = u'ignored'
                Db.flush()

            return len(results) > 0
예제 #47
0
    def delete(self, id):
        '''
        Mark movie as deleted
        '''

        movie = Db.query(Movie).filter_by(id=id).one()
        previousStatus = movie.status

        #set status
        movie.status = u'deleted'
        Db.flush()

        if previousStatus == 'downloaded':
            self.flash.add('movie-' + str(movie.id),
                           '"%s" deleted.' % (movie.name))
            return redirect(url(controller='movie', action='index'))
예제 #48
0
    def __init__(self, config):

        self.config = config

        # Config TheMovieDB
        self.theMovieDb = theMovieDb(self.config)
        self.sources.append(self.theMovieDb)

        # Config imdbWrapper
        self.imdb = imdbWrapper(self.config)
        self.sources.append(self.imdb)

        # Update the cache
        movies = Db.query(Movie).order_by(Movie.name).filter(or_(Movie.status == u'want', Movie.status == u'waiting')).all()
        for movie in movies:
            if not movie.extra:
                self.getExtraInfo(movie)

            # Fix db errors
            try:

                # Clear wrong value
                imdb_is_int = False
                try:
                    imdb_is_int = float(movie.imdb)
                except ValueError:
                    pass

                if not imdb_is_int and movie.imdb[:2] != 'tt':
                    movie.imdb = None
                    Db.flush()

                if movie.imdb and movie.imdb[:2] != 'tt':
                    movie.imdb = 'tt%s' % movie.imdb
                    Db.flush()
                elif not movie.imdb and movie.movieDb:
                    results = self.findById(movie.movieDb)
                    if results.get('imdb'):
                        movie.imdb = results.get('imdb')
                        Db.flush()

                if not movie.imdb:
                    log.error('Errors in your database, try and remove & re-add: %s' % movie.name)
            except:
                pass
예제 #49
0
    def index(self):
        '''
        Show all wanted, snatched, downloaded movies
        '''

        if cherrypy.request.path_info == '/':
            return redirect('movie/')

        qMovie = Db.query(Movie)
        movies = qMovie.order_by(Movie.name).filter(
            or_(Movie.status == u'want', Movie.status == u'waiting')).all()
        snatched = qMovie.order_by(
            desc(Movie.dateChanged),
            Movie.name).filter_by(status=u'snatched').all()
        downloaded = qMovie.order_by(
            desc(Movie.dateChanged),
            Movie.name).filter_by(status=u'downloaded').all()

        return self.render({
            'movies': movies,
            'snatched': snatched,
            'downloaded': downloaded
        })
예제 #50
0
    def _addMovie(self, movie, quality, year=None):

        if cherrypy.config.get('config').get('XBMC', 'dbpath'):
            for root, dirs, files in os.walk(
                    cherrypy.config.get('config').get('XBMC', 'dbpath')):
                for file in files:
                    if file.startswith('MyVideos'):
                        dbfile = os.path.join(root, file)

            if dbfile:
                #------Opening connection to XBMC DB------
                connXbmc = MySqlite.connect(dbfile)
                if connXbmc:
                    log.debug('Checking if movie exists in XBMC by IMDB id:' +
                              movie.imdb)
                    connXbmc.row_factory = MySqlite.Row
                    cXbmc = connXbmc.cursor()
                    cXbmc.execute('select c09 from movie where c09="' +
                                  movie.imdb + '"')
                    #------End of Opening connection to XBMC DB------
                    inXBMC = False
                    for rowXbmc in cXbmc:  # do a final check just to be sure
                        log.debug('Found in XBMC:' + rowXbmc["c09"])
                        if movie.imdb == rowXbmc["c09"]:
                            inXBMC = True
                        else:
                            inXBMC = False

                    cXbmc.close()

                    if inXBMC:
                        log.info('Movie already exists in XBMC, skipping.')
                        return
                else:
                    log.info(
                        'Could not connect to the XBMC database at ' +
                        cherrypy.config.get('config').get('XBMC', 'dbpath'))
            else:
                log.info('Could not find the XBMC MyVideos db at ' +
                         cherrypy.config.get('config').get('XBMC', 'dbpath'))

        log.info('Adding movie to database: %s' % movie.name)

        if movie.id:
            exists = Db.query(Movie).filter_by(movieDb=movie.id).first()
        else:
            exists = Db.query(Movie).filter_by(imdb=movie.imdb).first()

        if exists:
            log.info('Movie already exists, do update.')

            # Delete old qualities
            for x in exists.queue:
                x.active = False
                Db.flush()

            new = exists
        else:
            new = Movie()
            Db.add(new)

        # Update the stuff
        new.status = u'want'
        new.name = movie.name
        new.imdb = movie.imdb
        new.movieDb = movie.id
        new.quality = quality
        new.year = year if year and movie.year == 'None' else movie.year
        Db.flush()

        # Add qualities to the queue
        quality = Db.query(QualityTemplate).filter_by(id=quality).one()
        for type in quality.types:
            queue = MovieQueue()
            queue.qualityType = type.type
            queue.movieId = new.id
            queue.order = type.order
            queue.active = True
            queue.completed = False
            queue.waitFor = 0 if type.markComplete else quality.waitFor
            queue.markComplete = type.markComplete
            Db.add(queue)
            Db.flush()

        #Get xml from themoviedb and save to cache
        self.searchers.get('movie').getExtraInfo(new.id, overwrite=True)

        #gogo find nzb for added movie via Cron
        self.cron.get('yarr').forceCheck(new.id)

        self.flash.add('movie-' + str(new.id),
                       '"%s" (%s) added.' % (new.name, new.year))
예제 #51
0
파일: movierss.py 프로젝트: jj9000/MyGamez
    def doRSSCheck(self):
        '''
        Go find movies and add them!
        '''

        if self.isDisabled():
            log.info('Movie RSS has been disabled')
            return

        log.info('Starting Movies RSS check')

        if not self.isAvailable(self.MovieRSSUrl):
            log.info('Movie RSS is not available')
            return

        RSSData = self.urlopen(self.MovieRSSUrl)
        RSSItems = self.getItems(RSSData)

        RSSMovies = []
        RSSMovie = {'name': 'test', 'year': '2009'}

        MyMovieController = MovieController()

        for RSSItem in RSSItems:
            RSSMovie['name'] = self.gettextelement(
                RSSItem, "title").lower().split("blu-ray")[0].strip(
                    "(").rstrip()  #strip Blu-ray and spaces
            RSSMovie['year'] = self.gettextelement(
                RSSItem, "description").split("|")[1].strip(
                    "(").strip()  #find movie year in description

            if not RSSMovie['name'].find(
                    "/") == -1:  # make sure it is not a double movie release
                continue

            if int(RSSMovie['year']) < int(
                    self.conf('minyear')):  #do year filtering
                continue

            for test in RSSMovies:
                if test.values() == RSSMovie.values(
                ):  # make sure we did not already include it...
                    break
            else:
                log.info('Release found: %s.' % RSSMovie)
                RSSMovies.append(RSSMovie.copy())

        if not RSSMovies:
            log.info('No movies found.')
            return

        log.info("Applying IMDB filter to found movies...")

        for RSSMovie in RSSMovies:
            if self.abort:  #this loop takes a while, stop when the program needs to close
                return

            time.sleep(5)  # give the system some slack

            log.debug('Searching for "%s".' % RSSMovie)
            result = self.searcher['movie'].find(RSSMovie['name'] + ' ' +
                                                 RSSMovie['year'],
                                                 limit=1)

            if not result:
                log.info('Movie not found: "%s".' % RSSMovie)
                continue

            try:
                imdbmovie = self.searcher['movie'].imdb.findByImdbId(
                    result.imdb, True)
            except:
                log.info('Cannot find movie on IMDB: "%s".' % RSSMovie)
                continue

            if not (imdbmovie.get('kind') == 'movie'):
                log.info('This is a ' + imdbmovie.get('kind') +
                         ' not a movie: "%s"' % RSSMovie)
                continue

            if not imdbmovie.get('year'):
                log.info('IMDB has trouble with the year, skipping: "%s".' %
                         RSSMovie)
                continue

            if not int(imdbmovie.get('year')) == int(RSSMovie['year']):
                log.info('IMDB movie year is wrong for: "%s".' % RSSMovie)
                continue

            if not imdbmovie.get('rating'):
                log.info('Rating is unknown for this movie: "%s".' % RSSMovie)
                continue

            if not imdbmovie.get('votes'):
                log.info('Number of votes is unknown for this movie: "%s".' %
                         RSSMovie)
                continue

            if float(imdbmovie.get('rating')) < float(self.conf('minrating')):
                log.info('Rating is too low for this movie: "%s".' % RSSMovie)
                continue

            if float(imdbmovie.get('votes')) < float(self.conf('minvotes')):
                log.info('Number of votes is too low for this movie: "%s".' %
                         RSSMovie)
                continue

            log.info('Adding movie to queue: %s.' % imdbmovie.get('title') +
                     ' (' + str(imdbmovie.get('year')) + ') Rating: ' +
                     str(imdbmovie.get('rating')))
            try:
                # Check and see if the movie is in CP already, if so, ignore it.
                cpMovie = Db.query(Movie).filter_by(imdb=result.imdb).first()
                if cpMovie:
                    log.info('Movie found in CP Database, ignore: "%s".' %
                             RSSMovie)
                    continue

                quality = Db.query(QualityTemplate).filter_by(
                    name=self.config.get('Quality', 'default')).one()
                MyMovieController._addMovie(result, quality.id)
            except:
                log.info('MovieController unable to add this movie: "%s". %s' %
                         (RSSMovie, traceback.format_exc()))
예제 #52
0
    def getExtraInfo(self, movie, overwrite = False):

        if(type(movie) in [int, str, unicode]):
            movie = Db.query(Movie).filter_by(id = movie).one()

        # Try and update if no tmdbId
        if not movie.movieDb:
            result = self.theMovieDb.findByImdbId(movie.imdb)
            if result:
                movie.movieDb = result.id
                Db.flush()

        if not movie.movieDb:
            log.error('Search failed for "%s", no TheMovieDB id.' % movie.name)
            return

        movieId = movie.id
        theMovieDbId = movie.movieDb

        self.cacheExtra(theMovieDbId, overwrite)
        xmlFile = os.path.join(cherrypy.config.get('cachePath'), 'xml', str(theMovieDbId) + '.xml')
        if os.path.isfile(xmlFile):
            if overwrite:
                log.info('Getting extra movie info for %s.' % movie.name)

            handle = open(xmlFile, 'r')
            movieInfo = self.theMovieDb.getItems(handle, 'movies/movie')
            if not movieInfo:
                return
            movieInfo = movieInfo[0]

            # rating
            rating = self.theMovieDb.gettextelement(movieInfo, 'rating')
            self.saveExtra(movieId, 'rating', rating)

            overview = self.theMovieDb.gettextelement(movieInfo, 'overview')
            if overview:
                overview = self.theMovieDb.toSaveString(overview)
                self.saveExtra(movieId, 'overview', overview)

            hasPosterThumb = False

            images = movieInfo.findall('images/image')
            hasPosterCover = False
            hasPosterMid = False
            hasPosterThumb = False
            for image in images:
                imageFile = str(theMovieDbId) + '-' + image.get('type') + '-' + image.get('size') + '.jpg'
                if image.get('type') == 'poster' and image.get('size') == 'cover' and not hasPosterCover:
                    poster = self.theMovieDb.saveImage(image.get('url'), imageFile)
                    if poster: self.saveExtra(movieId, 'poster_cover', poster)
                    hasPosterCover = True
                if image.get('type') == 'poster' and image.get('size') == 'mid' and not hasPosterMid:
                    poster = self.theMovieDb.saveImage(image.get('url'), imageFile)
                    if poster: self.saveExtra(movieId, 'poster_mid', poster)
                    hasPosterMid = True
                if image.get('type') == 'poster' and image.get('size') == 'thumb' and not hasPosterThumb:
                    poster = self.theMovieDb.saveImage(image.get('url'), imageFile)
                    if poster: self.saveExtra(movieId, 'poster_thumb', poster)
                    hasPosterThumb = True

            handle.close()
예제 #53
0
    def save(self, **data):
        '''
        Save all config settings
        '''
        config = cherrypy.config.get('config')

        # catch checkboxes
        bools = filter(lambda s: not data.get(s), [
            'global.launchbrowser',
            'global.updater',
            'XBMC.enabled',
            'XBMC.onSnatch',
            'NMJ.enabled',
            'PLEX.enabled',
            'PROWL.enabled',
            'PROWL.onSnatch',
            'GROWL.enabled',
            'GROWL.onSnatch',
            'Notifo.enabled',
            'Notifo.onSnatch',
            'Boxcar.enabled',
            'Boxcar.onSnatch',
            'NMA.enable',
            'NMA.onSnatch',
            'Twitter.enabled',
            'Twitter.onSnatch',
            'Trakt.notification_enabled',
            'Trakt.watchlist_remove',
            'Trakt.watchlist_enabled',
            'Trakt.dontaddcollection',
            'Meta.enabled',
            'MovieETA.enabled',
            'Renamer.enabled',
            'Renamer.trailerQuality',
            'Renamer.cleanup',
            'Torrents.enabled',
            'NZB.enabled',
            'NZBMatrix.enabled',
            'NZBMatrix.english',
            'NZBMatrix.ssl',
            'NZBsRUS.enabled',
            'newzbin.enabled',
            'NZBsorg.enabled',
            'newznab.enabled',
            'x264.enabled',
            'Subtitles.enabled',
            'Subtitles.addLanguage',
            'MovieRSS.enabled',
            'KinepolisRSS.enabled',
        ])
        data.update(data.fromkeys(bools, False))

        # Do quality order
        order = data.get('Quality.order').split(',')
        for id in order:
            qo = Db.query(QualityTemplate).filter_by(id=int(id)).one()
            qo.order = order.index(id)
            Db.flush()
        del data['Quality.order']

        # Save templates
        if data.get('Quality.templates'):
            templates = json.loads(data.get('Quality.templates'))
            Qualities().saveTemplates(templates)
        del data['Quality.templates']

        # Save post data
        for name in data:
            section = name.split('.')[0]
            var = name.split('.')[1]
            config.set(section, var, data[name])

        # Change cron interval
        self.cron.get('yarr').setInterval(config.get('Intervals', 'search'))

        config.save()

        self.flash.add('config', 'Settings successfully saved.')
        return redirect(cherrypy.request.headers.get('referer'))
예제 #54
0
    def doJSONCheck(self):
        '''
        Go find movies and add them!
        '''

        if self.isDisabled():
            log.debug('Trakt has been disabled')
            return

        log.info('Starting Trakt check')
        req = urllib2.Request(self.TraktUrl + self.conf('apikey') + "/" +
                              self.conf('username'))
        if self.conf('password') != "":
            req.add_data(
                json.dumps({
                    'username': self.conf('username'),
                    'password': sha1(self.conf('password')).hexdigest()
                }))
            req.add_header('content-type', 'application/json')
        try:
            url = urllib2.urlopen(req, timeout=10)
            watchlist = json.load(url)
        except (IOError, URLError):
            log.info('Trakt conection failed')
            return

        MyMovieController = MovieController()

        if not watchlist:
            log.info(
                'No movies found. Please add a password if you have a protected account'
            )
            return

        for movie in watchlist:
            if self.abort:  #this loop takes a while, stop when the program needs to close
                log.info('Aborting trakt watchlist check')
                return

            time.sleep(5)  # give the system some slack

            log.debug('Searching for movie: "%s".' % movie.get('title'))
            result = False
            try:
                if movie.get('tmdb_id') != "":
                    result = self.searcher['movie'].findById(
                        movie.get('tmdb_id'))
                elif movie.get('imdb_id') != "":
                    result = self.searcher['movie'].findByImdbId(
                        movie.get('imdb_id'))
                else:
                    log.info('Trakt has no tmdb or imdb Id for movie: "%s".' %
                             movie.get('title'))
                    continue
            except Exception:
                result = False
            if not result:
                log.info('Movie not found: "%s".' % movie.get('title'))
                continue
            log.debug('Checking movie: %s.' % movie.get('title') + ' (' +
                      str(movie.get('year')) + ')')
            try:
                # Check and see if the movie is in CP already, if so, ignore it.
                cpMovie = Db.query(Movie).filter_by(
                    imdb=movie.get('imdb_id')).first()
                if cpMovie:
                    log.debug('Movie found in CP Database, ignore: "%s".' %
                              movie.get('title'))
                    continue
                log.info('Adding movie to queue: %s.' % movie.get('title') +
                         ' (' + str(movie.get('year')) + ')')
                quality = Db.query(QualityTemplate).filter_by(
                    name=self.config.get('Quality', 'default')).one()
                MyMovieController._addMovie(result, quality.id)
            except:
                log.info('MovieController unable to add this movie: "%s". %s' %
                         (movie.get('title'), traceback.format_exc()))
예제 #55
0
 def alreadyTried(self, nzb, movie):
     return Db.query(History).filter(
         and_(History.movie == movie,
              History.value == str(nzb.id) + '-' + str(nzb.size),
              History.status == u'ignore')).first()
예제 #56
0
    def doJSONCheck(self):
        '''
        Go find movies and add them!
        '''

        if self.isDisabled():
            log.debug('Trakt has been disabled')
            return

        log.info('Starting Trakt check')
        trakt = Trakt()
        watchlist = trakt.getWatchlist()
        if not watchlist:
            log.info(
                "Could not get watchlist. Please add a password if you have a protected account"
            )
            return

        MyMovieController = MovieController()

        for movie in watchlist:
            if self.abort:  #this loop takes a while, stop when the program needs to close
                log.info('Aborting trakt watchlist check')
                return

            time.sleep(5)  # give the system some slack
            if (self.conf('dontaddcollection')):
                if ("in_collection" in movie):
                    if (movie.get("in_collection")):
                        log.debug(
                            'Movie "%s" already in collection, ignoring' %
                            movie.get('title'))
                        continue

            log.debug('Searching for movie: "%s".' % movie.get('title'))
            result = False
            try:
                if movie.get('tmdb_id') != "":
                    result = self.searcher['movie'].findById(
                        movie.get('tmdb_id'))
                elif movie.get('imdb_id') != "":
                    result = self.searcher['movie'].findByImdbId(
                        movie.get('imdb_id'))
                else:
                    log.info('Trakt has no tmdb or imdb Id for movie: "%s".' %
                             movie.get('title'))
                    continue
            except Exception:
                result = False
            if not result:
                log.info('Movie not found: "%s".' % movie.get('title'))
                continue
            log.debug('Checking movie: %s.' % movie.get('title') + ' (' +
                      str(movie.get('year')) + ')')
            try:
                # Check and see if the movie is in CP already, if so, ignore it.
                cpMovie = Db.query(Movie).filter_by(
                    imdb=movie.get('imdb_id')).first()
                if cpMovie:
                    log.debug('Movie found in CP Database, ignore: "%s".' %
                              movie.get('title'))
                    continue
                log.info('Adding movie to queue: %s.' % movie.get('title') +
                         ' (' + str(movie.get('year')) + ')')
                quality = Db.query(QualityTemplate).filter_by(
                    name=self.config.get('Quality', 'default')).one()
                MyMovieController._addMovie(result, quality.id)
            except:
                log.info('MovieController unable to add this movie: "%s". %s' %
                         (movie.get('title'), traceback.format_exc()))
예제 #57
0
 def all(self):
     activeMovies = Db.query(Movie).filter(
         or_(Movie.status == u'want', Movie.status == u'waiting')).all()
     for movie in activeMovies:
         etaQueue.put({'movie': movie})
예제 #58
0
    def determineMovie(self, movie):
        result = False

        movieName = self.cleanName(movie['folder'])
        movieYear = self.findYear(movie['folder'])

        #check to see if the downloaded movie nfo file agrees with what we thought we were downloading
        if movie['info']['cpnfoImdb'] and movie['info']['imdb']:
            cpnfoimdb = 'tt' + movie['info']['cpnfoImdb'].replace("tt", '')
            nfoimdb = 'tt' + movie['info']['imdb'].replace("tt", '')
            if cpnfoimdb != nfoimdb:
                log.info(
                    "Downloaded movie's nfo has imdb id that doesn't match what we though we downloaded"
                )
            movie['info']['imdb'] = cpnfoimdb

        if movie['info']['imdb']:
            byImdb = self.getMovieByIMDB(movie['info']['imdb'])
            if byImdb:
                return byImdb
            else:
                result = cherrypy.config['searchers']['movie'].findByImdbId(
                    movie['info']['imdb'])

        if not result:

            # Check and see if name is in queue
            try:
                queue = Db.query(MovieQueue).filter_by(
                    name=movie['folder']).first()
                if queue:
                    log.info('Found movie via MovieQueue.')
                    return queue.Movie
            except:
                pass

            # Find movie via movie name
            try:
                m = Db.query(Movie).filter_by(name=movieName).first()
                if m:
                    log.info('Found movie via moviename.')
                    return m
            except:
                pass

            # Try and match the movies via filenaming
            for file in movie['files']:
                dirnames = movie['path'].lower().replace(
                    unicode(self.config.get('Renamer', 'download')).lower(),
                    '').split(os.path.sep)
                dirnames.append(file['filename'])
                dirnames.reverse()

                for dir in dirnames:
                    dir = self.cleanName(dir)

                    # last resort, match every word in path to db
                    lastResort = {}
                    dirSplit = re.split('\W+', dir.lower())
                    for s in dirSplit:
                        if s:
                            results = Db.query(Movie).filter(
                                Movie.name.like('%' + s + '%')).filter_by(
                                    year=movieYear).all()
                            for r in results:
                                lastResort[r.id] = r

                    for l in lastResort.itervalues():
                        wordCount = 0
                        for word in dirSplit:
                            if word in l.name.lower():
                                wordCount += 1

                        if wordCount == len(dirSplit) and len(dirSplit) > 0:
                            return l

            # Search tMDB
            if movieName and not movieName in ['movie']:
                log.info('Searching for "%s".' % movie['folder'])
                result = cherrypy.config['searchers']['movie'].find(
                    movieName + ' ' + movieYear, limit=1)

        if result:
            movie = self.getMovieByIMDB(result.imdb)

            if not movie:
                new = Movie()
                Db.add(new)

                try:
                    # Add found movie as downloaded
                    new.status = u'downloaded'
                    new.name = result.name
                    new.imdb = result.imdb
                    new.movieDb = result.id
                    new.year = result.year
                    Db.flush()

                    return new
                except Exception, e:
                    log.error('Movie could not be added to database %s. %s' %
                              (result, e))
            else:
                return movie
예제 #59
0
    def _checkMovieExists(self, movie, qualityId):
        if cherrypy.config.get('config').get('XBMC', 'dbpath'):
            dbfile = None
            for root, dirs, files in os.walk(
                    cherrypy.config.get('config').get('XBMC', 'dbpath')):
                for file in files:
                    if file.startswith('MyVideos'):
                        dbfile = os.path.join(root, file)

            if dbfile:
                #------Opening connection to XBMC DB------
                connXbmc = MySqlite.connect(dbfile)
                if connXbmc:
                    log.debug('Checking if movie exists in XBMC by IMDB id:' +
                              movie.imdb)
                    connXbmc.row_factory = MySqlite.Row
                    cXbmc = connXbmc.cursor()
                    #sqlQuery = 'select c09 from movie where c09="' + movie.imdb + '"'
                    sqlQuery = self._generateSQLQuery(movie)
                    cXbmc.execute(sqlQuery)
                    #------End of Opening connection to XBMC DB------
                    inXBMC = False
                    for rowXbmc in cXbmc:  # do a final check just to be sure
                        log.debug('Found in XBMC:' + rowXbmc["c09"])
                        if movie.imdb == rowXbmc["c09"]:
                            inXBMC = True
                        else:
                            inXBMC = False

                    cXbmc.close()

                    if inXBMC:
                        log.info('Movie already exists in XBMC, skipping.')
                        return True
                else:
                    log.info(
                        'Could not connect to the XBMC database at ' +
                        cherrypy.config.get('config').get('XBMC', 'dbpath'))
            else:
                log.info('Could not find the XBMC MyVideos db at ' +
                         cherrypy.config.get('config').get('XBMC', 'dbpath'))

        if cherrypy.config.get('config').get('XBMC', 'useWebAPIExistingCheck'):
            quality = Db.query(QualityTemplate).filter_by(id=qualityId).one()
            acceptableQualities = [
                x.type for x in filter(lambda x: x.markComplete, quality.types)
            ]
            log.debug(
                "acceptableQualities = %s" % acceptableQualities
            )  # log.info(["%s %s %s %s %s" % (x.id, x.markComplete, x.order, x.quality, x.type) for x in sorted(quality.types, key=lambda x:x.order)])

            xbmc = XBMC()

            sqlQuery = self._generateSQLQuery(movie)
            xbmcResultsHosts = xbmc.queryVideoDatabase(sqlQuery)

            if xbmcResultsHosts:
                for xmbcResults in xbmcResultsHosts:
                    records = xmbcResults.strip().split("<record>")
                    for xmbcResult in records:
                        xmbcResult = xmbcResult.replace("</record>", "")

                        if xmbcResult == "":
                            continue

                        fields = [
                            x.replace("<field>", "")
                            for x in filter(lambda x: x.startswith("<field>"),
                                            xmbcResult.split("</field>"))
                        ]

                        log.debug("fields = %s" % fields)

                        if len(fields) < 5:
                            log.error("Invalid response: %s" % xmbcResult)
                            continue

                        imdbId, strVideoCodec, fVideoAspect, iVideoWidth, iVideoHeight = fields[:
                                                                                                5]
                        if imdbId == movie.imdb:
                            existingMovieQuality = self._classifyQuality(
                                strVideoCodec, fVideoAspect, iVideoWidth,
                                iVideoHeight)

                            if existingMovieQuality == "Unknown":
                                log.info(
                                    "Unable to classify movie: strVideoCodec=%s, fVideoAspect=%s, iVideoWidth=%s, iVideoHeight=%s"
                                    % (strVideoCodec, fVideoAspect,
                                       iVideoWidth, iVideoHeight))

                            treatUnknownAs = cherrypy.config.get('config').get(
                                'XBMC', 'unknown')
                            if treatUnknownAs and treatUnknownAs != '':
                                existingMovieQuality = treatUnknownAs

                            if existingMovieQuality in acceptableQualities:
                                log.info(
                                    'Movie already exists in XBMC (web API call), with acceptable quality (%s), skipping.'
                                    % (existingMovieQuality))
                                return True
                            else:
                                log.info(
                                    'Movie already exists in XBMC (web API call), but quality (%s) incorrect (require: %s).'
                                    % (existingMovieQuality,
                                       acceptableQualities))

        return False