@@ -1 +1,3 @@ |
||
| 1 |
-.idea/ |
|
| 1 |
+.idea/ |
|
| 2 |
+.DS_Store |
|
| 3 |
+minipai2.db |
@@ -1,9 +1,13 @@ |
||
| 1 | 1 |
# -*- coding: utf-8 -*- |
| 2 | 2 |
|
| 3 |
+import glob |
|
| 4 |
+import os |
|
| 5 |
+import sqlite3 |
|
| 6 |
+ |
|
| 3 | 7 |
from tornado.httpserver import HTTPServer |
| 4 | 8 |
from tornado.ioloop import IOLoop |
| 5 | 9 |
from tornado.options import define, options |
| 6 |
-from tornado.web import Application, RequestHandler |
|
| 10 |
+from tornado.web import Application, RequestHandler, StaticFileHandler |
|
| 7 | 11 |
|
| 8 | 12 |
|
| 9 | 13 |
define('host', default='127.0.0.1', help='run on the given host', type=str)
|
@@ -11,13 +15,136 @@ define('port', default=8001, help='run on the given port', type=int)
|
||
| 11 | 15 |
options.parse_command_line() |
| 12 | 16 |
|
| 13 | 17 |
|
| 18 |
+ROOT_PATH = '/tmp/minipai2' |
|
| 19 |
+ |
|
| 20 |
+# 创建数据表语句 |
|
| 21 |
+CREATE_TABLE_STMT = """ |
|
| 22 |
+ CREATE TABLE IF NOT EXISTS photoinfo ( |
|
| 23 |
+ id integer primary key, |
|
| 24 |
+ lensman varchar(20), |
|
| 25 |
+ session varchar(20), |
|
| 26 |
+ name varchar(13) |
|
| 27 |
+);""" |
|
| 28 |
+# 创建索引语句 |
|
| 29 |
+CREATE_INDEX1 = 'CREATE INDEX IF NOT EXISTS idx_lensman ON photoinfo (lensman);' |
|
| 30 |
+CREATE_INDEX2 = 'CREATE INDEX IF NOT EXISTS idx_session ON photoinfo (session);' |
|
| 31 |
+# 插入数据语句 |
|
| 32 |
+INSERT_RECORD_STMT = 'INSERT INTO photoinfo VALUES (NULL, ?, ?, ?)' |
|
| 33 |
+# 查询数据语句 |
|
| 34 |
+SELECT_RECORD_STMT = 'SELECT MAX(name) FROM photoinfo WHERE lensman = ? and session = ?' |
|
| 35 |
+ |
|
| 36 |
+ |
|
| 37 |
+conn = sqlite3.connect('minipai2.db')
|
|
| 38 |
+cur = conn.cursor() |
|
| 39 |
+# 执行语句 |
|
| 40 |
+cur.execute(CREATE_TABLE_STMT) |
|
| 41 |
+cur.execute(CREATE_INDEX1) |
|
| 42 |
+cur.execute(CREATE_INDEX2) |
|
| 43 |
+conn.commit() |
|
| 44 |
+ |
|
| 45 |
+ |
|
| 46 |
+def get_session_dir(lensman, session): |
|
| 47 |
+ return '{}/{}/{}'.format(ROOT_PATH, session, 'origin'), '{}/{}/{}'.format(ROOT_PATH, session, 'thumbnail')
|
|
| 48 |
+ |
|
| 49 |
+ |
|
| 50 |
+def create_session_dir(lensman, session): |
|
| 51 |
+ for path in get_session_dir(lensman, session): |
|
| 52 |
+ if not os.path.exists(path): |
|
| 53 |
+ os.makedirs(path) |
|
| 54 |
+ |
|
| 55 |
+ |
|
| 56 |
+def get_last_timestamp(lensman, session): |
|
| 57 |
+ cur.execute(SELECT_RECORD_STMT, (lensman, session)) |
|
| 58 |
+ result = cur.fetchall() |
|
| 59 |
+ return int(result[0][0] or 0) |
|
| 60 |
+ |
|
| 61 |
+ |
|
| 62 |
+def insert_session_file(lensman, session, name): |
|
| 63 |
+ cur.execute(INSERT_RECORD_STMT, (lensman, session, name)) |
|
| 64 |
+ conn.commit() |
|
| 65 |
+ |
|
| 66 |
+ |
|
| 67 |
+def get_new_files(lensman, session, maxt): |
|
| 68 |
+ _, thumb = get_session_dir(lensman, session) |
|
| 69 |
+ files = glob.iglob('{}/*'.format(thumb))
|
|
| 70 |
+ news = [] |
|
| 71 |
+ for file in files: |
|
| 72 |
+ filename = file.split('/')[-1]
|
|
| 73 |
+ name = filename.split('.')[0]
|
|
| 74 |
+ if int(name) > maxt: |
|
| 75 |
+ insert_session_file(lensman, session, name) |
|
| 76 |
+ news.append({
|
|
| 77 |
+ 'id': name, |
|
| 78 |
+ 'name': filename, |
|
| 79 |
+ 'path': file.strip(ROOT_PATH), |
|
| 80 |
+ }) |
|
| 81 |
+ return news |
|
| 82 |
+ |
|
| 83 |
+ |
|
| 14 | 84 |
class HelloHandler(RequestHandler): |
| 15 | 85 |
def get(self): |
| 16 | 86 |
self.write('Hello Tornado')
|
| 17 | 87 |
|
| 18 | 88 |
|
| 89 |
+class SessionStartHandler(RequestHandler): |
|
| 90 |
+ def post(self): |
|
| 91 |
+ lensman = self.get_argument('lensman', '')
|
|
| 92 |
+ session = self.get_argument('session', '')
|
|
| 93 |
+ create_session_dir(lensman, session) |
|
| 94 |
+ self.write({
|
|
| 95 |
+ 'status': 200, |
|
| 96 |
+ }) |
|
| 97 |
+ |
|
| 98 |
+ |
|
| 99 |
+class SessionEndHandler(RequestHandler): |
|
| 100 |
+ def post(self): |
|
| 101 |
+ lensman = self.get_argument('lensman', '')
|
|
| 102 |
+ session = self.get_argument('session', '')
|
|
| 103 |
+ self.write({
|
|
| 104 |
+ 'status': 200, |
|
| 105 |
+ }) |
|
| 106 |
+ |
|
| 107 |
+ |
|
| 108 |
+class FetchThumbnailHandler(RequestHandler): |
|
| 109 |
+ def post(self): |
|
| 110 |
+ lensman = self.get_argument('lensman', '')
|
|
| 111 |
+ session = self.get_argument('session', '')
|
|
| 112 |
+ |
|
| 113 |
+ maxt = get_last_timestamp(lensman, session) |
|
| 114 |
+ files = get_new_files(lensman, session, maxt) |
|
| 115 |
+ |
|
| 116 |
+ self.write({
|
|
| 117 |
+ 'status': 200, |
|
| 118 |
+ 'data': {
|
|
| 119 |
+ 'files': files |
|
| 120 |
+ } |
|
| 121 |
+ }) |
|
| 122 |
+ |
|
| 123 |
+ |
|
| 124 |
+class FetchOriginHandler(RequestHandler): |
|
| 125 |
+ def post(self): |
|
| 126 |
+ lensman = self.get_argument('lensman', '')
|
|
| 127 |
+ session = self.get_argument('session', '')
|
|
| 128 |
+ |
|
| 129 |
+ name = self.get_argument('name', '')
|
|
| 130 |
+ |
|
| 131 |
+ origin, _ = get_session_dir(lensman, session) |
|
| 132 |
+ |
|
| 133 |
+ self.write({
|
|
| 134 |
+ 'status': 200, |
|
| 135 |
+ 'data': {
|
|
| 136 |
+ 'origin': '{}/{}'.format(origin, name).strip(ROOT_PATH)
|
|
| 137 |
+ } |
|
| 138 |
+ }) |
|
| 139 |
+ |
|
| 140 |
+ |
|
| 19 | 141 |
handlers = [ |
| 20 |
- (r'/', HelloHandler) |
|
| 142 |
+ (r'/', HelloHandler), |
|
| 143 |
+ (r'/session_start', SessionStartHandler), |
|
| 144 |
+ (r'/session_end', SessionEndHandler), |
|
| 145 |
+ (r'/fetch_thumbnail', FetchThumbnailHandler), |
|
| 146 |
+ (r'/fetch_origin', FetchOriginHandler), |
|
| 147 |
+ (r'/static/(.*)', StaticFileHandler, {'path': ROOT_PATH}),
|
|
| 21 | 148 |
] |
| 22 | 149 |
|
| 23 | 150 |
|