Selaa lähdekoodia

add freetrial watermark

ming 3 vuotta sitten
vanhempi
commit
697b2bdf7b
3 muutettua tiedostoa jossa 105 lisäystä ja 16 poistoa
  1. 18 6
      OpenshotService/openshot_video_generator.py
  2. 75 10
      api/main.py
  3. 12 0
      api/util/user.py

+ 18 - 6
OpenshotService/openshot_video_generator.py

@@ -737,7 +737,7 @@ def video_gen(name_hash,name,text_content, image_urls,multiLang,avatar):
     print(name+"ALL DONE : www.choozmo.com:8168/"+video_sub_folder+name_hash+"raw.mp4")
 
 
-def anchor_video_v2(name_hash,name,text_content, image_urls,multiLang,avatar):
+def anchor_video_v2(name_hash,name,text_content, image_urls,multiLang,avatar,freeTrial):
     print(os.getcwd())
     print('sub image made')
     print(multiLang)
@@ -863,6 +863,12 @@ def anchor_video_v2(name_hash,name,text_content, image_urls,multiLang,avatar):
     title_clip = video_photo_clip(vid=title, layer=4,location_x=-0.047, location_y=0.801,position=0,end=head_duration+main_timer)
     t.AddClip(title_clip)
 
+    if freeTrial:
+        wm = openshot.QtImageReader(dir_video+"freeTrialWatermark.png")
+        wm.Open()     
+        wm = video_photo_clip(wm,layer=6,position=int(head_duration+main_timer+ED_duration),end=left_time)
+        t.AddClip(wm)
+
     ####start building
     w = openshot.FFmpegWriter(tmp_video_dir+name_hash+".mp4")
     w.SetAudioOptions(True, "aac", 44100, 2, openshot.LAYOUT_STEREO, 3000000)
@@ -882,7 +888,7 @@ def anchor_video_v2(name_hash,name,text_content, image_urls,multiLang,avatar):
     print("video at : www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4")
 
 
-def anchor_video_eng(name_hash,name,text_content, image_urls,sub_titles,avatar):
+def anchor_video_eng(name_hash,name,text_content, image_urls,sub_titles,avatar,freeTrial):
     file_prepare(name, name_hash, text_content,image_urls,1,'eng')
     sub_list=generate_subtitle_image_ENG(name_hash,sub_titles)
     
@@ -1002,6 +1008,12 @@ def anchor_video_eng(name_hash,name,text_content, image_urls,sub_titles,avatar):
     title_clip = video_photo_clip(vid=title, layer=4,location_x=-0.047, location_y=0.801,position=0,end=head_duration+main_timer)
     t.AddClip(title_clip)
 
+    if freeTrial:
+        wm = openshot.QtImageReader(dir_video+"freeTrialWatermark.png")
+        wm.Open()     
+        wm = video_photo_clip(wm,layer=6,position=int(head_duration+main_timer+ED_duration),end=left_time)
+        t.AddClip(wm)
+
     ####start building
     w = openshot.FFmpegWriter(tmp_video_dir+name_hash+".mp4")
     w.SetAudioOptions(True, "aac", 44100, 2, openshot.LAYOUT_STEREO, 3000000)
@@ -1032,11 +1044,11 @@ def make_speech(text):
 
     
 class video_service(rpyc.Service):
-    def exposed_call_video(self,name_hash,name,text_content, image_urls,multiLang,avatar):
+    def exposed_call_video(self,name_hash,name,text_content, image_urls,multiLang,avatar,freeTrial):
         print('ML:'+str(multiLang))
-        anchor_video_v2(name_hash,name,text_content, image_urls,multiLang,avatar)
-    def exposed_call_video_eng(self,name_hash,name,text_content, image_urls,sub_titles,avatar):
-        anchor_video_eng(name_hash,name,text_content, image_urls,sub_titles,avatar)
+        anchor_video_v2(name_hash,name,text_content, image_urls,multiLang,avatar,freeTrial)
+    def exposed_call_video_eng(self,name_hash,name,text_content, image_urls,sub_titles,avatar,freeTrial):
+        anchor_video_eng(name_hash,name,text_content, image_urls,sub_titles,avatar,freeTrial)
     def exposed_call_video_gen(self,name_hash,name,text_content, image_urls,multiLang,avatar):
         print('ML:'+str(multiLang))#this is long video version,
         video_gen(name_hash,name,text_content, image_urls,multiLang,avatar)

+ 75 - 10
api/main.py

@@ -492,7 +492,8 @@ async def make_anchor_video_gSlide(req:util.models.gSlide_req,token: str = Depen
     proto_req.avatar = req.avatar
     proto_req.multiLang = req.multiLang
     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))
+    freeTrial = 6 in util.user.get_user_role_list(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,freeTrial))
     x.start()
     return {"msg":"ok"} 
 
@@ -563,7 +564,8 @@ async def make_anchor_video(req:util.models.request,token: str = Depends(oauth2_
             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))
+    freeTrial = 6 in util.user.get_user_role_list(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,freeTrial))
     x.start()
      
     if first(db.query('SELECT COUNT(1) FROM video_queue'))['COUNT(1)'] >= 3:
@@ -600,7 +602,8 @@ async def make_anchor_video_noAuth(req:util.models.request):
             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))
+    freeTrial = 6 in util.user.get_user_role_list(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,freeTrial))
     x.start()
      
     if first(db.query('SELECT COUNT(1) FROM video_queue'))['COUNT(1)'] >= 3:
