commit ea9f4d79b00244f407861849a78f227ca5edfdd4 Author: Solène <138325816+solene-drnx@users.noreply.github.com> Date: Mon Sep 16 13:29:02 2024 +0200 Push public diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/apiDMTB.txt b/apiDMTB.txt new file mode 100644 index 0000000..28eeb08 --- /dev/null +++ b/apiDMTB.txt @@ -0,0 +1,5 @@ +Clé API +### + +Jeton d'accès en lecture à l'API : +### \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000..ee21d42 --- /dev/null +++ b/app.py @@ -0,0 +1,770 @@ +from flask import Flask, render_template, request +from datetime import datetime +from flask_caching import Cache +import asyncio + +# 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 + +app = Flask(__name__) +cache = Cache(app, config={'CACHE_TYPE': 'simple'}) + +@app.route('/') +@cache.cached(timeout=3600) +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) + } + } + + 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" + } + ] + + films = get_data(cinemas) + filmsClean = cleanFilms(films) + + return render_template('index.html', page_actuelle='home', films=filmsClean, date=date) + + +@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 diff --git a/modules/__pycache__/date.cpython-312.pyc b/modules/__pycache__/date.cpython-312.pyc new file mode 100644 index 0000000..8c136f5 Binary files /dev/null and b/modules/__pycache__/date.cpython-312.pyc differ diff --git a/modules/__pycache__/firebase.cpython-312.pyc b/modules/__pycache__/firebase.cpython-312.pyc new file mode 100644 index 0000000..c9386ce Binary files /dev/null and b/modules/__pycache__/firebase.cpython-312.pyc differ diff --git a/modules/__pycache__/scraping.cpython-312.pyc b/modules/__pycache__/scraping.cpython-312.pyc new file mode 100644 index 0000000..2f8c626 Binary files /dev/null and b/modules/__pycache__/scraping.cpython-312.pyc differ diff --git a/modules/__pycache__/urlGenerator.cpython-312.pyc b/modules/__pycache__/urlGenerator.cpython-312.pyc new file mode 100644 index 0000000..8b2a052 Binary files /dev/null and b/modules/__pycache__/urlGenerator.cpython-312.pyc differ diff --git a/modules/date.py b/modules/date.py new file mode 100644 index 0000000..38d008b --- /dev/null +++ b/modules/date.py @@ -0,0 +1,200 @@ +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 new file mode 100644 index 0000000..175d80a --- /dev/null +++ b/modules/firebase.py @@ -0,0 +1,73 @@ +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 new file mode 100644 index 0000000..bf10d48 --- /dev/null +++ b/modules/scraping.py @@ -0,0 +1,153 @@ +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 new file mode 100644 index 0000000..8cc75d8 --- /dev/null +++ b/modules/urlGenerator.py @@ -0,0 +1,40 @@ +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/requirements.txt b/requirements.txt new file mode 100644 index 0000000..6d93b7a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,52 @@ +attrs==24.2.0 +beautifulsoup4==4.12.3 +blinker==1.8.2 +bs4==0.0.2 +CacheControl==0.14.0 +cachelib==0.9.0 +cachetools==5.4.0 +cattrs==23.2.3 +certifi==2024.7.4 +cffi==1.17.0 +charset-normalizer==3.3.2 +click==8.1.7 +cryptography==43.0.0 +firebase-admin==6.5.0 +Flask==3.0.3 +Flask-Caching==2.3.0 +google-api-core==2.19.1 +google-api-python-client==2.140.0 +google-auth==2.33.0 +google-auth-httplib2==0.2.0 +google-cloud-core==2.4.1 +google-cloud-firestore==2.17.1 +google-cloud-storage==2.18.2 +google-crc32c==1.5.0 +google-resumable-media==2.7.2 +googleapis-common-protos==1.63.2 +grpcio==1.65.4 +grpcio-status==1.62.3 +httplib2==0.22.0 +idna==3.7 +itsdangerous==2.2.0 +Jinja2==3.1.4 +MarkupSafe==2.1.5 +msgpack==1.0.8 +mysql-connector-python==9.0.0 +platformdirs==4.2.2 +proto-plus==1.24.0 +protobuf==4.25.4 +pyasn1==0.6.0 +pyasn1_modules==0.4.0 +pycparser==2.22 +PyJWT==2.9.0 +pyparsing==3.1.2 +requests==2.32.3 +requests-cache==1.2.1 +rsa==4.9 +six==1.16.0 +soupsieve==2.5 +uritemplate==4.1.1 +url-normalize==1.4.3 +urllib3==2.2.2 +Werkzeug==3.0.3 diff --git a/static/.DS_Store b/static/.DS_Store new file mode 100644 index 0000000..2a043aa Binary files /dev/null and b/static/.DS_Store differ diff --git a/static/css/main.css b/static/css/main.css new file mode 100644 index 0000000..40810f2 --- /dev/null +++ b/static/css/main.css @@ -0,0 +1,519 @@ +@font-face { + font-family: 'healTheWebA'; + src: url("../font/HealTheWebA-Regular.otf"); +} + +@font-face { + font-family: 'healTheWebB'; + src: url("../font/HealTheWebB-Regular.otf"); +} + +@font-face { + font-family: 'Raleway-Black'; + src: url("../font/Raleway-Black.ttf"); +} + +@font-face { + font-family: 'Montserrat-ExtraBold'; + src: url("../font/montserrat_extrabold.ttf"); +} + +body { + margin: 0; + font-family: 'healTheWebA', sans-serif; +} + +h1 h2 h3 { + font-family: 'healTheWebB', sans-serif; +} + +h3 { + font-size: 24px; +} + +.background_svg { + position: fixed; + top: -30%; + left: -10%; + z-index: -2; + width: 150vw; +} + +p { + font-size: 20; + font-family: 'healTheWebA', sans-serif; +} + +.divHeader { + margin-left: 10%; + margin-right: 10%; + display: flex; + flex-direction: row; + align-items: baseline; + justify-content: space-between; +} + +#map { + margin-left: 10%; + margin-right: 10%; + height: 500px; + border-radius: 10px; +} + +.custom-marker { + background-color: #444cf7; + border: 2px solid #fff; + border-radius: 50%; + width: 15px; + height: 15px; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); +} + +/* 444cf7 */ + +.container_titrePlanning, +.container_infoFilm { + margin-left: 10%; + margin-right: 10%; +} + +.line { + width: 100%; + height: 2px; + background-image: linear-gradient(90deg, rgba(68, 76, 247, 1) 0%, rgba(9, 9, 121, 1) 35%, rgba(2, 0, 36, 1) 100%); + margin-top: 10px; + margin-bottom: 20px; +} + +.container_titrePlanning { + margin-top: 50px; +} + +.affiche { + width: 200px; + height: 288px; + border-radius: 5px; + padding-right: 30px; +} + +.container_infoFilm { + position: relative; + display: flex; + flex-direction: row; +} + +.blur-background { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(255, 255, 255, 0.3); + backdrop-filter: blur(20px); + z-index: -1; + border-radius: 20px; + filter: drop-shadow(0 -6mm 4mm rgba(2, 2, 2, 0.2)); + filter: drop-shadow(2mm 6mm 6mm rgba(2, 2, 2, 0.2)); +} + +.info-content { + position: relative; + z-index: 1; +} + +.realisateur, +.duree, +.casting, +.genre { + margin-top: -20px; +} + +.date { + display: flex; + flex-direction: column; + align-items: center; + border-radius: 10px; + width: 80px; + height: 100px; + justify-content: center; +} + +.date-selectionne { + display: flex; + flex-direction: column; + align-items: center; + background-color: #444cf7; + color: white; + border-radius: 10px; + width: 80px; + height: 100px; + justify-content: center; + filter: drop-shadow(2mm 6mm 6mm rgba(2, 2, 2, 0.2)); +} + +.mois { + margin-bottom: 20px; +} + +.calendrier { + width: 600px; + position: relative; + display: flex; + flex-direction: row; + justify-content: space-between; +} + +.chiffre { + font-family: 'Montserrat-ExtraBold'; + font-size: 42px; + margin-top: -20px; + margin-bottom: -20px; +} + +.duree { + margin-bottom: 45px; +} + +.cinema { + background-color: #444cf7; + border-radius: 5px; + height: 40px; + width: 200px; + color: white; + padding-left: 10px; + box-sizing: border-box; + align-items: center; + display: flex; + align-items: center; + filter: drop-shadow(2mm 6mm 6mm rgba(2, 2, 2, 0.2)); + flex-shrink: 0; + flex-grow: 0; +} + +.horaire_container { + background-color: white; +} + +.seance_container { + margin-right: 10%; + margin-left: 10%; + display: flex; + flex-direction: row; +} + +.horaires_container { + display: flex; + flex-direction: row; + max-width: 80% - 200px; + overflow-x: auto; +} + +.horaire { + background-color: white; + border-radius: 5px; + height: 40px; + width: 100px; + color: #444cf7; + box-sizing: border-box; + align-items: center; + display: flex; + align-items: center; + justify-content: center; + margin-left: 10px; + filter: drop-shadow(2mm 6mm 6mm rgba(2, 2, 2, 0.2)); + flex-shrink: 0; + flex-grow: 0; +} + +footer { + background-color: white; +} + +.container_footer { + margin-right: 10%; + margin-left: 10%; + display: flex; + flex-direction: row; + justify-content: space-between; +} + +.contenu_edt { + display: flex; + flex-direction: row; + justify-content: space-between; +} + +.txt_edt { + position: relative; + top: 50px; +} + +.synopsis_container { + max-width: 800px; + margin-right: 10%; +} + +.synopsis { + opacity: 0.8; +} + +.date:hover { + display: flex; + flex-direction: column; + align-items: center; + background-color: #444cf7; + color: white; + border-radius: 10px; + width: 80px; + height: 100px; + justify-content: center; + filter: drop-shadow(2mm 6mm 6mm rgba(2, 2, 2, 0.2)); + transition: all 0.2s ease-in-out; +} + +a { + text-decoration: none; + color: black; +} + +#loader { + min-width: 100vw; + min-height: 100vh; + display: flex; + justify-content: center; + align-items: center; +} + +#loader div.box { + width: 3rem; + height: 3rem; + position: relative; + margin: 0 1rem 0 1rem; +} + +#loader div.box::after { + content: ""; + position: absolute; + background: #444cf7; + height: 3rem; + ; + width: 3rem; + border-radius: 50%; + animation: move 1s ease alternate infinite; + opacity: 0; +} + +#loader div.box:nth-child(2)::after { + animation-delay: 0.25s; +} + +#loader div.box:nth-child(3)::after { + animation-delay: 0.5s; +} + +@keyframes move { + 0% { + bottom: -1.5rem; + opacity: 0; + } + + 100% { + bottom: 1.5rem; + opacity: 1; + } +} + +.goTop { + width: 50px; + height: 50px; + background-color: #444cf7; + border: #fff solid 5px; + border-radius: 50%; + position: fixed; + bottom: 20px; + right: 20px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + filter: drop-shadow(2mm 6mm 6mm rgba(2, 2, 2, 0.2)); +} + +html { + scroll-behavior: smooth; +} + +.responsive-div { + height: 90px; +} + +.responsive-petite-div { + height: 10px; +} + +@media (max-width: 576px) { + .contenu_edt { + display: flex; + flex-direction: column; + } + #map { + max-width: 100vw; + height: 400px; + /* width: 350px; */ + border-radius: 5px; + } + body { + margin: 0; + padding: 0; + overflow-y: auto; + } + .divHeader { + flex-direction: column; + max-width: 80vw; + } + h1 { + margin-block-start: 15px; + margin-block-end: 0; + } + p{ + font-size: 12px; + margin-block-start: -5px; + } + .date { + width: 40px; + height: 50px; + } + + .date-selectionne { + width: 50px; + height: 50px; + } + + .mois { + margin-bottom: 20px; + font-size: 10px; + } + + .calendrier { + max-width: 80vw; + width: 350px; + } + + .chiffre { + font-size: 20px; + margin-top: 15px; + margin-bottom: 0; + } + .jour { + display: none; + } + .txt_edt { + display: none; + } + .line { + max-width: 80vw; + width: 350px; + } + .affiche { + width: 100px; + height: 144px; + padding-right: 10px; + } + .titreFilm{ + font-size: 18px; + margin-block-start: 5px; + margin-block-end: 5px; + } + .realisateur, + .duree, + .casting, + .genre { + margin-block-start: 0; + margin-block-end: 0; + font-size: 10px; + margin-right: 5px; + } + .synopsis{ + display: none; + } + .cinema { + height: 30px; + width: 100px; + color: white; + padding-right: 5px; + } + .horaires_container { + max-width: 250px; + } + + .horaire { + height: 30px; + width: 45px; + border-radius: 5px; + margin-left: 5px; + } + .cinema p, + .horaire p{ + font-size: 10px; + margin-block-start: 1em; + } + .container_titrePlanning, + .container_infoFilm { + max-width: 80vw; + width: 350px; + } + .responsive-div { + height: 30px; + } + .responsive-petite-div { + height: 5px; + } + .goTop { + z-index: 2; + bottom: 10px; + right: 10px; + width: 50px; + height: 50px; + background-color: #444cf7; + border: #fff solid 4px; + } + .goTop p{ + font-size: 20px; + margin-block-start: 1em; + margin-block-end: 1em; + } + .background_svg { + position: fixed; + bottom: 0; + top: auto; + right: 0; + z-index: -2; + transform: scale(2); + } + .blur-background { + background: rgba(255, 255, 255, 0.3); + backdrop-filter: blur(20px); + z-index: -1; + border-radius: 5px; + filter: drop-shadow(0 -6mm 4mm rgba(2, 2, 2, 0.2)); + filter: drop-shadow(2mm 6mm 6mm rgba(2, 2, 2, 0.4)); + } + footer { + background-color: white; + padding-top: 10px; + } + + .container_footer { + max-width: 80vw; + } + .container_footer p{ + font-size: 10px; + } + *:not(.affiche) { + box-sizing: border-box; + } + .date:hover { + width: 40px; + height: 50px; + } +} \ No newline at end of file diff --git a/static/firebase/firebase_grainParisArt.json b/static/firebase/firebase_grainParisArt.json new file mode 100644 index 0000000..e69de29 diff --git a/static/font/HealTheWebA-Regular.otf b/static/font/HealTheWebA-Regular.otf new file mode 100644 index 0000000..8c5746a Binary files /dev/null and b/static/font/HealTheWebA-Regular.otf differ diff --git a/static/font/HealTheWebB-Regular.otf b/static/font/HealTheWebB-Regular.otf new file mode 100644 index 0000000..c26a557 Binary files /dev/null and b/static/font/HealTheWebB-Regular.otf differ diff --git a/static/font/Raleway-Black.ttf b/static/font/Raleway-Black.ttf new file mode 100644 index 0000000..c926d1d Binary files /dev/null and b/static/font/Raleway-Black.ttf differ diff --git a/static/font/montserrat_extrabold.ttf b/static/font/montserrat_extrabold.ttf new file mode 100644 index 0000000..6725d53 Binary files /dev/null and b/static/font/montserrat_extrabold.ttf differ diff --git a/static/images/LaurenceAnyways.jpg b/static/images/LaurenceAnyways.jpg new file mode 100644 index 0000000..4aaf79e Binary files /dev/null and b/static/images/LaurenceAnyways.jpg differ diff --git a/static/images/aftersun.jpeg b/static/images/aftersun.jpeg new file mode 100644 index 0000000..f0ca262 Binary files /dev/null and b/static/images/aftersun.jpeg differ diff --git a/static/images/background.png b/static/images/background.png new file mode 100644 index 0000000..3e0a1b5 Binary files /dev/null and b/static/images/background.png differ diff --git a/static/images/background.svg b/static/images/background.svg new file mode 100644 index 0000000..646ac6f --- /dev/null +++ b/static/images/background.svg @@ -0,0 +1,31 @@ + diff --git a/static/images/favicon.png b/static/images/favicon.png new file mode 100644 index 0000000..2f0fde3 Binary files /dev/null and b/static/images/favicon.png differ diff --git a/static/images/julieEn12Chapitre.webp b/static/images/julieEn12Chapitre.webp new file mode 100644 index 0000000..43d0dd1 Binary files /dev/null and b/static/images/julieEn12Chapitre.webp differ diff --git a/static/images/old.png b/static/images/old.png new file mode 100644 index 0000000..8e6e9ea Binary files /dev/null and b/static/images/old.png differ diff --git a/static/js/infinite-scroll.js b/static/js/infinite-scroll.js new file mode 100644 index 0000000..6b6daab --- /dev/null +++ b/static/js/infinite-scroll.js @@ -0,0 +1,32 @@ +var isLoading = false; +var page = 1; + +function fetchCinemaSessions() { + if (isLoading) return; + + isLoading = true; + var loadingContainer = document.getElementById('loading-container'); + loadingContainer.innerHTML = ''; + + fetch('/?page=' + page) + .then(function(response) { + return response.text(); + }) + .then(function(html) { + var cinemaContainer = document.getElementById('cinema-container'); + cinemaContainer.insertAdjacentHTML('beforeend', html); + isLoading = false; + page += 1; + }) + .catch(function() { + isLoading = false; + }); +} + +window.addEventListener('scroll', function() { + if (window.innerHeight + window.scrollY >= document.body.offsetHeight - 100 && !isLoading) { + fetchCinemaSessions(); + } +}); + +fetchCinemaSessions(); diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..d711ab3 --- /dev/null +++ b/templates/base.html @@ -0,0 +1,29 @@ + + +
+ + + + + + + {% block head %} {% endblock %} + + +Quand ça va pas, y aura toujours le cinéma
+🍿
+{{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}}
+🍿
+{{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}}
+