-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
236 lines (192 loc) · 8.57 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
import os
import json # 導入 json 模組
from datetime import datetime
from flask import Flask, request, render_template, send_file, redirect, url_for, session, send_from_directory
import threading
import logging
import tool.vision_detect as vision_detect
import tool.auth as auth
import tool.vid_User as vid_User
import tool.mail_User as mail_User
import tool.ranking as _ranking
app = Flask(__name__)
app.secret_key = 'secret_key'
# 設定上傳檔案和處理檔案的資料夾路徑
UPLOAD_FOLDER = 'uploads'
PROCESSED_FOLDER = 'processed'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['PROCESSED_FOLDER'] = PROCESSED_FOLDER
if not os.path.exists(app.config['UPLOAD_FOLDER']):
os.makedirs(app.config['UPLOAD_FOLDER'])
if not os.path.exists(app.config['PROCESSED_FOLDER']):
os.makedirs(app.config['PROCESSED_FOLDER'])
gpu_lock = threading.Lock()
def process_video(input_path, output_path):
if gpu_lock.acquire(timeout=3600): # 最多等待 1hr 來獲取 Lock
try:
vision_detect.process_video(input_path, output_path)
finally:
gpu_lock.release()
else:
logging.warning(input_path+"Timeout while waiting to acquire GPU lock.")
@app.route('/')
def index():
if 'user' in session:
# print("hello1")
mail_User.write(session['email'],session['user'])
return render_template('index.html')
else:
# print("hello2")
return render_template("login.html")
@app.route('/upload', methods=['POST'])
def upload():
# 確認請求中是否包含名為'video'的檔案部分
if 'video' not in request.files:
return "No file part"
# 取得使用者上傳的影片檔案
video_file = request.files['video']
# 確認使用者是否選擇了檔案
if video_file.filename == '':
return "No selected file"
# 使用當前日期時間來建立新的檔名
current_datetime = datetime.now()
filename = current_datetime.strftime("%Y%m%d%H%M%S")+ '_' + video_file.filename
# 將使用者上傳的影片儲存到伺服器上的暫存位置
video_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
video_file.save(video_path)
vid_User.write(filename,session['email'])
# 處理影片,並將處理過後的影片儲存到指定資料夾
processed_filename = "processed_" + filename
processed_path = os.path.join(app.config['PROCESSED_FOLDER'], processed_filename)
process_thread = threading.Thread(target=process_video, args=(video_path, processed_path))
process_thread.start()
# 重新導向到下載頁面,並將處理過後的影片檔案名稱作為查詢參數
return redirect(url_for('result_page', video=processed_filename))
# 設置新的路由來處理下載頁面
@app.route('/result_page')
def result_page():
# 取得查詢參數中的影片檔案名稱
video_name = request.args.get('video')
# 回傳 download.html 模板,並將影片檔案名稱傳遞到模板中
return render_template('result.html', video_name=video_name)
# 設置新的路由來處理下載影片
@app.route('/download/<video>')
def download(video):
# 取得處理過後的影片檔案路徑
processed_path = os.path.join(app.config['PROCESSED_FOLDER'], video)
# 以檔案下載方式回傳影片檔案
return send_file(processed_path, as_attachment=True, download_name="processed_" + processed_path[35:])
@app.route('/download_original/<video>')
def download_original(video):
# 取得原始影片檔案路徑
original_path = os.path.join(app.config['UPLOAD_FOLDER'], video)
# 以檔案下載方式回傳原始影片檔案
return send_file(original_path, as_attachment=True, download_name=original_path[23:])
# 新增影片列表路由
@app.route('/video_list')
def video_list():
# 取得上傳影片的檔案列表
uploaded_videos = os.listdir(app.config['UPLOAD_FOLDER'])
processed_videos = os.listdir(app.config['PROCESSED_FOLDER'])
video_list_info = []
vid_user = []
with open('./data/vid_User.json') as f:
vid_user = json.load(f)
for video in uploaded_videos:
if vid_user[video] != session['email']:
continue
# processed_filename = 'processed_' + video
filename = os.path.splitext(video)[0]
json_filename = 'processed_' + filename + '.json'
time_str = filename[:14]
name_str = filename[15:]
upload_time = datetime.strptime(time_str, '%Y%m%d%H%M%S') # 轉換成 datetime 物件
formatted_upload_time = upload_time.strftime('%Y-%m-%d %H:%M:%S') # 格式化成 'yyyy-mm-dd HH:MM'
if json_filename in processed_videos:
rank = _ranking.get_ranking(filename)
json_path = os.path.join(app.config['PROCESSED_FOLDER'], json_filename)
with open(json_path, 'r') as f:
video_info = json.load(f)
video_list_info.append({
'video_name': name_str,
'upload_time': formatted_upload_time,
'open_times': video_info['open_times'],
'cross_times': video_info['cross_times'],
'magic_cross_times': video_info['magic_cross_times'],
'score': video_info['score'],
'rank': rank,
'full_filename': video
})
else:
PROCESSING_TEXT = 'Processing...'
json_path = os.path.join(app.config['PROCESSED_FOLDER'], json_filename)
base, ext = os.path.splitext(json_path)
progress_json_path = f"{base}_progress{ext}"
if os.path.exists(progress_json_path):
with open(progress_json_path, 'r') as f:
progress_info = json.load(f)
progress = progress_info.get('progress', 0)
elapsed_time = progress_info.get('elapsed_time', 0)
remaining_time = progress_info.get('remaining_time', 0)
open_times = f'Progress: {progress}%'
cross_times = f'Elapsed time: {elapsed_time}min'
magic_cross_times = f'Remaining time: {remaining_time}min'
else:
open_times = 'Processing...'
cross_times = 'Processing...'
magic_cross_times = 'Processing...'
video_list_info.append({
'video_name': name_str,
'upload_time': formatted_upload_time,
'open_times': open_times,
'cross_times': PROCESSING_TEXT,
'magic_cross_times': cross_times,
'score': PROCESSING_TEXT,
'rank': magic_cross_times,
'full_filename': video
})
# 回傳 video_list.html 模板,並將影片列表資訊傳遞到模板中
return render_template('video_list.html', video_list_info=video_list_info)
@app.route('/login')
def login():
return redirect(url_for('auth_google'))
@app.route('/auth_google')
def auth_google():
return auth.auth_google()
@app.route('/callback')
def callback():
return auth.callback()
@app.route('/logout')
def logout():
return auth.logout()
@app.route('/ranking')
def ranking():
# 讀取排名資料、使用者對應影片資料和使用者對應名稱資料
with open('data/ranking.json', 'r') as f:
ranking_data = json.load(f)
with open('data/vid_User.json', 'r') as f:
vid_User_data = json.load(f)
with open('data/mail_name.json', 'r') as f:
mail_name_data = json.load(f)
video_file_formats = ['.mp4', '.avi', '.mov', '.mkv', '.webm', '.wmv', '.m4v']
if 'user' in session:
return render_template('ranking.html', ranking=ranking_data, vid_User=vid_User_data, mail_name=mail_name_data, formats=video_file_formats)
else:
return render_template('ranking_no_user.html', ranking=ranking_data, vid_User=vid_User_data, mail_name=mail_name_data, formats=video_file_formats)
@app.route('/rule')
def rule():
if 'user' in session:
return render_template("rule.html")
else:
return render_template("rule_no_user.html")
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
@app.route('/favicon.ico')
def favicon():
return send_from_directory(os.path.join(app.root_path, 'static'),'favicon.ico', mimetype='image/vnd.microsoft.icon')
@app.route('/sitemap.xml')
def sitemap():
return send_from_directory(app.static_folder, request.path[1:])
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, ssl_context=('server.crt', 'server.key'))