from vcinema_utils import VCinemaUtils import base64 from collections import Counter, OrderedDict import csv import os from progress.bar import IncrementalBar from wand.image import Image import worldmap import warnings warnings.filterwarnings("ignore") # Page ID of https://wiki.jacknet.io/books/vcinema/page/films-by-country FILMS_BY_COUNTRY_PAGE_ID = 34 def get_films_by_country(viewings): viewings_filtered_by_country = VCinemaUtils.filter_viewings(viewings, "countries") return viewings_filtered_by_country def build_page(films_by_country): country_count = len(films_by_country.keys()) with IncrementalBar('Generating table', max=country_count, suffix='%(percent).1f%% - %(eta)ds remaining', check_tty=False) as bar: film_by_country_table = build_table(films_by_country, bar) print("Drawing map") country_counter = Counter(films_by_country) png_data = draw_map(country_counter) encoded = base64.b64encode(png_data).decode("utf-8") image = "![](data:image/png;base64,{})".format(encoded) page = image + "\n" + film_by_country_table return page def get_flags_dict(): flags = {} with open('country-flags.csv', newline='') as f: reader = csv.reader(f, quotechar="\"") next(reader, None) # skip the headers for row in reader: flags[row[0]] = row[1] return flags def build_table(films_by_country, bar=None): films_by_country_sorted = OrderedDict(sorted(films_by_country.items(), key=lambda t: t[0])) flags = get_flags_dict() table = "| Country | Films |\n| - | - |" for country in films_by_country_sorted.keys(): table += "\n" table += "{} {}".format(str(country), flags[country] if country in flags.keys() else "") table += " | " film_links = ["[{}](https://www.imdb.com/title/tt{}/)".format(film['title'], film['imdb_id']) for film in films_by_country_sorted[country]] table += "
".join(film_links) if bar is not None: bar.next() if bar is not None: bar.finish() 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=["#FF4000"], 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