|
@@ -10,7 +10,6 @@ from typing import List
|
|
|
import requests
|
|
|
from pydantic import BaseModel
|
|
|
from bs4 import BeautifulSoup
|
|
|
-import time
|
|
|
from PIL import Image,ImageDraw,ImageFont
|
|
|
import pyttsx3
|
|
|
import rpyc
|
|
@@ -105,6 +104,9 @@ async def index2():
|
|
|
@app.get("/script_msg.js")
|
|
|
async def index2():
|
|
|
return FileResponse('script_msg.js')
|
|
|
+@app.get("/script_msg2.js")
|
|
|
+async def index2():
|
|
|
+ return FileResponse('script_msg2.js')
|
|
|
@app.get("/style.css")
|
|
|
async def index2():
|
|
|
return FileResponse('style.css')
|
|
@@ -134,6 +136,25 @@ async def make_anchor_video_v2(req:request2):
|
|
|
x.start()
|
|
|
return {"msg":"製作影片需要時間,請您耐心等候 稍後可以在www.choozmo.com:8168/"+req.name+".mp4 中觀看"}
|
|
|
|
|
|
+@app.post("/make_anchor_video_v33")
|
|
|
+async def make_anchor_video_v2(req:request2):
|
|
|
+ db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
|
|
|
+ log_table = db['history_input']
|
|
|
+ txt_content_seperate_by_dot = ''
|
|
|
+ for txt in req.text_content:
|
|
|
+ txt_content_seperate_by_dot += txt+","
|
|
|
+ txt_content_seperate_by_dot = txt_content_seperate_by_dot[:-1]
|
|
|
+ img_urls_seperate_by_dot = ''
|
|
|
+ for iurl in req.image_urls:
|
|
|
+ img_urls_seperate_by_dot += iurl+","
|
|
|
+ img_urls_seperate_by_dot = img_urls_seperate_by_dot[:-1]
|
|
|
+ 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,'timestamp':time_stamp})
|
|
|
+ x = threading.Thread(target=anchor_video_v3333, args=(req.name, req.text_content, req.image_urls))
|
|
|
+ x.start()
|
|
|
+ return {"msg":"製作影片需要時間,請您耐心等候 稍後可以在www.choozmo.com:8168/"+req.name+".mp4 中觀看"}
|
|
|
+
|
|
|
@app.websocket("/progress")
|
|
|
async def websocket_endpoint(websocket: WebSocket):
|
|
|
await manager.connect(websocket)
|
|
@@ -451,9 +472,7 @@ def generate_subtitle_image(name_hash,text_content):
|
|
|
def anchor_video_v2(name,text_content, image_urls):
|
|
|
#ws = create_connection("ws://www.choozmo.com:8888/progress")
|
|
|
progress = 0
|
|
|
- m = hashlib.md5()
|
|
|
- m.update(name.encode("utf-8"))
|
|
|
- name_hash = m.hexdigest()
|
|
|
+ name_hash = str(time.time()).replace('.','')
|
|
|
|
|
|
print('sub image made')
|
|
|
file_prepare_v2(name, name_hash, text_content,image_urls)
|
|
@@ -613,4 +632,172 @@ def anchor_video_v2(name,text_content, image_urls):
|
|
|
print("video at : www.choozmo.com:8168/"+name_hash+".mp4")
|
|
|
|
|
|
#line notifs
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+def anchor_video_v3333(name,text_content, image_urls):
|
|
|
+ ws = create_connection("ws://www.choozmo.com:8888/progress")
|
|
|
+ progress = 0
|
|
|
+
|
|
|
+ name_hash = str(time.time()).replace('.','')
|
|
|
+
|
|
|
+ print('sub image made')
|
|
|
+ file_prepare_v2(name, name_hash, text_content,image_urls)
|
|
|
+ progress = 10
|
|
|
+ ws.send(str(progress))
|
|
|
+ sub_list=generate_subtitle_image(name_hash,text_content)
|
|
|
+ progress = 20
|
|
|
+ ws.send(str(progress))
|
|
|
+
|
|
|
+ progress_per_video = int(40/len(text_content))
|
|
|
+ for fname in range(len(text_content)):
|
|
|
+ call_achor_video_v2(name_hash+"/"+str(fname))
|
|
|
+ progress += progress_per_video
|
|
|
+ ws.send(str(progress))
|
|
|
+ print('step finish')
|
|
|
+ print('called............................................')
|
|
|
+
|
|
|
+ ck=cKey(0,254,0,270)
|
|
|
+ ck_anchor=cKey(0,255,1,320)
|
|
|
+ duration = 0
|
|
|
+ #average layer level is 3
|
|
|
+ t = openshot.Timeline(1280, 720, openshot.Fraction(30000, 1000), 44100, 2, openshot.LAYOUT_STEREO)
|
|
|
+ t.Open()
|
|
|
+
|
|
|
+ main_timer = 0
|
|
|
+
|
|
|
+ LOGO_OP = openshot.FFmpegReader(dir_video+"LOGO_OP.mp4")
|
|
|
+ LOGO_OP.Open() # Open the reader
|
|
|
+ LOGO_OP_clip = video_photo_clip(vid=LOGO_OP,layer=4,position=0,end=LOGO_OP.info.duration
|
|
|
+ ,location_y=-0.03,scale_x=0.8,scale_y=0.71)
|
|
|
+ t.AddClip(LOGO_OP_clip)
|
|
|
+ bg_head = openshot.FFmpegReader(dir_video+"bg_head.avi")
|
|
|
+ bg_head.Open()
|
|
|
+ bg_head_clip = video_photo_clip(vid=bg_head,layer=2,position=0,end=LOGO_OP.info.duration,ck=ck)
|
|
|
+ t.AddClip(bg_head_clip)
|
|
|
+ main_timer += LOGO_OP.info.duration
|
|
|
+ head_duration = LOGO_OP.info.duration
|
|
|
+ bg_head.Close()
|
|
|
+ LOGO_OP.Close()
|
|
|
+ progress += 10
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ clip_duration=0
|
|
|
+ photo_clip_list = [None]*len(text_content)
|
|
|
+ img_list = [None]*len(text_content)
|
|
|
+ anchor_clip_list = [None] * len(text_content)
|
|
|
+ anchor_list = [None] * len(text_content)
|
|
|
+ audio_clip_list = [None] * len(text_content)
|
|
|
+ audio_list = [None] * len(text_content)
|
|
|
+ sub_clip_list = [None] * len(text_content)
|
|
|
+ sub_img_list = [None] * len(text_content)
|
|
|
+
|
|
|
+ idx = 0
|
|
|
+ for p in listdir(dir_photo+name_hash):
|
|
|
+
|
|
|
+ anchor_list[idx] = openshot.FFmpegReader(dir_anchor+name_hash+"/"+str(idx)+".mp4")
|
|
|
+ clip_duration = anchor_list[idx].info.duration
|
|
|
+ anchor_list[idx].Open()
|
|
|
+ anchor_clip_list[idx] = video_photo_clip(vid=anchor_list[idx],layer=4,scale_x=0.65,scale_y=0.65,
|
|
|
+ location_x=0.35,location_y=0.25,position=main_timer, end=clip_duration,ck=ck_anchor,audio=False)
|
|
|
+ t.AddClip(anchor_clip_list[idx])
|
|
|
+
|
|
|
+ img_list[idx] = openshot.FFmpegReader(dir_photo+name_hash+'/'+p)
|
|
|
+ img_list[idx].Open()
|
|
|
+ photo_clip_list[idx] = video_photo_clip(vid=img_list[idx],layer=3
|
|
|
+ ,scale_x=0.81,scale_y=0.68,location_y=-0.03,position=main_timer,end=clip_duration,audio=False)
|
|
|
+ t.AddClip(photo_clip_list[idx])
|
|
|
+ img_list[idx].Close()
|
|
|
+
|
|
|
+ audio_list[idx] = openshot.FFmpegReader(dir_sound+name_hash+"/"+str(idx)+".mp3")
|
|
|
+ audio_list[idx].Open()
|
|
|
+ audio_clip_list[idx] = openshot.Clip(audio_list[idx])
|
|
|
+ audio_clip_list[idx].Position(main_timer)
|
|
|
+ audio_clip_list[idx].End(clip_duration)
|
|
|
+ t.AddClip(audio_clip_list[idx])
|
|
|
+
|
|
|
+ img_list[idx].Close()
|
|
|
+ anchor_list[idx].Close()
|
|
|
+ audio_list[idx].Close()
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ sub_img_list[idx] = [None] * len(sub_list[idx])
|
|
|
+ sub_clip_list[idx] = [None] * len(sub_list[idx])
|
|
|
+ sub_timer = 0
|
|
|
+ for sub_idx in range(len(sub_list[idx])):
|
|
|
+ sub_img_list[idx][sub_idx] = openshot.QtImageReader(sub_list[idx][sub_idx]['path'])
|
|
|
+ sub_img_list[idx][sub_idx].Open()
|
|
|
+ sub_duration = 0.205*sub_list[idx][sub_idx]['count']
|
|
|
+ sub_clip_list[idx][sub_idx] = video_photo_clip(vid=sub_img_list[idx][sub_idx], layer=6,location_x=0.069, location_y=0.89,position=main_timer+sub_timer,end=sub_duration)
|
|
|
+ t.AddClip(sub_clip_list[idx][sub_idx])
|
|
|
+ sub_img_list[idx][sub_idx].Close()
|
|
|
+ sub_timer += sub_duration
|
|
|
+ print(sub_list[idx][sub_idx]['path'])
|
|
|
+ main_timer += clip_duration
|
|
|
+ idx+=1
|
|
|
+
|
|
|
+ progress+=10
|
|
|
+ ws.send(str(progress))
|
|
|
+
|
|
|
+ LOGO_ED = openshot.FFmpegReader(dir_video+"LOGO_ED.avi")
|
|
|
+ LOGO_ED.Open()
|
|
|
+ LOGO_ED_clip = video_photo_clip(vid=LOGO_ED,layer=4,position=main_timer,end=LOGO_ED.info.duration+2
|
|
|
+ ,location_x=0,location_y=-0.02
|
|
|
+ ,scale_x=0.79,scale_y=0.685)
|
|
|
+ t.AddClip(LOGO_ED_clip)
|
|
|
+ ED_duration = LOGO_ED.info.duration
|
|
|
+ LOGO_ED.Close()
|
|
|
+
|
|
|
+
|
|
|
+ bg = openshot.FFmpegReader(dir_video+"bg.mp4")
|
|
|
+ bg.Open()
|
|
|
+ bg_times = math.floor(main_timer+ED_duration/bg.info.duration)
|
|
|
+ left_time = (main_timer+ED_duration) % bg.info.duration
|
|
|
+ bg_clip_list = [None] * bg_times
|
|
|
+ bg_list = [None] * bg_times
|
|
|
+ bg.Close()
|
|
|
+ bg_timer = head_duration
|
|
|
+ for idx in range(bg_times):
|
|
|
+ bg_list[idx] = openshot.FFmpegReader(dir_video+"bg.mp4")
|
|
|
+ bg_list[idx].Open()
|
|
|
+ bg_clip_list[idx] = video_photo_clip(bg_list[idx],layer=2,position=bg_timer
|
|
|
+ ,end=bg_list[idx].info.duration,ck=ck)
|
|
|
+ t.AddClip(bg_clip_list[idx])
|
|
|
+ bg_timer += bg_list[idx].info.duration
|
|
|
+ bg_list[idx].Close()
|
|
|
+ bg_left = openshot.FFmpegReader(dir_video+"bg.mp4")
|
|
|
+ bg_left.Open()
|
|
|
+ bg_left_clip = video_photo_clip(bg_left,layer=2,position=bg_timer,end=left_time,ck=ck)
|
|
|
+ t.AddClip(bg_left_clip)
|
|
|
+ bg_left.Close()
|
|
|
+
|
|
|
+ title = openshot.QtImageReader(dir_title+name_hash+".png")
|
|
|
+ title.Open() # Open the reader
|
|
|
+ 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)
|
|
|
+
|
|
|
+ ####start building
|
|
|
+ w = openshot.FFmpegWriter("../html/"+name_hash+".mp4")
|
|
|
+ w.SetAudioOptions(True, "aac", 44100, 2, openshot.LAYOUT_STEREO, 3000000)
|
|
|
+ w.SetVideoOptions(True, "libx264", openshot.Fraction(30000, 1000), 1280, 720,
|
|
|
+ openshot.Fraction(1, 1), False, False, 3000000)
|
|
|
+ w.Open()
|
|
|
+ progress = 100
|
|
|
+ ws.send(str(progress))
|
|
|
+ #may change duration into t.info.duration
|
|
|
+ for n in range(int(t.info.fps)*int(head_duration+main_timer+ED_duration)):
|
|
|
+ f=t.GetFrame(n)
|
|
|
+ w.WriteFrame(f)
|
|
|
+
|
|
|
+ #notify_group(name+"的影片已經產生完成囉! www.choozmo.com:8168/"+name_hash+".mp4")
|
|
|
+ t.Close()
|
|
|
+ w.Close()
|
|
|
+
|
|
|
+ print("Video done")
|
|
|
+ print("video at : www.choozmo.com:8168/"+name_hash+".mp4")
|
|
|
+
|
|
|
+ #line notifs
|
|
|
|