|
@@ -19,8 +19,6 @@ import math
|
|
|
import dataset
|
|
|
from datetime import datetime
|
|
|
from gtts import gTTS
|
|
|
-import cv2
|
|
|
-from mail import mail_to_users
|
|
|
|
|
|
dir_sound = 'mp3_track/'
|
|
|
dir_photo = 'photo/'
|
|
@@ -31,36 +29,18 @@ dir_subtitle = 'subtitle/'
|
|
|
dir_anchor = 'anchor_raw/'
|
|
|
tmp_video_dir = 'tmp_video/'
|
|
|
video_sub_folder = 'ai_anchor_video/'
|
|
|
-#
|
|
|
+
|
|
|
dir_list = [dir_sound,dir_photo,dir_text,dir_video,dir_title,dir_subtitle,dir_anchor,tmp_video_dir]
|
|
|
|
|
|
-def notify_group(msg, glist=['7vilzohcyQMPLfAMRloUawiTV4vtusZhxv8Czo7AJX8','WekCRfnAirSiSxALiD6gcm0B56EejsoK89zFbIaiZQD','1dbtJHbWVbrooXmQqc4r8OyRWDryjD4TMJ6DiDsdgsX','HOB1kVNgIb81tTB4Ort1BfhVp9GFo6NlToMQg88vEhh']):
|
|
|
+def notify_group(msg):
|
|
|
+ glist=['7vilzohcyQMPLfAMRloUawiTV4vtusZhxv8Czo7AJX8','WekCRfnAirSiSxALiD6gcm0B56EejsoK89zFbIaiZQD','1dbtJHbWVbrooXmQqc4r8OyRWDryjD4TMJ6DiDsdgsX','HOB1kVNgIb81tTB4Ort1BfhVp9GFo6NlToMQg88vEhh']
|
|
|
for gid in glist:
|
|
|
headers = {
|
|
|
"Authorization": "Bearer " + gid,
|
|
|
"Content-Type": "application/x-www-form-urlencoded"
|
|
|
}
|
|
|
- params = {"message": msg}
|
|
|
- r = requests.post("https://notify-api.line.me/api/notify",headers=headers, params=params)
|
|
|
-
|
|
|
-
|
|
|
-def get_mp4_duration(video_name='mp4-test-file.mp4'): # 可輸入url
|
|
|
- cap = cv2.VideoCapture(video_name)
|
|
|
- # 幀率
|
|
|
- fps = int(round(cap.get(cv2.CAP_PROP_FPS)))
|
|
|
- # 分辨率-寬度
|
|
|
- width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
|
|
- # 分辨率-高度
|
|
|
- height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
|
|
- # 總幀數
|
|
|
- frame_counter = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
|
|
-
|
|
|
- cap.release()
|
|
|
- cv2.destroyAllWindows()
|
|
|
- # 時長,單位:秒(s)
|
|
|
- duration = int(frame_counter / fps)
|
|
|
- return duration
|
|
|
-
|
|
|
+ params = {"message": msg}
|
|
|
+ r = requests.post("https://notify-api.line.me/api/notify",headers=headers, params=params)
|
|
|
|
|
|
def cKey(r,g,b,fuzz):
|
|
|
col=openshot.Color()
|
|
@@ -132,7 +112,6 @@ def file_prepare(name, name_hash,text_content,image_urls,lang='zh'):
|
|
|
make_dir(name_hash)
|
|
|
img_num = 1
|
|
|
for imgu in image_urls:
|
|
|
-
|
|
|
if get_url_type(imgu) =='video/mp4':
|
|
|
r=requests.get(imgu)
|
|
|
f=open(dir_photo+name_hash+"/"+str(img_num)+".mp4",'wb')
|
|
@@ -167,7 +146,7 @@ def file_prepare(name, name_hash,text_content,image_urls,lang='zh'):
|
|
|
print("mp3 file made")
|
|
|
#make title as image
|
|
|
txt2image_title(name, dir_title+name_hash+".png",lang)
|
|
|
-
|
|
|
+
|
|
|
def txt2image(content, save_target,lang='zh'):
|
|
|
unicode_text = trim_punctuation(content)
|
|
|
font = ''
|
|
@@ -273,7 +252,6 @@ def generate_subtitle_image_ENG(name_hash,text_content):
|
|
|
return img_list
|
|
|
|
|
|
def anchor_video_v2(name_hash,name,text_content, image_urls,avatar):
|
|
|
- """ 影片產生主程式。 """
|
|
|
print(os.getcwd())
|
|
|
print('sub image made')
|
|
|
file_prepare(name, name_hash, text_content,image_urls)
|
|
@@ -410,26 +388,8 @@ def anchor_video_v2(name_hash,name,text_content, image_urls,avatar):
|
|
|
for n in range(frames):
|
|
|
f=t.GetFrame(n)
|
|
|
w.WriteFrame(f)
|
|
|
-
|
|
|
- # 更新剩下時間、duration
|
|
|
- video_link = f"www.choozmo.com:8168/{video_sub_folder}{name_hash}.mp4"
|
|
|
- duration, user_id = update_hisotry_duration(video_link)
|
|
|
- is_left_time = update_user_left_time(user_id, duration)
|
|
|
-
|
|
|
- # 1.餘額足 2. 餘額不足
|
|
|
- # 找到user-line群組token
|
|
|
- email, line_token = get_user_line_token_email(user_id)
|
|
|
-
|
|
|
- if is_left_time:
|
|
|
- notify_group(name+"的影片已經產生完成囉! www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4", glist=[line_token, 'WekCRfnAirSiSxALiD6gcm0B56EejsoK89zFbIaiZQD'])
|
|
|
- contents = f""" 影片下載網址: {video_link}"""
|
|
|
- mail_to_users(user_id, f'您好,您的影片 "{name}" 已經完成', contents=contents)
|
|
|
- else:
|
|
|
- notify_group(msg="您的餘額不足,請去...儲值,才能取得影片唷!", glist=[line_token, 'WekCRfnAirSiSxALiD6gcm0B56EejsoK89zFbIaiZQD'])
|
|
|
- contents = f""" 餘額不足,請往: ...儲值url儲值 """
|
|
|
- mail_to_users(user_id, f'您好,您的餘額不足', contents)
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+ #notify_group(name+"的影片已經產生完成囉! www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4")
|
|
|
t.Close()
|
|
|
w.Close()
|
|
|
print("video at : www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4")
|
|
@@ -567,26 +527,8 @@ def anchor_video_eng(name_hash,name,text_content, image_urls,sub_titles,avatar):
|
|
|
for n in range(frames):
|
|
|
f=t.GetFrame(n)
|
|
|
w.WriteFrame(f)
|
|
|
+
|
|
|
|
|
|
-
|
|
|
- # 更新剩下時間、duration
|
|
|
- video_link = f"www.choozmo.com:8168/{video_sub_folder}{name_hash}.mp4"
|
|
|
- duration, user_id = update_hisotry_duration(video_link)
|
|
|
- is_left_time = update_user_left_time(user_id, duration)
|
|
|
-
|
|
|
- # 1.餘額足 2. 餘額不足
|
|
|
- # 找到user-line群組token
|
|
|
- email, line_token = get_user_line_token_email(user_id)
|
|
|
-
|
|
|
- if is_left_time:
|
|
|
- notify_group(name+", Your video is complete! www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4", glist=[line_token, 'WekCRfnAirSiSxALiD6gcm0B56EejsoK89zFbIaiZQD'])
|
|
|
- contents = f""" The download address: {video_link}"""
|
|
|
- mail_to_users(user_id, f'Hi, your video "{name}" is complete', contents=contents)
|
|
|
- else:
|
|
|
- notify_group(msg="The left money is not enough, please deposit to get the video!", glist=[line_token, 'WekCRfnAirSiSxALiD6gcm0B56EejsoK89zFbIaiZQD'])
|
|
|
- contents = f""" The left money is not enough, please go to ... to deposit. """
|
|
|
- mail_to_users(user_id, f'Hi, your remain deposit is not enough', contents)
|
|
|
-
|
|
|
t.Close()
|
|
|
w.Close()
|
|
|
print("video at : www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4")
|
|
@@ -600,62 +542,9 @@ class video_service(rpyc.Service):
|
|
|
anchor_video_eng(name_hash,name,text_content, image_urls,sub_titles,avatar)
|
|
|
|
|
|
|
|
|
-def update_hisotry_duration(video_link):
|
|
|
- """ 更新資訊影片長度資訊。 """
|
|
|
- db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
|
|
|
- table = db['history_input']
|
|
|
- duration = get_mp4_duration(video_link)
|
|
|
- data = dict(link=video_link, duration=duration)
|
|
|
- table.update(data, ['link'])
|
|
|
-
|
|
|
- rows = db.query(f'SELECT * FROM history_input WHERE link="{video_link}"')
|
|
|
- for row in rows:
|
|
|
- user_id = row['user_id']
|
|
|
-
|
|
|
- return duration, user_id
|
|
|
-
|
|
|
-
|
|
|
-def update_user_left_time(user_id, duration):
|
|
|
- """ 更新使用者剩下時間,如果為負,接著提醒。 """
|
|
|
- db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
|
|
|
- table = db['users']
|
|
|
- rows = db.query(f"SELECT * FROM user WHERE id={user_id}")
|
|
|
- for row in rows:
|
|
|
- left_time = row['left_time']
|
|
|
- line_token = row['line_token']
|
|
|
- left_time -= duration
|
|
|
- data = dict(id=user_id, left_time=left_time-duration)
|
|
|
- table.update(data, ['id'])
|
|
|
-
|
|
|
- if left_time < 0:
|
|
|
- return False
|
|
|
- else:
|
|
|
- return True
|
|
|
-
|
|
|
-
|
|
|
-def get_user_line_token_email(user_id):
|
|
|
- """ 取得使用者line-token、email用以通知用。 """
|
|
|
- db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
|
|
|
- query = f"""
|
|
|
- select
|
|
|
- A.user_id, A.link, B.email, B.line_token
|
|
|
- from
|
|
|
- ((select link, user_id, duration
|
|
|
- from AI_anchor.history_input ) as A
|
|
|
- inner join (select id, email, line_token from AI_anchor.users where id={user_id}) as B
|
|
|
- on A.user_id=B.id);
|
|
|
- """
|
|
|
- rows = db.query(query)
|
|
|
- for row in rows:
|
|
|
- line_token = row['line_token']
|
|
|
- email = row['email']
|
|
|
- break
|
|
|
- return line_token, email
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
|
|
|
from rpyc.utils.server import ThreadedServer
|
|
|
t = ThreadedServer(video_service, port=8858)
|
|
|
print('service started')
|
|
|
-t.start()
|
|
|
+t.start()
|
|
|
+
|