浏览代码

add aaron feature

ming 3 年之前
父节点
当前提交
f6a8275a49
共有 5 个文件被更改,包括 158 次插入10 次删除
  1. 二进制
      .DS_Store
  2. 63 0
      OpenshotService/mail.py
  3. 94 10
      OpenshotService/openshot_video_generator.py
  4. 二进制
      api/.DS_Store
  5. 1 0
      api/main.py

二进制
.DS_Store


+ 63 - 0
OpenshotService/mail.py

@@ -0,0 +1,63 @@
+
+import dataset
+import smtplib
+from email.mime.multipart import MIMEMultipart      # email內容載體
+from email.mime.text import MIMEText                # 用於製作文字內文
+from email.mime.base import MIMEBase                # 用於承載附檔
+from email import encoders                          # 用於附檔編碼
+import datetime
+import ssl
+
+
+def get_db(db_name, table_name):
+    db = dataset.connect(f'mysql://choozmo:pAssw0rd@db.ptt.cx:3306/{db_name}?charset=utf8mb4')
+    user_table = db[table_name]
+    return user_table
+
+
+def mail_to_users(user_id: int, subject: str, contents: str):
+    """
+        1. 透過id查詢DB, 找出使用者email、username
+        2. 訊息制定(如: Aaron, 您的影片於2021/7/12 14:00 "ChoozMo測試影片" 完成了,請前往官網: "url")下載。
+        3. 傳送。
+            - 根據server不同,可以區分。
+            - 先用Gmail。(可以動就好)
+    """
+    # 連線DB得到使用者郵件、姓名
+    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
+    rows = db.query(f'SELECT * FROM users WHERE id={user_id}')
+    for row in rows:
+        email = row['email']
+        name = row['username']
+        print(name, email)
+
+    # 寄件者使用的Gmail帳戶資訊
+    time_now = datetime.datetime.utcnow() + datetime.timedelta(hours=8)
+    with open('password.txt') as f:
+        gmail_user, gmail_password = f.readlines()
+    # gmail_user = 'aaron@choozmo.com'
+    # gmail_password = 'Choozmo1015'
+    from_address = gmail_user
+    # 設定信件內容與收件人資訊
+    to_address = email  if type(email) == type([]) else [email]
+
+    # 開始組合信件內容
+    mail = MIMEMultipart()
+    mail['From'] = from_address
+    mail['To'] = ', '.join(to_address)
+    mail['Subject'] = subject
+    # 將信件內文加到email中
+    mail.attach(MIMEText(contents))
+    print(to_address)  
+
+    # 設定smtp伺服器並寄發信件    
+    smtpserver = smtplib.SMTP_SSL("smtp.gmail.com", 465)
+    smtpserver.ehlo()
+    smtpserver.login(gmail_user, gmail_password)
+    smtpserver.sendmail(from_address, to_address, mail.as_string())
+    smtpserver.quit()
+
+
+if __name__ == '__main__':
+    mail_to_users(4, 'subject', 'contents')
+

+ 94 - 10
OpenshotService/openshot_video_generator.py

@@ -19,6 +19,8 @@ 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/'
@@ -32,15 +34,33 @@ 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)
+    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
+
 
 def cKey(r,g,b,fuzz):
     col=openshot.Color()
@@ -253,6 +273,7 @@ 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,0)
@@ -389,8 +410,23 @@ def anchor_video_v2(name_hash,name,text_content, image_urls,avatar):
     for n in range(frames):
         f=t.GetFrame(n)
         w.WriteFrame(f)
-        
-    notify_group(name+"的影片已經產生完成囉! www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4")
+    
+    # 更新剩下時間、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. 餘額不足
+    if is_left_time:
+        notify_group(name+"的影片已經產生完成囉! www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4")
+        contents = f"""  影片下載網址: {video_link}"""
+        mail_to_users(user_id, f'您好,您的影片 "{name}" 已經完成', contents=contents)
+    else:
+        notify_group(msg="您的餘額不足,請去...儲值,才能取得影片唷!")
+        contents = f"""  餘額不足,請往: ...儲值url儲值 """
+        mail_to_users(user_id, f'您好,您的餘額不足', contents)
+    
+    
     t.Close()
     w.Close()
     print("video at : www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4")
@@ -528,8 +564,23 @@ 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)
-        
-    notify_group(name+"(ENG)的影片已經產生完成囉! www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4")
+    
+
+    # 更新剩下時間、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. 餘額不足
+    if is_left_time:
+        notify_group(name+", Your video is complete! www.choozmo.com:8168/"+video_sub_folder+name_hash+".mp4")
+        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!")
+        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")
@@ -543,9 +594,42 @@ 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
+
+
+
 
 from rpyc.utils.server import ThreadedServer
 t = ThreadedServer(video_service, port=8878)
 print('service started')
-t.start()
-
+t.start()

二进制
api/.DS_Store


+ 1 - 0
api/main.py

@@ -36,6 +36,7 @@ from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
 import models
 import pymysql
 from first import first
+from mail import mail_to_users
 pymysql.install_as_MySQLdb()
 
 app = FastAPI()