diff --git a/DB.py b/DB.py
new file mode 100644
index 0000000..86932bc
--- /dev/null
+++ b/DB.py
@@ -0,0 +1,11 @@
+DB_type = "plaintext"#"plaintext" or "mondoDB"
+
+
+if DB_type == "plaintext":
+ from database import Database
+elif DB_type == "mondoDB":#not yet implemented
+ from database import Database#hue
+else:
+ import sys
+ print "Unsupported database type \"%s\"" % DB_type
+ sys.exit()
\ No newline at end of file
diff --git a/database/Channels/.placeholder b/database/Channels/.placeholder
new file mode 100644
index 0000000..e69de29
diff --git a/database/Creators/913304C0CC74CC1F/74CC1F_0D376FC60C9DC_000.ppm b/database/Creators/913304C0CC74CC1F/74CC1F_0D376FC60C9DC_000.ppm
deleted file mode 100644
index 31a743b..0000000
Binary files a/database/Creators/913304C0CC74CC1F/74CC1F_0D376FC60C9DC_000.ppm and /dev/null differ
diff --git a/database/Creators/913304C0CC74CC1F/74CC1F_0D3AA40F2B3A0_000.ppm b/database/Creators/913304C0CC74CC1F/74CC1F_0D3AA40F2B3A0_000.ppm
new file mode 100644
index 0000000..df5680a
Binary files /dev/null and b/database/Creators/913304C0CC74CC1F/74CC1F_0D3AA40F2B3A0_000.ppm differ
diff --git a/database/Creators/913304C0CC74CC1F/flipnotes.dat b/database/Creators/913304C0CC74CC1F/flipnotes.dat
index 9952495..3889d92 100644
--- a/database/Creators/913304C0CC74CC1F/flipnotes.dat
+++ b/database/Creators/913304C0CC74CC1F/flipnotes.dat
@@ -1 +1 @@
-74CC1F_0D376FC60C9DC_000 4 5 0 0 0 0
\ No newline at end of file
+74CC1F_0D3AA40F2B3A0_000 0 0 0 0 0 0 0
\ No newline at end of file
diff --git a/database/__init__.py b/database/__init__.py
new file mode 100644
index 0000000..af64105
--- /dev/null
+++ b/database/__init__.py
@@ -0,0 +1,152 @@
+from twisted.internet import reactor
+import atexit, os
+from Hatenatools import TMB
+
+#The database handling flipnote files and info
+#this one stores them in plaintext, only works with one server worker
+class Database:
+ def __init__(self):
+ #read database stuff into memory:
+ if os.path.exists("database/new_flipnotes.dat"):
+ f = open("database/new_flipnotes.dat", "rb")#contains the newest 5000 flipnotes
+ file = f.read()
+ f.close()
+ else:
+ file = ""
+
+ if file:
+ self.Newest = [tuple(i.split("\t")) for i in file.split("\n")]#[i] = [creatorID, filename]
+ else:
+ self.Newest = []
+
+ self.Creator = {}#to store creator info updates before writing to disk. Creator[id][n] = [filename, views, stars, green stars, red stars, blue stars, purple stars, Channel, Downloads]
+
+ #to check if an update is neccesary(caching):
+ self.new = False#True when new flipnotes has been uploaded
+ self.Views = 0
+ self.Stars = 0
+ self.Downloads = 0
+
+ #schtuff
+ reactor.callLater(60*3, self.flusher)
+ atexit.register(self.write)
+ def flusher(self):#Automatically flushes the files every 3 minutes and trims down memory usage
+ reactor.callLater(60*3, self.flusher)
+ self.write()
+ def write(self):
+ if self.new:
+ #trim newest:
+ if len(self.Newest) > 5000:
+ self.Newest = self.Newest[:5000]
+
+ #write to file:
+ f = open("database/new_flipnotes.dat", "wb")
+ f.write("\n".join(("\t".join(i) for i in self.Newest)))
+ f.close()
+ self.new = False
+
+ #write creator changes to file:
+ for ID in self.Creator.keys():
+ f = open("database/Creators/%s/flipnotes.dat" % ID, "wb")
+ f.write("\n".join(("\t".join(map(str, i)) for i in self.Creator[ID])))
+ f.close()
+ del self.Creator[ID]
+ #interface:
+ def CreatorExists(self, CreatorID):
+ return os.path.exists("database/Creators/" + CreatorID) or (CreatorID in self.Creator)
+ def FlipnoteExists(self, CreatorID, filename):
+ return os.path.exists(self.FlipnotePath(CreatorID, filename))
+ def GetCreator(self, CreatorID, Store=False):#Returns a list of all the self.GetFlipnote(). "Store" holds it in memory for a while, use this when making changes or reading it often
+ if CreatorID in self.Creator:
+ return self.Creator[CreatorID]
+ else:
+ if not os.path.exists("database/Creators/" + CreatorID):
+ return None
+
+ f = open("database/Creators/%s/flipnotes.dat" % CreatorID, "rb")
+ ret = [i.split("\t") for i in f.read().split("\n")]
+ f.close()
+
+ #update to newer format:
+ #current format = [filename, views, stars, green stars, red stars, blue stars, purple stars, Channel, Downloads]
+ for i in xrange(len(ret)):
+ if len(ret[i]) < 9:
+ filename = ret[i][0]#take this as a give for now
+ for n, default in enumerate((filename, 0, 0, 0, 0, 0, 0, "", 0)):
+ if len(ret[i]) <= n:
+ ret[i].append(default)
+
+ if Store:
+ self.Creator[CreatorID] = ret
+
+ return ret
+ def GetFlipnote(self, CreatorID, filename, Store=False):#returns: [filename, views, stars, green stars, red stars, blue stars, purple stars, Channel, Downloads]
+ for i in (self.GetCreator(CreatorID, Store) or []):
+ if i[0] == filename:
+ return i
+ return False
+ def GetFlipnotePPM(self, CreatorID, filename):#the ppm binary data
+ f = open(self.FlipnotePath(CreatorID, filename), "rb")
+ ret = f.read()
+ f.close()
+ return ret
+ def GetFlipnoteTMB(self, CreatorID, filename):#the tmb binary data
+ f = open(self.FlipnotePath(CreatorID, filename), "rb")
+ ret = f.read(0x6a0)
+ f.close()
+ return ret
+ def AddFlipnote(self, content, Channel=""):#content = ppm binary data
+ tmb = TMB().Read(content)
+ if not tmb:
+ return False
+
+ #CreatorID = tmb.Username
+ CreatorID = tmb.EditorAuthorID
+ filename = tmb.CurrentFilename[:-4]
+ del tmb
+
+ if self.FlipnoteExists(CreatorID, filename):#already exists
+ return False
+
+ #add to database:
+ self.new = True
+ self.Newest.insert(0, (CreatorID, filename))
+
+ if not self.GetCreator(CreatorID, True):
+ self.Creator[CreatorID] = [[filename, 0, 0, 0, 0, 0, 0, Channel, 0]]
+ else:
+ self.Creator[CreatorID].append([filename, 0, 0, 0, 0, 0, 0, Channel, 0])
+
+ #write flipnote to file:
+ if not os.path.isdir("database/Creators/" + CreatorID):
+ os.mkdir("database/Creators/" + CreatorID)
+ f = open(self.FlipnotePath(CreatorID, filename), "wb")
+ f.write(content)
+ f.close()
+
+ return CreatorID, filename
+ def AddView(self, CreatorID, filename):
+ for i, flipnote in enumerate(self.GetCreator(CreatorID, True) or []):
+ if flipnote[0] == filename:
+ self.Creator[CreatorID][i][1] = int(flipnote[1]) + 1
+ self.Views += 1
+ return True
+ return False
+ def AddStar(self, CreatorID, filename, amount=1):#todo: add support for other colored stars
+ for i, flipnote in enumerate(self.GetCreator(CreatorID, True) or []):
+ if flipnote[0] == filename:
+ self.Creator[CreatorID][i][2] = int(flipnote[2]) + amount
+ self.Stars += 1
+ return True
+ return False
+ def AddDownload(self, CreatorID, filename):
+ for i, flipnote in enumerate(self.GetCreator(CreatorID, True) or []):
+ if flipnote[0] == filename:
+ self.Creator[CreatorID][i][8] = int(flipnote[8]) + 1
+ self.Downloads += 1
+ return True
+ return False
+ #internal helpers:
+ def FlipnotePath(self, CreatorID, filename):#use self.GetFlipnotePPM() instead
+ return "database/Creators/%s/%s.ppm" % (CreatorID, filename)
+Database = Database()#is loaded, yesth!
\ No newline at end of file
diff --git a/database/new_flipnotes.dat b/database/new_flipnotes.dat
index 18715a2..20df4ab 100644
--- a/database/new_flipnotes.dat
+++ b/database/new_flipnotes.dat
@@ -1 +1 @@
-913304C0CC74CC1F 74CC1F_0D376FC60C9DC_000
\ No newline at end of file
+913304C0CC74CC1F 74CC1F_0D3AA40F2B3A0_000
\ No newline at end of file
diff --git a/hatena.py b/hatena.py
index da189a8..f217fb8 100644
--- a/hatena.py
+++ b/hatena.py
@@ -1,8 +1,9 @@
from twisted.web import static, resource
-from twisted.internet import reactor
-import sys, os, atexit, glob, imp
+import sys, os, glob, imp
from Hatenatools import *#UGO, PPM, TMB and NTFT
+#from DB import Database#flipnote handler
+#from DB import Database#flipnote handler
ServerLog = None#Is set to the log class by server.py
Silent = False
@@ -16,9 +17,10 @@ class AccessDenied(resource.Resource):
isLeaf = True
def render(self, request):
ServerLog.write("%s got 403 when requesting \"%s\"" % (request.getClientIP(), request.path), Silent)
+ print "debug:",request.getAllHeaders()
request.setResponseCode(403)
- return "403 - Access denied\nThis proxy is only for Flipnote Hatena for the DSi."
+ return "403 - Access denied\nThis proxy is only allowed to use for Flipnote Hatena for the DSi."
AccessDenied = AccessDenied()
class NotFound(resource.Resource):
isLeaf = True
@@ -28,7 +30,7 @@ class NotFound(resource.Resource):
ServerLog.write("%s got 404 when requesting \"%s\"" % (request.getClientIP(), path), Silent)
request.setResponseCode(404)
- return "404 - Not Found\nThis proxy is only for Flipnote Hatena for the DSi."
+ return "404 - Not Found\nThis proxy is only allowed to use for Flipnote Hatena for the DSi."
NotFound = NotFound()
class ConnectionTest(resource.Resource):#used for people setting up the proxy in their DSi. It's nice to see it's actually working.
#http://conntest.nintendowifi.net/
@@ -39,7 +41,6 @@ class ConnectionTest(resource.Resource):#used for people setting up the proxy in
return '
HTML PageThis is test.html page'
ConnectionTest = ConnectionTest()
-
#Root structure:
class Root(resource.Resource):#filters out non-hantena clients
isLeaf = False
@@ -71,7 +72,7 @@ class Root(resource.Resource):#filters out non-hantena clients
if request.getHost() == "conntest.nintendowifi.net":
return ConnectionTest
Log(request, "root")
- return "Welcome to hatena.pbsds.net!\nThis is in early stages, so please don't expect too much."
+ return "Welcome to hatena.pbsds.net!\nThis is still in early stages, so please don't expect too much."
class ds(resource.Resource):#child of Root
isLeaf = False
def __init__(self):
@@ -93,7 +94,7 @@ class UgoRoot(resource.Resource):#child of ds. (v2-xx)
def __init__(self):
resource.Resource.__init__(self)
- LoadHatenaStructure(self)
+ LoadHatenadirStructure(self)
def getChild(self, name, request):
if name == "":
return self
@@ -161,8 +162,8 @@ class FolderResource(resource.Resource):
def render(self, request):
path = "/".join(request.path.split("/")[3:])
Log(request, path)
- return "This is a folder, but I'm to lazy to list the contents..."
-def LoadHatenaStructure(Resource, path="hatenadir/ds/v2-xx", root = True):
+ return "I am a folder, but I'm to lazy to list my contents..."
+def LoadHatenadirStructure(Resource, path="hatenadir/ds/v2-xx", root = True):
for i in glob.glob("%s\*" % path):
if os.path.isfile(i):
filename = os.path.basename(i)
@@ -194,125 +195,12 @@ def LoadHatenaStructure(Resource, path="hatenadir/ds/v2-xx", root = True):
elif os.path.isdir(i):
if os.path.basename(i)[:2] <> "__":
folder = FolderResource()
- LoadHatenaStructure(folder, os.path.join(path, os.path.basename(i)), False)
+ LoadHatenadirStructure(folder, os.path.join(path, os.path.basename(i)), False)
Resource.putChild(os.path.basename(i), folder)
-#Flipnote handler:
-class Database:
- def __init__(self):
- #read:
- f = open("database/new_flipnotes.dat", "rb")#contains the newest 5000 flipnotes
- self.Newest = [tuple(i.split("\t")) for i in f.read().split("\n")]#[i] = [creatorID, filename]
- self.new = False#True when new flipnotes has been uploaded
- f.close()
-
- self.Creator = {}#to store creator info updates before writing to disk. Creator[id][n] = [filename, views, stars, green stars, red stars, blue stars, purple stars, Channel]
-
- reactor.callLater(60*3, self.flusher)
- atexit.register(self.write)
-
- #to check if an update is neccesary:
- self.Views = 0
- self.Stars = 0
- def flusher(self):#Automatically flushes the files every 3 minutes and trims down memory usage
- reactor.callLater(60*3, self.flusher)
-
- #trim newest:
- if len(self.Newest) > 5000:
- self.Newest = self.Newest[:5000]
-
- self.write()
- def write(self):
- if self.new:
- f = open("database/new_flipnotes.dat", "wb")
- f.write("\n".join(("\t".join(i) for i in self.Newest)))
- f.close()
- self.new = False
-
- for ID in self.Creator.keys():
- f = open("database/Creators/%s/flipnotes.dat" % ID, "wb")
- f.write("\n".join(("\t".join(map(str, i)) for i in self.Creator[ID])))
- f.close()
- del self.Creator[ID]
- #helpers:
- def FlipnotePath(self, CreatorID, filename):
- return "database/Creators/%s/%s" % (CreatorID, filename)
- def CreatorExists(self, CreatorID):
- return os.path.exists("database/Creators/" + CreatorID) or (CreatorID in self.Creator)
- def FlipnoteExists(self, CreatorID, filename):
- return os.path.exists("database/Creators/%s/%s.ppm" % (CreatorID, filename))
- #interface:
- def GetCreator(self, CreatorID, Store=False):#"Store" holds it in memory, use this when making changes or reading it often
- if CreatorID in self.Creator:
- return self.Creator[CreatorID]
- else:
- if not os.path.exists("database/Creators/" + CreatorID):
- return None
-
- f = open("database/Creators/%s/flipnotes.dat" % CreatorID, "rb")
- ret = [i.split("\t") for i in f.read().split("\n")]
- f.close()
-
- if Store:
- self.Creator[CreatorID] = ret
-
- return ret
- def GetFlipnote(self, CreatorID, filename):#[filename, views, stars, green stars, red stars, blue stars, purple stars, Channel]
- for i in (self.GetCreator(CreatorID) or []):
- if i[0] == filename:
- return i
- return False
- def AddFlipnote(self, content, Channel=""):
- tmb = TMB().Read(content)
- if not tmb:
- return False
-
- #CreatorID = tmb.Username
- CreatorID = tmb.EditorAuthorID
- filename = tmb.CurrentFilename[:-4]
- del tmb
-
- if os.path.exists("database/Creators/%s/%s.ppm" % (CreatorID, filename)):#already exists
- return False
-
- #add to database:
- self.new = True
- self.Newest.insert(0, (CreatorID, filename))
-
- if not self.GetCreator(CreatorID, True):
- self.Creator[CreatorID] = [[filename, 0, 0, 0, 0, 0, 0, Channel]]
- else:
- self.Creator[CreatorID].append([filename, 0, 0, 0, 0, 0, 0, Channel])
-
- #write flipnote to file:
- if not os.path.isdir("database/Creators/" + CreatorID):
- os.mkdir("database/Creators/" + CreatorID)
- f = open("database/Creators/%s/%s.ppm" % (CreatorID, filename), "wb")
- f.write(content)
- f.close()
-
- return CreatorID, filename
- def AddView(self, CreatorID, filename):
- for i, flipnote in enumerate(self.GetCreator(CreatorID, True) or []):
- if flipnote[0] == filename:
- self.Creator[CreatorID][i][1] = int(flipnote[1]) + 1
- self.Views += 1
- return True
- return False
- def AddStar(self, CreatorID, filename, amount=1):
- for i, flipnote in enumerate(self.GetCreator(CreatorID, True) or []):
- if flipnote[0] == filename:
- self.Creator[CreatorID][i][2] = int(flipnote[2]) + amount
- self.Stars += 1
- return True
- return False
-Database = Database()
-
#when loading:
def Setup():
- print "Setting up hatena...",
root = Root()
- print "Done!"
return root
diff --git a/hatenadir/ds/v2-xx/frontpage/hotmovies.ugo.py b/hatenadir/ds/v2-xx/frontpage/hotmovies.ugo.py
index 613832b..fd5532f 100644
--- a/hatenadir/ds/v2-xx/frontpage/hotmovies.ugo.py
+++ b/hatenadir/ds/v2-xx/frontpage/hotmovies.ugo.py
@@ -2,7 +2,8 @@ from twisted.web import resource
from twisted.internet import reactor
import time
-from hatena import Database, Log, NotFound
+from hatena import Log, NotFound
+from DB import Database
from Hatenatools import UGO
#makes a flipnote list of the most seen ones among the recently uploaded
@@ -77,12 +78,9 @@ class PyResource(resource.Resource):
ugo.Items.append(("button", 115, "Previous", "http://flipnote.hatena.com/ds/v2-xx/frontpage/hotmovies.uls?page=%i" % (page-1), ("", ""), None))
#Flipnotes
- for creatorid, filename in flipnotes:#[i*50 : i*50+50]:
+ for creatorid, filename in flipnotes:
stars = str(Database.GetFlipnote(creatorid, filename)[2])
-
- f = open(Database.FlipnotePath(creatorid, filename+".ppm"), "rb")
- ugo.Items.append(("button", 3, "", "http://flipnote.hatena.com/ds/v2-xx/movie/%s/%s.ppm" % (creatorid, filename), (stars, "765", "573", "0"), ("bleh", f.read(0x6a0))))
- f.close()
+ ugo.Items.append(("button", 3, "", "http://flipnote.hatena.com/ds/v2-xx/movie/%s/%s.ppm" % (creatorid, filename), (stars, "765", "573", "0"), (filename+".ppm", Database.GetFlipnoteTMB(creatorid, filename))))
#next page
if next:
diff --git a/hatenadir/ds/v2-xx/frontpage/likedmovies.ugo.py b/hatenadir/ds/v2-xx/frontpage/likedmovies.ugo.py
index 1756859..15f21c9 100644
--- a/hatenadir/ds/v2-xx/frontpage/likedmovies.ugo.py
+++ b/hatenadir/ds/v2-xx/frontpage/likedmovies.ugo.py
@@ -2,7 +2,8 @@ from twisted.web import resource
from twisted.internet import reactor
import time
-from hatena import Database, Log, NotFound
+from hatena import Log, NotFound
+from DB import Database
from Hatenatools import UGO
#makes a flipnote list of the most seen ones among the recently uploaded
@@ -14,7 +15,7 @@ class PyResource(resource.Resource):
self.pages = []#10 first pages
self.neweststar = None
self.newestflip = None
- reactor.callLater(2, self.Update)#or it'll clash with hotmovies.ugo
+ reactor.callLater(2, self.Update)#or it'll clash with the others in the terminal
def render(self, request):
page = int(request.args["page"][0]) if "page" in request.args else 1
@@ -79,10 +80,7 @@ class PyResource(resource.Resource):
#Flipnotes
for creatorid, filename in flipnotes:#[i*50 : i*50+50]:
stars = str(Database.GetFlipnote(creatorid, filename)[2])
-
- f = open(Database.FlipnotePath(creatorid, filename+".ppm"), "rb")
- ugo.Items.append(("button", 3, "", "http://flipnote.hatena.com/ds/v2-xx/movie/%s/%s.ppm" % (creatorid, filename), (stars, "765", "573", "0"), ("bleh", f.read(0x6a0))))
- f.close()
+ ugo.Items.append(("button", 3, "", "http://flipnote.hatena.com/ds/v2-xx/movie/%s/%s.ppm" % (creatorid, filename), (stars, "765", "573", "0"), (filename+".ppm", Database.GetFlipnoteTMB(creatorid, filename))))
#next page
if next:
diff --git a/hatenadir/ds/v2-xx/frontpage/newmovies.ugo.py b/hatenadir/ds/v2-xx/frontpage/newmovies.ugo.py
index 3e95eaa..44ce8b0 100644
--- a/hatenadir/ds/v2-xx/frontpage/newmovies.ugo.py
+++ b/hatenadir/ds/v2-xx/frontpage/newmovies.ugo.py
@@ -2,7 +2,8 @@ from twisted.web import resource
from twisted.internet import reactor
import time
-from hatena import Database, Log, NotFound
+from hatena import Log, NotFound
+from DB import Database
from Hatenatools import UGO
#makes a flipnote list of the newest flipnotes
@@ -13,7 +14,7 @@ class PyResource(resource.Resource):
self.pages = []#10 first pages
self.newestflip = None
- self.Update()
+ reactor.callLater(4, self.Update)#or it'll clash with the others in the terminal
def render(self, request):
page = int(request.args["page"][0]) if "page" in request.args else 1
@@ -73,10 +74,7 @@ class PyResource(resource.Resource):
#Flipnotes
for creatorid, filename in flipnotes:#[i*50 : i*50+50]:
stars = str(Database.GetFlipnote(creatorid, filename)[2])
-
- f = open(Database.FlipnotePath(creatorid, filename+".ppm"), "rb")
- ugo.Items.append(("button", 3, "", "http://flipnote.hatena.com/ds/v2-xx/movie/%s/%s.ppm" % (creatorid, filename), (stars, "765", "573", "0"), ("bleh", f.read(0x6a0))))
- f.close()
+ ugo.Items.append(("button", 3, "", "http://flipnote.hatena.com/ds/v2-xx/movie/%s/%s.ppm" % (creatorid, filename), (stars, "765", "573", "0"), (filename+".ppm", Database.GetFlipnoteTMB(creatorid, filename))))
#next page
if next:
diff --git a/hatenadir/ds/v2-xx/movie.py b/hatenadir/ds/v2-xx/movie.py
index 4188174..04006cb 100644
--- a/hatenadir/ds/v2-xx/movie.py
+++ b/hatenadir/ds/v2-xx/movie.py
@@ -1,7 +1,8 @@
from twisted.web import resource
import os
-from hatena import Database, Log, ServerLog, Silent, NotFound
+from hatena import Log, ServerLog, Silent, NotFound
+from DB import Database
from Hatenatools import TMB
#The movie folder:
@@ -58,14 +59,12 @@ class CreatorIDFileResource(resource.Resource):
Log(request, path)
#add a view:
- Database.AddView(creator, file[:4])
+ Database.AddView(creator, file[:-4])
#read ppm file:
- f = open(Database.FlipnotePath(creator, file), "rb")
- data = f.read()
- f.close()
+ data = Database.GetFlipnotePPM(creator, file[:-4])
- #send file to client:
+ #send file to the client:
request.responseHeaders.setRawHeaders('content-type', ['text/plain'])
return data
elif filetype == "info":
@@ -74,7 +73,8 @@ class CreatorIDFileResource(resource.Resource):
request.responseHeaders.setRawHeaders('content-type', ['text/plain'])
return "0\n0\n"#undocumented what it means
elif filetype == "htm":
- #maybe cache the details page of Database.Newest
+ #maybe cache the details page of Database.Newest?
+
if "mode" in request.args:
if request.args["mode"][0] == "commentshalfsize":
pass
@@ -104,9 +104,11 @@ class CreatorIDFileResource(resource.Resource):
elif filetype == "dl":
path = "/".join(request.path.split("/")[3:])
Log(request, path, True)
- #this is POSTed to when it've been downloaded.
- #todo: keep count
- return "Noted ;)"#muhahaha!
+ #this is POSTed to when it've been stored to memory.
+
+ Database.AddDownload(creator, file[:-3])
+
+ return "Noted ;)"
else:
path = "/".join(request.path.split("/")[3:])
ServerLog.write("%s got 403 when requesting %s" % (request.getClientIP(), path), Silent)
@@ -118,7 +120,7 @@ class CreatorIDFileResource(resource.Resource):
flipnote = Database.GetFlipnote(CreatorID, filename)#flipnote = [filename, views, stars, green stars, red stars, blue stars, purple stars, Channel], all probably strings
if not flipnote:
return "This flipnote doesn't exist!"
- tmb = TMB().ReadFile(Database.FlipnotePath(CreatorID, filename+".ppm"))
+ tmb = TMB().Read(Database.GetFlipnoteTMB(CreatorID, filename))
if not tmb:
return "This flipnote is corrupt!"
@@ -159,6 +161,8 @@ class CreatorIDFileResource(resource.Resource):
#Comments:
Comments = "0"
+ #doto: add original author info too
+
#add the entries to page:
return DetailsPageTemplate.replace("%%CreatorID%%", CreatorID).replace("%%Filename%%", filename).replace("%%CommentCount%%", Comments).replace("%%Spinoff%%", Spinnoff).replace("%%PageEntries%%", PageEntrySeparator.join(Entries))
diff --git a/hatenadir/ds/v2-xx/post/flipnote.post.py b/hatenadir/ds/v2-xx/post/flipnote.post.py
index 106213b..e2108d6 100644
--- a/hatenadir/ds/v2-xx/post/flipnote.post.py
+++ b/hatenadir/ds/v2-xx/post/flipnote.post.py
@@ -2,7 +2,8 @@ from twisted.web import resource
from twisted.internet import reactor
import time
-from hatena import Database, ServerLog, Silent
+from hatena import ServerLog, Silent
+from DB import Database
from Hatenatools import TMB
#Handle flipnote uploads
diff --git a/server.py b/server.py
index e193824..e5ce188 100644
--- a/server.py
+++ b/server.py
@@ -1,15 +1,15 @@
#Settings:
-useWSGI = False#not fully tested and WILL NOT support multible instances/workers
+useWSGI = False#not fully tested and WILL NOT support multible instances/workers with the plaintext database
port = 8080
#import:
-print "Importing modules..."
+print "Importing modules...",
from twisted.web import server#filehost
from twisted.internet import reactor
if useWSGI: from twisted.application import internet, service
import sys, time, os, atexit
-
+print "Done!"
#Logging
class Log:
@@ -83,15 +83,21 @@ class Log:
Print = write
Log = Log()
+#init database:
+print "Initializing flipnote database...",
+import DB
+print "Done!"
+
#Setup hatena server:
-print "Setting up flipnote database..."
+print "Setting up hatena site...",
import hatena
hatena.ServerLog = Log
-print "Setting up hatena site structure..."
site = server.Site(hatena.Setup())
+print "Done!"
+
#make the hatena server accept proxy connections:
-print "Setting up proxy hack..."
+print "Setting up proxy hack...",
silent = True
old_lineReceived = site.protocol.lineReceived
def lineReceived(self, line):
@@ -104,6 +110,7 @@ def lineReceived(self, line):
if not silent: print line
old_lineReceived(self, line)
site.protocol.lineReceived = lineReceived
+print "Done!"
#run!
print "Server start!\n"