Bladeren bron

Merge branch 'master' of http://git.choozmo.com:3000/choozmo/AI_Anchor_2 into master

jeter20131220 3 jaren geleden
bovenliggende
commit
db66d1791d

BIN
api/__pycache__/main.cpython-39.pyc


+ 86 - 9
api/main.py

@@ -165,7 +165,9 @@ async def user_profile(token: str = Depends(oauth2_scheme)):
     
     user_id = get_user_id(token)
     user_obj = first(db.query('SELECT * FROM users where id ="'+str(user_id)+'"'))
-
+    if user_obj['invite_code'] is None:
+        util.user.init_invite_code(user_id)
+        user_obj = first(db.query('SELECT * FROM users where id ="'+str(user_id)+'"'))
     if user_obj is None:
         raise HTTPException(
             status_code=status.HTTP_401_UNAUTHORIZED,
@@ -180,8 +182,11 @@ async def user_profile(token: str = Depends(oauth2_scheme)):
     statement = 'SELECT * FROM history_input WHERE user_id='+str(user_obj['id'])+' ORDER BY timestamp DESC LIMIT 50'
     for row in db.query(statement):
         video_info_list.append({'id':row['id'],'title':row['name'],'duration':row['duration'],'url':row['link'],'time_stamp':row['timestamp'].strftime("%m/%d/%Y, %H:%M:%S")})
-    dic_return = {'user_info':{'id':user_id,'userName':user_obj['username'],'email':user_obj['email'],'video_num':video_num,'total_sec':total_sec,'left_sec':user_obj['left_time']},'video_info':video_info_list}
+    dic_return = {'user_info':{'id':user_id,'userName':user_obj['username'],'email':user_obj['email']
+                ,'video_num':video_num,'total_sec':total_sec,'left_sec':user_obj['left_time'],'invite_code':user_obj['invite_code']}
+                ,'video_info':video_info_list}
     str_return = json.dumps(dic_return)
+    
     return str_return
 
 @app.post('/edit_profile')
@@ -281,12 +286,41 @@ async def register(request: util.models.register_req):
         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)
+            try:
+                mailer.register_verify('請至點擊網址驗證 : https://www.choozmo.com:8887/verify_email?code='+code, request.email)
+                return {'msg':{'eng':'Register success! Please check your mailbox to verify your email','zh':'註冊成功! 請至信箱收取驗證信'}}
+            except:
+                return {'msg':{'eng':'Invalid email address','zh':'無法寄送認證信!'}}
+        else :
+            return {'msg':{'eng':'error','zh':'error'}}
+    else:
+        return {'msg':{'eng':user_obj['username']+' is duplicated user name try another','zh':user_obj['username']+'重複,請更改'}}
+
+@app.post("/register_by_invite")
+async def register_by_invite(request: util.models.register_invite_req):
+    db_check()
+    user_obj = first(db.query('SELECT * FROM users where username ="'+str(request.username)+'"'))
+    
+    if user_obj == None:
+        invcode = request.invite_code
+        sha = hashlib.sha256()
+        sha.update(str(time.time()).replace('.','').encode())
+        request.invite_code = sha.hexdigest()
+        id = user_register(request)
+        result = util.user.add_to_basic_role(id)
+        if type(id) is int:
+            code = str(time.time()).replace('.','')
+            db['register_veri_code'].insert({'code':code,'user_id':id})
+            try:
+                mailer.register_verify('請至點擊網址驗證 : https://www.choozmo.com:8887/verify_email?code='+code, request.email)
+            except:
+                return {'msg':{'eng':'Invalid email address','zh':'無法寄送認證信!'}}
+            util.user.add_time_by_invite(invcode)
             return {'msg':{'eng':'Register success! Please login at previous page','zh':'註冊成功! 請回到上頁登入帳號'}}
         else :
             return {'msg':{'eng':'error','zh':'error'}}
     else:
-        return {'msg':{'eng':user.username+' is duplicated user name try another','zh':user.username+'重複,請更改'}}
+        return {'msg':{'eng':user_obj['username']+' is duplicated user name try another','zh':user_obj['username']+'重複,請更改'}}
 
 @app.get('/logout')
 def logout(request: Request, Authorize: AuthJWT = Depends()):
