Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
<img src="assets/minimax-text.svg" alt="Minimax" width="60" height="60" />
<img src="assets/siliconcloud-color.svg" alt="SiliconFlow" width="15" height="60" />
<img src="assets/siliconcloud-text.svg" alt="SiliconFlow" width="100" height="60" />
<img src="assets/wenxin-color.svg" alt="Baidu ERNIE" width="60" height="60" />
</div>

## 1. Introduction
Expand Down Expand Up @@ -49,6 +50,7 @@
- `Minimax image-01`
- `Kwai Kolors`
- `Tencent Hunyuan`
- `Baidu ERNIE`

项目架构流程如下:

Expand Down Expand Up @@ -215,6 +217,12 @@ MLLM 模型主要用于自动切片后的切片标题生成,此功能默认关

请自行[注册账号](https://console.cloud.tencent.com/cam/capi)并申请 API Key,填写到 `bilive.toml` 文件中对应的 `TENCENT_SECRET_ID` 和 `TENCENT_SECRET_KEY` 中。

##### 3.3.4 Baidu ERNIE 模型

> 如需使用 Baidu ERNIE 模型,请将 `IMAGE_GEN_MODEL` 参数设置为 `baidu`。

请自行[注册账号](https://console.bce.baidu.com/iam/key/list)并申请 API Key,填写到 `bilive.toml` 文件中对应的 `BAIDU_API_KEY` 中。

#### 4. bilitool 登录

> 由于一般日志打印不出二维码效果(docker 的日志不确定是否能打印,等发布新image时再修改,docker 版本请先参考文档 [bilive](https://bilive.timerring.com),本 README 只针对源码部署),所以这步需要提前在机器上安装 [bilitool](https://github.com/timerring/bilitool):
Expand Down
1 change: 1 addition & 0 deletions assets/wenxin-color.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 3 additions & 2 deletions bilive.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,9 @@ qwen_api_key = "" # Apply for your own Qwen API key at https://bailian.console.a

[cover]
generate_cover = false # whether to generate cover
image_gen_model = "minimax" # the image generation model, can be "minimax" or "siliconflow" or "tencent"
image_gen_model = "minimax" # the image generation model, can be "minimax" or "siliconflow" or "tencent" or "baidu"
minimax_api_key = "" # Apply for your own Minimax API key at https://platform.minimaxi.com/user-center/basic-information/interface-key
siliconflow_api_key = "" # Apply for your own SiliconFlow API key at https://cloud.siliconflow.cn/i/3Szr5BVg
tencent_secret_id = "" # Apply for your own Tencent Cloud API key at https://console.cloud.tencent.com/cam/capi
tencent_secret_key = "" # Apply for your own Tencent Cloud secret key as above
tencent_secret_key = "" # Apply for your own Tencent Cloud secret key as above
baidu_api_key = "" # Apply for your own Baidu API key at https://console.bce.baidu.com/iam/key/list
3 changes: 2 additions & 1 deletion src/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,4 +77,5 @@ def get_interface_config():
MINIMAX_API_KEY = config.get('cover', {}).get('minimax_api_key')
SILICONFLOW_API_KEY = config.get('cover', {}).get('siliconflow_api_key')
TENCENT_SECRET_ID = config.get('cover', {}).get('tencent_secret_id')
TENCENT_SECRET_KEY = config.get('cover', {}).get('tencent_secret_key')
TENCENT_SECRET_KEY = config.get('cover', {}).get('tencent_secret_key')
BAIDU_API_KEY = config.get('cover', {}).get('baidu_api_key')
4 changes: 4 additions & 0 deletions src/cover/cover_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ def wrapper(video_path):
from .image_model_sdk.tencent_sdk import hunyuan_generate_cover

return hunyuan_generate_cover(cover_path)
elif model_type == "baidu":
from .image_model_sdk.baidu_sdk import baidu_generate_cover

return baidu_generate_cover(cover_path)
else:
upload_log.error(f"Unsupported model type: {model_type}")
return None
Expand Down
91 changes: 91 additions & 0 deletions src/cover/image_model_sdk/baidu_sdk.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import requests
import json
import os
import base64
from PIL import Image
from io import BytesIO
import time
from src.upload.bilitool.bilitool.model.model import Model
from src.config import BAIDU_API_KEY

def cover_up(img: str):
"""Upload the cover image
Parameters
----------
- img: img path or stream
Returns
-------
- url: str
the url of the cover image in bili server
"""
from PIL import Image
from io import BytesIO
request = requests.Session()
request.headers = {
'user-agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/63.0.3239.108",
'referer': "https://www.bilibili.com/",
'connection': 'keep-alive'
}
model = Model().get_config()
request.cookies.set('SESSDATA', model['cookies']['SESSDATA'])
with Image.open(img) as im:
# you should keep the image ratio 16:10
xsize, ysize = im.size
if xsize / ysize > 1.6:
delta = xsize - ysize * 1.6
region = im.crop((delta / 2, 0, xsize - delta / 2, ysize))
else:
delta = ysize - xsize * 10 / 16
region = im.crop((0, delta / 2, xsize, ysize - delta / 2))
buffered = BytesIO()
region.save(buffered, format=im.format)
r = request.post(
url="https://member.bilibili.com/x/vu/web/cover/up",
data={
"cover": b"data:image/jpeg;base64,"
+ (base64.b64encode(buffered.getvalue())),
"csrf": model['cookies']['bili_jct']
},
timeout=30,
)
buffered.close()
res = r.json()
if res.get("data") is None:
raise Exception(res)
print(res["data"]["url"], flush=True)
return res["data"]["url"]

def baidu_generate_cover(your_file_path):
try:
cover_url = cover_up(your_file_path)

url = "https://qianfan.baidubce.com/v2/images/generations"
payload = json.dumps({
"model": "irag-1.0",
"prompt": "这是视频截图,请根据该图生成对应的动漫类型的封面",
"refer_image": cover_url
})
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {BAIDU_API_KEY}'
}

response = requests.request("POST", url, headers=headers, data=payload)
if response.status_code == 200:
image_url=response.json()['data'][0]['url']
img_data = requests.get(image_url).content
cover_name = time.strftime("%Y%m%d%H%M%S") + ".png"
temp_cover_path = os.path.join(os.path.dirname(your_file_path), cover_name)
with open(temp_cover_path, "wb") as handler:
handler.write(img_data)
os.remove(your_file_path)
return temp_cover_path
else:
print(response.text, flush=True)
return None
except Exception as e:
print(e, flush=True)
return None

if __name__ == '__main__':
print(baidu_generate_cover(""))