ソースを参照

gslide update

ming 3 年 前
コミット
0c09b7bfb1
6 ファイル変更112 行追加11 行削除
  1. 27 1
      api/gSlide.py
  2. 25 4
      api/main.py
  3. 1 0
      api/models.py
  4. 37 3
      api/static/script_util.js
  5. 2 2
      api/templates/make_video_slide.html
  6. 20 1
      api/util/user.py

+ 27 - 1
api/gSlide.py

@@ -78,4 +78,30 @@ def parse_slide_url(slide_url,eng):
         slide_content['sub_titles'] = sub_title_list
 
     return slide_content['name'],slide_content['text_content'],slide_content['image_urls']
-        
+
+def parse_slide_url(fileanme,img_upload_folder,img_url,eng):
+    
+    notes_list=[]
+    sub_title_list=[]
+    img_list=[]
+    
+    prs = Presentation(fileanme)
+    for slide in prs.slides:
+        notes_slide = slide.notes_slide
+        text_frame = notes_slide.notes_text_frame
+        print(text_frame.text)
+        shapes = slide.shapes
+        notes_list.append(text_frame.text)
+        for s in shapes:
+            img_name = str(time.time()).replace('.','')
+            image = s.image
+            image_bytes = image.blob
+            # ---make up a name for the file, e.g. 'image.jpg'---
+            image = Image.open(image_bytes)
+            image= image.convert("RGB")
+            image.save(img_upload_folder+img_name+'.jpg')
+            img_list.append(img_url+img_name+'.jpg')
+            #image_filename = ''
+            #with open(image_filename, 'wb') as f:
+            #    f.write(image_bytes)
+    return filename, notes_list, img_list

+ 25 - 4
api/main.py

@@ -70,13 +70,17 @@ oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
 
 tmp_video_dir = '../OpenshotService/tmp_video/'
 tmp_avatar_dir = '../../face_swap/tmp_avatar/'  #change source face path here
-
+resource_server = 'www.choozmo.com:8168/'
+resource_folder = '/var/www/html/'
 video_sub_folder = 'ai_anchor_video/'
 avatar_sub_folder = 'swap_save/'
 tmp_img_sub_folder = 'tmp_img/'
+pttx_sub_folder = 'tmp_pttx/'
 img_upload_folder = '/var/www/html/'+tmp_img_sub_folder
 video_dest = '/var/www/html/'+video_sub_folder
 avatar_dest = '/var/www/html/'+avatar_sub_folder
+pttx_dest = '/var/www/html/'+pttx_sub_folder
+
 
 
 # @app.get("/index2")
@@ -247,22 +251,39 @@ async def create_upload_file(file: UploadFile = File(...)):
             async with aiofiles.open(img_upload_folder+img_name+'.mp4', 'wb') as out_file:
                 content = await file.read()
                 await out_file.write(content) 
-            return {"msg": 'www.choozmo.com:8168/'+tmp_img_sub_folder+img_name+'.mp4'}
+            return {"msg": resource_server+tmp_img_sub_folder+img_name+'.mp4'}
         else:
             contents = await file.read()
             image = Image.open(io.BytesIO(contents))
             image= image.convert("RGB")
             image.save(img_upload_folder+img_name+'.jpg')
-            return {"msg": 'www.choozmo.com:8168/'+tmp_img_sub_folder+img_name+'.jpg'}
+            return {"msg": resource_server+tmp_img_sub_folder+img_name+'.jpg'}
     except Exception as e:
         logging.error(traceback.format_exc())
         return {'msg':'檔案無法使用'}
 
+@app.post("/upload_pttx/")
+async def upload_pttx(file: UploadFile = File(...)):
+    try:
+        if "_" in file.filename:
+            return {'msg':'檔案無法使用檔名不能含有"_"符號'}
+        else:
+            pttx_name = file.filename+'_'+str(time.time()).replace('.','')
+            with open(pttx_dest+pttx_name, "wb+") as file_object:
+                file_object.write(file.file.read())
+            return {"msg": resource_server+pttx_sub_folder+pttx_name}
+    except Exception as e:
+        logging.error(traceback.format_exc())
+        return {'msg':'檔案無法使用'}
 
 
 @app.post("/make_anchor_video_gSlide")
 async def make_anchor_video_gSlide(req:models.gSlide_req,token: str = Depends(oauth2_scheme)):
-    name, text_content, image_urls = gSlide.parse_slide_url(req.slide_url,eng=False)
+    if req.url_type == 0:
+        name, text_content, image_urls = gSlide.parse_slide_url(req.slide_url,eng=False)
+    else :
+        filename = req.slide_url.replace(resource_server+pttx_sub_folder,resource_folder+pttx_sub_folder)
+        name, text_content, image_urls = gSlide.parse_pttx_url(filename,img_upload_folder,resource_server+tmp_img_sub_folder,eng=False)
     if len(image_urls) != len(text_content):
         return {'msg':'副標題數量、圖片(影片)數量以及台詞數量必須一致'}
     for idx in range(len(image_urls)):

