diff --git a/.gitignore b/.gitignore index be33f58c..00c30786 100644 --- a/.gitignore +++ b/.gitignore @@ -160,4 +160,7 @@ test.* temp.* objdump* *.min.*.js -TODO \ No newline at end of file +TODO + +experimental_mods +search_results diff --git a/crazy_functional.py b/crazy_functional.py index 92bc2842..0629ab8f 100644 --- a/crazy_functional.py +++ b/crazy_functional.py @@ -50,8 +50,16 @@ def get_crazy_functions(): from crazy_functions.Image_Generate_Wrap import ImageGen_Wrap from crazy_functions.SourceCode_Comment import 注释Python项目 from crazy_functions.SourceCode_Comment_Wrap import SourceCodeComment_Wrap + from crazy_functions.VideoResource_GPT import 多媒体任务 function_plugins = { + "多媒体智能体": { + "Group": "智能体", + "Color": "stop", + "AsButton": True, + "Info": "【仅测试】多媒体任务", + "Function": HotReload(多媒体任务), + }, "虚空终端": { "Group": "对话|编程|学术|智能体", "Color": "stop", diff --git a/crazy_functions/VideoResource_GPT.py b/crazy_functions/VideoResource_GPT.py new file mode 100644 index 00000000..720715f1 --- /dev/null +++ b/crazy_functions/VideoResource_GPT.py @@ -0,0 +1,116 @@ +import requests +import random +import time +import re +import json +from bs4 import BeautifulSoup +from functools import lru_cache +from itertools import zip_longest +from check_proxy import check_proxy +from toolbox import CatchException, update_ui, get_conf, promote_file_to_downloadzone, update_ui_lastest_msg, generate_file_link +from crazy_functions.crazy_utils import request_gpt_model_in_new_thread_with_ui_alive, input_clipping +from request_llms.bridge_all import model_info +from request_llms.bridge_all import predict_no_ui_long_connection +from crazy_functions.prompts.internet import SearchOptimizerPrompt, SearchAcademicOptimizerPrompt +from crazy_functions.json_fns.pydantic_io import GptJsonIO, JsonStringError +from textwrap import dedent +from pydantic import BaseModel, Field + +class Query(BaseModel): + search_keyword: str = Field(description="search query for video resource") + +# {'title': '【麦笛奈Martine】天文馆的猫 | Diffsinger Lynxnet版本中文试听【Cover 泠鸢·折纸信笺】', 'author': '灰条纹的灰猫君', 'author_id': 2083633, 'bvid': 'BV1LSSHYXEtv', '播放量': 75, '弹幕': 0, '评论': 7, '点赞': 5, '发布时间': '2024-10-31 22:10:08', '视频时长': '4:40', 'tag': '虚拟歌姬,鸟蛋,冷鸟,女声翻唱,泠鸢yousa,虚拟主播,虚拟UP主,VTuber,Diffsinger,虚拟歌手分享官,虚拟之声创作计划·2024第三期', 'description': '翻唱:麦笛奈Martine\n调混:灰条纹的灰猫君\nQ版曲绘:西柚Kanno\n原曲:Av847726911\n原唱:泠鸢\n\n滑铲——月更!\n万圣节快乐!今天是和喵星发电报的可爱猫猫~'} + +class VideoResource(BaseModel): + title: str = Field(description="title of the video") + author: str = Field(description="author/uploader of the video") + bvid: str = Field(description="unique ID of the video") + + +def get_video_resource(search_keyword): + from experimental_mods.get_search_kw_api_stop import search_videos + + # Default parameters for video search + csrf_token = '40a227fcf12c380d7d3c81af2cd8c5e8' # Using default from main() + search_type = 'default' + max_pages = 1 + output_path = 'search_results' + config_path = 'experimental_mods/config.json' + + # Search for videos and return the first result + videos = search_videos( + keyword=search_keyword, + csrf_token=csrf_token, + search_type=search_type, + max_pages=max_pages, + output_path=output_path, + config_path=config_path, + early_stop=True + ) + + # Return the first video if results exist, otherwise return None + return videos + +def download_video(bvid, user_name, chatbot, history): + from experimental_mods.get_bilibili_resource import download_bilibili + + # download audio + chatbot.append((None, "下载音频, 请稍等...")); yield from update_ui(chatbot=chatbot, history=history) + downloaded_files = download_bilibili(bvid, only_audio=True, user_name=user_name) + + # preview + preview_list = [promote_file_to_downloadzone(fp) for fp in downloaded_files] + file_links = generate_file_link(preview_list) + yield from update_ui_lastest_msg(f"已完成的文件:
" + file_links, chatbot=chatbot, history=history, delay=0) + + # download video + chatbot.append((None, "下载视频, 请稍等...")); yield from update_ui(chatbot=chatbot, history=history) + downloaded_files_part2 = download_bilibili(bvid, only_audio=False, user_name=user_name) + + # preview + preview_list = [promote_file_to_downloadzone(fp) for fp in downloaded_files_part2] + file_links = generate_file_link(preview_list) + yield from update_ui_lastest_msg(f"已完成的文件:
" + file_links, chatbot=chatbot, history=history, delay=0) + + # return + return downloaded_files + downloaded_files_part2 + +@CatchException +def 多媒体任务(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, user_request): + user_wish: str = txt + + # 搜索 + chatbot.append((txt, "检索中, 请稍等...")) + yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 + # 结构化生成 + rf_req = dedent(f""" + The user wish to get the following resource: + {user_wish} + Generate reseach keywords accordingly. + """) + gpt_json_io = GptJsonIO(Query) + inputs = rf_req + gpt_json_io.format_instructions + run_gpt_fn = lambda inputs, sys_prompt: predict_no_ui_long_connection(inputs=inputs, llm_kwargs=llm_kwargs, history=[], sys_prompt=sys_prompt, observe_window=[]) + analyze_res = run_gpt_fn(inputs, "") + query: Query = gpt_json_io.generate_output_auto_repair(analyze_res, run_gpt_fn) + candadate_dictionary: dict = get_video_resource(query.search_keyword) + candadate_dictionary_as_str = json.dumps(candadate_dictionary, ensure_ascii=False, indent=4) + + + # 筛选 + chatbot.append((None, f"检索关键词已确认: {query.search_keyword}。筛选中, 请稍等...")) + yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 + # 结构化生成 + rf_req_2 = dedent(f""" + Select the most relevant and suitable video resource from the following search results: + {candadate_dictionary_as_str} + """) + gpt_json_io = GptJsonIO(VideoResource) + inputs = rf_req_2 + gpt_json_io.format_instructions + run_gpt_fn = lambda inputs, sys_prompt: predict_no_ui_long_connection(inputs=inputs, llm_kwargs=llm_kwargs, history=[], sys_prompt=sys_prompt, observe_window=[]) + analyze_res = run_gpt_fn(inputs, "") + video_resource: VideoResource = gpt_json_io.generate_output_auto_repair(analyze_res, run_gpt_fn) + + if video_resource and video_resource.bvid: + print(video_resource) + yield from download_video(video_resource.bvid, chatbot.get_user(), chatbot, history) \ No newline at end of file diff --git a/tests/test_bilibili_down.py b/tests/test_bilibili_down.py new file mode 100644 index 00000000..129a26cc --- /dev/null +++ b/tests/test_bilibili_down.py @@ -0,0 +1,15 @@ +""" +对项目中的各个插件进行测试。运行方法:直接运行 python tests/test_plugins.py +""" + +import init_test +import os, sys + +if __name__ == "__main__": + from experimental_mods.get_bilibili_resource import download_bilibili + download_bilibili("BV1LSSHYXEtv", only_audio=True, user_name="test") + +# if __name__ == "__main__": +# from test_utils import plugin_test + +# plugin_test(plugin='crazy_functions.VideoResource_GPT->视频任务', main_input="帮我找到《天文馆的猫》,歌手泠鸢")