# -*- coding: iso-8859-1 -*- from google.appengine.ext import webapp from google.appengine.ext.webapp.util import run_wsgi_app from google.appengine.ext import db from google.appengine.api.urlfetch import fetch from api import AnyClipAPI import re from time import sleep from random import randint class Title(db.Model): title = db.StringProperty(required=True) code = db.StringProperty(required=True) actors = db.StringListProperty() characters = db.StringListProperty() lastThumb = db.IntegerProperty() class Answer(db.Model): title = db.ReferenceProperty(Title) frame = db.IntegerProperty() answer = db.ListProperty(int) class NewQuestion(webapp.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'application/json' titles = Title.all() title = titles[randint(0, titles.count() - 1)] frame = randint(1, title.lastThumb / 10) * 10 url = "http://img.anyclip.com/thumbnails/%s/tmb_%s_480.jpg" % (title.code, frame) cast = "" for i in range(len(title.actors)): if i != 0: cast += "," cast += "[\"%s\",\"%s\"]" % (title.actors[i], title.characters[i]) self.response.out.write("{\"title\":\"%s\",\"code\":\"%s\",\"frame\":%s,\"image\":\"%s\",\"cast\":[%s]}" % (title.title, title.code, frame, url, cast)) class AnswerQuestion(webapp.RequestHandler): def get(self): code = self.request.get("code") answer = self.request.get("answer") frame = self.request.get("frame") try: frame = int(frame) except: return if code == "" or answer == "": return answers = answer.split(",") for i in range(len(answers)): try: answers[i] = int(answers[i]) if (answers[i] > 9): return except: return titleQuery = Title.all().filter('code = ', code).fetch(1) if len(titleQuery) != 1 or len(answers) == 0 or (-1 in answers and len(answers) > 1): return maxAnswer = len(titleQuery[0].characters) for ans in answers: if ans >= maxAnswer: return answer = Answer() answer.title = titleQuery[0] answer.answer = answers; answer.frame = frame answer.put() self.response.out.write(str(answers) + "
" + code + "
" + str(frame)); class LoadNewTitles(webapp.RequestHandler): def __init__(self): self.api = AnyClipAPI("CAD58B9E-F045-492F-81B9-22CFE6B00604") def getCast(self, imdbCode): imdbList = fetch("http://www.imdb.com/title/tt%s/fullcredits" % imdbCode) i = 0 while imdbList.status_code != 200: i += 1 if i == 5: break sleep(3) imdbList = fetch("http://www.imdb.com/title/tt%s/fullcredits" % imdbCode) if imdbList.status_code != 200: return None i = 0 actors = [] characters = [] index = 0 htmlRemove = re.compile("<.*?>") while True: index = imdbList.content.find("", index) + 15 end = imdbList.content.find("", index) if index < 15 or end < 0: break actor = htmlRemove.sub("", imdbList.content[index:end]) index = imdbList.content.find(" ... ", end) + 43 end = imdbList.content.find("", index) if index < 43 or end < 0: break for character in htmlRemove.sub("", imdbList.content[index:end]).split(" / "): actors.append(actor) characters.append(character) i += 1 if i == 10: break return (actors, characters) def get(self): thumbListing = fetch("http://anyclip.zx2c4.com/thumblisting.py") if thumbListing.status_code != 200: self.response.out.write("error") return movies = thumbListing.content.split("\n") for movie in movies: codeThumb = movie.split(" ") if len(codeThumb) != 2: continue code = codeThumb[0] lastThumb = int(codeThumb[1]) if Title.all().filter('code = ', code).count() == 0: item = self.api.request("title", (code,)) if len(item) == 2 and item[0] == '1005': self.response.out.write("Could not add invalid code %s
" % code) continue self.response.out.write("Adding %s
" % item["Name"]) newTitle = Title(title=item["Name"], code=item["Code"]) newTitle.lastThumb = lastThumb cast = self.getCast(item["ImdbID"]) if cast == None: self.response.out.write("Could not add cast of %s
" % item["Name"]) continue newTitle.actors = cast[0] newTitle.characters = cast[1] newTitle.put() class Statistics(webapp.RequestHandler): def get(self): self.response.out.write("Statistics

Statistics

") query = Answer.all().order("title").order("frame") total = query.count() i = 0 lastTitle = None lastFrame = -1 frameAnswers = [] for answer in query: while True: if lastFrame != answer.frame or lastTitle == None or answer.title.key() != lastTitle.key(): if len(frameAnswers) != 0: union = None intersection = None for frameAnswer in frameAnswers: if union == None: union = set(frameAnswer) else: union = union.union(set(frameAnswer)) if intersection == None: intersection = set(frameAnswer) else: intersection = intersection.intersection(set(frameAnswer)) self.response.out.write("
  • Frame %s with %s answers:" % (lastFrame, len(frameAnswers))) self.response.out.write("") frameAnswers = [] lastFrame = answer.frame frameAnswers.append(answer.answer) if lastTitle == None or answer.title.key() != lastTitle.key(): if lastTitle != None: self.response.out.write("") lastTitle = answer.title self.response.out.write("