# -*- 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("StatisticsStatistics
")
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("- Union:
")
for index in union:
if index == -1:
self.response.out.write("- Nobody
")
else:
self.response.out.write("- %s as %s
" % (lastTitle.actors[index], lastTitle.characters[index]))
self.response.out.write("
")
self.response.out.write("- Intersection:
")
for index in intersection:
if index == -1:
self.response.out.write("- Nobody
")
else:
self.response.out.write("- %s as %s
" % (lastTitle.actors[index], lastTitle.characters[index]))
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("- %s
" % answer.title.title)
i += 1
if i == total:
answer = Answer()
answer.title = lastTitle
else:
break
self.response.out.write("");
application = webapp.WSGIApplication(
[('/newquestion', NewQuestion),
('/loadnewtitles', LoadNewTitles),
('/answerquestion', AnswerQuestion),
('/statistics', Statistics)],
debug=True)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()