Add support for search movies & series

This commit is contained in:
mhdzumair
2023-08-06 18:42:28 +05:30
parent 898b1f4b3f
commit dd59773a93
7 changed files with 66 additions and 13 deletions
+8
View File
@@ -88,6 +88,14 @@ async def get_catalog(response: Response, catalog_id: str, skip: int = 0):
return movies
@app.get("/catalog/{content_type}/tamil_blasters/search={search_query}.json", response_model=schemas.Movie)
async def search_movie(response: Response, content_type: Literal["movie", "series"], search_query: str):
response.headers.update({"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "*"})
logging.info(f"Searching for {search_query}")
return await crud.process_search_query(search_query, content_type)
@app.get("/meta/movie/{meta_id}.json")
async def get_meta(meta_id: str, response: Response):
response.headers.update({"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "*"})
+1 -1
View File
@@ -1,4 +1,4 @@
{
"projectName": "stremio-tamilblasters",
"lastCommit": "374da80"
"lastCommit": "898b1f4"
}
+20 -2
View File
@@ -12,7 +12,7 @@ from utils.parser import extract_stream_details
ia = Cinemagoer()
async def get_movies_meta(catalog: str, skip: int = 0, limit: int = 100):
async def get_movies_meta(catalog: str, skip: int = 0, limit: int = 100) -> list[schemas.Meta]:
movies_meta = []
movies = (
await TamilBlasterMovie.find(TamilBlasterMovie.catalog == catalog)
@@ -149,7 +149,7 @@ async def save_movie_metadata(metadata: dict):
movie_data.created_at = metadata["created_at"]
logging.info(f"update video qualities for {metadata['name']}")
else:
movie_data = TamilBlasterMovie.parse_obj(metadata)
movie_data = TamilBlasterMovie.model_validate(metadata)
movie_data.video_qualities = metadata["video_qualities"]
series_data = await TamilBlasterMovie.find_one(
@@ -175,3 +175,21 @@ async def save_movie_metadata(metadata: dict):
logging.info(f"new movie '{metadata['name']}' added.")
await movie_data.save()
async def process_search_query(search_query: str, content_type: str) -> dict:
query = {"$text": {"$search": search_query}, "type": content_type}
search_results = await TamilBlasterMovie.find(query).to_list()
logging.info(f"Found {len(search_results)} results for {search_query} in {content_type}")
movies_meta = []
unique_names = []
for movie in search_results:
meta_data = schemas.Meta.model_validate(movie.model_dump())
meta_data.id = movie.imdb_id or movie.tamilblaster_id
if movie.name not in unique_names:
movies_meta.append(meta_data)
unique_names.append(movie.name)
return {"metas": movies_meta}
+6 -5
View File
@@ -11,11 +11,11 @@ class TamilBlasterMovie(Document):
name: str
catalog: str
type: str
season: Optional[int]
episode: Optional[str]
season: Optional[int] = None
episode: Optional[str] = None
poster: str
imdb_id: Optional[str]
tamilblaster_id: Optional[str]
imdb_id: Optional[str] = None
tamilblaster_id: Optional[str] = None
created_at: datetime = Field(default_factory=datetime.now)
video_qualities: dict
@@ -29,5 +29,6 @@ class TamilBlasterMovie(Document):
("episode", pymongo.ASCENDING),
],
unique=True,
)
),
IndexModel([("name", pymongo.TEXT)]),
]
+1 -1
View File
@@ -17,7 +17,7 @@ class Meta(BaseModel):
class Movie(BaseModel):
metas: Optional[List[Meta]] = []
metas: list[Meta] = []
class Stream(BaseModel):
+22
View File
@@ -35,6 +35,28 @@
"series"
],
"catalogs": [
{
"id": "tamil_blasters",
"type": "movie",
"name": "Movies",
"extra": [
{
"name": "search",
"isRequired": true
}
]
},
{
"id": "tamil_blasters",
"type": "series",
"name": "Series",
"extra": [
{
"name": "search",
"isRequired": true
}
]
},
{
"id": "any_any",
"type": "movie",
+8 -4
View File
@@ -225,22 +225,23 @@ async def run_scraper(
except KeyError:
logging.error(f"Unsupported language or video type: {language}_{video_type}")
return
for page in range(start_page, pages + 1):
for page in range(start_page, pages + start_page):
scrap_link = f"{scrap_link}/page/{page}/"
logging.info(f"Scrap page: {page}")
await scrap_page(scrap_link, language, video_type)
logging.info(f"Scrap completed for : {language}_{video_type}")
async def run_schedule_scrape():
async def run_schedule_scrape(pages: int = 1, start_page: int = 1):
for language in tamil_blaster_links:
for video_type in tamil_blaster_links[language]:
await run_scraper(language, video_type, pages=1, start_page=1, is_scrape_home=False)
await run_scraper(language, video_type, pages=pages, start_page=start_page, is_scrape_home=False)
await run_scraper(is_scrape_home=True)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Scrap Movie metadata from TamilBlasters")
parser.add_argument("--all", action="store_true", help="scrap all type of movies & series")
parser.add_argument("--home", action="store_true", help="scrap home page")
parser.add_argument("-l", "--language", help="scrap movie language", default="tamil")
parser.add_argument("-t", "--video-type", help="scrap movie video type", default="hdrip")
@@ -253,4 +254,7 @@ if __name__ == "__main__":
datefmt="%d-%b-%y %H:%M:%S",
level=logging.INFO,
)
asyncio.run(run_scraper(args.language, args.video_type, args.pages, args.start_pages, args.home))
if args.all:
asyncio.run(run_schedule_scrape(args.pages, args.start_pages))
else:
asyncio.run(run_scraper(args.language, args.video_type, args.pages, args.start_pages, args.home))