From 28c2a9e474e5f8efdf1d8bcff3cca2fcc157b38a Mon Sep 17 00:00:00 2001 From: lomion Date: Thu, 23 Sep 2021 13:39:40 +0200 Subject: [PATCH] Improved Movie and TvShow search --- aiohttp_tester.py | 2 +- drone.yaml | 4 ++-- tmdb/tmdb.py | 27 +++++++++++++++++++-------- tmdb/tmdb_api.py | 36 ++++++++++++++++++++---------------- 4 files changed, 42 insertions(+), 27 deletions(-) diff --git a/aiohttp_tester.py b/aiohttp_tester.py index f4b27ec..cdad572 100644 --- a/aiohttp_tester.py +++ b/aiohttp_tester.py @@ -8,7 +8,7 @@ async def test(): movie = Movie() await movie.load_parameters() id = await movie.search_title('Breakfast Club') - print("ID of Breakfast Club " + id) + print("ID of Breakfast Club " + str(id)) print(time.time() - start) await movie.close_session() diff --git a/drone.yaml b/drone.yaml index 7dc64fd..e8a40f5 100644 --- a/drone.yaml +++ b/drone.yaml @@ -5,7 +5,7 @@ pipeline: - pip install -r requirements.txt - pip install flake8 - python3 test_tmdb.py - - flake8 --ignore=E501 --exclude=__init__.py --exclude=test_tmdb.py + - flake8 --ignore=E501 --exclude=__init__.py,test_tmdb.py build: image: alpine @@ -16,4 +16,4 @@ pipeline: upload: image: uploader project: tmdb-bot - artifact: lomion.tmdb.${DRONE_COMMIT_SHA:0:8}.mbp \ No newline at end of file + artifact: lomion.tmdb.${DRONE_COMMIT_SHA:0:8}.mbp diff --git a/tmdb/tmdb.py b/tmdb/tmdb.py index a5b83b2..5819753 100644 --- a/tmdb/tmdb.py +++ b/tmdb/tmdb.py @@ -132,15 +132,26 @@ class TmdbBot(Plugin): constructor = MessageConstructor(movie) html_message = constructor.construct_html_message() await self.send_html_message(evt, f'{movie.title}', html_message) - await self.send_image(evt, movie.title, movie.get_image_binary()) + if movie.get_image_binary(): + await self.send_image(evt, movie.title, movie.get_image_binary()) + + async def init_movie(self): + movie = Movie() + await movie.load_parameters() + return movie + + async def init_tvshow(self): + show = TvShow() + await show.load_parameters() + return show async def movie_id(self, evt: MessageEvent, message: str = "") -> None: - movie = Movie() + movie = await self.init_movie() self.poster_size(evt, movie) language = self.db.get_language(evt.sender) if language: movie.set_language(language) - movie.query_details(message) + await movie.query_details(message) await self.send_movie_info(evt, movie) @command.new("movie-id", help="Movie lookup by id") @@ -169,7 +180,7 @@ class TmdbBot(Plugin): await evt.respond(content) async def set_poster_size(self, evt: MessageEvent, message: str = None) -> None: - movie = Movie() + movie = await self.init_movie() poster_sizes = "" for x in movie.poster_sizes: poster_sizes += x + " " @@ -197,12 +208,12 @@ class TmdbBot(Plugin): await self.send_help(evt) async def tvshow_search(self, evt: MessageEvent, message: str = "") -> None: - movie = TvShow() + movie = await self.init_tvshow() self.poster_size(evt, movie) language = self.db.get_language(evt.sender) if language: movie.set_language(language) - movie.search_title(message) + await movie.search_title(message) if movie.valid: await self.send_movie_info(evt, movie) else: @@ -214,13 +225,13 @@ class TmdbBot(Plugin): await self.tvshow_search(evt, message) async def movie_search(self, evt: MessageEvent, message: str = "") -> None: - movie = Movie() + movie = await self.init_movie() self.poster_size(evt, movie) language = self.db.get_language(evt.sender) if language: movie.set_language(language) title, year = self.split_title_year(message) - movie.search_title(title, year) + await movie.search_title(title, year) if movie.valid: await self.send_movie_info(evt, movie) else: diff --git a/tmdb/tmdb_api.py b/tmdb/tmdb_api.py index 90612bd..491fb8a 100644 --- a/tmdb/tmdb_api.py +++ b/tmdb/tmdb_api.py @@ -59,15 +59,20 @@ class TmdbApiSingle(TmdbApi): self.title = None self.id = None self.poster_url = None + self.poster_binary = None self.overview = None self.web_url = None self.vote_average = None def get_image_binary(self): + return self.poster_binary + + async def query_image_binary(self): if self.poster_url: async with self.session.get(self.poster_url) as resp: - return await resp.json() - return None + self.poster_binary = await resp.read() + else: + self.poster_binary = None def set_poster_size(self, size): for x in self.poster_sizes: @@ -124,13 +129,13 @@ class Movie(TmdbApiSingle): json = await self.request('search/movie', params=payload) if json['total_results'] > 0: movie_id = json['results'][0]['id'] + await self.query_details(movie_id) await asyncio.gather( - self.query_details(movie_id), - self.query_cast(movie_id)) + self.query_cast(movie_id), + self.query_image_binary()) return movie_id async def query_details(self, id): - print('Get details') data = await self.request('movie/' + str(id)) self.title = data['title'] self.id = data['id'] @@ -138,12 +143,9 @@ class Movie(TmdbApiSingle): self.overview = data['overview'] self.web_url = 'https://www.themoviedb.org/movie/' + str(self.id) self.vote_average = str(data['vote_average']) - print('Got details') async def query_cast(self, id): - print('Get Cast') data = await self.request('movie/' + str(id) + '/credits') - print('Got Cast') self.cast = [] for actor in data['cast']: self.cast.append(actor['name']) @@ -156,27 +158,29 @@ class TvShow(TmdbApiSingle): def __init__(self): super().__init__() - def search_title(self, title): + async def search_title(self, title): payload = {} payload['query'] = title - json = self.request('/search/tv', params=payload) + json = await self.request('/search/tv', params=payload) if json['total_results'] > 0: movie_id = json['results'][0]['id'] - self.query_details(movie_id) + await self.query_details(movie_id) + await asyncio.gather( + self.query_cast(), + self.query_image_binary()) return movie_id - def query_details(self, id): - data = self.request('tv/' + str(id)) + async def query_details(self, id): + data = await self.request('tv/' + str(id)) self.title = data['name'] self.id = data['id'] self.poster_url = self.base_url_poster + data['poster_path'] self.overview = data['overview'] self.web_url = 'https://www.themoviedb.org/tv/' + str(self.id) self.vote_average = str(data['vote_average']) - self.query_cast() - def query_cast(self): - data = self.request('tv/' + str(self.id) + '/credits') + async def query_cast(self): + data = await self.request('tv/' + str(self.id) + '/credits') self.cast = [] for actor in data['cast']: self.cast.append(actor['name'])