+ 1 - 0
api/models.py

@@ -30,6 +30,7 @@ class gSlide_req(BaseModel):
     avatar: str
     client_id :str
     multiLang :int
+    url_type: int
 
 class request_eng(BaseModel):
     name: str

+ 37 - 3
api/static/script_util.js

@@ -44,7 +44,41 @@ function openavatarModel() {
   avatarModal.show();
 }
 
-$('input[type=file]').on('change', prepareUpload);
+$('.pttx_uploader').on('change', prepareUploadPTTX);
+function prepareUploadPTTX(event) {
+  files = event.target.files;
+  var data = new FormData();
+  //data.append('file', $('.img_up1').prop('files')[0]);
+  data.append('file', files[0]);
+  // append other variables to data if you want: data.append('field_name_x', field_value_x);
+  $(this).next().text('');
+  $(this).next().html('<img src="static/img/Spinner-1s-181px.gif">');
+  $.ajax({
+    type: 'POST',
+    processData: false, // important
+    contentType: false, // important
+    data: data,
+    url: '/upload_pttx',
+    dataType: 'json',
+    success: function (jsonData) {
+      event.target.previousSibling.value = jsonData.msg;
+      $(this).prev().val(jsonData.msg);
+      event.target.nextSibling.innerHTML = '';
+      event.target.nextSibling.textContent = '上傳檔案';
+      //console.log($(this).next());
+      //$(this).next().html('上傳檔案');
+      //$(this).next().text('上傳檔案');
+      $('#url_type').val('1');
+    },
+    error: function (error) {
+      event.target.nextSibling.innerHTML = '';
+      event.target.nextSibling.textContent = '上傳檔案';
+      alert('圖片錯誤');
+    }
+  });
+}
+$('.img_uploader').on('change', prepareUpload);
+
 function prepareUpload(event) {
   files = event.target.files;
   var data = new FormData();
@@ -210,7 +244,7 @@ $("#send_slide").click(function () {
   var step;
   multiLang = 0
   if ($('#multiLang').prop("checked")) {multiLang = 1;}
-  dataOBJ = {'slide_url':$('#slide_raw_url').val(),"avatar": avatar,"multiLang":multiLang, "client_id": client_id }
+  dataOBJ = {'slide_url':$('#slide_raw_url').val(),"avatar": avatar,"multiLang":multiLang, "client_id": client_id,"url_type":$('#url_type').val() }
   objstr = JSON.stringify(dataOBJ);
   jwt_token =  get_jwt_token()
   var xhr = new XMLHttpRequest();
@@ -443,7 +477,7 @@ function renderimgBlock(i) {
   imguploadlabel.classList.add('upload-btn');
   imguploadlabel.textContent = '上傳檔案';
   imgInputs.appendChild(imguploadlabel);
-  $('input[type=file]').on('change', prepareUpload);
+  $('.img_uploader').on('change', prepareUpload);
 }
 
 

+ 2 - 2
api/templates/make_video_slide.html

@@ -29,8 +29,8 @@
         <!-- fieldsets -->
         <fieldset>
           <h3 class="fs-subtitle">SLIDE 連結<img class="ms-1" src="static/img/question.png" alt="" data-bs-toggle="tooltip" data-bs-placement="right" title="將作為影片的內嵌標題"></h3>
-          <input id=slide_raw_url type="text" name='t1' class='title_new' value="" placeholder="連結" />
-          <label class="uploadpttx-btn">上傳檔案</label>
+          <input id=slide_raw_url type="text" name='t1' class='title_new' value="" placeholder="連結" /><input id="img3" type="file" class="pttx_uploader">
+          <input id ='url_type' type='hidden' value='0'>
           <label for="myCheck">加入英文:</label> 
           <input type="checkbox" id="multiLang" > <br/>
         </fieldset>

+ 20 - 1
api/util/user.py

@@ -56,4 +56,23 @@ class user_util():
             return False
         return user
 
-    def 
+    def get_roles(self, username):
+        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 username=username'
+        role_list = []
+        for row in db.query(statement):
+            role_list.append({'id':row['role_id'],'name':row['name']})
+        return role_list
+        
+    def add_role(self, username,role_id):
+        db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
+        user_role_table = db['user_role']
+        user_role_table.insert({'user_id':,'role_id':role_id})
+
+    def get_user_id(self, username):
+        db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/AI_anchor?charset=utf8mb4')
+        return str(first(db.query('SELECT COUNT(*) FROM history_input WHERE user_id ='+str(user_obj['id'])))['COUNT(*)'])
+