Пример #1
0
Файл: utils.py Проект: tax/snor
def save_show(choice='new', **kwargs):
    # Convert to boolean
    kwargs['use_season_folders'] = 'use_season_folders' in kwargs

    # Download serie info from tvdb
    url = 'http://thetvdb.com/api/{api_key}/series/{id}/'

    r = requests.get(url.format(id=kwargs['tvdb_id'], api_key=models.API_KEY))
    t = et.fromstring(r.content)
    show = {i.tag.lower(): i.text for i in t.find('Series')}

    # Only create show in db if it doesn't exist
    shows = Show.select().where(Show.tvdb_id == kwargs['tvdb_id'])
    if shows.count() == 0:
        s = Show.create(**dict(kwargs.items() + show.items()))
    else:
        s = list(shows)[0]
        # Only use valid keys
        showdata = dict(kwargs.items() + show.items()).items()
        d = {k: v for k, v in showdata if k in Show._meta.fields.keys()}
        d['tvdb_id'] = d['id']
        del d['id']
        d['date_last_updated'] = datetime.datetime.now()
        s.update(**d).execute()

    s.save_episodes('download_new_only' in kwargs, 'skip_specials' in kwargs)

    # Mark episodes as downloaded if they exist
    if choice == 'existing':
        s.check_download_status()

    return s.id
Пример #2
0
def save_show(choice='new', **kwargs):
    # Convert to boolean
    kwargs['use_season_folders'] = 'use_season_folders' in kwargs

    # Download serie info from tvdb
    url = 'http://thetvdb.com/api/{api_key}/series/{id}/'

    r = requests.get(url.format(id=kwargs['tvdb_id'], api_key=models.API_KEY))
    t = et.fromstring(r.content)
    show = {i.tag.lower(): i.text for i in t.find('Series')}

    # Only create show in db if it doesn't exist
    shows = Show.select().where(Show.tvdb_id == kwargs['tvdb_id'])
    if shows.count() == 0:
        s = Show.create(**dict(kwargs.items() + show.items()))
    else:
        s = list(shows)[0]
        # Only use valid keys
        showdata = dict(kwargs.items() + show.items()).items()
        d = {k: v for k, v in showdata if k in Show._meta.fields.keys()}
        d['tvdb_id'] = d['id']
        del d['id']
        d['date_last_updated'] = datetime.datetime.now()
        s.update(**d).execute()

    s.save_episodes('download_new_only' in kwargs, 'skip_specials' in kwargs)

    # Mark episodes as downloaded if they exist
    if choice == 'existing':
        s.check_download_status()

    return s.id
Пример #3
0
def create_show_submission():
    form = ShowForm(request.form)

    try:
        new_show = Show(artist_id=form.artist_id.data,
                        venue_id=form.venue_id.data,
                        start_time=form.start_time.data)

        Show.create(new_show)

        flash('Show was successfully listed!')

    except ValueError:  # FIXME melhorar essa exception

        flash('An error occurred. Show could not be listed.')

    return render_template('pages/home.html')
Пример #4
0
def create_show_submission():
    form = ShowForm(request.form)

    try:
        new_show = Show(artist_id=form.artist_id.data,
                        venue_id=form.venue_id.data,
                        start_time=form.start_time.data)

        Show.create(new_show)

        flash('Show was successfully listed!', "success")

    except:

        flash('An error occurred. Show could not be listed.', "danger")

    return render_template('pages/home.html')
Пример #5
0
def create_show_submission():
    # called to create new shows in the db, upon submitting new show listing form
    # TODO: insert form data as a new Show record in the db, instead
    error = False
    try:
        artist_id = request.form.get('artist_id')
        venue_id = request.form.get('venue_id')
        start_time = request.form.get('start_time')
        new_show = Show(venue_id=venue_id,
                        artist_id=artist_id,
                        start_time=start_time)
        Show.create(new_show)
    except:
        db.session.rollback()
        print(sys.exc_info())
        error = True
    finally:
        if error:
            flash('An error occurred. Show could not be listed.')
            return render_template('pages/home.html')
        else:
            flash('Show was successfully listed!')
            return render_template('pages/home.html')
        db.session.close()
