@@ -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 |
|