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 datetime import timedelta
 | 
				
			||||||
from typing import Literal
 | 
					from typing import Literal, Optional
 | 
				
			||||||
import asyncio
 | 
					import asyncio
 | 
				
			||||||
from logging import getLogger
 | 
					from logging import getLogger
 | 
				
			||||||
from providers.provider import Provider, ProviderError
 | 
					from providers.provider import Provider, ProviderError
 | 
				
			||||||
@ -55,20 +55,44 @@ class Matcher:
 | 
				
			|||||||
		if raw.get("season") == raw.get("year") and "season" in raw:
 | 
							if raw.get("season") == raw.get("year") and "season" in raw:
 | 
				
			||||||
			del raw["season"]
 | 
								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(
 | 
									raise ProviderError(
 | 
				
			||||||
					f"An episode can't have multiple seasons (found {raw.get('season')} for {path})"
 | 
										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(
 | 
									raise ProviderError(
 | 
				
			||||||
					f"Multi-episodes files are not yet supported (for {path})"
 | 
										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":
 | 
						async def search_movie(self, title: str, year: Optional[int], path: str):
 | 
				
			||||||
			movie = await self._provider.search_movie(raw["title"], raw.get("year"))
 | 
							movie = await self._provider.search_movie(title, year)
 | 
				
			||||||
			movie.path = str(path)
 | 
							movie.path = path
 | 
				
			||||||
		logger.debug("Got movie: %s", movie)
 | 
							logger.debug("Got movie: %s", movie)
 | 
				
			||||||
		movie_id = await self._client.post("movies", data=movie.to_kyoo())
 | 
							movie_id = await self._client.post("movies", data=movie.to_kyoo())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -79,15 +103,23 @@ class Matcher:
 | 
				
			|||||||
			await asyncio.gather(
 | 
								await asyncio.gather(
 | 
				
			||||||
				*(self._client.link_collection(x, "movie", movie_id) for x in ids)
 | 
									*(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(
 | 
							episode = await self._provider.search_episode(
 | 
				
			||||||
				raw["title"],
 | 
								title,
 | 
				
			||||||
				season=raw.get("season"),
 | 
								season=season,
 | 
				
			||||||
				episode_nbr=raw.get("episode"),
 | 
								episode_nbr=episode_nbr,
 | 
				
			||||||
				absolute=raw.get("episode") if "season" not in raw else None,
 | 
								absolute=episode_nbr if season is None else None,
 | 
				
			||||||
				year=raw.get("year"),
 | 
								year=year,
 | 
				
			||||||
		)
 | 
							)
 | 
				
			||||||
			episode.path = str(path)
 | 
							episode.path = path
 | 
				
			||||||
		logger.debug("Got episode: %s", episode)
 | 
							logger.debug("Got episode: %s", episode)
 | 
				
			||||||
		episode.show_id = await self.create_or_get_show(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
 | 
									episode.show, episode.show_id, episode.season_number
 | 
				
			||||||
			)
 | 
								)
 | 
				
			||||||
		await self._client.post("episodes", data=episode.to_kyoo())
 | 
							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:
 | 
						async def create_or_get_collection(self, collection: Collection) -> str:
 | 
				
			||||||
		@cache(ttl=timedelta(days=1), cache=self._collection_cache)
 | 
							@cache(ttl=timedelta(days=1), cache=self._collection_cache)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user