mirror of
				https://github.com/zoriya/Kyoo.git
				synced 2025-11-04 03:27:14 -05:00 
			
		
		
		
	
						commit
						04d4b7ab1d
					
				@ -1,5 +1,5 @@
 | 
			
		||||
from datetime import timedelta
 | 
			
		||||
from typing import Literal
 | 
			
		||||
from typing import Literal, Optional
 | 
			
		||||
import asyncio
 | 
			
		||||
from logging import getLogger
 | 
			
		||||
from providers.provider import Provider, ProviderError
 | 
			
		||||
@ -55,20 +55,44 @@ class Matcher:
 | 
			
		||||
		if raw.get("season") == raw.get("year") and "season" in raw:
 | 
			
		||||
			del raw["season"]
 | 
			
		||||
 | 
			
		||||
		if isinstance(raw.get("season"), list):
 | 
			
		||||
		logger.info("Identied %s: %s", path, raw)
 | 
			
		||||
 | 
			
		||||
		title = raw.get("title")
 | 
			
		||||
		if isinstance(title, list):
 | 
			
		||||
			title = title[0]
 | 
			
		||||
		if not isinstance(title, str):
 | 
			
		||||
			raise ProviderError(f"Could not guess title, found: {title}")
 | 
			
		||||
 | 
			
		||||
		year = raw.get("year")
 | 
			
		||||
		if year is not None and not isinstance(year, int):
 | 
			
		||||
			year = None
 | 
			
		||||
			logger.warn(f"Invalid year value. Found {year}. Ignoring")
 | 
			
		||||
 | 
			
		||||
		if raw["type"] == "movie":
 | 
			
		||||
			await self.search_movie(title, year, path)
 | 
			
		||||
		elif raw["type"] == "episode":
 | 
			
		||||
			season = raw.get("season")
 | 
			
		||||
			if isinstance(season, list):
 | 
			
		||||
				raise ProviderError(
 | 
			
		||||
					f"An episode can't have multiple seasons (found {raw.get('season')} for {path})"
 | 
			
		||||
				)
 | 
			
		||||
		if isinstance(raw.get("episode"), list):
 | 
			
		||||
			if season is not None and not isinstance(season, int):
 | 
			
		||||
				raise ProviderError(f"Could not guess season, found: {season}")
 | 
			
		||||
			episode = raw.get("episode")
 | 
			
		||||
			if isinstance(episode, list):
 | 
			
		||||
				raise ProviderError(
 | 
			
		||||
					f"Multi-episodes files are not yet supported (for {path})"
 | 
			
		||||
				)
 | 
			
		||||
			if not isinstance(episode, int):
 | 
			
		||||
				raise ProviderError(f"Could not guess episode, found: {episode}")
 | 
			
		||||
 | 
			
		||||
		logger.info("Identied %s: %s", path, raw)
 | 
			
		||||
			await self.search_episode(title, year, season, episode, path)
 | 
			
		||||
		else:
 | 
			
		||||
			logger.warn("Unknown video file type: %s", raw["type"])
 | 
			
		||||
 | 
			
		||||
		if raw["type"] == "movie":
 | 
			
		||||
			movie = await self._provider.search_movie(raw["title"], raw.get("year"))
 | 
			
		||||
			movie.path = str(path)
 | 
			
		||||
	async def search_movie(self, title: str, year: Optional[int], path: str):
 | 
			
		||||
		movie = await self._provider.search_movie(title, year)
 | 
			
		||||
		movie.path = path
 | 
			
		||||
		logger.debug("Got movie: %s", movie)
 | 
			
		||||
		movie_id = await self._client.post("movies", data=movie.to_kyoo())
 | 
			
		||||
 | 
			
		||||
@ -79,15 +103,23 @@ class Matcher:
 | 
			
		||||
			await asyncio.gather(
 | 
			
		||||
				*(self._client.link_collection(x, "movie", movie_id) for x in ids)
 | 
			
		||||
			)
 | 
			
		||||
		elif raw["type"] == "episode":
 | 
			
		||||
 | 
			
		||||
	async def search_episode(
 | 
			
		||||
		self,
 | 
			
		||||
		title: str,
 | 
			
		||||
		year: Optional[int],
 | 
			
		||||
		season: Optional[int],
 | 
			
		||||
		episode_nbr: int,
 | 
			
		||||
		path: str,
 | 
			
		||||
	):
 | 
			
		||||
		episode = await self._provider.search_episode(
 | 
			
		||||
				raw["title"],
 | 
			
		||||
				season=raw.get("season"),
 | 
			
		||||
				episode_nbr=raw.get("episode"),
 | 
			
		||||
				absolute=raw.get("episode") if "season" not in raw else None,
 | 
			
		||||
				year=raw.get("year"),
 | 
			
		||||
			title,
 | 
			
		||||
			season=season,
 | 
			
		||||
			episode_nbr=episode_nbr,
 | 
			
		||||
			absolute=episode_nbr if season is None else None,
 | 
			
		||||
			year=year,
 | 
			
		||||
		)
 | 
			
		||||
			episode.path = str(path)
 | 
			
		||||
		episode.path = path
 | 
			
		||||
		logger.debug("Got episode: %s", episode)
 | 
			
		||||
		episode.show_id = await self.create_or_get_show(episode)
 | 
			
		||||
 | 
			
		||||
@ -96,8 +128,6 @@ class Matcher:
 | 
			
		||||
				episode.show, episode.show_id, episode.season_number
 | 
			
		||||
			)
 | 
			
		||||
		await self._client.post("episodes", data=episode.to_kyoo())
 | 
			
		||||
		else:
 | 
			
		||||
			logger.warn("Unknown video file type: %s", raw["type"])
 | 
			
		||||
 | 
			
		||||
	async def create_or_get_collection(self, collection: Collection) -> str:
 | 
			
		||||
		@cache(ttl=timedelta(days=1), cache=self._collection_cache)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user