From b40916c7f4cd5e074403805551082ffe481a3676 Mon Sep 17 00:00:00 2001 From: _aandres Date: Mon, 30 May 2022 00:18:09 +0200 Subject: [PATCH] feat [both]: tmdb calls from django --- front/components/admin/form.vue | 16 ++++++---------- server/myapi/urls.py | 2 ++ server/myapi/views/__init__.py | 0 server/myapi/views/tmdb_views.py | 26 ++++++++++++++++++++++++++ server/requirements.txt | 1 + server/ulm_cine_club_api/urls.py | 5 ++++- 6 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 server/myapi/views/__init__.py create mode 100644 server/myapi/views/tmdb_views.py diff --git a/front/components/admin/form.vue b/front/components/admin/form.vue index 402805b..68532ad 100644 --- a/front/components/admin/form.vue +++ b/front/components/admin/form.vue @@ -132,7 +132,7 @@
@@ -144,7 +144,7 @@
{{ foundFilm.title }}
- {{ foundFilm.release_date }} + {{ foundFilm.releaseDate }}
@@ -176,7 +176,7 @@ const film = useModel("modelValue", { type: "object" }) const foundFilms = ref() // https://developers.themoviedb.org/3/getting-started/images const image = computed(() => (index: number) => { - return `https://image.tmdb.org/t/p/w500${foundFilms.value?.results[index].poster_path}` + return `https://image.tmdb.org/t/p/w500${foundFilms.value[index]?.posterPath}` }) const durationNoSecond = computed({ @@ -187,12 +187,8 @@ const durationNoSecond = computed({ }) async function findFilm() { - foundFilms.value = await $fetch("https://api.themoviedb.org/3/search/movie", { - params: { - api_key: "INSERT API KEY HERE", - language: "fr-FR", - query: title.value, - }, - }) + foundFilms.value = ( + await apiGet("tmdb/search/", { query: film.value.title }) + ).data.value } diff --git a/server/myapi/urls.py b/server/myapi/urls.py index e2242b8..16af695 100644 --- a/server/myapi/urls.py +++ b/server/myapi/urls.py @@ -1,9 +1,11 @@ from django.urls import include, path from rest_framework import routers from .views.std_views import FilmViewSet +from .views.tmdb_views import TmdbViewSet router = routers.DefaultRouter() router.register(r"films", FilmViewSet) +router.register(r"tmdb", TmdbViewSet, "tmdb") # Wire up our API using automatic URL routing. # Additionally, we include login URLs for the browsable API. diff --git a/server/myapi/views/__init__.py b/server/myapi/views/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/myapi/views/tmdb_views.py b/server/myapi/views/tmdb_views.py new file mode 100644 index 0000000..01277bf --- /dev/null +++ b/server/myapi/views/tmdb_views.py @@ -0,0 +1,26 @@ +from rest_framework import viewsets +from rest_framework.decorators import action +from rest_framework.response import Response + +from tmdbv3api import TMDb, Search +tmdb = TMDb() +tmdb.api_key = "" # TODO configure key in settings +tmdb.language = "fr" + + +class TmdbViewSet(viewsets.ViewSet): + @action(methods=['GET'], detail=False) + def search(self, request): + query = request.query_params['query'] + search = Search() + # tmdb_results = search.movies({"query": query}) + tmdb_results = [{'adult': False, 'backdrop_path': '/vdpKKzVqvniuIHF2wguIPUJY4mQ.jpg', 'genre_ids': [], 'id': 139057, 'original_language': 'fr', 'original_title': 'Sans titre', 'overview': "Sans titre est un court métrage français réalisé par Leos Carax, sorti en 1997. Alors que Carax n'avait pas sorti de film depuis six ans (Les Amants du Pont-Neuf, 1991), le festival de Cannes lui a commandé un court métrage où « il donnerait de ses nouvelles. » Tourné en vidéo, le film est projeté, sans titre, pour le cinquantième anniversaire du Festival, dans le but de trouver des financements pour le projet suivant de Carax, Pola X. Le Monde écrit dans son édition du 9 mai 1997 : « La réponse du réalisateur - fulgurance de huit minutes trente-sept secondes dépourvue de titre - rassure d'abord parce qu'elle témoigne de la puissance intacte d'un créateur qui allie virtuosité, mystère et émotion intime en un montage époustouflant qui entremêle l'histoire du cinéma et celle du cinéaste ».", 'popularity': 1.4, 'poster_path': '/wGRhq0eHzt8kaRkGkfEbUrJ4ixQ.jpg', 'release_date': '1997-06-06', 'title': 'Sans Titre', 'video': False, 'vote_average': 4.9, 'vote_count': 7}, {'adult': False, 'backdrop_path': None, 'genre_ids': [], 'id': 754521, 'original_language': 'fr', 'original_title': 'Sans titre', 'overview': 'Un film de Rodolphe Bouquerel', 'popularity': 1.09, 'poster_path': None, 'release_date': '1973-01-01', 'title': 'Sans titre', 'video': False, 'vote_average': 0, 'vote_count': 0}, {'adult': False, 'backdrop_path': None, 'genre_ids': [99], 'id': 940513, 'original_language': 'fr', 'original_title': 'Hors-Titre', 'overview': '', 'popularity': 0.6, 'poster_path': '/627YtGBIJOzrt3FfYFfHLTa7xH6.jpg', 'release_date': '2022-03-11', 'title': 'Hors-Titre', 'video': False, 'vote_average': 0, 'vote_count': 0}, {'adult': False, 'backdrop_path': None, 'genre_ids': [], 'id': 182413, 'original_language': 'en', 'original_title': 'Sans titre', 'overview': '', 'popularity': 0.6, 'poster_path': None, 'release_date': '2011-10-13', 'title': 'Sans titre', 'video': False, 'vote_average': 6, 'vote_count': 1}, {'adult': False, 'backdrop_path': None, 'genre_ids': [99], 'id': 404669, 'original_language': 'xx', 'original_title': 'Sans titre', 'overview': '', 'popularity': 0.6, 'poster_path': '/5L4d1ixUo1rjLSUHw0YWyTUxPPL.jpg', 'release_date': '1997-01-01', 'title': 'Sans titre', 'video': False, 'vote_average': 5, 'vote_count': 1}, {'adult': False, 'backdrop_path': None, 'genre_ids': [], 'id': 308863, 'original_language': 'en', 'original_title': 'Sans titre', 'overview': '', 'popularity': 0.6, 'poster_path': None, 'release_date': '2010-01-01', 'title': 'Sans titre', 'video': False, 'vote_average': 5, 'vote_count': 3}, {'adult': False, 'backdrop_path': None, 'genre_ids': [], 'id': 811923, 'original_language': 'fr', 'original_title': 'Sans titre', 'overview': 'Un filme de Jean-Louis Gonnet', 'popularity': 0.6, 'poster_path': None, 'release_date': '', 'title': 'Sans titre', 'video': False, 'vote_average': 0, 'vote_count': 0}, {'adult': False, 'backdrop_path': None, 'genre_ids': [], 'id': 648867, 'original_language': 'en', 'original_title': 'Sans Titre', 'overview': '', 'popularity': 0.6, 'poster_path': '/uhhVKe8Z4afe0SbhLQMtuLHIL4U.jpg', 'release_date': '2001-01-01', 'title': 'Sans Titre', 'video': False, 'vote_average': 0, 'vote_count': 0}, {'adult': False, 'backdrop_path': None, 'genre_ids': [18], 'id': 649045, 'original_language': 'fr', 'original_title': 'Sans titre', 'overview': '', 'popularity': 0.6, 'poster_path': '/gUMceRxf5la0rRVJagjHKWT4RO0.jpg', 'release_date': '2008-05-18', 'title': 'Sans titre', 'video': False, 'vote_average': 0, 'vote_count': 0}, {'adult': False, 'backdrop_path': None, 'genre_ids': [], 'id': 670135, 'original_language': 'fr', 'original_title': 'sans titre', 'overview': 'En donnant vie à un pigeon en plastique, le même utilisé comme leurre par les chasseurs, Bertrand Planes nous guide, en compagnie du volatile à moteur doté d’une hélice, dans une visite insolite de la ville d’Osaka par voie fluviale. Radiocommandé à distance, le robot est aussi le protagoniste principal d’une série qui lui est dédié, où il visite dans d’autres épisodes différents quartiers de Paris.', 'popularity': 0.6, 'poster_path': None, 'release_date': '2017-01-01', 'title': 'sans titre', 'video': False, 'vote_average': 0, 'vote_count': 0}, {'adult': False, 'backdrop_path': None, 'genre_ids': [], 'id': 685029, 'original_language': 'fr', 'original_title': 'Sans Titre', 'overview': 'Un film de Marie Sochor', 'popularity': 0.6, 'poster_path': '/9cgHjjubeqw5Y7TGvZhatr1edft.jpg', 'release_date': '2003-01-01', 'title': 'Sans Titre', 'video': False, 'vote_average': 0, 'vote_count': 0}, {'adult': False, 'backdrop_path': None, 'genre_ids': [], 'id': 685030, 'original_language': 'fr', 'original_title': 'Sans Titre', 'overview': 'Elle aveugle le texte d’écriture et fait bruire la page.', 'popularity': 0.6, 'poster_path': None, 'release_date': '2005-01-01', 'title': 'Sans Titre', 'video': False, 'vote_average': 0, 'vote_count': 0}, {'adult': False, 'backdrop_path': None, 'genre_ids': [], 'id': 754522, 'original_language': 'fr', 'original_title': 'Sans titre', 'overview': 'Un film de Rodolphe Bouquerel', 'popularity': 0.6, 'poster_path': None, 'release_date': '1974-01-01', 'title': 'Sans titre', 'video': False, 'vote_average': 0, 'vote_count': 0}, {'adult': False, 'backdrop_path': None, 'genre_ids': [], 'id': 774388, 'original_language': 'fr', 'original_title': 'Sans titre', 'overview': 'Un film de Philip Dubuquoy', 'popularity': 0.6, 'poster_path': None, 'release_date': '1981-01-01', 'title': 'Sans titre', 'video': False, 'vote_average': 0, 'vote_count': 0}, {'adult': False, 'backdrop_path': None, 'genre_ids': [], 'id': 968545, 'original_language': 'en', 'original_title': 'Sans Titre', 'overview': '', 'popularity': 0.6, 'poster_path': '/71Jtw8Mmh47dCJVC63Y7x0H25Ay.jpg', 'release_date': '2014-01-01', 'title': 'Sans Titre', 'video': False, 'vote_average': 0, 'vote_count': 0}, {'adult': False, 'backdrop_path': None, 'genre_ids': [], 'id': 545656, 'original_language': 'fr', 'original_title': '(sans titre - 2015)', 'overview': '(sans titre - 2015)', 'popularity': 0.6, 'poster_path': '/25OW1owv3dWSHw2xv2lFQJlk4jS.jpg', 'release_date': '2015-01-01', 'title': '(sans titre - 2015)', 'video': False, 'vote_average': 0, 'vote_count': 0}, {'adult': False, 'backdrop_path': None, 'genre_ids': [], 'id': 569289, 'original_language': 'xx', 'original_title': 'Sans titre 1', 'overview': 'Un film de Jean-Pierre Bertrand', 'popularity': 0.6, 'poster_path': '/q2O8UdC87qzr8CUAKBNbdqzsj1V.jpg', 'release_date': '1972-01-01', 'title': 'Sans titre 1', 'video': False, 'vote_average': 0, 'vote_count': 0}, {'adult': False, 'backdrop_path': None, 'genre_ids': [], 'id': 468356, 'original_language': 'fr', 'original_title': 'Hors Titre I', 'overview': '', 'popularity': 0.6, 'poster_path': '/sw9DwFmrClms9wpc7lACfQPM33h.jpg', 'release_date': '1981-11-17', 'title': 'Hors Titre I', 'video': False, 'vote_average': 0, 'vote_count': 0}, {'adult': False, 'backdrop_path': None, 'genre_ids': [16], 'id': 857067, 'original_language': 'fr', 'original_title': 'Pas de titre', 'overview': '', 'popularity': 0.6, 'poster_path': '/pJ0Tta5gBRYb2FC7XcX8eZ8kbZs.jpg', 'release_date': '2021-08-05', 'title': 'Pas de titre', 'video': False, 'vote_average': 0, 'vote_count': 0}, {'adult': False, 'backdrop_path': None, 'genre_ids': [], 'id': 625355, 'original_language': 'fr', 'original_title': 'Sans titre 84', 'overview': "SANS TITRE 84 utilise des photos découpées en bandes verticales, horizontales et diagonales d'un objet hautement valorisé, l'Arc de triomphe de Paris. Chaque photo n'a que peu d'intérêt, elle n'est que le moment d'une série qui se dirige dans deux directions. La sérialisation des photos appelle le temps. La série façonne un temps qui subvertit la photo. Chaque photo des 4 séries (une autour de l'Arc: 24 positions de prises de vues respectant l'inscription au sol d'une étoile à 24 branches, les 3 autres allant vers l'Arc de trois avenues différentes) est banale, standardisée. Le mélange des vues (2 à 2) produit de nouveaux objets qui mettent en place des moments distincts dans la rotation autour de l'Arc. Ainsi des architectures sont-elles invoquées, convoquées dans leurs restitutions différentielles de l'objet initial. L'objet se perd dans son image deux fois doublée et se reconstitue démembré.", 'popularity': 0.6, 'poster_path': '/9IzCp2UtZhUhf4JoGE8VZM2jM2U.jpg', 'release_date': '1984-01-01', 'title': 'Sans titre 84', 'video': False, 'vote_average': 0, 'vote_count': 0}] + res = [] + for film in tmdb_results: + res.append({ + "id": film["id"], + "release_date": film["release_date"], + "title": film["title"], + "poster_path": film["poster_path"] + }) + return Response(res) diff --git a/server/requirements.txt b/server/requirements.txt index 8bc90a5..c541d00 100644 --- a/server/requirements.txt +++ b/server/requirements.txt @@ -3,3 +3,4 @@ djangorestframework==3.13.1 django-cors-headers==3.11.0 djangorestframework-camel-case==1.3.0 getconf~=1.11.1 +tmdbv3api~=1.7.6 diff --git a/server/ulm_cine_club_api/urls.py b/server/ulm_cine_club_api/urls.py index d269259..8e70c67 100644 --- a/server/ulm_cine_club_api/urls.py +++ b/server/ulm_cine_club_api/urls.py @@ -16,4 +16,7 @@ Including another URLconf from django.contrib import admin from django.urls import path, include -urlpatterns = [path("admin/", admin.site.urls), path("api/", include("myapi.urls"))] +urlpatterns = [ + path("admin/", admin.site.urls), + path("api/", include("myapi.urls")), +]