diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba0430d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__/ \ No newline at end of file diff --git a/apiDMTB.txt b/apiDMTB.txt deleted file mode 100644 index 28eeb08..0000000 --- a/apiDMTB.txt +++ /dev/null @@ -1,5 +0,0 @@ -Clé API -### - -Jeton d'accès en lecture à l'API : -### \ No newline at end of file diff --git a/app.py b/app.py index ee21d42..9d8c4e7 100644 --- a/app.py +++ b/app.py @@ -1,770 +1,124 @@ from flask import Flask, render_template, request -from datetime import datetime -from flask_caching import Cache -import asyncio +from datetime import datetime, timedelta # IMPORT DES MODULES -from modules.date import chiffre_intoMonth, anglais_intoJourFrancais, testChiffreJour, testMoisNumero -from modules.scraping import scrap_infoFilm, get_data, cleanFilms -from modules.urlGenerator import decalageDate +from modules.Classes import * + +cinemas = { + "C0071": "Écoles Cinéma Club", + "C2954": "MK2 Bibliothèque", + "C0050": "MK2 Beaubourg", + "W7504": "Épée de bois", + "C0076": "Cinéma du Panthéon", + "C0089": "Max Linder Panorama", + "C0013": "Luminor Hotel de Ville", + "C0072": "Le Grand Action", + "C0099": "MK2 Parnasse", + "C0073": "Le Champo", + "C0020": "Filmothèque du Quartier Latin", + "C0074": "Reflet Medicis", + "C0159": "UGC Ciné Cité Les Halles", + "C0026": "UGC Ciné Cité Bercy" +} + +theaters: list[Theater] = [] +for id, name in cinemas.items(): + theaters.append(Theater({ + "name": name, + "internalId": id, + "location": None + })) + +def getShowtimes(date): + showtimes:list[Showtime] = [] + + for theater in theaters: + showtimes.extend(theater.getShowtimes(date)) + + data = {} + + for showtime in showtimes: + movie = showtime.movie + theater = showtime.theater + + if showtime.movie.title not in data.keys(): + data[movie.title] = { + "title": movie.title, + "duree": movie.runtime, + "genres": ", ".join(movie.genres), + "casting": ", ".join(movie.cast), + "realisateur": movie.director, + "synopsis": movie.synopsis, + "affiche": movie.affiche, + "director": movie.director, + "seances": {} + } + + + if theater.name not in data[movie.title]["seances"].keys(): + data[movie.title]["seances"][theater.name] = [] + + data[movie.title]["seances"][theater.name].append(showtime.startsAt.strftime("%H:%M")) + + return data + +showtimes = getShowtimes(datetime.today()+timedelta(days=1)) +print("Séances récupéré!") + +import json +with open("tmp.json", "w+", encoding="utf-8") as f: + json.dump(showtimes, f, ensure_ascii=False, indent=4) app = Flask(__name__) -cache = Cache(app, config={'CACHE_TYPE': 'simple'}) + +def translateMonth(num: int): + match num: + case 1: return "janv" + case 2: return "févr" + case 3: return "mars" + case 4: return "avr" + case 5: return "mai" + case 6: return "juin" + case 7: return "juil" + case 8: return "août" + case 9: return "sept" + case 10: return "oct" + case 11: return "nov" + case 12: return "déc" + case _: return "???" + +def translateDay(weekday: int): + match weekday: + case 0: return "lun" + case 1: return "mar" + case 2: return "mer" + case 3: return "jeu" + case 4: return "ven" + case 5: return "sam" + case 6: return "dim" + case _: return "???" @app.route('/') -@cache.cached(timeout=3600) +@app.route('/index') def home(): - date = { - "jour1" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 0), - "chiffre" : testChiffreJour(datetime.today().day, 0), - "mois" : testMoisNumero(datetime.today().day, 0) - }, - "jour2" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 1), - "chiffre" : testChiffreJour(datetime.today().day, 1), - "mois" : testMoisNumero(datetime.today().day, 1) - }, - "jour3" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 2), - "chiffre" : testChiffreJour(datetime.today().day, 2), - "mois" : testMoisNumero(datetime.today().day, 2) - }, - "jour4" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 3), - "chiffre" : testChiffreJour(datetime.today().day, 3), - "mois" : testMoisNumero(datetime.today().day, 3) - }, - "jour5" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 4), - "chiffre" : testChiffreJour(datetime.today().day, 4), - "mois" : testMoisNumero(datetime.today().day, 4) - }, - "jour6" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 5), - "chiffre" : testChiffreJour(datetime.today().day, 5), - "mois" : testMoisNumero(datetime.today().day, 5) - }, - "jour7" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 6), - "chiffre" : testChiffreJour(datetime.today().day, 6), - "mois" : testMoisNumero(datetime.today().day, 6) - } - } + delta = request.args.get("delta", default=0, type=int) - cinemas = [ - { - "salle" : "Écoles Cinéma Club", - "url" : "https://www.allocine.fr/seance/salle_gen_csalle=C0071.html" - }, - { - "salle" : "MK2 Bibliothèque", - "url" : "https://www.allocine.fr/seance/salle_gen_csalle=C2954.html", - }, - { - "salle" : "MK2 Beaubourg", - "url" : "https://www.allocine.fr/seance/salle_gen_csalle=C0050.html" - }, - { - "salle" : "Épée de bois", - "url" : "https://www.allocine.fr/seance/salle_gen_csalle=W7504.html" - }, - { - "salle" : "Cinéma du Panthéon", - "url" : "https://www.allocine.fr/seance/salle_gen_csalle=C0076.html" - }, - { - "salle" : "Max Linder Panorama", - "url" : "https://www.allocine.fr/seance/salle_gen_csalle=C0089.html" - }, - { - "salle" : "Luminor Hotel de Ville", - "url" : "https://www.allocine.fr/seance/salle_gen_csalle=C0013.html" - }, - { - "salle" : "Le Grand Action", - "url" : "https://www.allocine.fr/seance/salle_gen_csalle=C0072.html" - }, - { - "salle" : "MK2 Parnasse", - "url" : "https://www.allocine.fr/seance/salle_gen_csalle=C0099.html" - }, - { - "salle" : "Le Champo", - "url" : "https://www.allocine.fr/seance/salle_gen_csalle=C0073.html" - }, - { - "salle" : "Filmothèque du Quartier Latin", - "url" : "https://www.allocine.fr/seance/salle_gen_csalle=C0020.html" - }, - { - "salle" : "Reflet Medicis", - "url" : "https://www.allocine.fr/seance/salle_gen_csalle=C0074.html" - }, - { - "salle" : "UGC Ciné Cité Les Halles", - "url" : "https://www.allocine.fr/seance/salle_gen_csalle=C0159.html" - }, - { - "salle" : "UGC Ciné Cité Bercy", - "url" : "https://www.allocine.fr/seance/salle_gen_csalle=C0026.html" - } - ] + if delta > 6: delta = 6 + if delta < 0: delta = 0 - films = get_data(cinemas) - filmsClean = cleanFilms(films) + dates = [] - return render_template('index.html', page_actuelle='home', films=filmsClean, date=date) + for i in range(0,7): + day = datetime.today()+timedelta(i+delta) + dates.append({ + "jour": translateDay(day.weekday()), + "chiffre": day.day, + "mois": translateMonth(day.month), + "choisi": i==delta, + "index": i + }) + return render_template('index.html', page_actuelle='home', films=showtimes, dates=dates) -@app.route('/jour1') -@cache.cached(timeout=3600) -def jour1(): - date = { - "jour1" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 0), - "chiffre" : testChiffreJour(datetime.today().day, 0), - "mois" : testMoisNumero(datetime.today().day, 0) - }, - "jour2" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 1), - "chiffre" : testChiffreJour(datetime.today().day, 1), - "mois" : testMoisNumero(datetime.today().day, 1) - }, - "jour3" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 2), - "chiffre" : testChiffreJour(datetime.today().day, 2), - "mois" : testMoisNumero(datetime.today().day, 2) - }, - "jour4" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 3), - "chiffre" : testChiffreJour(datetime.today().day, 3), - "mois" : testMoisNumero(datetime.today().day, 3) - }, - "jour5" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 4), - "chiffre" : testChiffreJour(datetime.today().day, 4), - "mois" : testMoisNumero(datetime.today().day, 4) - }, - "jour6" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 5), - "chiffre" : testChiffreJour(datetime.today().day, 5), - "mois" : testMoisNumero(datetime.today().day, 5) - }, - "jour7" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 6), - "chiffre" : testChiffreJour(datetime.today().day, 6), - "mois" : testMoisNumero(datetime.today().day, 6) - } - } - - films = [] - - cinemas = [ - { - "salle" : "Écoles Cinéma Club", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0071.html#shwt_date=", 1) - }, - { - "salle" : "MK2 Bibliothèque", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C2954.html#shwt_date=l",1) - }, - { - "salle" : "MK2 Beaubourg", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0050.html#shwt_date=",1) - }, - { - "salle" : "Épée de bois", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=W7504.html#shwt_date=",1) - }, - { - "salle" : "Cinéma du Panthéon", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0076.html#shwt_date=",1) - }, - { - "salle" : "Max Linder Panorama", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0089.html#shwt_date=",1) - }, - { - "salle" : "Luminor Hotel de Ville", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0013.html#shwt_date=",1) - }, - { - "salle" : "Le Grand Action", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0072.html#shwt_date=",1) - }, - { - "salle" : "MK2 Parnasse", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0099.html#shwt_date=",1) - }, - { - "salle" : "Le Champo", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0073.html#shwt_date=",1) - }, - { - "salle" : "Filmothèque du Quartier Latin", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0020.html#shwt_date=",1) - }, - { - "salle" : "Reflet Medicis", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0074.html#shwt_date=",1) - }, - { - "salle" : "UGC Ciné Cité Les Halles", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0159.html#shwt_date=",1) - }, - { - "salle" : "UGC Ciné Cité Bercy", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0026.html#shwt_date=",1) - } - ] - - films = get_data(cinemas) - filmsClean = cleanFilms(films) - - return render_template('jours/jour1.html', page_actuelle='jour1', films=filmsClean, date=date) - -@app.route('/jour2') -@cache.cached(timeout=3600) -def jour2(): - date = { - "jour1" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 0), - "chiffre" : testChiffreJour(datetime.today().day, 0), - "mois" : testMoisNumero(datetime.today().day, 0) - }, - "jour2" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 1), - "chiffre" : testChiffreJour(datetime.today().day, 1), - "mois" : testMoisNumero(datetime.today().day, 1) - }, - "jour3" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 2), - "chiffre" : testChiffreJour(datetime.today().day, 2), - "mois" : testMoisNumero(datetime.today().day, 2) - }, - "jour4" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 3), - "chiffre" : testChiffreJour(datetime.today().day, 3), - "mois" : testMoisNumero(datetime.today().day, 3) - }, - "jour5" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 4), - "chiffre" : testChiffreJour(datetime.today().day, 4), - "mois" : testMoisNumero(datetime.today().day, 4) - }, - "jour6" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 5), - "chiffre" : testChiffreJour(datetime.today().day, 5), - "mois" : testMoisNumero(datetime.today().day, 5) - }, - "jour7" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 6), - "chiffre" : testChiffreJour(datetime.today().day, 6), - "mois" : testMoisNumero(datetime.today().day, 6) - } - } - - films = [] - - cinemas = [ - { - "salle" : "Écoles Cinéma Club", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0071.html#shwt_date=", 2) - }, - { - "salle" : "MK2 Bibliothèque", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C2954.html#shwt_date=l",2) - }, - { - "salle" : "MK2 Beaubourg", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0050.html#shwt_date=",2) - }, - { - "salle" : "Épée de bois", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=W7504.html#shwt_date=",2) - }, - { - "salle" : "Cinéma du Panthéon", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0076.html#shwt_date=",2) - }, - { - "salle" : "Max Linder Panorama", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0089.html#shwt_date=",2) - }, - { - "salle" : "Luminor Hotel de Ville", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0013.html#shwt_date=",2) - }, - { - "salle" : "Le Grand Action", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0072.html#shwt_date=",2) - }, - { - "salle" : "MK2 Parnasse", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0099.html#shwt_date=",2) - }, - { - "salle" : "Le Champo", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0073.html#shwt_date=",2) - }, - { - "salle" : "Filmothèque du Quartier Latin", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0020.html#shwt_date=",2) - }, - { - "salle" : "Reflet Medicis", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0074.html#shwt_date=",2) - }, - { - "salle" : "UGC Ciné Cité Les Halles", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0159.html#shwt_date=",2) - }, - { - "salle" : "UGC Ciné Cité Bercy", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0026.html#shwt_date=",2) - } - ] - - films = get_data(cinemas) - filmsClean = cleanFilms(films) - - return render_template('jours/jour2.html', page_actuelle='jour2', films=filmsClean, date=date) - -@app.route('/jour3') -@cache.cached(timeout=3600) -def jour3(): - date = { - "jour1" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 0), - "chiffre" : testChiffreJour(datetime.today().day, 0), - "mois" : testMoisNumero(datetime.today().day, 0) - }, - "jour2" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 1), - "chiffre" : testChiffreJour(datetime.today().day, 1), - "mois" : testMoisNumero(datetime.today().day, 1) - }, - "jour3" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 2), - "chiffre" : testChiffreJour(datetime.today().day, 2), - "mois" : testMoisNumero(datetime.today().day, 2) - }, - "jour4" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 3), - "chiffre" : testChiffreJour(datetime.today().day, 3), - "mois" : testMoisNumero(datetime.today().day, 3) - }, - "jour5" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 4), - "chiffre" : testChiffreJour(datetime.today().day, 4), - "mois" : testMoisNumero(datetime.today().day, 4) - }, - "jour6" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 5), - "chiffre" : testChiffreJour(datetime.today().day, 5), - "mois" : testMoisNumero(datetime.today().day, 5) - }, - "jour7" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 6), - "chiffre" : testChiffreJour(datetime.today().day, 6), - "mois" : testMoisNumero(datetime.today().day, 6) - } - } - - films = [] - - cinemas = [ - { - "salle" : "Écoles Cinéma Club", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0071.html#shwt_date=", 3) - }, - { - "salle" : "MK2 Bibliothèque", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C2954.html#shwt_date=l",3) - }, - { - "salle" : "MK2 Beaubourg", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0050.html#shwt_date=",3) - }, - { - "salle" : "Épée de bois", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=W7504.html#shwt_date=",3) - }, - { - "salle" : "Cinéma du Panthéon", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0076.html#shwt_date=",3) - }, - { - "salle" : "Max Linder Panorama", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0089.html#shwt_date=",3) - }, - { - "salle" : "Luminor Hotel de Ville", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0013.html#shwt_date=",3) - }, - { - "salle" : "Le Grand Action", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0072.html#shwt_date=",3) - }, - { - "salle" : "MK2 Parnasse", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0099.html#shwt_date=",3) - }, - { - "salle" : "Le Champo", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0073.html#shwt_date=",3) - }, - { - "salle" : "Filmothèque du Quartier Latin", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0020.html#shwt_date=",3) - }, - { - "salle" : "Reflet Medicis", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0074.html#shwt_date=",3) - }, - { - "salle" : "UGC Ciné Cité Les Halles", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0159.html#shwt_date=",3) - }, - { - "salle" : "UGC Ciné Cité Bercy", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0026.html#shwt_date=",3) - } - ] - - films = get_data(cinemas) - filmsClean = cleanFilms(films) - - return render_template('jours/jour3.html', page_actuelle='jour3', films=filmsClean, date=date) - -@app.route('/jour4') -@cache.cached(timeout=3600) -def jour4(): - date = { - "jour1" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 0), - "chiffre" : testChiffreJour(datetime.today().day, 0), - "mois" : testMoisNumero(datetime.today().day, 0) - }, - "jour2" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 1), - "chiffre" : testChiffreJour(datetime.today().day, 1), - "mois" : testMoisNumero(datetime.today().day, 1) - }, - "jour3" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 2), - "chiffre" : testChiffreJour(datetime.today().day, 2), - "mois" : testMoisNumero(datetime.today().day, 2) - }, - "jour4" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 3), - "chiffre" : testChiffreJour(datetime.today().day, 3), - "mois" : testMoisNumero(datetime.today().day, 3) - }, - "jour5" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 4), - "chiffre" : testChiffreJour(datetime.today().day, 4), - "mois" : testMoisNumero(datetime.today().day, 4) - }, - "jour6" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 5), - "chiffre" : testChiffreJour(datetime.today().day, 5), - "mois" : testMoisNumero(datetime.today().day, 5) - }, - "jour7" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 6), - "chiffre" : testChiffreJour(datetime.today().day, 6), - "mois" : testMoisNumero(datetime.today().day, 6) - } - } - - films = [] - - cinemas = [ - { - "salle" : "Écoles Cinéma Club", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0071.html#shwt_date=", 4) - }, - { - "salle" : "MK2 Bibliothèque", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C2954.html#shwt_date=l",4) - }, - { - "salle" : "MK2 Beaubourg", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0050.html#shwt_date=",4) - }, - { - "salle" : "Épée de bois", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=W7504.html#shwt_date=",4) - }, - { - "salle" : "Cinéma du Panthéon", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0076.html#shwt_date=",4) - }, - { - "salle" : "Max Linder Panorama", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0089.html#shwt_date=",4) - }, - { - "salle" : "Luminor Hotel de Ville", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0013.html#shwt_date=",4) - }, - { - "salle" : "Le Grand Action", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0072.html#shwt_date=",4) - }, - { - "salle" : "MK2 Parnasse", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0099.html#shwt_date=",4) - }, - { - "salle" : "Le Champo", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0073.html#shwt_date=",4) - }, - { - "salle" : "Filmothèque du Quartier Latin", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0020.html#shwt_date=",4) - }, - { - "salle" : "Reflet Medicis", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0074.html#shwt_date=",4) - }, - { - "salle" : "UGC Ciné Cité Les Halles", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0159.html#shwt_date=",4) - }, - { - "salle" : "UGC Ciné Cité Bercy", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0026.html#shwt_date=",4) - } - ] - - films = get_data(cinemas) - filmsClean = cleanFilms(films) - - return render_template('jours/jour4.html', page_actuelle='jour4', films=filmsClean, date=date) - -@app.route('/jour5') -@cache.cached(timeout=3600) -def jour5(): - date = { - "jour1" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 0), - "chiffre" : testChiffreJour(datetime.today().day, 0), - "mois" : testMoisNumero(datetime.today().day, 0) - }, - "jour2" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 1), - "chiffre" : testChiffreJour(datetime.today().day, 1), - "mois" : testMoisNumero(datetime.today().day, 1) - }, - "jour3" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 2), - "chiffre" : testChiffreJour(datetime.today().day, 2), - "mois" : testMoisNumero(datetime.today().day, 2) - }, - "jour4" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 3), - "chiffre" : testChiffreJour(datetime.today().day, 3), - "mois" : testMoisNumero(datetime.today().day, 3) - }, - "jour5" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 4), - "chiffre" : testChiffreJour(datetime.today().day, 4), - "mois" : testMoisNumero(datetime.today().day, 4) - }, - "jour6" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 5), - "chiffre" : testChiffreJour(datetime.today().day, 5), - "mois" : testMoisNumero(datetime.today().day, 5) - }, - "jour7" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 6), - "chiffre" : testChiffreJour(datetime.today().day, 6), - "mois" : testMoisNumero(datetime.today().day, 6) - } - } - - films = [] - - cinemas = [ - { - "salle" : "Écoles Cinéma Club", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0071.html#shwt_date=",5) - }, - { - "salle" : "MK2 Bibliothèque", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C2954.html#shwt_date=l",5) - }, - { - "salle" : "MK2 Beaubourg", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0050.html#shwt_date=",5) - }, - { - "salle" : "Épée de bois", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=W7504.html#shwt_date=",5) - }, - { - "salle" : "Cinéma du Panthéon", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0076.html#shwt_date=",5) - }, - { - "salle" : "Max Linder Panorama", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0089.html#shwt_date=",5) - }, - { - "salle" : "Luminor Hotel de Ville", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0013.html#shwt_date=",5) - }, - { - "salle" : "Le Grand Action", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0072.html#shwt_date=",5) - }, - { - "salle" : "MK2 Parnasse", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0099.html#shwt_date=",5) - }, - { - "salle" : "Le Champo", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0073.html#shwt_date=",5) - }, - { - "salle" : "Filmothèque du Quartier Latin", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0020.html#shwt_date=",5) - }, - { - "salle" : "Reflet Medicis", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0074.html#shwt_date=",5) - }, - { - "salle" : "UGC Ciné Cité Les Halles", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0159.html#shwt_date=",5) - }, - { - "salle" : "UGC Ciné Cité Bercy", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0026.html#shwt_date=",5) - } - ] - - films = get_data(cinemas) - filmsClean = cleanFilms(films) - - return render_template('jours/jour5.html', page_actuelle='jour5', films=filmsClean, date=date) - -@app.route('/jour6') -@cache.cached(timeout=3600) -def jour6(): - date = { - "jour1" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 0), - "chiffre" : testChiffreJour(datetime.today().day, 0), - "mois" : testMoisNumero(datetime.today().day, 0) - }, - "jour2" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 1), - "chiffre" : testChiffreJour(datetime.today().day, 1), - "mois" : testMoisNumero(datetime.today().day, 1) - }, - "jour3" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 2), - "chiffre" : testChiffreJour(datetime.today().day, 2), - "mois" : testMoisNumero(datetime.today().day, 2) - }, - "jour4" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 3), - "chiffre" : testChiffreJour(datetime.today().day, 3), - "mois" : testMoisNumero(datetime.today().day, 3) - }, - "jour5" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 4), - "chiffre" : testChiffreJour(datetime.today().day, 4), - "mois" : testMoisNumero(datetime.today().day, 4) - }, - "jour6" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 5), - "chiffre" : testChiffreJour(datetime.today().day, 5), - "mois" : testMoisNumero(datetime.today().day, 5) - }, - "jour7" : { - "jour" : anglais_intoJourFrancais(datetime.today().strftime("%A"), 6), - "chiffre" : testChiffreJour(datetime.today().day, 6), - "mois" : testMoisNumero(datetime.today().day, 6) - } - } - - films = [] - - cinemas = [ - { - "salle" : "Écoles Cinéma Club", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0071.html#shwt_date=", 6) - }, - { - "salle" : "MK2 Bibliothèque", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C2954.html#shwt_date=l",6) - }, - { - "salle" : "MK2 Beaubourg", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0050.html#shwt_date=",6) - }, - { - "salle" : "Épée de bois", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=W7504.html#shwt_date=",6) - }, - { - "salle" : "Cinéma du Panthéon", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0076.html#shwt_date=",6) - }, - { - "salle" : "Max Linder Panorama", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0089.html#shwt_date=",6) - }, - { - "salle" : "Luminor Hotel de Ville", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0013.html#shwt_date=",6) - }, - { - "salle" : "Le Grand Action", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0072.html#shwt_date=",6) - }, - { - "salle" : "MK2 Parnasse", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0099.html#shwt_date=",6) - }, - { - "salle" : "Le Champo", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0073.html#shwt_date=",6) - }, - { - "salle" : "Filmothèque du Quartier Latin", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0020.html#shwt_date=",6) - }, - { - "salle" : "Reflet Medicis", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0074.html#shwt_date=",6) - }, - { - "salle" : "UGC Ciné Cité Les Halles", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0159.html#shwt_date=",6) - }, - { - "salle" : "UGC Ciné Cité Bercy", - "url" : decalageDate("https://www.allocine.fr/seance/salle_gen_csalle=C0026.html#shwt_date=",6) - } - ] - - films = get_data(cinemas) - filmsClean = cleanFilms(films) - - return render_template('jours/jour6.html', page_actuelle='jour6', films=filmsClean, date=date) - -""" -@app.route('/process') -def process(): - # Simule un traitement long - time.sleep(5) - return jsonify(status='success', message='Traitement terminé') -""" if __name__ == '__main__': - app.run(debug=True) \ No newline at end of file + app.run() \ No newline at end of file diff --git a/modules/Classes.py b/modules/Classes.py new file mode 100644 index 0000000..c6e78fa --- /dev/null +++ b/modules/Classes.py @@ -0,0 +1,117 @@ +from datetime import datetime +import requests + +class Movie: + def __init__(self, data) -> None: + self.data = data + self.title = data["title"] + self.id = data['internalId'] + self.runtime = data["runtime"] + self.synopsis = data["synopsis"] + self.genres = [genre['translate'] for genre in data["genres"]] + try: + self.affiche = data["poster"]["url"] + except: + self.affiche = "https://upload.wikimedia.org/wikipedia/commons/a/a3/Image-not-found.png" #TODO: Remplacer par une joli image qui fait 1067x1600 + self.cast = [] + + # Noms des acteurs + for actor in data["cast"]["edges"]: + if actor["node"]["actor"] == None: continue + + if actor["node"]["actor"]["lastName"] == None: + actor["node"]["actor"]["lastName"] = "" + + if actor["node"]["actor"]["firstName"] == None: + actor["node"]["actor"]["firstName"] = "" + + name = f'{actor["node"]["actor"]["firstName"]} {actor["node"]["actor"]["lastName"]}' + name = name.lstrip() + self.cast.append(name) + + # Nom du réalisateur + if len(data["credits"]) == 0: + self.director = "Inconnu" + else: + if data["credits"][0]["person"]["lastName"] == None: + data["credits"][0]["person"]["lastName"] = "" + + if data["credits"][0]["person"]["firstName"] == None: + data["credits"][0]["person"]["firstName"] = "" + + self.director = f'{data["credits"][0]["person"]["firstName"]} {data["credits"][0]["person"]["lastName"]}' + self.director = self.director.lstrip() + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} name={self.title}>" + +class Showtime: + def __init__(self, data, theather, movie:Movie) -> None: + self.startsAt = datetime.fromisoformat(data['startsAt']) + self.diffusionVersion = data['diffusionVersion'] + self.services = data["service"] + self.theater:Theater = theather + self.movie = movie + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} name={self.movie.title} startsAt={self.startsAt}>" + +class Theater: + def __init__(self, data) -> None: + self.name = data['name'] + self.id = data['internalId'] + self.location = data['location'] + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} name={self.name}>" + + def getShowtimes(self, date:datetime) -> list[Showtime]: + datestr = date.strftime("%Y-%m-%d") + r = requests.get(f"https://www.allocine.fr/_/showtimes/theater-{self.id}/d-{datestr}/") + if r.status_code != 200: + return {"error": True, "messag": r.status_code, "content": r.content} + + try: + data = r.json() + except: + return {"error": True, "message": "Can't parse JSON", "content": r.content} + + if data['error']: + return {"error": True, "message": "Error in request", "content": data} + + showtimes = [] + + for movie in data['results']: + inst = Movie(movie["movie"]) + movie_showtimes = [] + movie_showtimes.extend(movie["showtimes"]["dubbed"]) + movie_showtimes.extend(movie["showtimes"]["original"]) + movie_showtimes.extend(movie["showtimes"]["local"]) + + for showtime_data in movie_showtimes: + showtimes.append(Showtime(showtime_data, self, inst)) + + return showtimes + + @staticmethod + def new(query:str): + r = requests.get(f"https://www.allocine.fr/_/localization_city/{query}") + + try: + data = r.json() + except: + return {"error": True, "message": "Can't parse JSON", "content": r.content} + + if len(data["values"]["theaters"]) == 0: + return {"error": True, "message": "Not found", "content": r.content} + + return Theater(data["values"]["theaters"][0]["node"]) + +if __name__ == "__main__": + cgr = Theater.new("CGR Brest Le Celtic") + print(f"{cgr.name} ({cgr.id})") + print(f"{cgr.location['zip']} {cgr.location['city']}") + + showtimes = cgr.getShowtimes(datetime.today()) + + print(showtimes[0]) \ No newline at end of file diff --git a/modules/__pycache__/date.cpython-312.pyc b/modules/__pycache__/date.cpython-312.pyc deleted file mode 100644 index 8c136f5..0000000 Binary files a/modules/__pycache__/date.cpython-312.pyc and /dev/null differ diff --git a/modules/__pycache__/firebase.cpython-312.pyc b/modules/__pycache__/firebase.cpython-312.pyc deleted file mode 100644 index c9386ce..0000000 Binary files a/modules/__pycache__/firebase.cpython-312.pyc and /dev/null differ diff --git a/modules/__pycache__/scraping.cpython-312.pyc b/modules/__pycache__/scraping.cpython-312.pyc deleted file mode 100644 index 2f8c626..0000000 Binary files a/modules/__pycache__/scraping.cpython-312.pyc and /dev/null differ diff --git a/modules/__pycache__/urlGenerator.cpython-312.pyc b/modules/__pycache__/urlGenerator.cpython-312.pyc deleted file mode 100644 index 8b2a052..0000000 Binary files a/modules/__pycache__/urlGenerator.cpython-312.pyc and /dev/null differ diff --git a/modules/date.py b/modules/date.py deleted file mode 100644 index 38d008b..0000000 --- a/modules/date.py +++ /dev/null @@ -1,200 +0,0 @@ -import time -from datetime import datetime - -# Converti les mois en chiffre en lettres -def chiffre_intoMonth(month): - match month: - case 1: - return 'janvier' - case 2: - return 'février' - case 3: - return 'mars' - case 4: - return 'avril' - case 5: - return 'mai' - case 6: - return 'juin' - case 7: - return 'juillet' - case 8: - return 'août' - case 9: - return 'septembre' - case 10: - return 'octobre' - case 11: - return 'novembre' - case 12: - return 'décembre' - case _: - return 'invalid month' - -# Calcule le décallage des jours et traduits en lettres -def anglais_intoJourFrancais(jour, decalage): - if decalage == 0: - match jour: - case "Monday": - return 'lun' - case 'Tuesday': - return 'mar' - case 'Wednesday': - return 'mer' - case 'Thursday': - return 'jeu' - case 'Friday': - return 'ven' - case 'Saturday': - return 'sam' - case 'Sunday': - return 'dim' - case _: - return 'invalid jour' - elif decalage == 1: - match jour: - case "Monday": - return 'mar' - case 'Tuesday': - return 'mer' - case 'Wednesday': - return 'jeu' - case 'Thursday': - return 'ven' - case 'Friday': - return 'sam' - case 'Saturday': - return 'dim' - case 'Sunday': - return 'lun' - case _: - return 'invalid jour' - elif decalage == 2: - match jour: - case "Monday": - return 'mer' - case 'Tuesday': - return 'jeu' - case 'Wednesday': - return 'ven' - case 'Thursday': - return 'sam' - case 'Friday': - return 'dim' - case 'Saturday': - return 'lun' - case 'Sunday': - return 'mar' - case _: - return 'invalid jour' - elif decalage == 3: - match jour: - case "Monday": - return 'jeu' - case 'Tuesday': - return 'ven' - case 'Wednesday': - return 'sam' - case 'Thursday': - return 'dim' - case 'Friday': - return 'lun' - case 'Saturday': - return 'mar' - case 'Sunday': - return 'mer' - case _: - return 'invalid jour' - elif decalage == 4: - match jour: - case "Monday": - return 'ven' - case 'Tuesday': - return 'sam' - case 'Wednesday': - return 'dim' - case 'Thursday': - return 'lun' - case 'Friday': - return 'mar' - case 'Saturday': - return 'mer' - case 'Sunday': - return 'jeu' - case _: - return 'invalid jour' - elif decalage == 5: - match jour: - case "Monday": - return 'sam' - case 'Tuesday': - return 'dim' - case 'Wednesday': - return 'lun' - case 'Thursday': - return 'mar' - case 'Friday': - return 'mer' - case 'Saturday': - return 'jeu' - case 'Sunday': - return 'ven' - case _: - return 'invalid jour' - elif decalage == 6: - match jour: - case "Monday": - return 'dim' - case 'Tuesday': - return 'lun' - case 'Wednesday': - return 'mar' - case 'Thursday': - return 'mer' - case 'Friday': - return 'jeu' - case 'Saturday': - return 'ven' - case 'Sunday': - return 'sam' - case _: - return 'invalid jour' - -def testChiffreJour(chiffre, decalage): - today = datetime.today() - month = today.month - - if month in [1, 3, 5, 7, 8, 10, 12]: - max_days = 31 - elif month == 2: - if (today.year % 4 == 0 and today.year % 100 != 0) or (today.year % 400 == 0): - max_days = 29 - else: - max_days = 28 - else: - max_days = 30 - - if chiffre + decalage > max_days: - return chiffre + decalage - max_days - else: - return chiffre + decalage - -def testMoisNumero(chiffre, decalage): - today = datetime.today() - month = today.month - - if month in [1, 3, 5, 7, 8, 10, 12]: - max_days = 31 - elif month == 2: - if (today.year % 4 == 0 and today.year % 100 != 0) or (today.year % 400 == 0): - max_days = 29 - else: - max_days = 28 - else: - max_days = 30 - - if chiffre + decalage > max_days: - next_month = month + 1 if month < 12 else 1 - return chiffre_intoMonth(next_month) - else: - return chiffre_intoMonth(month) \ No newline at end of file diff --git a/modules/firebase.py b/modules/firebase.py deleted file mode 100644 index 175d80a..0000000 --- a/modules/firebase.py +++ /dev/null @@ -1,73 +0,0 @@ -import firebase_admin -from firebase_admin import credentials, db -import urllib.parse - -cred = credentials.Certificate('static/firebase/firebase_grainParisArt.json') -firebase_admin.initialize_app(cred, { - 'databaseURL': '###' -}) - -ref = db.reference('/') - -film = { - 'titre': "L'I.A. du mal", - 'realisateur': 'Luca Guadagnino', - 'casting': [' Zendaya', "Josh O'Connor", 'Mike Faist'], - 'genres': ['Drame', 'Romance'], - 'duree': {'heure': 2, 'minute': 12}, - 'affiche': 'https://fr.web.img2.acsta.net/c_310_420/pictures/24/01/15/10/08/2202044.jpg', - 'synopsis': '\nDurant leurs études, Patrick et Art, tombent amoureux de Tashi. À la fois amis, amants et rivaux, ils voient tous les trois leurs chemins se recroiser des années plus tard. Leur passé et leur présent s’entrechoquent et des tensions jusque-là inavouées refont surface.\n', - 'horaires': [{'cinema': 'MK2 Parnasse', 'seances': ['20:45']}] -} - -def encode_node_name(name): - replacements = { - '.': '__dot__', - '$': '__dollar__', - '#': '__hash__', - '[': '__lbrack__', - ']': '__rbrack__', - '/': '__slash__' - } - - for char, replacement in replacements.items(): - name = name.replace(char, replacement) - - return name - - -def enregistrementFilm(film): - cleaned_movie_name = encode_node_name(film['titre']) - movie_ref = ref.child(cleaned_movie_name) - movie_ref.set({ - 'titre': film['titre'], - 'realisateur': film['realisateur'], - 'casting': film['casting'], - 'genres': film['genres'], - 'duree': film['duree'], - 'affiche': film['affiche'], - 'synopsis': film['synopsis'] - }) - print(f"Node '{film['titre']}' created successfully with details!") - -def recupererDataFilm(nomFilm, realisateur): - cleaned_movie_name = encode_node_name(nomFilm) - print(cleaned_movie_name) - movie_ref = ref.child(cleaned_movie_name) - - # Lire les données du nœud - movie_data = movie_ref.get() - - if movie_data: - # Vérifier si le réalisateur correspond - if movie_data.get('realisateur') == realisateur: - return movie_data - else: - return 0 - else: - return 0 - -def supprimerTousLesFilms(): - root_ref = ref - root_ref.delete() - print("Tous les films ont été supprimés.") diff --git a/modules/scraping.py b/modules/scraping.py deleted file mode 100644 index bf10d48..0000000 --- a/modules/scraping.py +++ /dev/null @@ -1,153 +0,0 @@ -from bs4 import BeautifulSoup -import requests -import requests_cache -from datetime import timedelta -from modules.firebase import enregistrementFilm, recupererDataFilm - - -requests_cache.install_cache('film_cache', expire_after=timedelta(minutes=5)) - -# Récolte les données -def scrap_infoFilm(url, cinema): - films = [] - response = requests.get(url) - reponse_text = response.text - soupReponse = BeautifulSoup(reponse_text, 'html.parser') - - # films_list = soupReponse.find('div', class_="showtimes-list-holder").find_all('div', class_="card entity-card entity-card-list movie-card-theater cf hred") - films_list_container = soupReponse.find('div', class_="showtimes-list-holder") - if films_list_container: - films_list = films_list_container.find_all('div', class_="card entity-card entity-card-list movie-card-theater cf hred") - for film in films_list: - titre = film.find("div", class_="meta").find('h2', class_="meta-title").find("a").get_text() - realisateur_section = film.find("div", class_="meta-body-item meta-body-direction") - - if realisateur_section: - realisateur = realisateur_section.find('span', class_="dark-grey-link").get_text() - else: - realisateur = "Réalisateur non trouvé" - - dataFilm_firebase = recupererDataFilm(titre, realisateur) - if dataFilm_firebase == 0: - # Extraction de l'image - thumbnail_img = film.find('img', class_='thumbnail-img') - if thumbnail_img and not thumbnail_img['src'].startswith('data:image'): - img_url = thumbnail_img['src'] - else: - urlAffiche = "https://www.allocine.fr" + film.find("div", class_="meta").find('h2', class_="meta-title").find("a")['href'] - responseAffiche = requests.get(urlAffiche) - pageFilm = BeautifulSoup(responseAffiche.text, 'html.parser') - thumbnail_img = pageFilm.find('img', class_='thumbnail-img') - img_url = thumbnail_img['src'] if thumbnail_img and not thumbnail_img['src'].startswith('data:image') else 'Image de la vignette non trouvée' - - synopsis = film.find('div', class_="synopsis").find('div', class_="content-txt").get_text() if film.find('div', class_="synopsis") else "synopsis non trouvé" - acteur_container = film.find("div", class_="meta-body-item meta-body-actor") - acteurs = [acteur.get_text() for acteur in acteur_container.find_all("span", class_="dark-grey-link")] if acteur_container else ["acteurs non trouvés"] - - horaire_sections = film.find_all("div", class_="showtimes-hour-block") - horaires = [horaire_section.find('span', class_="showtimes-hour-item-value").get_text() for horaire_section in horaire_sections if horaire_section.find('span', class_="showtimes-hour-item-value")] or ["Horaire non trouvé"] - - genre_container = film.find("div", class_="meta-body-item meta-body-info") - genres = [span.get_text().strip() for span in genre_container.find_all("span") if 'class' in span.attrs and not span.attrs['class'][0].startswith('spacer') and 'nationality' not in span.attrs['class']] if genre_container else ["Genre non trouvé"] - if genres: genres.pop(0) - - # Récupération de la durée du film - url = "https://api.themoviedb.org/3/search/movie?query=" + titre - - headers = { - "accept": "application/json", - "Authorization": "###" - } - - response = requests.get(url, headers=headers) - - if response.status_code == 200: - data = response.json() - if data['results']: - film_id = data['results'][0]['id'] - url = "https://api.themoviedb.org/3/movie/" + str(film_id) - response = requests.get(url, headers=headers) - - data = response.json() - duree_film = data['runtime'] - - heure = duree_film // 60 - minute = duree_film % 60 - else: - heure = 0 - minute = 0 - else: - heure = 0 - minute = 0 - - film_data = { - "titre": titre, - "realisateur": realisateur, - "casting": acteurs, - "genres": genres, - "duree": {"heure": heure, "minute": minute}, - "affiche": img_url, - "synopsis": synopsis, - "horaires": [ - { - "cinema": cinema, - "seances": horaires - } - ] - } - enregistrementFilm(film_data) - print(f"{film_data['titre']} : enregistré dans la db") - else: - horaire_sections = film.find_all("div", class_="showtimes-hour-block") - horaires = [horaire_section.find('span', class_="showtimes-hour-item-value").get_text() for horaire_section in horaire_sections if horaire_section.find('span', class_="showtimes-hour-item-value")] or ["Horaire non trouvé"] - - film_data = { - "titre": dataFilm_firebase['titre'], - "realisateur": dataFilm_firebase['realisateur'], - "casting": dataFilm_firebase['casting'], - 'genres': ['Drame', 'Romance'], - "duree": dataFilm_firebase['duree'], - "affiche": dataFilm_firebase['affiche'], - "synopsis": dataFilm_firebase['synopsis'], - "horaires": [ - { - "cinema": cinema, - "seances": horaires - } - ] - } - print(f"{film_data['titre']} : récupéré dans la db") - - # Ajout du film s'il n'existe pas déjà - existing_film = next((f for f in films if f["titre"] == titre), None) - if existing_film: - existing_film["horaires"].append({ - "cinema": cinema, - "seances": horaires - }) - else: - films.append(film_data) - else: - print(f"L'élément 'showtimes-list-holder' n'a pas été trouvé pour l'URL {url}") - films_list = [] - return films - -def get_data(cinemas): - films = [] - for cinema in cinemas: - result = scrap_infoFilm(cinema["url"], cinema["salle"]) - films.extend(result) - return films - -def cleanFilms(films): - filmsClean = [] - for film in films: - existing_film = next((f for f in filmsClean if f["titre"] == film["titre"]), None) - if existing_film: - existing_film["horaires"].append({ - "cinema": film["horaires"][0]["cinema"], - "seances": film["horaires"][0]["seances"] - }) - else: - filmsClean.append(film) - return filmsClean \ No newline at end of file diff --git a/modules/urlGenerator.py b/modules/urlGenerator.py deleted file mode 100644 index 8cc75d8..0000000 --- a/modules/urlGenerator.py +++ /dev/null @@ -1,40 +0,0 @@ -import time -from datetime import datetime -import datetime - -def decalageDate(baseURL, decalage): - today = datetime.datetime.today() - - day = today.day - year = today.year - month = today.month - - if month in [1, 3, 5, 7, 8, 10, 12]: - max_days = 31 - elif month == 2: - if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0): - max_days = 29 - else: - max_days = 28 - else: - max_days = 30 - - if day + decalage > max_days: - if month + 1 > 12: - year = year + 1 - month = 1 - day = day + decalage - max_days - url = baseURL + str(year) + "-" + str(month).zfill(2) + "-" + str(day).zfill(2) - print(url) - return url - else: - day = day + decalage - max_days - url = baseURL + str(year) + "-" + str(month).zfill(2) + "-" + str(day).zfill(2) - print(url) - return url - else: - day = day + decalage - url = baseURL + str(year) + "-" + str(month).zfill(2) + "-" + str(day).zfill(2) - print(url) - return url - diff --git a/static/firebase/firebase_grainParisArt.json b/static/firebase/firebase_grainParisArt.json deleted file mode 100644 index e69de29..0000000 diff --git a/static/images/LaurenceAnyways.jpg b/static/images/LaurenceAnyways.jpg deleted file mode 100644 index 4aaf79e..0000000 Binary files a/static/images/LaurenceAnyways.jpg and /dev/null differ diff --git a/static/images/aftersun.jpeg b/static/images/aftersun.jpeg deleted file mode 100644 index f0ca262..0000000 Binary files a/static/images/aftersun.jpeg and /dev/null differ diff --git a/static/images/background.png b/static/images/background.png deleted file mode 100644 index 3e0a1b5..0000000 Binary files a/static/images/background.png and /dev/null differ diff --git a/static/images/julieEn12Chapitre.webp b/static/images/julieEn12Chapitre.webp deleted file mode 100644 index 43d0dd1..0000000 Binary files a/static/images/julieEn12Chapitre.webp and /dev/null differ diff --git a/static/images/old.png b/static/images/old.png deleted file mode 100644 index 8e6e9ea..0000000 Binary files a/static/images/old.png and /dev/null differ diff --git a/templates/base.html b/templates/base.html index d711ab3..72ea9bd 100644 --- a/templates/base.html +++ b/templates/base.html @@ -7,6 +7,7 @@ +
🍿
{{date.jour1.jour}}
-{{date.jour1.chiffre}}
-{{date.jour1.mois}}
+{{date.jour}}
+{{date.chiffre}}
+{{date.mois}}
{{date.jour2.jour}}
-{{date.jour2.chiffre}}
-{{date.jour2.mois}}
-{{date.jour3.jour}}
-{{date.jour3.chiffre}}
-{{date.jour3.mois}}
-{{date.jour4.jour}}
-{{date.jour4.chiffre}}
-{{date.jour4.mois}}
-{{date.jour5.jour}}
-{{date.jour5.chiffre}}
-{{date.jour5.mois}}
-{{date.jour6.jour}}
-{{date.jour6.chiffre}}
-{{date.jour6.mois}}
-{{date.jour7.jour}}
-{{date.jour7.chiffre}}
-{{date.jour7.mois}}
+{{date.jour}}
+{{date.chiffre}}
+{{date.mois}}
Réalisateur : {{film.realisateur}}
-Casting : {% for acteur in film.casting %}{{acteur}}, {% endfor %}
-Genre : {% for genre in film.genres %}{{genre}}, {% endfor %}
-Durée : {{film.duree.heure}}h{{film.duree.minute}}
+Réalisateur : {{film.director}}
+Casting : {{ film.casting }}
+Genre : {{ film.genres }}
+Durée : {{film.duree}}
@@ -136,13 +66,13 @@
{{horaire.cinema}}
+{{cinename}}
{{seance}}
🍿
-{{date.jour1.jour}}
-{{date.jour1.chiffre}}
-{{date.jour1.mois}}
-{{date.jour2.jour}}
-{{date.jour2.chiffre}}
-{{date.jour2.mois}}
-{{date.jour3.jour}}
-{{date.jour3.chiffre}}
-{{date.jour3.mois}}
-{{date.jour4.jour}}
-{{date.jour4.chiffre}}
-{{date.jour4.mois}}
-{{date.jour5.jour}}
-{{date.jour5.chiffre}}
-{{date.jour5.mois}}
-{{date.jour6.jour}}
-{{date.jour6.chiffre}}
-{{date.jour6.mois}}
-{{date.jour7.jour}}
-{{date.jour7.chiffre}}
-{{date.jour7.mois}}
-Réalisateur : {{film.realisateur}}
-Casting : {% for acteur in film.casting %}{{acteur}}, {% endfor %}
-Genre : {% for genre in film.genres %}{{genre}}, {% endfor %}
-Durée : {{film.duree.heure}}h{{film.duree.minute}}
-- {{film.synopsis}} -
-{{horaire.cinema}}
-{{seance}}
-🍿
-{{date.jour1.jour}}
-{{date.jour1.chiffre}}
-{{date.jour1.mois}}
-{{date.jour2.jour}}
-{{date.jour2.chiffre}}
-{{date.jour2.mois}}
-{{date.jour3.jour}}
-{{date.jour3.chiffre}}
-{{date.jour3.mois}}
-{{date.jour4.jour}}
-{{date.jour4.chiffre}}
-{{date.jour4.mois}}
-{{date.jour5.jour}}
-{{date.jour5.chiffre}}
-{{date.jour5.mois}}
-{{date.jour6.jour}}
-{{date.jour6.chiffre}}
-{{date.jour6.mois}}
-{{date.jour7.jour}}
-{{date.jour7.chiffre}}
-{{date.jour7.mois}}
-Réalisateur : {{film.realisateur}}
-Casting : {% for acteur in film.casting %}{{acteur}}, {% endfor %}
-Genre : {% for genre in film.genres %}{{genre}}, {% endfor %}
-Durée : {{film.duree.heure}}h{{film.duree.minute}}
-- {{film.synopsis}} -
-{{horaire.cinema}}
-{{seance}}
-🍿
-{{date.jour1.jour}}
-{{date.jour1.chiffre}}
-{{date.jour1.mois}}
-{{date.jour2.jour}}
-{{date.jour2.chiffre}}
-{{date.jour2.mois}}
-{{date.jour3.jour}}
-{{date.jour3.chiffre}}
-{{date.jour3.mois}}
-{{date.jour4.jour}}
-{{date.jour4.chiffre}}
-{{date.jour4.mois}}
-{{date.jour5.jour}}
-{{date.jour5.chiffre}}
-{{date.jour5.mois}}
-{{date.jour6.jour}}
-{{date.jour6.chiffre}}
-{{date.jour6.mois}}
-{{date.jour7.jour}}
-{{date.jour7.chiffre}}
-{{date.jour7.mois}}
-Réalisateur : {{film.realisateur}}
-Casting : {% for acteur in film.casting %}{{acteur}}, {% endfor %}
-Genre : {% for genre in film.genres %}{{genre}}, {% endfor %}
-Durée : {{film.duree.heure}}h{{film.duree.minute}}
-- {{film.synopsis}} -
-{{horaire.cinema}}
-{{seance}}
-🍿
-{{date.jour1.jour}}
-{{date.jour1.chiffre}}
-{{date.jour1.mois}}
-{{date.jour2.jour}}
-{{date.jour2.chiffre}}
-{{date.jour2.mois}}
-{{date.jour3.jour}}
-{{date.jour3.chiffre}}
-{{date.jour3.mois}}
-{{date.jour4.jour}}
-{{date.jour4.chiffre}}
-{{date.jour4.mois}}
-{{date.jour5.jour}}
-{{date.jour5.chiffre}}
-{{date.jour5.mois}}
-{{date.jour6.jour}}
-{{date.jour6.chiffre}}
-{{date.jour6.mois}}
-{{date.jour7.jour}}
-{{date.jour7.chiffre}}
-{{date.jour7.mois}}
-Réalisateur : {{film.realisateur}}
-Casting : {% for acteur in film.casting %}{{acteur}}, {% endfor %}
-Genre : {% for genre in film.genres %}{{genre}}, {% endfor %}
-Durée : {{film.duree.heure}}h{{film.duree.minute}}
-- {{film.synopsis}} -
-{{horaire.cinema}}
-{{seance}}
-🍿
-{{date.jour1.jour}}
-{{date.jour1.chiffre}}
-{{date.jour1.mois}}
-{{date.jour2.jour}}
-{{date.jour2.chiffre}}
-{{date.jour2.mois}}
-{{date.jour3.jour}}
-{{date.jour3.chiffre}}
-{{date.jour3.mois}}
-{{date.jour4.jour}}
-{{date.jour4.chiffre}}
-{{date.jour4.mois}}
-{{date.jour5.jour}}
-{{date.jour5.chiffre}}
-{{date.jour5.mois}}
-{{date.jour6.jour}}
-{{date.jour6.chiffre}}
-{{date.jour6.mois}}
-{{date.jour7.jour}}
-{{date.jour7.chiffre}}
-{{date.jour7.mois}}
-Réalisateur : {{film.realisateur}}
-Casting : {% for acteur in film.casting %}{{acteur}}, {% endfor %}
-Genre : {% for genre in film.genres %}{{genre}}, {% endfor %}
-Durée : {{film.duree.heure}}h{{film.duree.minute}}
-- {{film.synopsis}} -
-{{horaire.cinema}}
-{{seance}}
-🍿
-{{date.jour1.jour}}
-{{date.jour1.chiffre}}
-{{date.jour1.mois}}
-{{date.jour2.jour}}
-{{date.jour2.chiffre}}
-{{date.jour2.mois}}
-{{date.jour3.jour}}
-{{date.jour3.chiffre}}
-{{date.jour3.mois}}
-{{date.jour4.jour}}
-{{date.jour4.chiffre}}
-{{date.jour4.mois}}
-{{date.jour5.jour}}
-{{date.jour5.chiffre}}
-{{date.jour5.mois}}
-{{date.jour6.jour}}
-{{date.jour6.chiffre}}
-{{date.jour6.mois}}
-{{date.jour7.jour}}
-{{date.jour7.chiffre}}
-{{date.jour7.mois}}
-Réalisateur : {{film.realisateur}}
-Casting : {% for acteur in film.casting %}{{acteur}}, {% endfor %}
-Genre : {% for genre in film.genres %}{{genre}}, {% endfor %}
-Durée : {{film.duree.heure}}h{{film.duree.minute}}
-- {{film.synopsis}} -
-{{horaire.cinema}}
-{{seance}}
-