#!/usr/bin/python3 """Find photos on flickr for Wikipedia articls and contact the photographer.""" import collections import json import sys import typing from urllib.parse import unquote import flask import requests app = flask.Flask(__name__) app.debug = True enwiki = "en.wikipedia.org/wiki/" @app.route("/") def start() -> str: """Start form.""" wikipedia_url = flask.request.args.get("wikipedia") if not wikipedia_url: return flask.render_template("combined.html") start = wikipedia_url.find(enwiki) + len(enwiki) return flask.render_template( "combined.html", name=unquote(wikipedia_url[start:]).replace("_", " "), wikipedia_url=wikipedia_url, ) def get_params(line_iter: collections.abc.Iterable[str]) -> str: """Find and return params from flickr profile page.""" look_for = 'params: {"isEditingTestimonial":false,' return next(line[line.find("{") :] for line in line_iter if look_for in line) def flickr_usrename_to_nsid(username: str) -> str: """Get NSID from flickr username.""" url = f"https://www.flickr.com/people/{username}/" r = requests.get(url) params = json.loads(get_params(r.text.splitlines())) return typing.cast(str, params["nsid"]) @app.route("/message") def show_message() -> str: """Show message.""" flickr_url = flask.request.args["flickr"] wikipedia_url = flask.request.args["wikipedia"] start = wikipedia_url.find(enwiki) + len(enwiki) wiki_part1 = wikipedia_url[:start] if len(sys.argv) > 4: name = sys.argv[4] else: wiki_part2 = unquote(wikipedia_url[start:]) name = wiki_part2 if "_(" in name: name = name[: name.find("_(")] name = name.replace("_", " ") if "/in/" in flickr_url: flickr_url = flickr_url[: flickr_url.find("/in/")] flickr_start = "https://flickr.com/photos/" assert flickr_url.startswith(flickr_start) flickr_username = flickr_url[ len(flickr_start) : flickr_url.find("/", len(flickr_start)) ] nsid = flickr_usrename_to_nsid(flickr_username) assert nsid print(nsid) msg = flask.render_template( "message.jinja", flickr_url=flickr_url, wikipedia_url=wikipedia_url, name=name, wiki_part1=wiki_part1, wiki_part2=wiki_part2, ) subject = f"Request to use your photo of {name} on Wikipedia" lines = msg.split("\n\n") return flask.render_template( "show_message.html", subject=subject, lines=lines, nsid=nsid ) if __name__ == "__main__": app.run(host="0.0.0.0")