Skip to content

Commit

Permalink
Add non-blocking functions to assign series ID's and get poster
Browse files Browse the repository at this point in the history
Part of #311. Part of the /api/series endpoint implementation
  • Loading branch information
CollinHeist committed Mar 22, 2023
1 parent 39ecadf commit c605f5e
Showing 1 changed file with 107 additions and 8 deletions.
115 changes: 107 additions & 8 deletions app/routers/series.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,116 @@
from typing import Optional
from pathlib import Path
from requests import get
from typing import Annotated, Literal, Optional, Union

from fastapi import APIRouter, Depends
from fastapi import APIRouter, Body, Depends, Form, HTTPException, Query, \
Response, UploadFile
from starlette.responses import RedirectResponse
from sqlalchemy import or_
from sqlalchemy.orm import Session

from app.dependencies import get_database
from app.models.series import Series
from app.models.episode import Episode
from modules.Debug import log
from modules.SeriesInfo import SeriesInfo

from app.dependencies import get_database, get_preferences, get_emby_interface,\
get_jellyfin_interface, get_plex_interface, get_sonarr_interface, \
get_tmdb_interface
import app.models as models
from app.schemas.preferences import EpisodeDataSource, MediaServer,\
MediaServerToggle
from app.schemas.series import (
CreateSeries, Series, SortedImageSourceToggle, UpdateSeries
)
from app.schemas.episode import Episode


def set_series_database_ids(
series: Series,
db: 'Database',
emby_library_name: Optional[str],
jellyfin_library_name: Optional[str],
plex_library_name: Optional[str],
emby_interface: 'EmbyInterface',
jellyfin_interface: 'JellyfinInterface',
plex_interface: 'PlexInterface',
sonarr_interface: 'SonarrInterface',
tmdb_interface: 'TMDbInterface') -> Series:

# Create SeriesInfo object for this entry, query all interfaces
series_info = SeriesInfo(
series.name, series.year, emby_id=series.emby_id,
jellyfin_id=series.jellyfin_id, sonarr_id=series.sonarr_id,
tmdb_id=series.tmdb_id, tvdb_id=series.tvdb_id,
tvrage_id=series.tvrage_id,
)
if emby_interface is not None and emby_library_name is not None:
emby_interface.set_series_ids(emby_library_name, series_info)
if jellyfin_interface is not None and jellyfin_library_name is not None:
jellyfin_interface.set_series_ids(jellyfin_library_name, series_info)
if plex_interface is not None and plex_library_name is not None:
plex_interface.set_series_ids(plex_library_name, series_info)
if sonarr_interface is not None:
sonarr_interface.set_series_ids(series_info)
if tmdb_interface is not None:
tmdb_interface.set_series_ids(series_info)

# Update database if new ID's are available
if series.emby_id is None and series_info.has_id('emby_id'):
series.emby_id = series_info.emby_id
if series.jellyfin_id is None and series_info.has_id('jellyfin_id'):
series.jellyfin_id = series_info.jellyfin_id
if series.sonarr_id is None and series_info.has_id('sonarr_id'):
series.sonarr_id = series_info.sonarr_id
if series.tmdb_id is None and series_info.has_id('tmdb_id'):
series.tmdb_id = series_info.tmdb_id
if series.tvdb_id is None and series_info.has_id('tvdb_id'):
series.tvdb_id = series_info.tvdb_id
if series.tvrage_id is None and series_info.has_id('tvrage_id'):
series.tvrage_id = series_info.tvrage_id
db.commit()

return series


def download_series_poster(
series: Series,
db: 'Database',
preferences: 'Preferences',
tmdb_interface: 'TMDbInterface') -> str:

# If series poster exists and is not a placeholder, return that
path = Path(series.poster_path)
if path.exists() and path.name != 'placeholder.jpg':
return series.poster_url

# Attempt to download poster
series_info = SeriesInfo(
series.name, series.year, emby_id=series.emby_id,
jellyfin_id=series.jellyfin_id, sonarr_id=series.sonarr_id,
tmdb_id=series.tmdb_id, tvdb_id=series.tvdb_id,
tvrage_id=series.tvrage_id,
)

if tmdb_interface is not None:
poster_url = tmdb_interface.get_series_poster(series_info)
if poster_url is None:
log.debug(f'TMDb returned no valid posters')
else:
path = preferences.asset_directory / 'posters' / f'{series.id}.jpg'
try:
path.write_bytes(get(poster_url).content)
series.poster_path = str(path)
series.poster_url = f'/assets/posters/{series.id}.jpg'
db.commit()
log.debug(f'Downloaded poster')
except Exception as e:
log.error(f'Error downloading poster', e)

return series.poster_url


series_router = APIRouter(
prefix='/series',
tags=['series', 'shows'],
dependencies=[],#[Depends(get_database)],
responses={404: {'description': 'series not found'}},
tags=['Series'],
)

@series_router.post('/new')
Expand Down

0 comments on commit c605f5e

Please sign in to comment.