vcinema/update_films_by_country_pag...

141 lines
4.0 KiB
Python
Raw Normal View History

import argparse
import base64
from collections import Counter, OrderedDict
import os
from progress.bar import Bar
from wand.image import Image
import worldmap
from bookstack import Bookstack
from vcinema_utils import VCinemaUtils
FLAGS = {
"Australia": "🇦🇺",
"Belgium": "🇧🇪",
"Canada": "🇨🇦",
"China": "🇨🇳",
"Czech Republic": "🇨🇿",
"Czechia": "🇨🇿",
"France": "🇫🇷",
"Germany": "🇩🇪",
"Hong Kong": "🇭🇰",
"Hong Kong SAR China": "🇭🇰",
"Italy": "🇮🇹",
"Israel": "🇮🇱",
"Japan": "🇯🇵",
"Luxembourg": "🇱🇺",
"Mexico": "🇲🇽",
"New Zealand": "🇳🇿",
"Nigeria": "🇳🇬",
"North Korea": "🇰🇵",
"Philippines": "🇵🇭",
"Russia": "🇷🇺",
"Spain": "🇪🇸",
"South Africa": "🇿🇦",
"South Korea": "🇰🇷",
"Taiwan": "🇹🇼",
"Thailand": "🇹🇭",
"Turkey": "🇹🇷",
"Uganda": "🇺🇬",
"United Kingdom": "🇬🇧",
"United States": "🇺🇸",
"West Germany": "⬅️🇩🇪",
}
def build_table(fby, bar):
fby_sorted = OrderedDict(sorted(fby.items(), key=lambda t: t[0]))
table = "<table>"
table += "<thead><tr><th>Country</th><th>Films</th></tr>"
table += "<tbody>"
for country in fby_sorted.keys():
row = "<tr>"
row += "<td>"
row += "{} {}".format(str(country), FLAGS[country])
row += "</td>"
row += "<td>"
row += "<br>".join(["<a href=\"{}\">{}</a>".format(film['imdb_id'], film['title']) for film in fby_sorted[country]])
row += "</td>"
row += "</tr>"
table += row
bar.next()
table += "</tbody>"
table += "</table>"
return table
def draw_map(counter, file_name="vcinema_map.svg"):
countries = [k for k, v in counter.items()]
counts = [len(v) for _, v in counter.items()]
max_count = max(counts)
opacity = [0.5 + (x / (float(max_count))/2.0) for x in counts]
worldmap.plot(countries, cmap=["#ff0000"], opacity=opacity, filename=file_name, verbose=False)
with Image(filename=file_name, width=1000, height=655) as i:
png_data = i.make_blob("png")
os.remove(file_name)
return png_data
def update_page(map_png, table, wiki_url, token_id, token_secret):
page_id = 34
encoded = base64.b64encode(map_png).decode("utf-8")
image_html = "<img src=\"data:image/png;base64,{}\" />".format(encoded)
page_contents = image_html + table
Bookstack.update_page(wiki_url, token_id, token_secret, page_id, html=page_contents)
def update_films_by_country_page(token_id, token_secret):
print("Retrieving VCinema viewings")
viewings = VCinemaUtils.get_vcinema_viewings(token_id, token_secret)
viewing_count = len(viewings)
with Bar('Retrieving movie data', max=viewing_count, suffix='%(percent).1f%% - %(eta)ds remaining', check_tty=False) as bar:
VCinemaUtils.add_imdb_data_to_viewings(viewings, ['countries'], bar)
with Bar('Processing viewing data', max=viewing_count, suffix='%(percent).1f%% - %(eta)ds remaining', check_tty=False) as bar:
viewings_by_country = VCinemaUtils.filter_viewings(viewings, 'countries', bar)
country_count = len(viewings_by_country.keys())
with Bar('Generating table', max=country_count, suffix='%(percent).1f%% - %(eta)ds remaining', check_tty=False) as bar:
film_by_country_table = build_table(viewings_by_country, bar)
country_counter = Counter(viewings_by_country)
png_data = draw_map(country_counter)
update_page(png_data, film_by_country_table, VCinemaUtils.JACKNET_WIKI_URL, token_id, token_secret)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Update page displaying VCinema films sorted by country.')
parser.add_argument('token_id', help='API token ID.')
parser.add_argument('token_secret', help='API token secret.')
args = parser.parse_args()
update_films_by_country_page(args.token_id, args.token_secret)