| 
					
				 | 
			
			
				@@ -34,7 +34,7 @@ from jose import JWTError, jwt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from fastapi_jwt_auth import AuthJWT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from fastapi_jwt_auth.exceptions import AuthJWTException 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import models 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import util.models 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import pymysql 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import mailer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from moviepy.editor import VideoFileClip 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -47,7 +47,8 @@ import util.user 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 pymysql.install_as_MySQLdb() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 app = FastAPI() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+print("db loaded") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 mode = 'run' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 app.add_middleware( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     CORSMiddleware, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -157,7 +158,7 @@ async def make_video_slide(request: Request, response: Response, Authorize: Auth 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post('/user_profile', response_class=HTMLResponse) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 async def user_profile(token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_id = get_user_id(token) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_obj = first(db.query('SELECT * FROM users where id ="'+str(user_id)+'"')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -180,8 +181,8 @@ async def user_profile(token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return str_return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post('/edit_profile') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-async def edit_profile(userModel : models.UserProfile ,token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+async def edit_profile(userModel : util.models.UserProfile ,token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     print(token) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_id = get_user_id(token) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     print(user_id) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -197,7 +198,7 @@ async def get_login_and_register_page(request: Request): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post("/login") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 async def login_for_access_token(request: Request, form_data: OAuth2PasswordRequestForm = Depends(), Authorize: AuthJWT = Depends()): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user = authenticate_user(form_data.username, form_data.password) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if not user: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         raise HTTPException( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -221,12 +222,14 @@ async def login_for_access_token(request: Request, form_data: OAuth2PasswordRequ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if util.user.email_veri_pass(form_data.username): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return {"access_token": access_token, "token_type": "bearer",'veri':'ok'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        veri_obj = first(db.query('SELECT * FROM register_veri_code where user_id ="'+str(user_dict['id'])+'"')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mailer.register_verify('請至點擊網址驗證 : https://www.choozmo.com:8887/verify_email?code='+veri_obj['code'], user.email) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return {"access_token": access_token, "token_type": "bearer",'veri':'fail'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post("/token") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 async def access_token(form_data: OAuth2PasswordRequestForm = Depends(), Authorize: AuthJWT = Depends()): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user = authenticate_user(form_data.username, form_data.password) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if not user: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         raise HTTPException( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -243,50 +246,73 @@ async def access_token(form_data: OAuth2PasswordRequestForm = Depends(), Authori 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #前後端分離完全實現後拔除 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post("/register_old") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 async def register_old(request: Request): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    user = models.User(**await request.form()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    user = util.models.User(**await request.form()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_obj = first(db.query('SELECT * FROM users where username ="'+str(user.username)+'"')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if user_obj == None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         id = user_register(user) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = util.user.add_to_basic_role(id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        print(result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if type(id) is int: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             code = str(time.time()).replace('.','') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             db['register_veri_code'].insert({'code':code,'user_id':id}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             mailer.register_verify('請至點擊網址驗證 : https://www.choozmo.com:8887/verify_email?code='+code, user.email) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return {'msg':{'eng':'Register success! Please login at previous page','zh':'註冊成功! 請回到上頁登入帳號'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         else : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return {'msg':'error'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return {'msg':{'eng':'error','zh':'error'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         #return templates.TemplateResponse("make_video.html", {"request": request, "success": True},status_code=status.HTTP_302_FOUND) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         #return templates.TemplateResponse("login.html", {'request': request,"success": True}, status_code=status.HTTP_302_FOUND) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return {'msg':{'eng':user.username+' is duplicated user name try another','zh':user.username+'重複,請更改'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post("/register") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-async def register(request: models.register_req): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+async def register(request: util.models.register_req): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_obj = first(db.query('SELECT * FROM users where username ="'+str(request.username)+'"')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if user_obj == None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         id = user_register(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = util.user.add_to_basic_role(id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        print(result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if type(id) is int: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             code = str(time.time()).replace('.','') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             db['register_veri_code'].insert({'code':code,'user_id':id}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             mailer.register_verify('請至點擊網址驗證 : https://www.choozmo.com:8887/verify_email?code='+code, request.email) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return {'msg':{'eng':'Register success! Please login at previous page','zh':'註冊成功! 請回到上頁登入帳號'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         else : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return {'msg':'error'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return {'msg':{'eng':'error','zh':'error'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return {'msg':{'eng':user.username+' is duplicated user name try another','zh':user.username+'重複,請更改'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.get('/logout') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def logout(request: Request, Authorize: AuthJWT = Depends()): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     Authorize.jwt_required() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     Authorize.unset_jwt_cookies() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return {"msg": "ok"} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@app.post('/get_role') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+async def get_role(token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    user_id = util.user.get_user_id(token) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    roles = util.user.get_user_role(user_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return roles 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@app.post('/create_role') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+async def get_role(token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    user_id = get_user_id(token) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return user_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@app.post('/get_avatar_by_role') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+async def get_role(token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    user_id = util.user.get_user_id(token) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    avatar_info = util.user.get_avatar_by_role(user_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return avatar_info 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.get('/verify_email') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 async def verify_email(code): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     veri_obj = first(db.query('SELECT * FROM register_veri_code where code ="'+str(code)+'"')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if veri_obj != None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         db['register_veri_code'].delete(code=code) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -302,8 +328,9 @@ async def reset_pwd_page(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.get('/send_reset_pwd') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 async def send_reset_pwd(user_id,email): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     code = str(time.time()).replace('.','') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     db['reset_pw_code'].insert({'code':code,'user_id':user_id,'email':email}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     msg = '請至點擊網址以重設密碼 : https://www.choozmo.com:8887/reset_pwd_page    通行碼為 '+ code 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     print(msg) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -322,8 +349,8 @@ async def send_reset_pwd(user_id,email): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return {'msg':'ok'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post('/reset_pwd') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-async def reset_password(req :models.reset_pwd): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+async def reset_password(req :util.models.reset_pwd): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     print(req.code) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     veri_obj = next(iter(db.query('SELECT * FROM reset_pw_code where code ="'+str(req.code)+'"'))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     print(veri_obj['user_id']) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -340,14 +367,14 @@ async def avatar(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return FileResponse('static/gen_avatar.html') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post("/swapFace") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-async def swapFace(req:models.swap_req): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+async def swapFace(req:util.models.swap_req): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if 'http' not in req.imgurl: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         req.imgurl= 'http://'+req.imgurl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         im = Image.open(requests.get(req.imgurl, stream=True).raw) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         im= im.convert("RGB") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     except: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return {'msg':"無法辨別圖片網址"+req.imgurl} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return {'msg':{'eng':req.imgurl+'cant be proccessed','zh':"無法辨別圖片網址"+req.imgurl}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     name_hash = str(time.time()).replace('.','') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     x = threading.Thread(target=gen_avatar, args=(name_hash,req.imgurl)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -371,13 +398,13 @@ async def create_upload_file(file: UploadFile = File(...)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return {"msg": resource_server+tmp_img_sub_folder+img_name+'.jpg'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     except Exception as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         logging.error(traceback.format_exc()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return {'msg':'檔案無法使用'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return {'msg':{'eng':'file cant be prossessed','zh':'檔案無法使用'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post("/upload_pttx/") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 async def upload_pttx(file: UploadFile = File(...)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if "_" in file.filename: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return {'msg':'檔案無法使用檔名不能含有"_"符號'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return {'msg':{'eng':'symbol"_" is not allowed in file name','zh':'檔案無法使用檔名不能含有"_"符號'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             pttx_name = file.filename+'_'+str(time.time()).replace('.','') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             with open(pttx_dest+pttx_name, "wb+") as file_object: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -385,18 +412,18 @@ async def upload_pttx(file: UploadFile = File(...)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return {"msg": resource_server+pttx_sub_folder+pttx_name} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     except Exception as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         logging.error(traceback.format_exc()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return {'msg':'檔案無法使用'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return {'msg':{'eng':'file cant be prossessed','zh':'檔案無法使用'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post("/make_anchor_video_gSlide") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-async def make_anchor_video_gSlide(req:models.gSlide_req,token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+async def make_anchor_video_gSlide(req:util.models.gSlide_req,token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if req.url_type == 0: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         name, text_content, image_urls = gSlide.parse_slide_url(req.slide_url,eng=False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         filename = req.slide_url.replace(resource_server+pttx_sub_folder,resource_folder+pttx_sub_folder) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         name, text_content, image_urls = gSlide.parse_pttx_url(filename,img_upload_folder,resource_server+tmp_img_sub_folder,eng=False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if len(image_urls) != len(text_content): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return {'msg':'副標題數量、圖片(影片)數量以及台詞數量必須一致'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return {'msg':{'eng':'number of subtitles and images(videos) should be the same','zh':'副標題數量、圖片(影片)數量以及台詞數量必須一致'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for idx in range(len(image_urls)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if 'http' not in image_urls[idx]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             image_urls[idx] = 'http://'+image_urls[idx] 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -404,10 +431,10 @@ async def make_anchor_video_gSlide(req:models.gSlide_req,token: str = Depends(oa 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for txt in text_content: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if re.search('[a-zA-Z]', txt) !=None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 print('語言錯誤') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return {'msg':'輸入字串不能包含英文字!'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return {'msg':{'eng':'English is not allowed in subtitles','zh':'輸入字串不能包含英文字!'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if re.search(',', txt) !=None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 print('包含非法符號') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return {'msg':'輸入不能含有,符號'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return {'msg':{'eng':'symbol "," is not allowede','zh':'輸入不能含有","符號'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     name_hash = str(time.time()).replace('.','') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for imgu in image_urls: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -417,9 +444,9 @@ async def make_anchor_video_gSlide(req:models.gSlide_req,token: str = Depends(oa 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 im = Image.open(requests.get(imgu, stream=True).raw) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 im= im.convert("RGB") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         except: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return {'msg':"無法辨別圖片網址"+imgu} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return {'msg':{'eng':req.imgurl+'cant be proccessed','zh':"無法辨別圖片網址"+req.imgurl}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_id = get_user_id(token) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    proto_req = models.request_normal() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    proto_req = util.models.request_normal() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     proto_req.text_content = text_content 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     proto_req.name = name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     proto_req.image_urls = image_urls 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -428,13 +455,14 @@ async def make_anchor_video_gSlide(req:models.gSlide_req,token: str = Depends(oa 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     video_id = save_history(proto_req,name_hash,user_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     x = threading.Thread(target=gen_video_queue, args=(name_hash,name, text_content, image_urls,int(req.avatar),req.multiLang,video_id,user_id)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     x.start() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return {"msg":"製作影片需要時間,請您耐心等候,成果會傳送至LINE群組中"}  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return {"msg":"ok"}  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post("/make_anchor_video_long") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-async def make_anchor_video_long(req:models.request,token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+async def make_anchor_video_long(req:util.models.request,token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     left_tag = [m.start() for m in re.finditer('{', req.text_content[0])] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if len(req.image_urls) != len(left_tag): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return {'msg':'副標題數量、圖片(影片)數量以及台詞數量必須一致'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return {'msg':{'eng':'number of subtitles and images(videos) should be the same','zh':'副標題數量、圖片(影片)數量以及台詞數量必須一致'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for idx in range(len(req.image_urls)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if 'http' not in req.image_urls[idx]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             req.image_urls[idx] = 'http://'+req.image_urls[idx] 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -442,10 +470,10 @@ async def make_anchor_video_long(req:models.request,token: str = Depends(oauth2_ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for txt in req.text_content: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if re.search('[a-zA-Z]', txt) !=None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 print('語言錯誤') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return {'msg':'輸入字串不能包含英文字!'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return {'msg':{'eng':'English is not allowed in subtitles','zh':'輸入字串不能包含英文字!'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if re.search(',', txt) !=None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 print('包含非法符號') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return {'msg':'輸入不能含有,符號'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return {'msg':{'eng':'symbol "," is not allowede','zh':'輸入不能含有","符號'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     name_hash = str(time.time()).replace('.','') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for imgu in req.image_urls: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -455,17 +483,25 @@ async def make_anchor_video_long(req:models.request,token: str = Depends(oauth2_ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 im = Image.open(requests.get(imgu, stream=True).raw) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 im= im.convert("RGB") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         except: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return {'msg':"無法辨別圖片網址"+imgu} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return {'msg':{'eng':req.imgurl+'cant be proccessed','zh':"無法辨別圖片網址"+req.imgurl}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_id = get_user_id(token) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     video_id = save_history(req,name_hash,user_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     x = threading.Thread(target=gen_video_long_queue, args=(name_hash,req.name, req.text_content, req.image_urls,int(req.avatar),req.multiLang,video_id,user_id)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     x.start() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return {"msg":"ok"}  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    returnMsg = '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if first(db.query('SELECT COUNT(1) FROM video_queue'))['COUNT(1)'] >= 3: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        returnMsg =  {'msg':{'eng':'There are many videos have been processing, please wait.','zh':'目前有多部影片處理中,煩請耐心等候'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        returnMsg =  {'msg':{'eng':'Processing video requires a few minutes, please wait for notification','zh':'影片處理需要數分鐘,請等待通知'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return returnMsg 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post("/make_anchor_video") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-async def make_anchor_video(req:models.request,token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+async def make_anchor_video(req:util.models.request,token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if len(req.image_urls) != len(req.text_content): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return {'msg':'副標題數量、圖片(影片)數量以及台詞數量必須一致'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return {'msg':{'eng':'number of subtitles and images(videos) should be the same','zh':'副標題數量、圖片(影片)數量以及台詞數量必須一致'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for idx in range(len(req.image_urls)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if 'http' not in req.image_urls[idx]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             req.image_urls[idx] = 'http://'+req.image_urls[idx] 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -473,10 +509,10 @@ async def make_anchor_video(req:models.request,token: str = Depends(oauth2_schem 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for txt in req.text_content: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if re.search('[a-zA-Z]', txt) !=None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 print('語言錯誤') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return {'msg':'輸入字串不能包含英文字!'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return {'msg':{'eng':'English is not allowed in subtitles','zh':'輸入字串不能包含英文字!'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if re.search(',', txt) !=None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 print('包含非法符號') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return {'msg':'輸入不能含有,符號'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return {'msg':{'eng':'symbol "," is not allowede','zh':'輸入不能含有","符號'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     name_hash = str(time.time()).replace('.','') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for imgu in req.image_urls: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -486,17 +522,23 @@ async def make_anchor_video(req:models.request,token: str = Depends(oauth2_schem 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 im = Image.open(requests.get(imgu, stream=True).raw) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 im= im.convert("RGB") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         except: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return {'msg':"無法辨別圖片網址"+imgu} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return {'msg':{'eng':req.imgurl+'cant be proccessed','zh':"無法辨別圖片網址"+req.imgurl}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_id = get_user_id(token) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     video_id = save_history(req,name_hash,user_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     x = threading.Thread(target=gen_video_queue, args=(name_hash,req.name, req.text_content, req.image_urls,int(req.avatar),req.multiLang,video_id,user_id)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     x.start() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if first(db.query('SELECT COUNT(1) FROM video_queue'))['COUNT(1)'] >= 3: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return {'msg':{'eng':'There are many videos have been processing, please wait.','zh':'目前有多部影片處理中,煩請耐心等候'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return {'msg':{'eng':'Processing video requires a few minutes, please wait for notification','zh':'影片處理需要數分鐘,請等待通知'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return {'msg':'ok'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post("/make_anchor_video_eng") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-async def make_anchor_video_eng(req:models.request_eng,token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+async def make_anchor_video_eng(req:util.models.request_eng,token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if len(req.image_urls) != len(req.sub_titles) or len(req.sub_titles) != len(req.text_content): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return {'msg':'副標題數量、圖片(影片)數量以及台詞數量必須一致'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return {'msg':{'eng':'number of subtitles and images(videos) should be the same','zh':'副標題數量、圖片(影片)數量以及台詞數量必須一致'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for idx in range(len(req.image_urls)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if 'http' not in req.image_urls[idx]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             req.image_urls[idx] = 'http://'+req.image_urls[idx] 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -509,16 +551,21 @@ async def make_anchor_video_eng(req:models.request_eng,token: str = Depends(oaut 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 im = Image.open(requests.get(imgu, stream=True).raw) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 im= im.convert("RGB") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         except: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return {'msg':"無法辨別圖片網址"+imgu} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return {'msg':{'eng':req.imgurl+'cant be proccessed','zh':"無法辨別圖片網址"+req.imgurl}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_id = get_user_id(token) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     video_id = save_history(req,name_hash, user_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     x = threading.Thread(target=gen_video_queue_eng, args=(name_hash,req.name, req.text_content, req.image_urls,req.sub_titles,int(req.avatar),video_id)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     x.start() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if first(db.query('SELECT COUNT(1) FROM video_queue'))['COUNT(1)'] >= 3: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return {'msg':{'eng':'There are many videos have been processing, please wait.','zh':'目前有多部影片處理中,煩請耐心等候'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return {'msg':{'eng':'Processing video requires a few minutes, please wait for notification','zh':'影片處理需要數分鐘,請等待通知'}} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return {"msg":"ok"}  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post("/save_draft") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-async def save_draft(req:models.video_draft,token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+async def save_draft(req:util.models.video_draft,token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_id = get_user_id(token) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     txt_content_seperate_by_dot = '' 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -544,7 +591,7 @@ async def save_draft(req:models.video_draft,token: str = Depends(oauth2_scheme)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post('/draft_list') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 async def draft_list(token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_id = get_user_id(token) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     statement = 'SELECT * FROM draft WHERE user_id='+str(user_id)+' ORDER BY time_stamp DESC LIMIT 50' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     logs = [] 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -554,12 +601,12 @@ async def draft_list(token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return logs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post('/del_draft') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-async def del_draft(id_obj:models.id_obj,token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+async def del_draft(id_obj:util.models.id_obj,token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_id = get_user_id(token) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     statement = 'SELECT * FROM draft WHERE user_id="'+str(user_id)+'" and id ="'+str(id_obj.id)+'"' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if first(db.query(statement)) is not None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        db['draft'].delete(id=id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        db['draft'].delete(id=id_obj.id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return {'msg':'wrong id'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -569,10 +616,11 @@ async def del_draft(id_obj:models.id_obj,token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.get("/history_input_old") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 async def history_input_old(request: Request, Authorize: AuthJWT = Depends()): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     Authorize.jwt_required() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     current_user = Authorize.get_jwt_subject() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_id = first(db.query('SELECT * FROM users where username="' + current_user +'"'))['id'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     statement = 'SELECT * FROM history_input WHERE user_id="'+str(user_id)+'" ORDER BY timestamp DESC LIMIT 50' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -584,21 +632,21 @@ async def history_input_old(request: Request, Authorize: AuthJWT = Depends()): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.post("/history_input") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 async def history_input(token: str = Depends(oauth2_scheme)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_id = get_user_id(token) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_obj = first(db.query('SELECT * FROM users where id ="'+str(user_id)+'"')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     statement = 'SELECT * FROM history_input WHERE user_id="'+str(user_id)+'" ORDER BY timestamp DESC LIMIT 50' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     logs = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for row in db.query(statement): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        logs.append({'id':row['id'],'name':row['name'],'text_content':row['text_content'].split(','),'link':row['link'],'image_urls':row['image_urls'].split(',')}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        logs.append({'id':row['id'],'name':row['name'],'avatar':row['avatar'],'text_content':row['text_content'].split(','),'link':row['link'],'image_urls':row['image_urls'].split(',')}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return logs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @AuthJWT.load_config 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def get_config(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return models.Settings() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return util.models.Settings() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @app.exception_handler(AuthJWTException) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def authjwt_exception_handler(request: Request, exc: AuthJWTException): 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -608,7 +656,7 @@ def authjwt_exception_handler(request: Request, exc: AuthJWTException): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def get_user_id(token): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     credentials_exception = HTTPException( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         status_code=status.HTTP_401_UNAUTHORIZED, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         detail="Could not validate credentials", 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -619,7 +667,7 @@ def get_user_id(token): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         username: str = payload.get("sub") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if username is None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             raise credentials_exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        token_data = models.TokenData(username=username) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        token_data = util.models.TokenData(username=username) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     except JWTError: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         raise credentials_exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user = get_user(username=token_data.username) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -629,23 +677,23 @@ def get_user_id(token): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return user_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def check_user_exists(username): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if int(next(iter(db.query('SELECT COUNT(*) FROM AI_anchor.users WHERE username = "'+username+'"')))['COUNT(*)']) > 0: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return True 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def get_user(username: str): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if not check_user_exists(username):  # if user don't exist 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_dict = next( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         iter(db.query('SELECT * FROM AI_anchor.users where username ="'+username+'"'))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    user = models.User(**user_dict) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    user = util.models.User(**user_dict) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return user 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def user_register(user): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     table = db['users'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user.password = get_password_hash(user.password) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     id = table.insert(dict(user)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -656,11 +704,11 @@ def get_password_hash(password): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def verify_password(plain_password, hashed_password): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return pwd_context.verify(plain_password, hashed_password) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def authenticate_user(username: str, password: str): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if not check_user_exists(username):  # if user don't exist 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     user_dict = next(iter(db.query('SELECT * FROM AI_anchor.users where username ="'+username+'"'))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    user = models.User(**user_dict) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    user = util.models.User(**user_dict) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if not verify_password(password, user.password): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return user 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -674,7 +722,7 @@ def create_access_token(data: dict, expires_delta): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return encoded_jwt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def save_history(req,name_hash,user_id): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     log_table = db['history_input'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     txt_content_seperate_by_dot = '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for txt in req.text_content: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -687,7 +735,7 @@ def save_history(req,name_hash,user_id): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     time_stamp = datetime.fromtimestamp(time.time()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     time_stamp = time_stamp.strftime("%Y-%m-%d %H:%M:%S") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     pk = log_table.insert({'name':req.name,'text_content':txt_content_seperate_by_dot,'image_urls':img_urls_seperate_by_dot 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ,'user_id':user_id,'link':'www.choozmo.com:8168/'+video_sub_folder+name_hash+'.mp4','timestamp':time_stamp}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ,'user_id':user_id,'link':'www.choozmo.com:8168/'+video_sub_folder+name_hash+'.mp4','avatar':req.avatar,'timestamp':time_stamp}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return pk 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def get_url_type(url): 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -705,7 +753,7 @@ def notify_group(msg): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def gen_video_long_queue(name_hash,name,text_content, image_urls,avatar,multiLang,video_id,user_id): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     time_stamp = datetime.fromtimestamp(time.time()).strftime("%Y-%m-%d %H:%M:%S") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     txt_content_seperate_by_dot = '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for txt in text_content: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -763,7 +811,7 @@ def gen_video_long_queue(name_hash,name,text_content, image_urls,avatar,multiLan 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         db['video_queue'].delete(id=top1['id']) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         db.query('UPDATE video_queue_status SET status = 0') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def gen_video_queue(name_hash,name,text_content, image_urls,avatar,multiLang,video_id,user_id): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     time_stamp = datetime.fromtimestamp(time.time()).strftime("%Y-%m-%d %H:%M:%S") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     txt_content_seperate_by_dot = '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for txt in text_content: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -822,7 +870,7 @@ def gen_video_queue(name_hash,name,text_content, image_urls,avatar,multiLang,vid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         db.query('UPDATE video_queue_status SET status = 0') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def gen_video_queue_eng(name_hash,name,text_content, image_urls,sub_titles,avatar,video_id): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     time_stamp = datetime.fromtimestamp(time.time()).strftime("%Y-%m-%d %H:%M:%S") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     txt_content_seperate_by_dot = '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for txt in text_content: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -861,7 +909,7 @@ def gen_video_queue_eng(name_hash,name,text_content, image_urls,sub_titles,avata 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         db.query('UPDATE video_queue_status SET status = 0') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def gen_avatar(name_hash, imgurl): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    db_check() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     db['avatar_queue'].insert({'name_hash':name_hash,'imgurl':imgurl}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     while True: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         statement = 'SELECT * FROM avatar_service_status'#only one row in this table, which is the id 1 one 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -917,7 +965,14 @@ async def make_voice(in_text:text_in): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     x = threading.Thread(target=call_voice, args=(in_text.text,)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     x.start() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def db_check(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    global db 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        db.tables 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    except: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        print("database down") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        
			 |