Source code for examples.film

#!/usr/bin/env python
"""

film.py: a simple tool to manage your movies review
Simon Rozet, http://atonie.org/

    - manage directors and writers
    - manage actors
    - handle non IMDB uri
    - markdown support in comment

Requires download and import of Python imdb library from
https://imdbpy.github.io/ - (warning: installation
will trigger automatic installation of several other packages)

--
Usage:
    film.py whoami "John Doe <john@doe.org>"
        Initialize the store and set your name and email.
    film.py whoami
        Tell you who you are
    film.py http://www.imdb.com/title/tt0105236/
        Review the movie "Reservoir Dogs"
"""
import datetime
import os
import sys
import re
import time

try:
    import imdb
except ImportError:
    imdb = None

from rdflib import BNode, ConjunctiveGraph, URIRef, Literal, Namespace, RDF
from rdflib.namespace import FOAF, DC
from six.moves import input

storefn = os.path.expanduser("~/movies.n3")
# storefn = '/home/simon/codes/film.dev/movies.n3'
storeuri = "file://" + storefn
title = "Movies viewed by %s"

r_who = re.compile(
    "^(.*?) <([a-z0-9_-]+(\.[a-z0-9_-]+)*@[a-z0-9_-]+(\.[a-z0-9_-]+)+)>$"
)

IMDB = Namespace("http://www.csd.abdn.ac.uk/~ggrimnes/dev/imdb/IMDB#")
REV = Namespace("http://purl.org/stuff/rev#")


[docs]class Store:
[docs] def __init__(self): self.graph = ConjunctiveGraph() if os.path.exists(storefn): self.graph.load(storeuri, format="n3") self.graph.bind("dc", DC) self.graph.bind("foaf", FOAF) self.graph.bind("imdb", IMDB) self.graph.bind("rev", "http://purl.org/stuff/rev#")
[docs] def save(self): self.graph.serialize(storeuri, format="n3")
[docs] def who(self, who=None): if who is not None: name, email = (r_who.match(who).group(1), r_who.match(who).group(2)) self.graph.add((URIRef(storeuri), DC["title"], Literal(title % name))) self.graph.add((URIRef(storeuri + "#author"), RDF.type, FOAF["Person"])) self.graph.add((URIRef(storeuri + "#author"), FOAF["name"], Literal(name))) self.graph.add((URIRef(storeuri + "#author"), FOAF["mbox"], Literal(email))) self.save() else: return self.graph.objects(URIRef(storeuri + "#author"), FOAF["name"])
[docs] def new_movie(self, movie): movieuri = URIRef("http://www.imdb.com/title/tt%s/" % movie.movieID) self.graph.add((movieuri, RDF.type, IMDB["Movie"])) self.graph.add((movieuri, DC["title"], Literal(movie["title"]))) self.graph.add((movieuri, IMDB["year"], Literal(int(movie["year"])))) self.save()
[docs] def new_review(self, movie, date, rating, comment=None): review = BNode() # @@ humanize the identifier (something like #rev-$date) movieuri = URIRef("http://www.imdb.com/title/tt%s/" % movie.movieID) self.graph.add( (movieuri, REV["hasReview"], URIRef("%s#%s" % (storeuri, review))) ) self.graph.add((review, RDF.type, REV["Review"])) self.graph.add((review, DC["date"], Literal(date))) self.graph.add((review, REV["maxRating"], Literal(5))) self.graph.add((review, REV["minRating"], Literal(0))) self.graph.add((review, REV["reviewer"], URIRef(storeuri + "#author"))) self.graph.add((review, REV["rating"], Literal(rating))) if comment is not None: self.graph.add((review, REV["text"], Literal(comment))) self.save()
[docs] def movie_is_in(self, uri): return (URIRef(uri), RDF.type, IMDB["Movie"]) in self.graph
[docs]def help(): print(__doc__.split("--")[1])
[docs]def main(argv=None): if not argv: argv = sys.argv s = Store() if argv[1] in ("help", "--help", "h", "-h"): help() elif argv[1] == "whoami": if os.path.exists(storefn): print(list(s.who())[0]) else: s.who(argv[2]) elif argv[1].startswith("http://www.imdb.com/title/tt"): if s.movie_is_in(argv[1]): raise else: i = imdb.IMDb() movie = i.get_movie(argv[1][len("http://www.imdb.com/title/tt") : -1]) print("%s (%s)" % (movie["title"].encode("utf-8"), movie["year"])) for director in movie["director"]: print("directed by: %s" % director["name"].encode("utf-8")) for writer in movie["writer"]: print("written by: %s" % writer["name"].encode("utf-8")) s.new_movie(movie) rating = None while not rating or (rating > 5 or rating <= 0): try: rating = int(input("Rating (on five): ")) except ValueError: rating = None date = None while not date: try: i = input("Review date (YYYY-MM-DD): ") date = datetime.datetime(*time.strptime(i, "%Y-%m-%d")[:6]) except: date = None comment = input("Comment: ") s.new_review(movie, date, rating, comment) else: help()
if __name__ == "__main__": if not imdb: raise Exception( 'This example requires the IMDB library! Install with "pip install imdbpy"' ) main()