@@ -574,6 +608,43 @@ async def make_anchor_video_noAuth(req:util.models.request):
     else:
         return {'msg':{'eng':'Processing video requires a few minutes, please wait for notification','zh':'影片處理需要數分鐘,請等待通知'}}
     return {'msg':'ok'}
+   
+@app.post("/make_anchor_video_noAuth2" , response_class=JSONResponse)
+async def make_anchor_video_noAuth2(req:util.models.request):
+    db_check()
+    if len(req.image_urls) != len(req.text_content):
+        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]
+    if req.multiLang==0:
+        for txt in req.text_content:
+            if re.search('[a-zA-Z]', txt) !=None:
+                print('語言錯誤')
+                return {'msg':{'eng':'English is not allowed in subtitles','zh':'輸入字串不能包含英文字!'}}
+            if re.search(',', txt) !=None:
+                print('包含非法符號')
+                return {'msg':{'eng':'symbol "," is not allowede','zh':'輸入不能含有","符號'}}
+    name_hash = str(time.time()).replace('.','')
+    for imgu in req.image_urls:
+        try:
+            if get_url_type(imgu) =='video/mp4':
+                r=requests.get(imgu)
+            else:
+                im = Image.open(requests.get(imgu, stream=True).raw)
+                im= im.convert("RGB")
+        except:
+            return {'msg':{'eng':req.imgurl+'cant be proccessed','zh':"無法辨別圖片網址"+req.imgurl}}
+
+    video_id = save_history(req,name_hash,-1)
+    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,-1))
+    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:util.models.request_eng,token: str = Depends(oauth2_scheme)):
@@ -939,10 +1010,15 @@ def gen_video_queue(name_hash,name,text_content, image_urls,avatar,multiLang,vid
             shutil.copy(tmp_video_dir+top1['name_hash']+'.mp4',video_dest+top1['name_hash']+'.mp4')
             os.remove(tmp_video_dir+top1['name_hash']+'.mp4')
             vid_duration = VideoFileClip(video_dest+top1['name_hash']+'.mp4').duration
-            user_obj = first(db.query('SELECT * FROM users where id ="'+str(user_id)+'"'))
-            line_token = user_obj['line_token']         # aa
-            left_time = user_obj['left_time']
-            email = user_obj['email']
+            line_token=''
+            left_time=10000
+            email=''
+            if user_id!=-1:
+                user_obj = first(db.query('SELECT * FROM users where id ="'+str(user_id)+'"'))
+                line_token = user_obj['line_token']         # aa
+                left_time = user_obj['left_time']
+                email = user_obj['email']
+            
             print('left_time is '+str(left_time))
             db.query('UPDATE history_input SET duration ='+str(vid_duration)+' WHERE id='+str(video_id)+';')
             if left_time is None:
@@ -956,7 +1032,8 @@ def gen_video_queue(name_hash,name,text_content, image_urls,avatar,multiLang,vid
                 #notify_line_user(msg, line_token)
             else:
                 left_time = left_time - vid_duration
-                db.query('UPDATE users SET left_time ='+str(left_time)+' WHERE id='+str(user_id)+';')
+                if user_id != -1:
+                    db.query('UPDATE users SET left_time ='+str(left_time)+' WHERE id='+str(user_id)+';')
                 notify_group(name+"的影片已經產生完成囉! www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4")
                 #notify_line_user(name+"的影片已經產生完成囉! www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4", line_token)
         except Exception as e:

BIN
api/util/__pycache__/models.cpython-39.pyc


BIN
api/util/__pycache__/user.cpython-39.pyc


+ 6 - 0
api/util/models.py

@@ -65,6 +65,12 @@ class register_req(BaseModel):
     email: str
     password: str
 
+class register_invite_req(BaseModel):
+    username: str
+    email: str
+    password: str
+    invite_code: str
+
 class reset_pwd(BaseModel):
     code: str
     password: str

+ 25 - 0
api/util/user.py

@@ -7,6 +7,8 @@ from fastapi_jwt_auth.exceptions import AuthJWTException
 from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
 import util.models
 from passlib.context import CryptContext
+import hashlib
+import time
 SECRET_KEY = "df2f77bd544240801a048bd4293afd8eeb7fff3cb7050e42c791db4b83ebadcd"
 ALGORITHM = "HS256"
 ACCESS_TOKEN_EXPIRE_DAYS = 5
@@ -109,6 +111,29 @@ def get_avatar_by_role(id):
     #user_role_table = db['user_role']
     #user_role_table.insert({'user_id':,'role_id':role_id})
 
+def add_time_by_invite(code):
+    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
+    id = get_id_by_code(code)
+    result = next(iter(db.query('SELECT * FROM users where invite_code ="'+code+'"')))
+
+    state = 'UPDATE users SET left_time=left_time+120 WHERE id="'+str(id)+'"'
+    db.query(state)
+    db.close()
+
+def get_id_by_code(code):
+    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
+    user_dict = next(iter(db.query('SELECT * FROM users where invite_code ="'+code+'"')))
+    db.close()
+    return user_dict['id']
+
+def init_invite_code(id):
+    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
+    sha = hashlib.sha256()
+    sha.update(str(time.time()).replace('.','').encode())
+    state = 'UPDATE users SET invite_code="'+sha.hexdigest()[:15]+'" WHERE id="'+str(id)+'"'
+    db.query(state)
+    db.close()
+
 def add_to_basic_role(id):
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
     state ='insert into user_role (user_id,role_id) values('+str(id)+',5) '

BIN
etc/testgGround/__pycache__/main.cpython-39.pyc


+ 34 - 0
etc/testgGround/main.py

@@ -0,0 +1,34 @@
+from typing import Optional
+from fastapi import FastAPI
+from pydantic import BaseModel
+from fastapi.staticfiles import StaticFiles
+
+app = FastAPI()
+
+app.mount("/static", StaticFiles(directory="static"), name="static")
+
+class Item(BaseModel):
+
+    name: str
+
+    price: float
+
+    is_offer: Optional[bool] = None
+
+
+
+@app.get("/")
+def read_root():
+    return {"Hello": "World"}
+
+
+@app.get("/items/{item_id}")
+def read_item(item_id: int, q: Optional[str] = None):
+    return {"item_id": item_id, "q": q}
+
+
+
+@app.post("/enter_invite_code")
+def update_item(item_id: int, item: Item):
+    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
+    return {"item_name": item.name, "item_id": item_id}

+ 43 - 0
etc/testgGround/static/invite_register.html

@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html lang="en" >
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>AI ANCHOR GO</title>
+  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css">
+  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css" integrity="sha384-DNOHZ68U8hZfKXOrtjWvjxusGo9WQnrNx2sqG0tfsghAvtVlRW3tvkXWZh58N9jp"
+    crossorigin="anonymous">
+  <link rel="stylesheet"
+    href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt"
+    crossorigin="anonymous">
+    <link rel="preconnect" href="https://fonts.googleapis.com">
+    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+    <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&display=swap" rel="stylesheet"> 
+  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.18/dist/sweetalert2.min.css">
+
+  <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
+
+</head>
+<body>
+  
+
+
+  </div>
+  
+  <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
+  <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.3/jquery.easing.min.js'></script>
+
+  <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js" integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous"></script>
+  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js" integrity="sha384-Atwg2Pkwv9vp0ygtn1JAojH0nYbwNJLPhwyoVbhoPwBhjQPR5VtM2+xf0Uwh9KtT" crossorigin="anonymous"></script> 
+  <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.18/dist/sweetalert2.all.min.js"></script>
+  <script src="//cdnjs.cloudflare.com/ajax/libs/validate.js/0.13.1/validate.min.js"></script>
+  <script src="static/invite_register.js"></script>
+
+
+  <body>
+
+</div>
+
+</body>
+</html>

+ 31 - 0
etc/testgGround/static/invite_register.js

@@ -0,0 +1,31 @@
+
+
+$(".sender").click(function () {
+
+  var pwd = $("#in_pwd").val();
+  var code = $("#code").val();
+  
+  var url = "/reset_pwd";
+
+  var xhr = new XMLHttpRequest();
+  xhr.open("POST", url);
+
+  xhr.setRequestHeader("accept", "application/json");
+  xhr.setRequestHeader("Content-Type", "application/json");
+
+  xhr.onreadystatechange = function () {
+    if (xhr.readyState === 4) {
+        alert('重設成功')
+    }};
+
+  var data = `{"code":"`+ code+`","password":"`+pwd+`"}`
+
+  xhr.send(data);
+});
+
+
+
+var url_string = "http://www.example.com/t.html?a=1&b=3&c=m2-m3-m4-m5"; //window.location.href
+var url = new URL(url_string);
+var c = url.searchParams.get("c");
+console.log(c);