109 lines
4.4 KiB
Python
109 lines
4.4 KiB
Python
from bs4 import BeautifulSoup
|
|
import re
|
|
from tkinter import Tk
|
|
from tkinter import messagebox
|
|
import urllib.request
|
|
from datetime import datetime
|
|
|
|
from db import DBManager, DBAttr
|
|
from ui import WinesUI
|
|
from __ssl import init_ssl
|
|
from config import *
|
|
|
|
init_ssl()
|
|
|
|
dbm = DBManager(DB_PATH)
|
|
|
|
def create_tables():
|
|
movies_attr = [
|
|
DBAttr("title", "TEXT", "NOT NULL"),
|
|
DBAttr("original_title", "TEXT", "NOT NULL"),
|
|
DBAttr("country", "TEXT", "NOT NULL"),
|
|
DBAttr("date", "DATE", "NOT NULL"),
|
|
DBAttr("director", "TEXT", "NOT NULL"),
|
|
DBAttr("genres", "TEXT", "NOT NULL")
|
|
]
|
|
|
|
genres_attr = [
|
|
DBAttr("genre", "TEXT")
|
|
]
|
|
|
|
dbm.create_table("movies", movies_attr)
|
|
dbm.create_table("genres", genres_attr)
|
|
|
|
def persist_movies():
|
|
f = urllib.request.urlopen(ESTRENOS_URL)
|
|
bs = BeautifulSoup(f, "lxml")
|
|
list_items = bs.find("ul", class_="elements").find_all("li")
|
|
for li in list_items:
|
|
f = urllib.request.urlopen(BASE_URL+li.a['href'])
|
|
bs = BeautifulSoup(f, "lxml")
|
|
data = bs.find("main", class_="informativo").find("section",class_="highlight").div.dl
|
|
original_title = data.find("dt", string=lambda s: s and "Título original" in s).find_next_sibling("dd").get_text(strip=True)
|
|
country = "".join(data.find("dt", string=lambda s: s and "País" in s).find_next_sibling("dd").stripped_strings)
|
|
title = data.find("dt", string=lambda s: s and "Título" in s).find_next_sibling("dd").get_text(strip=True)
|
|
date = datetime.strptime(data.find("dt",string="Estreno en España").find_next_sibling("dd").string.strip(), '%d/%m/%Y')
|
|
|
|
genres_director = bs.find("div",id="datos_pelicula")
|
|
genres_str = genres_director.find("p", class_="categorias").get_text(strip=True)
|
|
genres_list = [g.strip() for g in genres_str.split(",") if g.strip()]
|
|
for g in genres_list:
|
|
existing = dbm.exists("genres", "genre", g)
|
|
if not existing:
|
|
dbm.insert("genres", {"genre": g})
|
|
director = "".join(genres_director.find("p",class_="director").stripped_strings)
|
|
|
|
dbm.insert("movies", {
|
|
"title": title,
|
|
"original_title": original_title,
|
|
"country": country,
|
|
"date": date,
|
|
"director": director,
|
|
"genres": genres_str
|
|
})
|
|
|
|
return dbm.count("movies"), dbm.count("genres")
|
|
|
|
def main():
|
|
create_tables()
|
|
root = Tk()
|
|
ui = WinesUI(root)
|
|
|
|
def handle_action(action):
|
|
match(action):
|
|
case "cargar":
|
|
resp = messagebox.askyesno(title="Cargar", message="Quieres cargar todos los datos de nuevo?")
|
|
if resp:
|
|
dbm.clear("movies")
|
|
dbm.clear("genres")
|
|
movies_count, genres_count = persist_movies()
|
|
ui.info(f"Hay {movies_count} películas y {genres_count} géneros")
|
|
case "listar":
|
|
movies = dbm.get_all("movies")
|
|
ui.show_list(movies, ["title", "original_title", "country", "date", "director", "genres"])
|
|
case "buscar_titulo":
|
|
def search_title(title):
|
|
movies = [movie for movie in dbm.get_all("movies") if title.lower() in movie["title"].lower()]
|
|
ui.show_list(movies, ["title", "country", "director"])
|
|
ui.ask_text("Buscar por titulo: ", search_title)
|
|
case "buscar_fecha":
|
|
def search_date(date):
|
|
d = datetime.strptime(date, "%d-%m-%Y")
|
|
movies = [movie for movie in dbm.get_all("movies")
|
|
if d < datetime.strptime(movie["date"], "%Y-%m-%d %H:%M:%S")]
|
|
ui.show_list(movies, ["title", "date"])
|
|
ui.ask_text("Buscar por fecha: ", search_date)
|
|
case "buscar_genero":
|
|
genres = [g for g in dbm.get_singleton("genres")]
|
|
genres.sort()
|
|
def search_genre(genre):
|
|
movies = [movie for movie in dbm.get_all("movies") if genre in movie["genres"]]
|
|
ui.show_list(movies, ["title", "date"])
|
|
ui.ask_spinbox("Selecciona género: ", genres, search_genre)
|
|
|
|
ui.callback = handle_action
|
|
root.mainloop()
|
|
dbm.close()
|
|
|
|
if __name__ == "__main__":
|
|
main() |