vcinema/wiki_pages/FilmsByReference.py

101 lines
4.0 KiB
Python

from collections import OrderedDict
import wikipedia
from bookstack import Bookstack
from vcinema_utils import VCinemaUtils, VCinemaFilm
# Page ID of https://wiki.jacknet.io/books/vcinema/page/references
PAGE_ID = 62
def get_films_by_reference(films: [VCinemaFilm]):
films_by_reference = {}
for film in films:
if (film_keywords := film.get_imdb_data("keywords")) is not None:
for keyword in film_keywords:
if keyword.startswith("reference-to-"):
for reference in films_by_reference:
if keyword in films_by_reference[reference]["keywords"]:
films_by_reference[reference]["films"].append(film)
break
else:
keyword = keyword[13:]
if keyword.startswith("a-"):
keyword = keyword[2:]
if keyword.endswith("-character"):
keyword = keyword[:-10]
referenced = keyword.replace("-", " ")
searches = wikipedia.search(referenced, suggestion=False)
try:
referenced_page = wikipedia.page(title=referenced, auto_suggest=False)
page_title = referenced_page.title
page_url = referenced_page.url
except wikipedia.DisambiguationError as e:
page_title = e.title
page_title = page_title[0].upper() + page_title[1:]
page_url = VCinemaUtils.generate_wikipedia_url(page_title)
except wikipedia.PageError as _:
if len(searches) > 0:
try:
referenced_page = wikipedia.page(title=searches[0], auto_suggest=False)
page_title = referenced_page.title
page_url = referenced_page.url
except wikipedia.DisambiguationError as e:
page_title = e.title
page_title = page_title[0].upper() + page_title[1:]
page_url = VCinemaUtils.generate_wikipedia_url(page_title)
else:
page_title = referenced.title()
page_url = None
if page_title in films_by_reference.keys():
films_by_reference[page_title]["keywords"].append(keyword)
if film not in films_by_reference[page_title]["films"]:
films_by_reference[page_title]["films"].append(film)
else:
films_by_reference[page_title] = {"url": page_url,
"keywords": [keyword],
"films": [film]}
return films_by_reference
def update_page(token_id, token_secret, films_by_reference_keyword):
page = build_page(films_by_reference_keyword)
Bookstack.update_page(VCinemaUtils.JACKNET_WIKI_URL, token_id, token_secret, PAGE_ID, markdown=page)
def build_page(films_by_reference):
films_by_reference = OrderedDict(sorted(films_by_reference.items(), key=lambda t: t[0]))
table = "| Referenced | Films |\n| - | - |"
for reference, referenced in films_by_reference.items():
table += "\n"
row_data = []
reference_url = referenced["url"]
referenced_films = referenced["films"]
if reference_url is None:
row_data.append(reference)
else:
row_data.append(VCinemaUtils.generate_markdown_link(reference, reference_url))
row_data.append(VCinemaUtils.get_film_list(referenced_films))
table += " | ".join(row_data)
return table