Пример #6
0
def main(plex_id=None, force=False):
    logger = logging.getLogger("plex-imdb-updater")
    db.create_connection("db.sqlite")
    # Connect to the Plex server
    logger.info("Connecting to the Plex server at '{base_url}'...".format(base_url=PLEX_URL))
    try:
        plex = PlexServer(PLEX_URL, PLEX_TOKEN)
    except:
        logger.error("No Plex server found at: {base_url}".format(base_url=PLEX_URL))
        return

    libraries = []

    # Get list of movies from the Plex server
    for library_name in LIBRARY_NAMES:
        logger.info("Retrieving a list of movies/shows from the '{library}' library in Plex...".format(library=library_name))
        try:
            libraries.append(plex.library.section(library_name))
        except:
            logger.warning("The '{library}' library does not exist in Plex.".format(library=library_name))
            continue

    if not DRY_RUN:
        conn_db = sqlite3.connect(PLEX_DATABASE_FILE)
        conn_db.isolation_level = None
        database = conn_db.cursor()
    else:
        database = None

    success = 0
    failed = 0

    for library in libraries:
        pbar = tqdm(library.all(), postfix=["", ""])
        pbar.set_description("Processing " + library.title)
        for plex_object in pbar:
            pbar.postfix[0] = plex_object.title
            pbar.postfix[1] = "Processing"
            # first do a check if we specified a plex id
            if plex_id is not None and str(plex_object.ratingKey) != plex_id:
                continue
            # check if movie or show library
            if plex_object.TYPE is "movie":
                is_movie_library = True
                if not force and not should_update_media(plex_object.TYPE, plex_object):
                    continue
            else:
                is_movie_library = False
                if not force and not should_update_media(plex_object.TYPE, plex_object):
                    continue

            # resolve plex object to right identifiers
            imdb_id, tmdb_id, tvdb_id = resolve_ids(is_movie_library, plex_object, force, pbar)

            # if no imdb_id is found for plex guid, reset all ratings
            if not imdb_id:
                logger.debug("Missing IMDB ID. Skipping media object '{pm.title}'.".format(pm=plex_object))
                if not DRY_RUN:
                    db.reset_rating(database, plex_object)
                    db.set_locked_fields(database, plex_object)
                failed = failed + 1
                continue

            logger.debug("Getting ratings for imdb id '{imdb_id}'".format(imdb_id=imdb_id))
            rating = None
            imdb_object = None
            # Check if we need to update this
            if force or should_update_media(plex_object.TYPE, plex_object):
                # first trying to get it from OMDB
                if config.OMDB_API_KEY:
                    imdb_object = omdb.get_imdb_rating_from_omdb(imdb_id, pbar)
                    if imdb_object is not None:
                        logger.debug("{im}\t{pm.title}\tOMDB".format(pm=plex_object, im=imdb_object["imdb_rating"]))
                        rating = imdb_object["imdb_rating"]

                # if no rating yet, try to get it directly from IMDB
                if (imdb_object is None or rating is None) and imdb.title_exists(imdb_id):
                    imdb_object = imdb.get_title_ratings(imdb_id)
                    if imdb_object is not None and "rating" in imdb_object:
                        logger.debug("{im}\t{pm.title}\tIMDB".format(pm=plex_object, im=imdb_object["rating"]))
                        rating = imdb_object["rating"]

                # reset in database if nothing could be fetched
                if rating is None and not DRY_RUN:
                    logger.warning("Media not found on IMDB. Skipping '{pm.title} ({imdb_id})'.".format(
                        pm=plex_object, imdb_id=imdb_id))
                    if not DRY_RUN:
                        db.reset_rating(database, plex_object)
                        db.set_locked_fields(database, plex_object)
                    failed = failed + 1
                    continue

                if is_movie_library:
                    # do update in local library for future reference
                    db_movie = Movie.select().where(Movie.plex_id == plex_object.ratingKey)
                    if db_movie.exists():
                        db.update_db_rating(db_movie.get(), rating)
                    else:
                        Movie.create(
                            title=plex_object.title,
                            plex_id=plex_object.ratingKey,
                            imdb_id=imdb_id,
                            rating=rating,
                            tmdb_id=tmdb_id,
                            release_date=plex_object.originallyAvailableAt
                        )
                else:
                    # do update in local library for future reference
                    db_show = Show.select().where(Show.plex_id == plex_object.ratingKey)
                    if db_show.exists():
                        db.update_db_rating(db_show.get(), rating)
                    else:
                        Show.create(
                            title=plex_object.title,
                            plex_id=plex_object.ratingKey,
                            imdb_id=imdb_id,
                            rating=rating,
                            release_date=plex_object.originallyAvailableAt,
                            tvdb_id=tvdb_id
                        )

                if not DRY_RUN:
                    # if not dry run, do a update in Plex' DB
                    db.set_rating_and_imdb_image(database, plex_object, rating)
                    db.set_locked_fields(database, plex_object)
            # now try to fetch seasons
            if not is_movie_library:
                for season in plex_object.seasons():
                    # don't do anything with specials
                    if season.index is 0:
                        logger.debug("Skipping specials")
                        continue
                    # check if enabled in settings
                    if EPISODE_RATINGS:
                        logger.debug("Getting episodes for {p.title} for season {season}".format(
                            p=plex_object, season=season.index))
                        imdb_episodes = None
                        for episode in season.episodes():
                            update_success = update_episode_rating(database, episode, imdb_episodes, imdb_id,
                                                                   plex_object, season)
                            if update_success:
                                success = success + 1
                            else:
                                failed = failed + 1
            if not DRY_RUN:
                while len(plex.sessions()) is not 0:
                    logger.info("Plex Media Server in use... waiting 10 seconds before commiting changes")
                    sleep(10)
                conn_db.commit()
    if not DRY_RUN:
        database.close()
    logger.info("Finished updating. {success} updated and {failed} failed".format(success=success, failed=failed))
Пример #7
0
 def test_title(self):
     show = Show.create(13015)
     self.assertEqual(show.get_title(), "Arrow")