@@ -637,7 +640,8 @@ async def make_anchor_video_noAuth2(req:util.models.request):
             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))
+    freeTrial = True
+    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,freeTrial))
     x.start()
      
     if first(db.query('SELECT COUNT(1) FROM video_queue'))['COUNT(1)'] >= 3:
@@ -666,7 +670,68 @@ async def make_anchor_video_eng(req:util.models.request_eng,token: str = Depends
             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))
+    freeTrial = 6 in util.user.get_user_role_list(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,freeTrial))
+    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_noAuth")
+async def make_anchor_video_eng(req:util.models.request_eng):
+    db_check()
+    if len(req.image_urls) != len(req.sub_titles) or len(req.sub_titles) != 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]
+    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)
+    freeTrial = True
+    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,freeTrial))
+    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_noAuth2")
+async def make_anchor_video_eng(req:util.models.request_eng):
+    db_check()
+    if len(req.image_urls) != len(req.sub_titles) or len(req.sub_titles) != 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]
+    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)
+    freeTrial = True
+    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,freeTrial))
     x.start()
      
     if first(db.query('SELECT COUNT(1) FROM video_queue'))['COUNT(1)'] >= 3:
@@ -971,7 +1036,7 @@ def gen_video_long_queue(name_hash,name,text_content, image_urls,avatar,multiLan
         db.query('UPDATE video_queue_status SET status = 0')
     db.close()
 
-def gen_video_queue(name_hash,name,text_content, image_urls,avatar,multiLang,video_id,user_id):
+def gen_video_queue(name_hash,name,text_content, image_urls,avatar,multiLang,video_id,user_id,freeTrial):
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
     if name_hash == 'keepRunning':
         if first(db.query('SELECT COUNT(1) FROM video_queue where video_type="short"'))['COUNT(1)'] == 0:
@@ -1006,7 +1071,7 @@ def gen_video_queue(name_hash,name,text_content, image_urls,avatar,multiLang,vid
             c = rpyc.connect("localhost", 8858)
             c._config['sync_request_timeout'] = None
             remote_svc = c.root
-            my_answer = remote_svc.call_video(top1['name_hash'],top1['name'],top1['text_content'].split(','), top1['image_urls'].split(','),top1['multiLang'],top1['avatar']) # method call
+            my_answer = remote_svc.call_video(top1['name_hash'],top1['name'],top1['text_content'].split(','), top1['image_urls'].split(','),top1['multiLang'],top1['avatar'],top1['freeTrial']) # method call
             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
@@ -1023,7 +1088,7 @@ def gen_video_queue(name_hash,name,text_content, image_urls,avatar,multiLang,vid
             db.query('UPDATE history_input SET duration ='+str(vid_duration)+' WHERE id='+str(video_id)+';')
             if left_time is None:
                 left_time = 5*60
-            if left_time < vid_duration:
+            if left_time < vid_duration and freeTrial!=1:
                 msg = '您本月額度剩下'+str(left_time)+'秒,此部影片有'+str(vid_duration)+'秒, 若要繼續產生影片請至 192.168.1.107:8887/confirm_add_value?name_hash='+name_hash+' 加值'
                 print(msg)
                 msg =msg.encode(encoding='utf-8')
@@ -1044,7 +1109,7 @@ def gen_video_queue(name_hash,name,text_content, image_urls,avatar,multiLang,vid
         db.query('UPDATE video_queue_status SET status = 0')
     db.close()
 
-def gen_video_queue_eng(name_hash,name,text_content, image_urls,sub_titles,avatar,video_id):
+def gen_video_queue_eng(name_hash,name,text_content, image_urls,sub_titles,avatar,video_id,freeTrial):
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
     if name_hash == 'keepRunning':
         if first(db.query('SELECT COUNT(1) FROM video_queue where video_type="eng"'))['COUNT(1)'] == 0:
@@ -1080,7 +1145,7 @@ def gen_video_queue_eng(name_hash,name,text_content, image_urls,sub_titles,avata
             c = rpyc.connect("localhost", 8858)
             c._config['sync_request_timeout'] = None
             remote_svc = c.root
-            my_answer = remote_svc.call_video_eng(top1['name_hash'],top1['name'],top1['text_content'].split(','), top1['image_urls'].split(','),top1['subtitles'].split(','),top1['avatar']) # method call
+            my_answer = remote_svc.call_video_eng(top1['name_hash'],top1['name'],top1['text_content'].split(','), top1['image_urls'].split(','),top1['subtitles'].split(','),top1['avatar'],top1['freeTrial']) # method call
             shutil.copy(tmp_video_dir+top1['name_hash']+'.mp4',video_dest+top1['name_hash']+'.mp4')
             os.remove(tmp_video_dir+top1['name_hash']+'.mp4')
             notify_group(name+"(ENG)的影片已經產生完成囉! www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4")

+ 12 - 0
api/util/user.py

@@ -91,6 +91,18 @@ def get_user_role(id):
     db.close()
     return role_list
 
+def get_user_role_list(id):
+    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
+    state = 'SELECT * FROM user_role '\
+    'INNER JOIN users on user_role.user_id= users.id '\
+    'INNER JOIN role on user_role.role_id = role.id '\
+    'WHERE users.id='+str(id)
+    role_list = []
+    for row in db.query(state):
+        role_list.append(row['role_id'])
+    db.close()
+    return role_list
+
 def get_avatar_by_role(id):
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
     state = 'select role_avatar.role_id, avatar_id, avatar.name,num from role_avatar '\