rebuild file struct

This commit is contained in:
YuanHui
2025-03-22 13:42:23 +08:00
parent 3d363ff1fd
commit d9300313e7
21 changed files with 83276 additions and 3882 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -2,10 +2,19 @@
limit=100 limit=100
offset=0 offset=0
sort= sort=
download_id = 663
max_download_threads = 5 max_download_threads = 5
max_retry_attempts = 3 max_retry_attempts = 3
authorization_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiIxMDAwMDgzNDciLCJleHAiOjE3NDI2MDc3NDAsImp0aSI6IjEwMjM4YTJmLTBiN2QtNDIwNi1iNDU2LTQ1MTRiMjFjZGM4MyIsImlhdCI6MTc0MDAxNTc0MCwiaXNzIjoiYXBwdXNlciIsInVpZCI6ImJlMmViOGIyLTFhOTItNGVmMC05ZDAwLTA1YTlkN2E2OWRiMiIsInNjaGVtZSI6Imp3dGhzIiwic2lkIjoiZDliZjIzNjQtNjVhYi00ZWNkLThhZjctY2MzMDcxODU0M2M5In0.05GqlG4rhwwlbuQUfEHlHTB-vAz2lOh5JCVlQ6j4V8s authorization_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiIxMDAwMDgzNDciLCJleHAiOjE3NDUyMDYwNTYsImp0aSI6IjNmY2NiMWEwLTgyZTMtNDc4YS1hNTZmLWRmN2FmODUyNDgxMyIsImlhdCI6MTc0MjYxNDA1NiwiaXNzIjoiYXBwdXNlciIsInVpZCI6ImJlMmViOGIyLTFhOTItNGVmMC05ZDAwLTA1YTlkN2E2OWRiMiIsInNjaGVtZSI6Imp3dGhzIiwic2lkIjoiYzU1MWQ5OWMtZmI2Yy00YTI4LThmODgtNzRhOTIyMjA5ZmU3In0.15_pyKR8i0PRpcJ8CQWJJ26RK0Biz9uSmznBQK3cJzM
voice2txt_url=https://api.siliconflow.cn/v1/audio/transcriptions voice2txt_url=https://api.siliconflow.cn/v1/audio/transcriptions
voice_token=sk-vksrlpckcpttnpjgftpgwytmiipjmvhyzmnffhbhjpahbfiq voice_token=sk-vksrlpckcpttnpjgftpgwytmiipjmvhyzmnffhbhjpahbfiq
[POSTGRES]
dbname = songyi
user = root
password = lostecho
host = 192.168.31.3
port = 5433

View File

@@ -10,18 +10,13 @@ from threading import Thread
import requests import requests
from fileconvert import mp4_to_mp3, mp4_to_wav
from headers import headers from headers import headers
import logging
from video_voice_process import process_audio_file
from logging.handlers import RotatingFileHandler
# 配置日志 from logging_config import setup_logging
logging.basicConfig(level=logging.INFO, from video_voice_process import process_audio_file
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[ logger = setup_logging()
logging.StreamHandler(), # 控制台日志
RotatingFileHandler('app.log', maxBytes=1024*1024*5, backupCount=3) # 日志文件
])
# 读取配置文件 # 读取配置文件
config = configparser.ConfigParser() config = configparser.ConfigParser()
@@ -29,6 +24,7 @@ config.read('config.ini')
authorization_token = config['DEFAULT']['authorization_token'] authorization_token = config['DEFAULT']['authorization_token']
max_download_threads = int(config['DEFAULT']['max_download_threads']) max_download_threads = int(config['DEFAULT']['max_download_threads'])
max_retry_attempts = int(config['DEFAULT']['max_retry_attempts']) max_retry_attempts = int(config['DEFAULT']['max_retry_attempts'])
download_id = int(config['DEFAULT']['download_id'])
headers = headers headers = headers
headers['authorization'] = f'Bearer {authorization_token}' headers['authorization'] = f'Bearer {authorization_token}'
@@ -36,7 +32,7 @@ headers['authorization'] = f'Bearer {authorization_token}'
def download_attachment(attachment, course_id_folder, course_audio_filename, max_retries): def download_attachment(attachment, course_id_folder, course_audio_filename, max_retries):
if attachment['name'] in ["", None] or attachment['name'].endswith(".m3u8"): if attachment['name'] in ["", None] or attachment['name'].endswith(".m3u8"):
logging.info("字符串为空") logger.info("字符串为空")
last_slash_index = attachment['url'].rfind('/') last_slash_index = attachment['url'].rfind('/')
download_filename = attachment['url'][last_slash_index + 1:] download_filename = attachment['url'][last_slash_index + 1:]
else: else:
@@ -52,27 +48,27 @@ def download_attachment(attachment, course_id_folder, course_audio_filename, max
course_id_folder = os.path.join(course_id_folder, file_extension) course_id_folder = os.path.join(course_id_folder, file_extension)
else: else:
if os.path.exists(course_audio_filename): if os.path.exists(course_audio_filename):
logging.info(f"File {course_audio_filename} already exists, skipping download.") logger.info(f"File {course_audio_filename} already exists, skipping download.")
return return
filename = os.path.join(course_id_folder, download_filename) filename = os.path.join(course_id_folder, download_filename)
if os.path.exists(filename): if os.path.exists(filename):
logging.info(f"File {filename} already exists, skipping download.") logger.info(f"File {filename} already exists, skipping download.")
return return
command = f"aria2c -o {filename} -x 16 -s 16 {url}" command = f'aria2c -o "{filename}" -x 16 -s 16 {url}'
subprocess.run(command, shell=True, check=True) subprocess.run(command, shell=True, check=True)
logging.info(f"Download Command: {command}") logger.info(f"Download Command: {command}")
return return
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
logging.error(f"Failed to download {attachment['name']}: {e}") logger.error(f"Failed to download {attachment['name']}: {e}")
attempt += 1 attempt += 1
if attempt == max_retries: if attempt == max_retries:
logging.error(f"Failed to download {attachment['name']} after {max_retries} attempts.") logger.error(f"Failed to download {attachment['name']} after {max_retries} attempts.")
else: else:
logging.warning(f"Retrying {attachment['name']}... ({attempt}/{max_retries})") logger.warning(f"Retrying {attachment['name']}... ({attempt}/{max_retries})")
def worker(queue, course_id_folder, course_audio_filename, max_retries): def worker(queue, course_id_folder, course_audio_filename, max_retries):
@@ -82,45 +78,18 @@ def worker(queue, course_id_folder, course_audio_filename, max_retries):
queue.task_done() queue.task_done()
def convert_mp4(mp4_file): def fetch_course():
try:
mp4_dir = os.path.dirname(mp4_file)
mp4_filename = os.path.splitext(os.path.basename(mp4_file))[0]
wav_file = os.path.join(mp4_dir, f"{mp4_filename}.wav")
command = [
'ffmpeg',
'-y',
'-i', mp4_file,
'-vn', # 去除视频流
'-acodec', 'pcm_s16le', # 使用 PCM 16 位有符号小端编码
'-ar', '44100', # 设置采样率为 44100 Hz
'-ac', '2', # 设置声道数为 2立体声
wav_file
]
subprocess.run(command, check=True)
logging.info(f"成功将 {mp4_file} 转换为 {wav_file}")
return wav_file
except subprocess.CalledProcessError as e:
logging.error(f"转换失败: {e}")
return None
except FileNotFoundError:
logging.error("未找到 FFmpeg请确保已安装并配置好 FFmpeg 环境。")
return None
def get_course():
conn = sqlite3.connect('courses.db') conn = sqlite3.connect('courses.db')
cursor = conn.cursor() cursor = conn.cursor()
max_course_id = cursor.execute('SELECT id FROM courses ORDER BY id DESC LIMIT 1') max_course_id = cursor.execute('SELECT id FROM courses ORDER BY id DESC LIMIT 1')
if max_course_id: if max_course_id:
max_course_id = max_course_id.fetchone()[0] max_course_id = max_course_id.fetchone()[0]
logging.info(f"The maximum course ID is {max_course_id}") logger.info(f"The maximum course ID is {max_course_id}")
else: else:
logging.info("No courses found in the database.") logger.info("No courses found in the database.")
max_course_id = 11 max_course_id = 11
start_course_id = max_course_id - 5
start_course_id = download_id if max_course_id - 5 < download_id else max_course_id - 5
cursor.execute('SELECT id, title FROM courses where id >= ?', (start_course_id,)) cursor.execute('SELECT id, title FROM courses where id >= ?', (start_course_id,))
course_ids_data = cursor.fetchall() course_ids_data = cursor.fetchall()
@@ -134,11 +103,11 @@ def get_course():
os.makedirs('course') os.makedirs('course')
for course_id in course_ids: for course_id in course_ids:
logging.info(f"Processing course ID: {course_id}") logger.info(f"Processing course ID: {course_id}")
json_filename = os.path.join('json', f'{course_id}.json') json_filename = os.path.join('json', f'{course_id}.json')
if os.path.exists(json_filename): if os.path.exists(json_filename):
logging.info(f"Course {course_id} JSON file already exists, using local file.") logger.info(f"Course {course_id} JSON file already exists, using local file.")
with open(json_filename, 'r', encoding='utf-8') as json_file: with open(json_filename, 'r', encoding='utf-8') as json_file:
contents_data = json.load(json_file) contents_data = json.load(json_file)
else: else:
@@ -155,11 +124,16 @@ def get_course():
''', (item['id'], course_id, item['content'], item['category'], item['order'], ''', (item['id'], course_id, item['content'], item['category'], item['order'],
item['attachment']['url'] if item['attachment'] else None, item['attachment']['url'] if item['attachment'] else None,
item['attachment']['mime_type'] if item['attachment'] else None)) item['attachment']['mime_type'] if item['attachment'] else None))
return course_ids, course_ids_dict
conn.commit()
cursor.close()
conn.close() def download_course_contents(course_ids, course_ids_dict):
if not os.path.exists('json'):
os.makedirs('json')
if not os.path.exists('course'):
os.makedirs('course')
for course_id in course_ids: for course_id in course_ids:
course_id_folder = os.path.join('course', str(course_id)) course_id_folder = os.path.join('course', str(course_id))
@@ -201,7 +175,7 @@ def get_course():
for audio_file in audio_files: for audio_file in audio_files:
f.write(f"file '{audio_file['attachment']['name']}'\n") f.write(f"file '{audio_file['attachment']['name']}'\n")
ffmpeg_command = f"ffmpeg -f concat -safe 0 -i {text_file} -c copy {combined_audio_filename}" ffmpeg_command = f'ffmpeg -f concat -safe 0 -i {text_file} -c copy "{combined_audio_filename}"'
subprocess.run(ffmpeg_command, shell=True) subprocess.run(ffmpeg_command, shell=True)
shutil.move(combined_audio_filename, course_audio_filename) shutil.move(combined_audio_filename, course_audio_filename)
os.remove(text_file) os.remove(text_file)
@@ -211,7 +185,7 @@ def get_course():
try: try:
os.remove(audio_file_path) os.remove(audio_file_path)
except: except:
logging.error('delete file fail') logger.error('delete file fail')
for item in contents_data['data']: for item in contents_data['data']:
attachment = item['attachment'] attachment = item['attachment']
@@ -250,8 +224,9 @@ def get_course():
# 构建完整的 MP4 文件路径 # 构建完整的 MP4 文件路径
mp4_file = os.path.join(root, file) mp4_file = os.path.join(root, file)
if (not exist_md_file) and mp4_file is not None: if (not exist_md_file) and mp4_file is not None:
mp4_to_mp3(mp4_file)
# 调用 mp4_to_wav 函数进行转换 # 调用 mp4_to_wav 函数进行转换
wav_file = convert_mp4(mp4_file) wav_file = mp4_to_wav(mp4_file)
if wav_file is not None: if wav_file is not None:
try: try:
process_audio_file(wav_file) process_audio_file(wav_file)
@@ -259,5 +234,10 @@ def get_course():
print('process_audio_file fail') print('process_audio_file fail')
def get_course():
course_ids, course_ids_dict = fetch_course()
download_course_contents(course_ids, course_ids_dict)
if __name__ == '__main__': if __name__ == '__main__':
get_course() get_course()

View File

@@ -1,32 +0,0 @@
{
"ts": 1739422350205,
"data": [
{
"id": 12546,
"course_id": 649,
"content": "8、趋势之外的都微不足道.mp4",
"category": "video",
"attachment_id": "b58bdd98-6367-4a57-bb5e-c2f333bdf934",
"order": 1,
"duration": 538660,
"created_at": "2025-02-13T03:30:45.795Z",
"updated_at": "2025-02-13T03:30:57.706Z",
"attachment": {
"id": 82446,
"attachment_id": "b58bdd98-6367-4a57-bb5e-c2f333bdf934",
"name": "8、趋势之外的都微不足道.mp4",
"thumb": "",
"raw": "b58bdd98-6367-4a57-bb5e-c2f333bdf934.mp4",
"size": 74645261,
"duration": 538660,
"mime_type": "video/mp4",
"location": "aliyun_oss",
"created_at": "2025-02-13T03:30:42.106Z",
"updated_at": "2025-02-13T03:30:57.701Z",
"url": "https://bandu-resources.songy.info/7000104757/b58bdd98-6367-4a57-bb5e-c2f333bdf934.mp4",
"raw_url": "https://bandu-resources.songy.info/7000104757/b58bdd98-6367-4a57-bb5e-c2f333bdf934.mp4",
"thumb_url": "https://bandu-resources.songy.info/7000104757/b58bdd98-6367-4a57-bb5e-c2f333bdf934.mp4"
}
}
]
}

View File

@@ -1,5 +0,0 @@
注意力>时间>金钱
1. DeepSeek
2. 哪吒
任何 “生成式人工智能” 都是 ”可疑“ 的,要做事实核查才行,不能拿着它生成的东西直接使用……
工具越厉害,就越应该去锻炼自己的能力…… 因为工具是能力的放大器。

View File

@@ -1,593 +0,0 @@
{
"ts": 1739671616994,
"data": [
{
"id": 12547,
"course_id": 650,
"content": "5484dd34-7207-4b4a-9fc7-0c647d1e8d1e.mp3",
"category": "audio",
"attachment_id": "5484dd34-7207-4b4a-9fc7-0c647d1e8d1e",
"order": 1,
"duration": 15340,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:27.082Z",
"attachment": {
"id": 82590,
"attachment_id": "5484dd34-7207-4b4a-9fc7-0c647d1e8d1e",
"name": "5484dd34-7207-4b4a-9fc7-0c647d1e8d1e.mp3",
"thumb": "",
"raw": "5484dd34-7207-4b4a-9fc7-0c647d1e8d1e.mp3",
"size": 122733,
"duration": 15340,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.04Z",
"updated_at": "2025-02-14T10:05:27.077Z",
"url": "https://bandu-resources.songy.info/7000104757/5484dd34-7207-4b4a-9fc7-0c647d1e8d1e.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/5484dd34-7207-4b4a-9fc7-0c647d1e8d1e.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/5484dd34-7207-4b4a-9fc7-0c647d1e8d1e.mp3"
}
},
{
"id": 12548,
"course_id": 650,
"content": "注意力>时间>金钱",
"category": "text",
"attachment_id": "",
"order": 2,
"duration": 1000000000,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:04:41.086Z",
"attachment": null
},
{
"id": 12549,
"course_id": 650,
"content": "78a99ba0-c8be-480f-a464-033b47ede9c6.mp3",
"category": "audio",
"attachment_id": "78a99ba0-c8be-480f-a464-033b47ede9c6",
"order": 3,
"duration": 41210,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:27.349Z",
"attachment": {
"id": 82591,
"attachment_id": "78a99ba0-c8be-480f-a464-033b47ede9c6",
"name": "78a99ba0-c8be-480f-a464-033b47ede9c6.mp3",
"thumb": "",
"raw": "78a99ba0-c8be-480f-a464-033b47ede9c6.mp3",
"size": 329709,
"duration": 41210,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.042Z",
"updated_at": "2025-02-14T10:05:27.343Z",
"url": "https://bandu-resources.songy.info/7000104757/78a99ba0-c8be-480f-a464-033b47ede9c6.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/78a99ba0-c8be-480f-a464-033b47ede9c6.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/78a99ba0-c8be-480f-a464-033b47ede9c6.mp3"
}
},
{
"id": 12550,
"course_id": 650,
"content": "1. DeepSeek\n2. 哪吒",
"category": "text",
"attachment_id": "",
"order": 4,
"duration": 1000000000,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:04:41.086Z",
"attachment": null
},
{
"id": 12551,
"course_id": 650,
"content": "a9084e77-e3d2-47f9-9218-b6c12b843e09.mp3",
"category": "audio",
"attachment_id": "a9084e77-e3d2-47f9-9218-b6c12b843e09",
"order": 5,
"duration": 32830,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:27.596Z",
"attachment": {
"id": 82592,
"attachment_id": "a9084e77-e3d2-47f9-9218-b6c12b843e09",
"name": "a9084e77-e3d2-47f9-9218-b6c12b843e09.mp3",
"thumb": "",
"raw": "a9084e77-e3d2-47f9-9218-b6c12b843e09.mp3",
"size": 262701,
"duration": 32830,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.044Z",
"updated_at": "2025-02-14T10:05:27.59Z",
"url": "https://bandu-resources.songy.info/7000104757/a9084e77-e3d2-47f9-9218-b6c12b843e09.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/a9084e77-e3d2-47f9-9218-b6c12b843e09.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/a9084e77-e3d2-47f9-9218-b6c12b843e09.mp3"
}
},
{
"id": 12552,
"course_id": 650,
"content": "e3c597f4-f5d0-4294-89ea-9c8dd2aad319.mp3",
"category": "audio",
"attachment_id": "e3c597f4-f5d0-4294-89ea-9c8dd2aad319",
"order": 6,
"duration": 29470,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:27.849Z",
"attachment": {
"id": 82593,
"attachment_id": "e3c597f4-f5d0-4294-89ea-9c8dd2aad319",
"name": "e3c597f4-f5d0-4294-89ea-9c8dd2aad319.mp3",
"thumb": "",
"raw": "e3c597f4-f5d0-4294-89ea-9c8dd2aad319.mp3",
"size": 235821,
"duration": 29470,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.047Z",
"updated_at": "2025-02-14T10:05:27.844Z",
"url": "https://bandu-resources.songy.info/7000104757/e3c597f4-f5d0-4294-89ea-9c8dd2aad319.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/e3c597f4-f5d0-4294-89ea-9c8dd2aad319.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/e3c597f4-f5d0-4294-89ea-9c8dd2aad319.mp3"
}
},
{
"id": 12553,
"course_id": 650,
"content": "46ba8846-fd7e-42ca-883a-78f0564769f0.mp3",
"category": "audio",
"attachment_id": "46ba8846-fd7e-42ca-883a-78f0564769f0",
"order": 7,
"duration": 47350,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:28.058Z",
"attachment": {
"id": 82594,
"attachment_id": "46ba8846-fd7e-42ca-883a-78f0564769f0",
"name": "46ba8846-fd7e-42ca-883a-78f0564769f0.mp3",
"thumb": "",
"raw": "46ba8846-fd7e-42ca-883a-78f0564769f0.mp3",
"size": 378861,
"duration": 47350,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.049Z",
"updated_at": "2025-02-14T10:05:28.052Z",
"url": "https://bandu-resources.songy.info/7000104757/46ba8846-fd7e-42ca-883a-78f0564769f0.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/46ba8846-fd7e-42ca-883a-78f0564769f0.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/46ba8846-fd7e-42ca-883a-78f0564769f0.mp3"
}
},
{
"id": 12554,
"course_id": 650,
"content": "fceea5b5-6b8a-4f93-8c08-42417dc3bec1.mp3",
"category": "audio",
"attachment_id": "fceea5b5-6b8a-4f93-8c08-42417dc3bec1",
"order": 8,
"duration": 29110,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:28.271Z",
"attachment": {
"id": 82595,
"attachment_id": "fceea5b5-6b8a-4f93-8c08-42417dc3bec1",
"name": "fceea5b5-6b8a-4f93-8c08-42417dc3bec1.mp3",
"thumb": "",
"raw": "fceea5b5-6b8a-4f93-8c08-42417dc3bec1.mp3",
"size": 232941,
"duration": 29110,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.051Z",
"updated_at": "2025-02-14T10:05:28.266Z",
"url": "https://bandu-resources.songy.info/7000104757/fceea5b5-6b8a-4f93-8c08-42417dc3bec1.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/fceea5b5-6b8a-4f93-8c08-42417dc3bec1.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/fceea5b5-6b8a-4f93-8c08-42417dc3bec1.mp3"
}
},
{
"id": 12555,
"course_id": 650,
"content": "6b66be61-465f-427a-a3d3-d63018ee414b.mp3",
"category": "audio",
"attachment_id": "6b66be61-465f-427a-a3d3-d63018ee414b",
"order": 9,
"duration": 36600,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:28.5Z",
"attachment": {
"id": 82596,
"attachment_id": "6b66be61-465f-427a-a3d3-d63018ee414b",
"name": "6b66be61-465f-427a-a3d3-d63018ee414b.mp3",
"thumb": "",
"raw": "6b66be61-465f-427a-a3d3-d63018ee414b.mp3",
"size": 292845,
"duration": 36600,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.054Z",
"updated_at": "2025-02-14T10:05:28.495Z",
"url": "https://bandu-resources.songy.info/7000104757/6b66be61-465f-427a-a3d3-d63018ee414b.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/6b66be61-465f-427a-a3d3-d63018ee414b.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/6b66be61-465f-427a-a3d3-d63018ee414b.mp3"
}
},
{
"id": 12556,
"course_id": 650,
"content": "89c8e9c3-b624-4cc9-92bc-66c69472fe30.mp3",
"category": "audio",
"attachment_id": "89c8e9c3-b624-4cc9-92bc-66c69472fe30",
"order": 10,
"duration": 47520,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:28.719Z",
"attachment": {
"id": 82597,
"attachment_id": "89c8e9c3-b624-4cc9-92bc-66c69472fe30",
"name": "89c8e9c3-b624-4cc9-92bc-66c69472fe30.mp3",
"thumb": "",
"raw": "89c8e9c3-b624-4cc9-92bc-66c69472fe30.mp3",
"size": 380205,
"duration": 47520,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.056Z",
"updated_at": "2025-02-14T10:05:28.713Z",
"url": "https://bandu-resources.songy.info/7000104757/89c8e9c3-b624-4cc9-92bc-66c69472fe30.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/89c8e9c3-b624-4cc9-92bc-66c69472fe30.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/89c8e9c3-b624-4cc9-92bc-66c69472fe30.mp3"
}
},
{
"id": 12557,
"course_id": 650,
"content": "任何 “生成式人工智能” 都是 ”可疑“ 的,要做事实核查才行,不能拿着它生成的东西直接使用……",
"category": "text",
"attachment_id": "",
"order": 11,
"duration": 1000000000,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:04:41.086Z",
"attachment": null
},
{
"id": 12558,
"course_id": 650,
"content": "0a83e1a2-19f9-4644-99b6-210e5cd15a2d.mp3",
"category": "audio",
"attachment_id": "0a83e1a2-19f9-4644-99b6-210e5cd15a2d",
"order": 12,
"duration": 34800,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:29.012Z",
"attachment": {
"id": 82598,
"attachment_id": "0a83e1a2-19f9-4644-99b6-210e5cd15a2d",
"name": "0a83e1a2-19f9-4644-99b6-210e5cd15a2d.mp3",
"thumb": "",
"raw": "0a83e1a2-19f9-4644-99b6-210e5cd15a2d.mp3",
"size": 278445,
"duration": 34800,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.058Z",
"updated_at": "2025-02-14T10:05:29.006Z",
"url": "https://bandu-resources.songy.info/7000104757/0a83e1a2-19f9-4644-99b6-210e5cd15a2d.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/0a83e1a2-19f9-4644-99b6-210e5cd15a2d.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/0a83e1a2-19f9-4644-99b6-210e5cd15a2d.mp3"
}
},
{
"id": 12559,
"course_id": 650,
"content": "2c0ba7fc-ce0c-457c-aa14-01fa2dc8e26b.mp3",
"category": "audio",
"attachment_id": "2c0ba7fc-ce0c-457c-aa14-01fa2dc8e26b",
"order": 13,
"duration": 26040,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:29.226Z",
"attachment": {
"id": 82599,
"attachment_id": "2c0ba7fc-ce0c-457c-aa14-01fa2dc8e26b",
"name": "2c0ba7fc-ce0c-457c-aa14-01fa2dc8e26b.mp3",
"thumb": "",
"raw": "2c0ba7fc-ce0c-457c-aa14-01fa2dc8e26b.mp3",
"size": 208365,
"duration": 26040,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.06Z",
"updated_at": "2025-02-14T10:05:29.221Z",
"url": "https://bandu-resources.songy.info/7000104757/2c0ba7fc-ce0c-457c-aa14-01fa2dc8e26b.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/2c0ba7fc-ce0c-457c-aa14-01fa2dc8e26b.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/2c0ba7fc-ce0c-457c-aa14-01fa2dc8e26b.mp3"
}
},
{
"id": 12560,
"course_id": 650,
"content": "32da7c9a-2a00-4933-b3a7-da64b27760fb.mp3",
"category": "audio",
"attachment_id": "32da7c9a-2a00-4933-b3a7-da64b27760fb",
"order": 14,
"duration": 31130,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:29.463Z",
"attachment": {
"id": 82600,
"attachment_id": "32da7c9a-2a00-4933-b3a7-da64b27760fb",
"name": "32da7c9a-2a00-4933-b3a7-da64b27760fb.mp3",
"thumb": "",
"raw": "32da7c9a-2a00-4933-b3a7-da64b27760fb.mp3",
"size": 249069,
"duration": 31130,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.063Z",
"updated_at": "2025-02-14T10:05:29.457Z",
"url": "https://bandu-resources.songy.info/7000104757/32da7c9a-2a00-4933-b3a7-da64b27760fb.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/32da7c9a-2a00-4933-b3a7-da64b27760fb.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/32da7c9a-2a00-4933-b3a7-da64b27760fb.mp3"
}
},
{
"id": 12561,
"course_id": 650,
"content": "工具越厉害,就越应该去锻炼自己的能力…… 因为工具是能力的放大器。",
"category": "text",
"attachment_id": "",
"order": 15,
"duration": 1000000000,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:04:41.086Z",
"attachment": null
},
{
"id": 12562,
"course_id": 650,
"content": "9f4440ae-dc89-45bd-9377-07cc4ae02b1e.mp3",
"category": "audio",
"attachment_id": "9f4440ae-dc89-45bd-9377-07cc4ae02b1e",
"order": 16,
"duration": 54460,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:30.603Z",
"attachment": {
"id": 82601,
"attachment_id": "9f4440ae-dc89-45bd-9377-07cc4ae02b1e",
"name": "9f4440ae-dc89-45bd-9377-07cc4ae02b1e.mp3",
"thumb": "",
"raw": "9f4440ae-dc89-45bd-9377-07cc4ae02b1e.mp3",
"size": 435693,
"duration": 54420,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.065Z",
"updated_at": "2025-02-14T10:05:33.833Z",
"url": "https://bandu-resources.songy.info/7000104757/9f4440ae-dc89-45bd-9377-07cc4ae02b1e.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/9f4440ae-dc89-45bd-9377-07cc4ae02b1e.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/9f4440ae-dc89-45bd-9377-07cc4ae02b1e.mp3"
}
},
{
"id": 12563,
"course_id": 650,
"content": "d2e07bd7-c2b8-403a-8041-19b8f684e2dd.mp3",
"category": "audio",
"attachment_id": "d2e07bd7-c2b8-403a-8041-19b8f684e2dd",
"order": 17,
"duration": 31030,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:31.346Z",
"attachment": {
"id": 82602,
"attachment_id": "d2e07bd7-c2b8-403a-8041-19b8f684e2dd",
"name": "d2e07bd7-c2b8-403a-8041-19b8f684e2dd.mp3",
"thumb": "",
"raw": "d2e07bd7-c2b8-403a-8041-19b8f684e2dd.mp3",
"size": 248301,
"duration": 30985,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.067Z",
"updated_at": "2025-02-14T10:05:41.259Z",
"url": "https://bandu-resources.songy.info/7000104757/d2e07bd7-c2b8-403a-8041-19b8f684e2dd.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/d2e07bd7-c2b8-403a-8041-19b8f684e2dd.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/d2e07bd7-c2b8-403a-8041-19b8f684e2dd.mp3"
}
},
{
"id": 12564,
"course_id": 650,
"content": "3f67bb49-70d4-4d40-b5d5-9916cb00e6c8.mp3",
"category": "audio",
"attachment_id": "3f67bb49-70d4-4d40-b5d5-9916cb00e6c8",
"order": 18,
"duration": 42670,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:32.066Z",
"attachment": {
"id": 82603,
"attachment_id": "3f67bb49-70d4-4d40-b5d5-9916cb00e6c8",
"name": "3f67bb49-70d4-4d40-b5d5-9916cb00e6c8.mp3",
"thumb": "",
"raw": "3f67bb49-70d4-4d40-b5d5-9916cb00e6c8.mp3",
"size": 341421,
"duration": 42645,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.07Z",
"updated_at": "2025-02-14T10:05:43.819Z",
"url": "https://bandu-resources.songy.info/7000104757/3f67bb49-70d4-4d40-b5d5-9916cb00e6c8.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/3f67bb49-70d4-4d40-b5d5-9916cb00e6c8.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/3f67bb49-70d4-4d40-b5d5-9916cb00e6c8.mp3"
}
},
{
"id": 12565,
"course_id": 650,
"content": "1ed4a587-b172-4ed9-98e4-2f8dd344d4f2.mp3",
"category": "audio",
"attachment_id": "1ed4a587-b172-4ed9-98e4-2f8dd344d4f2",
"order": 19,
"duration": 25800,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:32.754Z",
"attachment": {
"id": 82604,
"attachment_id": "1ed4a587-b172-4ed9-98e4-2f8dd344d4f2",
"name": "1ed4a587-b172-4ed9-98e4-2f8dd344d4f2.mp3",
"thumb": "",
"raw": "1ed4a587-b172-4ed9-98e4-2f8dd344d4f2.mp3",
"size": 206445,
"duration": 25755,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.072Z",
"updated_at": "2025-02-14T10:05:48.037Z",
"url": "https://bandu-resources.songy.info/7000104757/1ed4a587-b172-4ed9-98e4-2f8dd344d4f2.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/1ed4a587-b172-4ed9-98e4-2f8dd344d4f2.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/1ed4a587-b172-4ed9-98e4-2f8dd344d4f2.mp3"
}
},
{
"id": 12566,
"course_id": 650,
"content": "5604c488-f86f-484b-9de8-b65b4aae3053.mp3",
"category": "audio",
"attachment_id": "5604c488-f86f-484b-9de8-b65b4aae3053",
"order": 20,
"duration": 34100,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:33.785Z",
"attachment": {
"id": 82605,
"attachment_id": "5604c488-f86f-484b-9de8-b65b4aae3053",
"name": "5604c488-f86f-484b-9de8-b65b4aae3053.mp3",
"thumb": "",
"raw": "5604c488-f86f-484b-9de8-b65b4aae3053.mp3",
"size": 272877,
"duration": 34060,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.074Z",
"updated_at": "2025-02-14T10:05:52.814Z",
"url": "https://bandu-resources.songy.info/7000104757/5604c488-f86f-484b-9de8-b65b4aae3053.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/5604c488-f86f-484b-9de8-b65b4aae3053.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/5604c488-f86f-484b-9de8-b65b4aae3053.mp3"
}
},
{
"id": 12567,
"course_id": 650,
"content": "ac0d83ff-9289-4685-968b-1db69589eadc.mp3",
"category": "audio",
"attachment_id": "ac0d83ff-9289-4685-968b-1db69589eadc",
"order": 21,
"duration": 60050,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:34.479Z",
"attachment": {
"id": 82606,
"attachment_id": "ac0d83ff-9289-4685-968b-1db69589eadc",
"name": "ac0d83ff-9289-4685-968b-1db69589eadc.mp3",
"thumb": "",
"raw": "ac0d83ff-9289-4685-968b-1db69589eadc.mp3",
"size": 480429,
"duration": 60010,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.076Z",
"updated_at": "2025-02-14T10:05:58.803Z",
"url": "https://bandu-resources.songy.info/7000104757/ac0d83ff-9289-4685-968b-1db69589eadc.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/ac0d83ff-9289-4685-968b-1db69589eadc.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/ac0d83ff-9289-4685-968b-1db69589eadc.mp3"
}
},
{
"id": 12568,
"course_id": 650,
"content": "e05f6f01-e1be-4fac-9193-6dcbb1931178.mp3",
"category": "audio",
"attachment_id": "e05f6f01-e1be-4fac-9193-6dcbb1931178",
"order": 22,
"duration": 30740,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:35.175Z",
"attachment": {
"id": 82607,
"attachment_id": "e05f6f01-e1be-4fac-9193-6dcbb1931178",
"name": "e05f6f01-e1be-4fac-9193-6dcbb1931178.mp3",
"thumb": "",
"raw": "e05f6f01-e1be-4fac-9193-6dcbb1931178.mp3",
"size": 245997,
"duration": 30715,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.079Z",
"updated_at": "2025-02-14T10:06:01.041Z",
"url": "https://bandu-resources.songy.info/7000104757/e05f6f01-e1be-4fac-9193-6dcbb1931178.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/e05f6f01-e1be-4fac-9193-6dcbb1931178.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/e05f6f01-e1be-4fac-9193-6dcbb1931178.mp3"
}
},
{
"id": 12569,
"course_id": 650,
"content": "2fa47d77-a58d-4274-b3db-5a8a4c76295c.mp3",
"category": "audio",
"attachment_id": "2fa47d77-a58d-4274-b3db-5a8a4c76295c",
"order": 23,
"duration": 37150,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:35.958Z",
"attachment": {
"id": 82608,
"attachment_id": "2fa47d77-a58d-4274-b3db-5a8a4c76295c",
"name": "2fa47d77-a58d-4274-b3db-5a8a4c76295c.mp3",
"thumb": "",
"raw": "2fa47d77-a58d-4274-b3db-5a8a4c76295c.mp3",
"size": 297261,
"duration": 37105,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.081Z",
"updated_at": "2025-02-14T10:06:03.006Z",
"url": "https://bandu-resources.songy.info/7000104757/2fa47d77-a58d-4274-b3db-5a8a4c76295c.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/2fa47d77-a58d-4274-b3db-5a8a4c76295c.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/2fa47d77-a58d-4274-b3db-5a8a4c76295c.mp3"
}
},
{
"id": 12570,
"course_id": 650,
"content": "dab1104c-b7f2-42ac-96d2-ab09200dc39c.mp3",
"category": "audio",
"attachment_id": "dab1104c-b7f2-42ac-96d2-ab09200dc39c",
"order": 24,
"duration": 37920,
"created_at": "2025-02-14T10:04:41.086Z",
"updated_at": "2025-02-14T10:05:36.812Z",
"attachment": {
"id": 82609,
"attachment_id": "dab1104c-b7f2-42ac-96d2-ab09200dc39c",
"name": "dab1104c-b7f2-42ac-96d2-ab09200dc39c.mp3",
"thumb": "",
"raw": "dab1104c-b7f2-42ac-96d2-ab09200dc39c.mp3",
"size": 303405,
"duration": 37875,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-14T10:04:41.083Z",
"updated_at": "2025-02-14T10:06:07.883Z",
"url": "https://bandu-resources.songy.info/7000104757/dab1104c-b7f2-42ac-96d2-ab09200dc39c.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/dab1104c-b7f2-42ac-96d2-ab09200dc39c.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/dab1104c-b7f2-42ac-96d2-ab09200dc39c.mp3"
}
}
]
}

View File

@@ -1,32 +0,0 @@
{
"ts": 1739769576164,
"data": [
{
"id": 12571,
"course_id": 651,
"content": "20250216150047-第34期茶话会-视频-1.mp4",
"category": "video",
"attachment_id": "4f23da9d-494a-4f8d-9513-5a1284372981",
"order": 1,
"duration": 7455670,
"created_at": "2025-02-16T09:51:54.676Z",
"updated_at": "2025-02-16T09:52:07.124Z",
"attachment": {
"id": 82797,
"attachment_id": "4f23da9d-494a-4f8d-9513-5a1284372981",
"name": "20250216150047-第34期茶话会-视频-1.mp4",
"thumb": "",
"raw": "4f23da9d-494a-4f8d-9513-5a1284372981.mp4",
"size": 467381471,
"duration": 7455670,
"mime_type": "video/mp4",
"location": "aliyun_oss",
"created_at": "2025-02-16T09:51:39.63Z",
"updated_at": "2025-02-16T09:52:07.119Z",
"url": "https://bandu-resources.songy.info/7000104757/4f23da9d-494a-4f8d-9513-5a1284372981.mp4",
"raw_url": "https://bandu-resources.songy.info/7000104757/4f23da9d-494a-4f8d-9513-5a1284372981.mp4",
"thumb_url": "https://bandu-resources.songy.info/7000104757/4f23da9d-494a-4f8d-9513-5a1284372981.mp4"
}
}
]
}

View File

@@ -1,7 +0,0 @@
1.定投财富
定投成长,读书写作
Garbage In, Garbage Out
定投陪家人
Simple Piano
https://scratch.mit.edu/projects/1104414057/
总结

View File

@@ -1,977 +0,0 @@
{
"ts": 1739942381844,
"data": [
{
"id": 12616,
"course_id": 653,
"content": "66e10bd8-80af-46b2-a194-b4758a98e54a.mp3",
"category": "audio",
"attachment_id": "66e10bd8-80af-46b2-a194-b4758a98e54a",
"order": 1,
"duration": 50260,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:29.633Z",
"attachment": {
"id": 82906,
"attachment_id": "66e10bd8-80af-46b2-a194-b4758a98e54a",
"name": "66e10bd8-80af-46b2-a194-b4758a98e54a.mp3",
"thumb": "",
"raw": "66e10bd8-80af-46b2-a194-b4758a98e54a.mp3",
"size": 402093,
"duration": 50260,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.124Z",
"updated_at": "2025-02-17T07:06:29.627Z",
"url": "https://bandu-resources.songy.info/7000104757/66e10bd8-80af-46b2-a194-b4758a98e54a.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/66e10bd8-80af-46b2-a194-b4758a98e54a.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/66e10bd8-80af-46b2-a194-b4758a98e54a.mp3"
}
},
{
"id": 12617,
"course_id": 653,
"content": "4e00093a-2710-4b06-a558-9fb33a83bf8b.mp3",
"category": "audio",
"attachment_id": "4e00093a-2710-4b06-a558-9fb33a83bf8b",
"order": 2,
"duration": 43340,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:29.833Z",
"attachment": {
"id": 82907,
"attachment_id": "4e00093a-2710-4b06-a558-9fb33a83bf8b",
"name": "4e00093a-2710-4b06-a558-9fb33a83bf8b.mp3",
"thumb": "",
"raw": "4e00093a-2710-4b06-a558-9fb33a83bf8b.mp3",
"size": 346797,
"duration": 43340,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.126Z",
"updated_at": "2025-02-17T07:06:29.829Z",
"url": "https://bandu-resources.songy.info/7000104757/4e00093a-2710-4b06-a558-9fb33a83bf8b.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/4e00093a-2710-4b06-a558-9fb33a83bf8b.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/4e00093a-2710-4b06-a558-9fb33a83bf8b.mp3"
}
},
{
"id": 12618,
"course_id": 653,
"content": "0a95337e-26f1-431c-9c20-02b51bc82bff.mp3",
"category": "audio",
"attachment_id": "0a95337e-26f1-431c-9c20-02b51bc82bff",
"order": 3,
"duration": 48530,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:31.645Z",
"attachment": {
"id": 82908,
"attachment_id": "0a95337e-26f1-431c-9c20-02b51bc82bff",
"name": "0a95337e-26f1-431c-9c20-02b51bc82bff.mp3",
"thumb": "",
"raw": "0a95337e-26f1-431c-9c20-02b51bc82bff.mp3",
"size": 388269,
"duration": 48485,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.129Z",
"updated_at": "2025-02-17T07:06:31.828Z",
"url": "https://bandu-resources.songy.info/7000104757/0a95337e-26f1-431c-9c20-02b51bc82bff.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/0a95337e-26f1-431c-9c20-02b51bc82bff.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/0a95337e-26f1-431c-9c20-02b51bc82bff.mp3"
}
},
{
"id": 12619,
"course_id": 653,
"content": "7429975c-ce5d-41e8-9997-b4e056dd673e.mp3",
"category": "audio",
"attachment_id": "7429975c-ce5d-41e8-9997-b4e056dd673e",
"order": 4,
"duration": 60050,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:33.122Z",
"attachment": {
"id": 82909,
"attachment_id": "7429975c-ce5d-41e8-9997-b4e056dd673e",
"name": "7429975c-ce5d-41e8-9997-b4e056dd673e.mp3",
"thumb": "",
"raw": "7429975c-ce5d-41e8-9997-b4e056dd673e.mp3",
"size": 480429,
"duration": 60005,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.131Z",
"updated_at": "2025-02-17T07:06:33.563Z",
"url": "https://bandu-resources.songy.info/7000104757/7429975c-ce5d-41e8-9997-b4e056dd673e.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/7429975c-ce5d-41e8-9997-b4e056dd673e.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/7429975c-ce5d-41e8-9997-b4e056dd673e.mp3"
}
},
{
"id": 12620,
"course_id": 653,
"content": "82fe821f-46a2-4bbf-af3b-8d444468141b.mp3",
"category": "audio",
"attachment_id": "82fe821f-46a2-4bbf-af3b-8d444468141b",
"order": 5,
"duration": 30980,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:34.804Z",
"attachment": {
"id": 82910,
"attachment_id": "82fe821f-46a2-4bbf-af3b-8d444468141b",
"name": "82fe821f-46a2-4bbf-af3b-8d444468141b.mp3",
"thumb": "",
"raw": "82fe821f-46a2-4bbf-af3b-8d444468141b.mp3",
"size": 247917,
"duration": 30960,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.134Z",
"updated_at": "2025-02-17T07:06:35.54Z",
"url": "https://bandu-resources.songy.info/7000104757/82fe821f-46a2-4bbf-af3b-8d444468141b.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/82fe821f-46a2-4bbf-af3b-8d444468141b.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/82fe821f-46a2-4bbf-af3b-8d444468141b.mp3"
}
},
{
"id": 12621,
"course_id": 653,
"content": "ea36aca7-efd5-4cf7-87fe-83144fd1bc3d.mp3",
"category": "audio",
"attachment_id": "ea36aca7-efd5-4cf7-87fe-83144fd1bc3d",
"order": 6,
"duration": 60050,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:36.409Z",
"attachment": {
"id": 82911,
"attachment_id": "ea36aca7-efd5-4cf7-87fe-83144fd1bc3d",
"name": "ea36aca7-efd5-4cf7-87fe-83144fd1bc3d.mp3",
"thumb": "",
"raw": "ea36aca7-efd5-4cf7-87fe-83144fd1bc3d.mp3",
"size": 480429,
"duration": 60005,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.136Z",
"updated_at": "2025-02-17T07:06:37.771Z",
"url": "https://bandu-resources.songy.info/7000104757/ea36aca7-efd5-4cf7-87fe-83144fd1bc3d.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/ea36aca7-efd5-4cf7-87fe-83144fd1bc3d.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/ea36aca7-efd5-4cf7-87fe-83144fd1bc3d.mp3"
}
},
{
"id": 12622,
"course_id": 653,
"content": "76e7fd4f-ed93-43e3-b7bc-2280ccae3b5f.mp3",
"category": "audio",
"attachment_id": "76e7fd4f-ed93-43e3-b7bc-2280ccae3b5f",
"order": 7,
"duration": 35040,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:37.948Z",
"attachment": {
"id": 82912,
"attachment_id": "76e7fd4f-ed93-43e3-b7bc-2280ccae3b5f",
"name": "76e7fd4f-ed93-43e3-b7bc-2280ccae3b5f.mp3",
"thumb": "",
"raw": "76e7fd4f-ed93-43e3-b7bc-2280ccae3b5f.mp3",
"size": 280365,
"duration": 35015,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.138Z",
"updated_at": "2025-02-17T07:06:39.826Z",
"url": "https://bandu-resources.songy.info/7000104757/76e7fd4f-ed93-43e3-b7bc-2280ccae3b5f.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/76e7fd4f-ed93-43e3-b7bc-2280ccae3b5f.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/76e7fd4f-ed93-43e3-b7bc-2280ccae3b5f.mp3"
}
},
{
"id": 12623,
"course_id": 653,
"content": "ad30301f-6a91-4b25-9385-9a9f7f8a0f09.mp3",
"category": "audio",
"attachment_id": "ad30301f-6a91-4b25-9385-9a9f7f8a0f09",
"order": 8,
"duration": 53300,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:39.808Z",
"attachment": {
"id": 82913,
"attachment_id": "ad30301f-6a91-4b25-9385-9a9f7f8a0f09",
"name": "ad30301f-6a91-4b25-9385-9a9f7f8a0f09.mp3",
"thumb": "",
"raw": "ad30301f-6a91-4b25-9385-9a9f7f8a0f09.mp3",
"size": 426477,
"duration": 53260,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.141Z",
"updated_at": "2025-02-17T07:06:42.025Z",
"url": "https://bandu-resources.songy.info/7000104757/ad30301f-6a91-4b25-9385-9a9f7f8a0f09.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/ad30301f-6a91-4b25-9385-9a9f7f8a0f09.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/ad30301f-6a91-4b25-9385-9a9f7f8a0f09.mp3"
}
},
{
"id": 12624,
"course_id": 653,
"content": "96ff5dd3-548e-40cd-b2b8-eaa147cd7d3e.mp3",
"category": "audio",
"attachment_id": "96ff5dd3-548e-40cd-b2b8-eaa147cd7d3e",
"order": 9,
"duration": 60050,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:41.294Z",
"attachment": {
"id": 82914,
"attachment_id": "96ff5dd3-548e-40cd-b2b8-eaa147cd7d3e",
"name": "96ff5dd3-548e-40cd-b2b8-eaa147cd7d3e.mp3",
"thumb": "",
"raw": "96ff5dd3-548e-40cd-b2b8-eaa147cd7d3e.mp3",
"size": 480429,
"duration": 60005,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.143Z",
"updated_at": "2025-02-17T07:06:47.821Z",
"url": "https://bandu-resources.songy.info/7000104757/96ff5dd3-548e-40cd-b2b8-eaa147cd7d3e.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/96ff5dd3-548e-40cd-b2b8-eaa147cd7d3e.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/96ff5dd3-548e-40cd-b2b8-eaa147cd7d3e.mp3"
}
},
{
"id": 12625,
"course_id": 653,
"content": "18346083-55a0-48f7-a107-9f64d34d2278.mp3",
"category": "audio",
"attachment_id": "18346083-55a0-48f7-a107-9f64d34d2278",
"order": 10,
"duration": 42190,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:43.165Z",
"attachment": {
"id": 82915,
"attachment_id": "18346083-55a0-48f7-a107-9f64d34d2278",
"name": "18346083-55a0-48f7-a107-9f64d34d2278.mp3",
"thumb": "",
"raw": "18346083-55a0-48f7-a107-9f64d34d2278.mp3",
"size": 337581,
"duration": 42145,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.146Z",
"updated_at": "2025-02-17T07:06:57.196Z",
"url": "https://bandu-resources.songy.info/7000104757/18346083-55a0-48f7-a107-9f64d34d2278.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/18346083-55a0-48f7-a107-9f64d34d2278.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/18346083-55a0-48f7-a107-9f64d34d2278.mp3"
}
},
{
"id": 12626,
"course_id": 653,
"content": "150f1056-1c59-4cc7-a933-063c449c8c4c.mp3",
"category": "audio",
"attachment_id": "150f1056-1c59-4cc7-a933-063c449c8c4c",
"order": 11,
"duration": 60050,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:44.713Z",
"attachment": {
"id": 82916,
"attachment_id": "150f1056-1c59-4cc7-a933-063c449c8c4c",
"name": "150f1056-1c59-4cc7-a933-063c449c8c4c.mp3",
"thumb": "",
"raw": "150f1056-1c59-4cc7-a933-063c449c8c4c.mp3",
"size": 480429,
"duration": 60005,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.148Z",
"updated_at": "2025-02-17T07:07:03.298Z",
"url": "https://bandu-resources.songy.info/7000104757/150f1056-1c59-4cc7-a933-063c449c8c4c.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/150f1056-1c59-4cc7-a933-063c449c8c4c.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/150f1056-1c59-4cc7-a933-063c449c8c4c.mp3"
}
},
{
"id": 12627,
"course_id": 653,
"content": "4a40328c-d425-4a58-bb65-eecb58206b1c.mp3",
"category": "audio",
"attachment_id": "4a40328c-d425-4a58-bb65-eecb58206b1c",
"order": 12,
"duration": 18620,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:46.412Z",
"attachment": {
"id": 82917,
"attachment_id": "4a40328c-d425-4a58-bb65-eecb58206b1c",
"name": "4a40328c-d425-4a58-bb65-eecb58206b1c.mp3",
"thumb": "",
"raw": "4a40328c-d425-4a58-bb65-eecb58206b1c.mp3",
"size": 149037,
"duration": 18580,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.15Z",
"updated_at": "2025-02-17T07:07:05.207Z",
"url": "https://bandu-resources.songy.info/7000104757/4a40328c-d425-4a58-bb65-eecb58206b1c.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/4a40328c-d425-4a58-bb65-eecb58206b1c.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/4a40328c-d425-4a58-bb65-eecb58206b1c.mp3"
}
},
{
"id": 12628,
"course_id": 653,
"content": "8ef31699-55b4-4edf-b05a-99de0f8fd1c2.mp3",
"category": "audio",
"attachment_id": "8ef31699-55b4-4edf-b05a-99de0f8fd1c2",
"order": 13,
"duration": 60050,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:47.873Z",
"attachment": {
"id": 82918,
"attachment_id": "8ef31699-55b4-4edf-b05a-99de0f8fd1c2",
"name": "8ef31699-55b4-4edf-b05a-99de0f8fd1c2.mp3",
"thumb": "",
"raw": "8ef31699-55b4-4edf-b05a-99de0f8fd1c2.mp3",
"size": 480429,
"duration": 60005,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.153Z",
"updated_at": "2025-02-17T07:07:10.929Z",
"url": "https://bandu-resources.songy.info/7000104757/8ef31699-55b4-4edf-b05a-99de0f8fd1c2.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/8ef31699-55b4-4edf-b05a-99de0f8fd1c2.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/8ef31699-55b4-4edf-b05a-99de0f8fd1c2.mp3"
}
},
{
"id": 12629,
"course_id": 653,
"content": "8c3d9850-7501-4109-925e-910943f9dd8f.mp3",
"category": "audio",
"attachment_id": "8c3d9850-7501-4109-925e-910943f9dd8f",
"order": 14,
"duration": 40440,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:49.61Z",
"attachment": {
"id": 82919,
"attachment_id": "8c3d9850-7501-4109-925e-910943f9dd8f",
"name": "8c3d9850-7501-4109-925e-910943f9dd8f.mp3",
"thumb": "",
"raw": "8c3d9850-7501-4109-925e-910943f9dd8f.mp3",
"size": 323565,
"duration": 40410,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.155Z",
"updated_at": "2025-02-17T07:07:16.009Z",
"url": "https://bandu-resources.songy.info/7000104757/8c3d9850-7501-4109-925e-910943f9dd8f.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/8c3d9850-7501-4109-925e-910943f9dd8f.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/8c3d9850-7501-4109-925e-910943f9dd8f.mp3"
}
},
{
"id": 12630,
"course_id": 653,
"content": "ebd07260-a946-4312-81e7-87539cc73c2e.mp3",
"category": "audio",
"attachment_id": "ebd07260-a946-4312-81e7-87539cc73c2e",
"order": 15,
"duration": 25250,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:52.011Z",
"attachment": {
"id": 82920,
"attachment_id": "ebd07260-a946-4312-81e7-87539cc73c2e",
"name": "ebd07260-a946-4312-81e7-87539cc73c2e.mp3",
"thumb": "",
"raw": "ebd07260-a946-4312-81e7-87539cc73c2e.mp3",
"size": 202029,
"duration": 25210,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.158Z",
"updated_at": "2025-02-17T07:07:17.784Z",
"url": "https://bandu-resources.songy.info/7000104757/ebd07260-a946-4312-81e7-87539cc73c2e.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/ebd07260-a946-4312-81e7-87539cc73c2e.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/ebd07260-a946-4312-81e7-87539cc73c2e.mp3"
}
},
{
"id": 12631,
"course_id": 653,
"content": "f7fcd9ad-6f5d-4d3b-bd28-f47fb79679de.mp3",
"category": "audio",
"attachment_id": "f7fcd9ad-6f5d-4d3b-bd28-f47fb79679de",
"order": 16,
"duration": 23780,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:54.042Z",
"attachment": {
"id": 82921,
"attachment_id": "f7fcd9ad-6f5d-4d3b-bd28-f47fb79679de",
"name": "f7fcd9ad-6f5d-4d3b-bd28-f47fb79679de.mp3",
"thumb": "",
"raw": "f7fcd9ad-6f5d-4d3b-bd28-f47fb79679de.mp3",
"size": 190317,
"duration": 23755,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.16Z",
"updated_at": "2025-02-17T07:07:20.045Z",
"url": "https://bandu-resources.songy.info/7000104757/f7fcd9ad-6f5d-4d3b-bd28-f47fb79679de.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/f7fcd9ad-6f5d-4d3b-bd28-f47fb79679de.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/f7fcd9ad-6f5d-4d3b-bd28-f47fb79679de.mp3"
}
},
{
"id": 12632,
"course_id": 653,
"content": "b6a019ee-4b43-4015-934b-45550c6e21d4.jpg",
"category": "image",
"attachment_id": "b6a019ee-4b43-4015-934b-45550c6e21d4",
"order": 17,
"duration": 1000000000,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:21.211Z",
"attachment": {
"id": 82922,
"attachment_id": "b6a019ee-4b43-4015-934b-45550c6e21d4",
"name": "b6a019ee-4b43-4015-934b-45550c6e21d4.jpg",
"thumb": "",
"raw": "b6a019ee-4b43-4015-934b-45550c6e21d4.jpg",
"size": 343506,
"duration": 0,
"mime_type": "image/jpeg",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.162Z",
"updated_at": "2025-02-17T07:07:26.314Z",
"url": "https://bandu-resources.songy.info/7000104757/b6a019ee-4b43-4015-934b-45550c6e21d4.webp",
"raw_url": "https://bandu-resources.songy.info/7000104757/b6a019ee-4b43-4015-934b-45550c6e21d4.jpg",
"thumb_url": "https://bandu-resources.songy.info/7000104757/b6a019ee-4b43-4015-934b-45550c6e21d4.jpg"
}
},
{
"id": 12633,
"course_id": 653,
"content": "598bb7ab-0023-4c5b-bcdc-2d4b52c2ab85.jpg",
"category": "image",
"attachment_id": "598bb7ab-0023-4c5b-bcdc-2d4b52c2ab85",
"order": 18,
"duration": 1000000000,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:21.211Z",
"attachment": {
"id": 82923,
"attachment_id": "598bb7ab-0023-4c5b-bcdc-2d4b52c2ab85",
"name": "598bb7ab-0023-4c5b-bcdc-2d4b52c2ab85.jpg",
"thumb": "",
"raw": "598bb7ab-0023-4c5b-bcdc-2d4b52c2ab85.jpg",
"size": 397003,
"duration": 0,
"mime_type": "image/jpeg",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.165Z",
"updated_at": "2025-02-17T07:07:32.23Z",
"url": "https://bandu-resources.songy.info/7000104757/598bb7ab-0023-4c5b-bcdc-2d4b52c2ab85.webp",
"raw_url": "https://bandu-resources.songy.info/7000104757/598bb7ab-0023-4c5b-bcdc-2d4b52c2ab85.jpg",
"thumb_url": "https://bandu-resources.songy.info/7000104757/598bb7ab-0023-4c5b-bcdc-2d4b52c2ab85.jpg"
}
},
{
"id": 12634,
"course_id": 653,
"content": "669539a1-1b60-49b7-bb2b-ce1766d7813b.mp3",
"category": "audio",
"attachment_id": "669539a1-1b60-49b7-bb2b-ce1766d7813b",
"order": 19,
"duration": 36310,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:55.878Z",
"attachment": {
"id": 82924,
"attachment_id": "669539a1-1b60-49b7-bb2b-ce1766d7813b",
"name": "669539a1-1b60-49b7-bb2b-ce1766d7813b.mp3",
"thumb": "",
"raw": "669539a1-1b60-49b7-bb2b-ce1766d7813b.mp3",
"size": 290541,
"duration": 36280,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.167Z",
"updated_at": "2025-02-17T07:07:34.342Z",
"url": "https://bandu-resources.songy.info/7000104757/669539a1-1b60-49b7-bb2b-ce1766d7813b.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/669539a1-1b60-49b7-bb2b-ce1766d7813b.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/669539a1-1b60-49b7-bb2b-ce1766d7813b.mp3"
}
},
{
"id": 12635,
"course_id": 653,
"content": "36fc960d-091f-4b10-b9c5-b589e7928621.mp3",
"category": "audio",
"attachment_id": "36fc960d-091f-4b10-b9c5-b589e7928621",
"order": 20,
"duration": 54000,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:57.607Z",
"attachment": {
"id": 82925,
"attachment_id": "36fc960d-091f-4b10-b9c5-b589e7928621",
"name": "36fc960d-091f-4b10-b9c5-b589e7928621.mp3",
"thumb": "",
"raw": "36fc960d-091f-4b10-b9c5-b589e7928621.mp3",
"size": 432045,
"duration": 53955,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.17Z",
"updated_at": "2025-02-17T07:07:36.667Z",
"url": "https://bandu-resources.songy.info/7000104757/36fc960d-091f-4b10-b9c5-b589e7928621.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/36fc960d-091f-4b10-b9c5-b589e7928621.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/36fc960d-091f-4b10-b9c5-b589e7928621.mp3"
}
},
{
"id": 12636,
"course_id": 653,
"content": "7b71f351-1b0b-4b6b-8e1b-79726dab83bf.mp3",
"category": "audio",
"attachment_id": "7b71f351-1b0b-4b6b-8e1b-79726dab83bf",
"order": 21,
"duration": 12720,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:06:59.062Z",
"attachment": {
"id": 82926,
"attachment_id": "7b71f351-1b0b-4b6b-8e1b-79726dab83bf",
"name": "7b71f351-1b0b-4b6b-8e1b-79726dab83bf.mp3",
"thumb": "",
"raw": "7b71f351-1b0b-4b6b-8e1b-79726dab83bf.mp3",
"size": 101805,
"duration": 12675,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.172Z",
"updated_at": "2025-02-17T07:07:39.471Z",
"url": "https://bandu-resources.songy.info/7000104757/7b71f351-1b0b-4b6b-8e1b-79726dab83bf.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/7b71f351-1b0b-4b6b-8e1b-79726dab83bf.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/7b71f351-1b0b-4b6b-8e1b-79726dab83bf.mp3"
}
},
{
"id": 12637,
"course_id": 653,
"content": "fc038b12-cc2d-482d-a721-c2a64a6f88fb.mp3",
"category": "audio",
"attachment_id": "fc038b12-cc2d-482d-a721-c2a64a6f88fb",
"order": 22,
"duration": 60050,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:07:00.899Z",
"attachment": {
"id": 82927,
"attachment_id": "fc038b12-cc2d-482d-a721-c2a64a6f88fb",
"name": "fc038b12-cc2d-482d-a721-c2a64a6f88fb.mp3",
"thumb": "",
"raw": "fc038b12-cc2d-482d-a721-c2a64a6f88fb.mp3",
"size": 480429,
"duration": 60005,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.175Z",
"updated_at": "2025-02-17T07:07:42.522Z",
"url": "https://bandu-resources.songy.info/7000104757/fc038b12-cc2d-482d-a721-c2a64a6f88fb.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/fc038b12-cc2d-482d-a721-c2a64a6f88fb.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/fc038b12-cc2d-482d-a721-c2a64a6f88fb.mp3"
}
},
{
"id": 12638,
"course_id": 653,
"content": "983b134c-56f4-405c-8c91-8372c5a6e135.mp3",
"category": "audio",
"attachment_id": "983b134c-56f4-405c-8c91-8372c5a6e135",
"order": 23,
"duration": 21940,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:07:02.678Z",
"attachment": {
"id": 82928,
"attachment_id": "983b134c-56f4-405c-8c91-8372c5a6e135",
"name": "983b134c-56f4-405c-8c91-8372c5a6e135.mp3",
"thumb": "",
"raw": "983b134c-56f4-405c-8c91-8372c5a6e135.mp3",
"size": 175533,
"duration": 21895,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.177Z",
"updated_at": "2025-02-17T07:07:44.21Z",
"url": "https://bandu-resources.songy.info/7000104757/983b134c-56f4-405c-8c91-8372c5a6e135.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/983b134c-56f4-405c-8c91-8372c5a6e135.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/983b134c-56f4-405c-8c91-8372c5a6e135.mp3"
}
},
{
"id": 12639,
"course_id": 653,
"content": "24bff19e-dd3f-4c8a-95fd-17e7bdef29cd.mp3",
"category": "audio",
"attachment_id": "24bff19e-dd3f-4c8a-95fd-17e7bdef29cd",
"order": 24,
"duration": 60050,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:07:04.25Z",
"attachment": {
"id": 82929,
"attachment_id": "24bff19e-dd3f-4c8a-95fd-17e7bdef29cd",
"name": "24bff19e-dd3f-4c8a-95fd-17e7bdef29cd.mp3",
"thumb": "",
"raw": "24bff19e-dd3f-4c8a-95fd-17e7bdef29cd.mp3",
"size": 480429,
"duration": 60005,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.179Z",
"updated_at": "2025-02-17T07:07:46.694Z",
"url": "https://bandu-resources.songy.info/7000104757/24bff19e-dd3f-4c8a-95fd-17e7bdef29cd.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/24bff19e-dd3f-4c8a-95fd-17e7bdef29cd.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/24bff19e-dd3f-4c8a-95fd-17e7bdef29cd.mp3"
}
},
{
"id": 12640,
"course_id": 653,
"content": "98518eb0-b9d6-4ef6-95f2-16babbe38c27.mp3",
"category": "audio",
"attachment_id": "98518eb0-b9d6-4ef6-95f2-16babbe38c27",
"order": 25,
"duration": 60050,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:07:05.729Z",
"attachment": {
"id": 82930,
"attachment_id": "98518eb0-b9d6-4ef6-95f2-16babbe38c27",
"name": "98518eb0-b9d6-4ef6-95f2-16babbe38c27.mp3",
"thumb": "",
"raw": "98518eb0-b9d6-4ef6-95f2-16babbe38c27.mp3",
"size": 480429,
"duration": 60005,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.182Z",
"updated_at": "2025-02-17T07:07:52.835Z",
"url": "https://bandu-resources.songy.info/7000104757/98518eb0-b9d6-4ef6-95f2-16babbe38c27.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/98518eb0-b9d6-4ef6-95f2-16babbe38c27.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/98518eb0-b9d6-4ef6-95f2-16babbe38c27.mp3"
}
},
{
"id": 12641,
"course_id": 653,
"content": "485723db-5cd5-4fe3-b2b3-2518e15962de.mp3",
"category": "audio",
"attachment_id": "485723db-5cd5-4fe3-b2b3-2518e15962de",
"order": 26,
"duration": 27860,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:07:07.428Z",
"attachment": {
"id": 82931,
"attachment_id": "485723db-5cd5-4fe3-b2b3-2518e15962de",
"name": "485723db-5cd5-4fe3-b2b3-2518e15962de.mp3",
"thumb": "",
"raw": "485723db-5cd5-4fe3-b2b3-2518e15962de.mp3",
"size": 222957,
"duration": 27820,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.184Z",
"updated_at": "2025-02-17T07:07:57.112Z",
"url": "https://bandu-resources.songy.info/7000104757/485723db-5cd5-4fe3-b2b3-2518e15962de.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/485723db-5cd5-4fe3-b2b3-2518e15962de.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/485723db-5cd5-4fe3-b2b3-2518e15962de.mp3"
}
},
{
"id": 12642,
"course_id": 653,
"content": "a52f82db-7d39-4954-a8c9-63490012dd69.mp3",
"category": "audio",
"attachment_id": "a52f82db-7d39-4954-a8c9-63490012dd69",
"order": 27,
"duration": 29420,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:07:09.238Z",
"attachment": {
"id": 82932,
"attachment_id": "a52f82db-7d39-4954-a8c9-63490012dd69",
"name": "a52f82db-7d39-4954-a8c9-63490012dd69.mp3",
"thumb": "",
"raw": "a52f82db-7d39-4954-a8c9-63490012dd69.mp3",
"size": 235437,
"duration": 29380,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.187Z",
"updated_at": "2025-02-17T07:08:01.842Z",
"url": "https://bandu-resources.songy.info/7000104757/a52f82db-7d39-4954-a8c9-63490012dd69.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/a52f82db-7d39-4954-a8c9-63490012dd69.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/a52f82db-7d39-4954-a8c9-63490012dd69.mp3"
}
},
{
"id": 12643,
"course_id": 653,
"content": "b8139d0a-6e01-491f-9f1c-dcf6c47d162b.mp3",
"category": "audio",
"attachment_id": "b8139d0a-6e01-491f-9f1c-dcf6c47d162b",
"order": 28,
"duration": 29040,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:07:11.699Z",
"attachment": {
"id": 82933,
"attachment_id": "b8139d0a-6e01-491f-9f1c-dcf6c47d162b",
"name": "b8139d0a-6e01-491f-9f1c-dcf6c47d162b.mp3",
"thumb": "",
"raw": "b8139d0a-6e01-491f-9f1c-dcf6c47d162b.mp3",
"size": 232365,
"duration": 29015,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.189Z",
"updated_at": "2025-02-17T07:08:04.738Z",
"url": "https://bandu-resources.songy.info/7000104757/b8139d0a-6e01-491f-9f1c-dcf6c47d162b.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/b8139d0a-6e01-491f-9f1c-dcf6c47d162b.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/b8139d0a-6e01-491f-9f1c-dcf6c47d162b.mp3"
}
},
{
"id": 12644,
"course_id": 653,
"content": "839ccd22-2384-41b8-9c72-6ffcea18fbb4.mp3",
"category": "audio",
"attachment_id": "839ccd22-2384-41b8-9c72-6ffcea18fbb4",
"order": 29,
"duration": 47040,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:07:13.241Z",
"attachment": {
"id": 82934,
"attachment_id": "839ccd22-2384-41b8-9c72-6ffcea18fbb4",
"name": "839ccd22-2384-41b8-9c72-6ffcea18fbb4.mp3",
"thumb": "",
"raw": "839ccd22-2384-41b8-9c72-6ffcea18fbb4.mp3",
"size": 376365,
"duration": 47010,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.191Z",
"updated_at": "2025-02-17T07:08:07.593Z",
"url": "https://bandu-resources.songy.info/7000104757/839ccd22-2384-41b8-9c72-6ffcea18fbb4.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/839ccd22-2384-41b8-9c72-6ffcea18fbb4.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/839ccd22-2384-41b8-9c72-6ffcea18fbb4.mp3"
}
},
{
"id": 12645,
"course_id": 653,
"content": "4b3f1c8c-aad3-4ee0-9fca-7dc24ece5053.mp3",
"category": "audio",
"attachment_id": "4b3f1c8c-aad3-4ee0-9fca-7dc24ece5053",
"order": 30,
"duration": 41860,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:07:14.533Z",
"attachment": {
"id": 82935,
"attachment_id": "4b3f1c8c-aad3-4ee0-9fca-7dc24ece5053",
"name": "4b3f1c8c-aad3-4ee0-9fca-7dc24ece5053.mp3",
"thumb": "",
"raw": "4b3f1c8c-aad3-4ee0-9fca-7dc24ece5053.mp3",
"size": 334893,
"duration": 41825,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.194Z",
"updated_at": "2025-02-17T07:08:09.241Z",
"url": "https://bandu-resources.songy.info/7000104757/4b3f1c8c-aad3-4ee0-9fca-7dc24ece5053.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/4b3f1c8c-aad3-4ee0-9fca-7dc24ece5053.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/4b3f1c8c-aad3-4ee0-9fca-7dc24ece5053.mp3"
}
},
{
"id": 12646,
"course_id": 653,
"content": "7c95aef6-859b-4498-8302-2ceeefec7b85.mp3",
"category": "audio",
"attachment_id": "7c95aef6-859b-4498-8302-2ceeefec7b85",
"order": 31,
"duration": 60050,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:07:16.235Z",
"attachment": {
"id": 82936,
"attachment_id": "7c95aef6-859b-4498-8302-2ceeefec7b85",
"name": "7c95aef6-859b-4498-8302-2ceeefec7b85.mp3",
"thumb": "",
"raw": "7c95aef6-859b-4498-8302-2ceeefec7b85.mp3",
"size": 480429,
"duration": 60005,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.196Z",
"updated_at": "2025-02-17T07:08:15.079Z",
"url": "https://bandu-resources.songy.info/7000104757/7c95aef6-859b-4498-8302-2ceeefec7b85.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/7c95aef6-859b-4498-8302-2ceeefec7b85.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/7c95aef6-859b-4498-8302-2ceeefec7b85.mp3"
}
},
{
"id": 12647,
"course_id": 653,
"content": "422b347e-daa5-4c6d-83d1-2a40ffa56cf3.mp3",
"category": "audio",
"attachment_id": "422b347e-daa5-4c6d-83d1-2a40ffa56cf3",
"order": 32,
"duration": 26830,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:07:17.709Z",
"attachment": {
"id": 82937,
"attachment_id": "422b347e-daa5-4c6d-83d1-2a40ffa56cf3",
"name": "422b347e-daa5-4c6d-83d1-2a40ffa56cf3.mp3",
"thumb": "",
"raw": "422b347e-daa5-4c6d-83d1-2a40ffa56cf3.mp3",
"size": 214701,
"duration": 26795,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.199Z",
"updated_at": "2025-02-17T07:08:16.798Z",
"url": "https://bandu-resources.songy.info/7000104757/422b347e-daa5-4c6d-83d1-2a40ffa56cf3.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/422b347e-daa5-4c6d-83d1-2a40ffa56cf3.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/422b347e-daa5-4c6d-83d1-2a40ffa56cf3.mp3"
}
},
{
"id": 12648,
"course_id": 653,
"content": "76fd6ee5-aff5-484f-8f7f-a1d3653a8407.mp3",
"category": "audio",
"attachment_id": "76fd6ee5-aff5-484f-8f7f-a1d3653a8407",
"order": 33,
"duration": 41690,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:07:19.483Z",
"attachment": {
"id": 82938,
"attachment_id": "76fd6ee5-aff5-484f-8f7f-a1d3653a8407",
"name": "76fd6ee5-aff5-484f-8f7f-a1d3653a8407.mp3",
"thumb": "",
"raw": "76fd6ee5-aff5-484f-8f7f-a1d3653a8407.mp3",
"size": 333549,
"duration": 41660,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.201Z",
"updated_at": "2025-02-17T07:08:18.787Z",
"url": "https://bandu-resources.songy.info/7000104757/76fd6ee5-aff5-484f-8f7f-a1d3653a8407.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/76fd6ee5-aff5-484f-8f7f-a1d3653a8407.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/76fd6ee5-aff5-484f-8f7f-a1d3653a8407.mp3"
}
},
{
"id": 12649,
"course_id": 653,
"content": "fe3830b7-79f9-499a-bbd4-3354f0fa836c.mp3",
"category": "audio",
"attachment_id": "fe3830b7-79f9-499a-bbd4-3354f0fa836c",
"order": 34,
"duration": 43180,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:07:21.644Z",
"attachment": {
"id": 82939,
"attachment_id": "fe3830b7-79f9-499a-bbd4-3354f0fa836c",
"name": "fe3830b7-79f9-499a-bbd4-3354f0fa836c.mp3",
"thumb": "",
"raw": "fe3830b7-79f9-499a-bbd4-3354f0fa836c.mp3",
"size": 345453,
"duration": 43140,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.204Z",
"updated_at": "2025-02-17T07:08:23.864Z",
"url": "https://bandu-resources.songy.info/7000104757/fe3830b7-79f9-499a-bbd4-3354f0fa836c.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/fe3830b7-79f9-499a-bbd4-3354f0fa836c.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/fe3830b7-79f9-499a-bbd4-3354f0fa836c.mp3"
}
},
{
"id": 12650,
"course_id": 653,
"content": "b32a8009-af40-41c3-9b94-63a2384f305d.mp3",
"category": "audio",
"attachment_id": "b32a8009-af40-41c3-9b94-63a2384f305d",
"order": 35,
"duration": 32740,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:07:23.357Z",
"attachment": {
"id": 82940,
"attachment_id": "b32a8009-af40-41c3-9b94-63a2384f305d",
"name": "b32a8009-af40-41c3-9b94-63a2384f305d.mp3",
"thumb": "",
"raw": "b32a8009-af40-41c3-9b94-63a2384f305d.mp3",
"size": 261933,
"duration": 32710,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.206Z",
"updated_at": "2025-02-17T07:08:28.449Z",
"url": "https://bandu-resources.songy.info/7000104757/b32a8009-af40-41c3-9b94-63a2384f305d.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/b32a8009-af40-41c3-9b94-63a2384f305d.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/b32a8009-af40-41c3-9b94-63a2384f305d.mp3"
}
},
{
"id": 12651,
"course_id": 653,
"content": "6331301e-2f69-41e7-90bc-7324f2efb5be.mp3",
"category": "audio",
"attachment_id": "6331301e-2f69-41e7-90bc-7324f2efb5be",
"order": 36,
"duration": 32160,
"created_at": "2025-02-17T07:06:21.211Z",
"updated_at": "2025-02-17T07:07:25.167Z",
"attachment": {
"id": 82941,
"attachment_id": "6331301e-2f69-41e7-90bc-7324f2efb5be",
"name": "6331301e-2f69-41e7-90bc-7324f2efb5be.mp3",
"thumb": "",
"raw": "6331301e-2f69-41e7-90bc-7324f2efb5be.mp3",
"size": 257325,
"duration": 32120,
"mime_type": "audio/mp3",
"location": "aliyun_oss",
"created_at": "2025-02-17T07:06:21.208Z",
"updated_at": "2025-02-17T07:08:36.377Z",
"url": "https://bandu-resources.songy.info/7000104757/6331301e-2f69-41e7-90bc-7324f2efb5be.mp3",
"raw_url": "https://bandu-resources.songy.info/7000104757/6331301e-2f69-41e7-90bc-7324f2efb5be.mp3",
"thumb_url": "https://bandu-resources.songy.info/7000104757/6331301e-2f69-41e7-90bc-7324f2efb5be.mp3"
}
}
]
}

View File

@@ -2,8 +2,8 @@
import configparser import configparser
import sqlite3 import sqlite3
import psycopg2
import requests import requests
import json import json
from headers import headers from headers import headers
@@ -15,6 +15,14 @@ limit = config['DEFAULT']['limit']
offset = config['DEFAULT']['offset'] offset = config['DEFAULT']['offset']
sort = config['DEFAULT']['sort'] sort = config['DEFAULT']['sort']
# PostgreSQL 数据库配置
dbname = config['POSTGRES']['dbname']
user = config['POSTGRES']['user']
password = config['POSTGRES']['password']
host = config['POSTGRES']['host']
port = config['POSTGRES']['port']
headers = headers headers = headers
headers['authorization'] = f'Bearer {authorization_token}' headers['authorization'] = f'Bearer {authorization_token}'
@@ -35,7 +43,7 @@ def get_list():
# 假设response的内容就是你提供的course_list.json # 假设response的内容就是你提供的course_list.json
course_list_json = response.text course_list_json = response.text
# print(course_list_json) print(course_list_json)
json_data = json.loads(course_list_json) json_data = json.loads(course_list_json)
course_item = json_data['data']['items'] course_item = json_data['data']['items']
@@ -43,8 +51,11 @@ def get_list():
print(item['id'], item['title'], item['description']) print(item['id'], item['title'], item['description'])
# 解析JSON数据 # 解析JSON数据
course_list_data = json.loads(course_list_json) return json.loads(course_list_json)
def insert_sqlit(course_list_data):
# 连接到SQLite数据库 # 连接到SQLite数据库
# 如果文件不存在,会自动在当前目录创建: # 如果文件不存在,会自动在当前目录创建:
conn = sqlite3.connect('courses.db') conn = sqlite3.connect('courses.db')
@@ -75,5 +86,49 @@ def get_list():
conn.close() conn.close()
def insert_pgsql(course_list_data):
# 连接到PostgreSQL数据库
conn = psycopg2.connect(
dbname=dbname,
user=user,
password=password,
host=host,
port=port
)
cursor = conn.cursor()
# 创建一个表,如果它不存在:
cursor.execute('''
CREATE TABLE IF NOT EXISTS courses (
id INTEGER PRIMARY KEY,
title TEXT,
description TEXT
)
''')
# 插入数据
for item in course_list_data['data']['items']:
try:
cursor.execute('''
INSERT INTO courses (id, title, description)
VALUES (%s, %s, %s)
ON CONFLICT (id) DO NOTHING
''', (item['id'], item['title'], item['description']))
except psycopg2.IntegrityError:
# 如果发生唯一键冲突,忽略该插入
conn.rollback()
else:
conn.commit()
# 关闭Cursor和Connection:
cursor.close()
conn.close()
def insert_data():
course_list_data = get_list()
insert_sqlit(course_list_data)
insert_pgsql(course_list_data)
if __name__ == '__main__': if __name__ == '__main__':
get_list() insert_data()

Binary file not shown.

64
fileconvert.py Normal file
View File

@@ -0,0 +1,64 @@
import logging
import os
import subprocess
from logging.handlers import RotatingFileHandler
# 配置日志
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.StreamHandler(), # 控制台日志
RotatingFileHandler('app.log', maxBytes=1024*1024*5, backupCount=3) # 日志文件
])
def mp4_to_wav(mp4_file):
try:
mp4_dir = os.path.dirname(mp4_file)
mp4_filename = os.path.splitext(os.path.basename(mp4_file))[0]
wav_file = os.path.join(mp4_dir, f"{mp4_filename}.wav")
command = [
'ffmpeg',
'-y',
'-i', mp4_file,
'-vn', # 去除视频流
'-acodec', 'pcm_s16le', # 使用 PCM 16 位有符号小端编码
'-ar', '44100', # 设置采样率为 44100 Hz
'-ac', '2', # 设置声道数为 2立体声
wav_file
]
subprocess.run(command, check=True)
logging.info(f"成功将 {mp4_file} 转换为 {wav_file}")
return wav_file
except subprocess.CalledProcessError as e:
logging.error(f"转换失败: {e}")
return None
except FileNotFoundError:
logging.error("未找到 FFmpeg请确保已安装并配置好 FFmpeg 环境。")
return None
def mp4_to_mp3(mp4_file):
try:
mp4_dir = os.path.dirname(mp4_file)
mp4_filename = os.path.splitext(os.path.basename(mp4_file))[0]
mp3_file = os.path.join(mp4_dir, f"{mp4_filename}.mp3")
command = [
'ffmpeg',
'-y',
'-i', mp4_file,
'-vn', # 去除视频流
mp3_file
]
print(command)
subprocess.run(command, check=True)
logging.info(f"成功将 {mp4_file} 转换为 {mp3_file}")
return mp3_file
except subprocess.CalledProcessError as e:
logging.error(f"转换失败: {e}")
return None
except FileNotFoundError:
logging.error("未找到 FFmpeg请确保已安装并配置好 FFmpeg 环境。")
return None

70
json/insert_mongodb.py Normal file
View File

@@ -0,0 +1,70 @@
import json
from pymongo import MongoClient
import os
# 指定目录路径
directory = './'
# 连接到 MongoDB
client = MongoClient('mongodb://root:lostecho@192.168.31.3:27017/')
# 选择数据库
db = client['songyi']
# 选择集合
collection = db['course_content']
# 遍历目录下的所有文件
for filename in os.listdir(directory):
if filename.endswith('.json'):
file_path = os.path.join(directory, filename)
course_id = filename.split('.')[0]
print(course_id)
try:
with open(file_path, 'r', encoding='utf-8-sig') as file:
# content = file.read()
# print(f"文件 {filename} 的内容如下:")
# print(content)
data = json.load(file)
# 为每个文档添加指定的 _id
# print(data["data"][0]["course_id"])
if isinstance(data, list):
for i, document in enumerate(data):
document["_id"] = course_id
else:
data["_id"] = course_id
if isinstance(data, list):
collection.insert_many(data)
else:
collection.insert_one(data)
except FileNotFoundError:
print(f"错误:文件 {file_path} 未找到。")
except Exception as e:
print(f"错误:处理文件 {file_path} 时出现未知错误:{e}")
id_to_query = str(1)
try:
# 根据 _id 查询单个文档
document = collection.find_one({"_id": id_to_query})
if document:
# 移除 _id 字段中的 ObjectId 对象,因为它不能直接被 JSON 序列化
document.pop("_id", None)
# 将查询结果转换为 JSON 字符串
json_str = json.dumps(document)
# 使用 json.loads 加载 JSON 字符串
loaded_data = json.loads(json_str)
print("加载后的数据:")
print(loaded_data)
else:
print(f"未找到 _id 为 {id_to_query} 的文档。")
except Exception as e:
print(f"错误:查询或处理数据时出现未知错误:{e}")
# 关闭连接
client.close()

18
logging_config.py Normal file
View File

@@ -0,0 +1,18 @@
import logging
def setup_logging():
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(module)s - %(message)s',
filename='app.log',
filemode='a'
)
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(module)s - %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
return logging.getLogger(__name__)

View File

@@ -1,9 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from course import get_course from course import get_course
from course_list import get_list from course_list import insert_data
from markdown_generator import get_content from markdown_generator import get_content
if __name__ == '__main__': if __name__ == '__main__':
get_list() insert_data()
get_course() get_course()
get_content() get_content()

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import configparser import configparser
import logging
import os import os
import shutil import shutil
import sqlite3
from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ThreadPoolExecutor
from os import makedirs from os import makedirs
@@ -10,16 +10,14 @@ import requests
from gradio_client import Client, handle_file from gradio_client import Client, handle_file
import json import json
from logging_config import setup_logging
# 读取配置文件 # 读取配置文件
config = configparser.ConfigParser() config = configparser.ConfigParser()
config.read('config.ini') config.read('config.ini')
max_download_threads = int(config['DEFAULT']['max_download_threads']) max_download_threads = int(config['DEFAULT']['max_download_threads'])
# 设置日志配置 logger = setup_logging()
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
import sqlite3
# 定义创建表的SQL语句 # 定义创建表的SQL语句
CREATE_TABLE_SQL = """ CREATE_TABLE_SQL = """
@@ -47,9 +45,9 @@ def create_audio_transcriptions_table(db_path):
try: try:
# 执行创建表的SQL语句 # 执行创建表的SQL语句
cursor.execute(CREATE_TABLE_SQL) cursor.execute(CREATE_TABLE_SQL)
logging.info("表audio_transcriptions创建成功。") logger.info("表audio_transcriptions创建成功。")
except sqlite3.Error as e: except sqlite3.Error as e:
logging.error(f"创建表时出错: {e}") logger.error(f"创建表时出错: {e}")
finally: finally:
# 关闭数据库连接 # 关闭数据库连接
conn.close() conn.close()
@@ -71,7 +69,7 @@ def download_file(url, local_path):
raise FileNotFoundError(f"文件下载后未找到:{local_path}") raise FileNotFoundError(f"文件下载后未找到:{local_path}")
return local_path return local_path
except Exception as e: except Exception as e:
logging.error(f"下载文件时出错:{e}") logger.error(f"下载文件时出错:{e}")
return None return None
@@ -84,7 +82,7 @@ def voice2txt(voice_path):
language="zh", language="zh",
api_name="/model_inference" api_name="/model_inference"
) )
logging.info(text) logger.info(text)
return text return text
@@ -112,15 +110,15 @@ def audio_to_text(audio_url, filename, course_id):
# 检查数据库中是否已存在转换后的文本 # 检查数据库中是否已存在转换后的文本
db_text = check_db_for_text(course_id, filename) db_text = check_db_for_text(course_id, filename)
if db_text: if db_text:
logging.info(f"文本已存在,无需重复转换:{filename}") logger.info(f"文本已存在,无需重复转换:{filename}")
return db_text # 返回已存在的文本 return db_text # 返回已存在的文本
try: try:
logging.info(f"Downloading audio file: {audio_url}") logger.info(f"Downloading audio file: {audio_url}")
download_path = os.path.join('course', filename) download_path = os.path.join('course', filename)
local_audio_path = download_file(audio_url, download_path) local_audio_path = download_file(audio_url, download_path)
if local_audio_path is None: if local_audio_path is None:
logging.error("音频文件下载失败") logger.error("音频文件下载失败")
return "音频文件下载失败" return "音频文件下载失败"
text_value = voice2txt(local_audio_path) text_value = voice2txt(local_audio_path)
if text_value: # 只有当转换成功时才保存到数据库 if text_value: # 只有当转换成功时才保存到数据库
@@ -128,7 +126,7 @@ def audio_to_text(audio_url, filename, course_id):
os.remove(local_audio_path) os.remove(local_audio_path)
return text_value return text_value
except Exception as e: except Exception as e:
logging.error(f"转换音频到文本时出错:{e}") logger.error(f"转换音频到文本时出错:{e}")
return f"音频转文本失败: {e}" return f"音频转文本失败: {e}"
@@ -158,11 +156,11 @@ def process_logseq_item(item):
def json_to_markdown(json_file, markdown_file, logseq=False): def json_to_markdown(json_file, markdown_file, logseq=False):
try: try:
logging.info(f"Reading JSON file: {json_file}") logger.info(f"Reading JSON file: {json_file}")
with open(json_file, 'r', encoding='utf-8') as file: with open(json_file, 'r', encoding='utf-8') as file:
data = json.load(file) data = json.load(file)
logging.info(f"Writing Markdown file: {markdown_file}") logger.info(f"Writing Markdown file: {markdown_file}")
with open(markdown_file, 'w', encoding='utf-8') as md_file: with open(markdown_file, 'w', encoding='utf-8') as md_file:
with ThreadPoolExecutor(max_workers=max_download_threads) as executor: # Use a thread pool with 5 threads with ThreadPoolExecutor(max_workers=max_download_threads) as executor: # Use a thread pool with 5 threads
futures = [executor.submit(process_logseq_item if logseq else process_item, item) for item in futures = [executor.submit(process_logseq_item if logseq else process_item, item) for item in
@@ -171,7 +169,7 @@ def json_to_markdown(json_file, markdown_file, logseq=False):
md_file.write(future.result()) # Write the result to the Markdown file md_file.write(future.result()) # Write the result to the Markdown file
except Exception as e: except Exception as e:
logging.error(f"处理JSON文件时出错{e}") logger.error(f"处理JSON文件时出错{e}")
def get_content(): def get_content():
@@ -181,9 +179,9 @@ def get_content():
max_course_id = cursor.execute('SELECT id FROM courses ORDER BY id DESC LIMIT 1') # 获取数据库中最大的课程ID max_course_id = cursor.execute('SELECT id FROM courses ORDER BY id DESC LIMIT 1') # 获取数据库中最大的课程ID
if max_course_id: if max_course_id:
max_course_id = max_course_id.fetchone()[0] max_course_id = max_course_id.fetchone()[0]
logging.info(f"The maximum course ID is {max_course_id}") logger.info(f"The maximum course ID is {max_course_id}")
else: else:
logging.info("No courses found in the database.") logger.info("No courses found in the database.")
max_course_id = 11 max_course_id = 11
start_course_id = max_course_id - 5 start_course_id = max_course_id - 5
@@ -193,7 +191,7 @@ def get_content():
course_ids_data = cursor.fetchall() course_ids_data = cursor.fetchall()
course_ids = [row[0] for row in course_ids_data] course_ids = [row[0] for row in course_ids_data]
course_ids_dict = dict(course_ids_data) course_ids_dict = dict(course_ids_data)
logging.info(course_ids_dict) logger.info(course_ids_dict)
# 创建json文件夹 # 创建json文件夹
if not os.path.exists('json'): if not os.path.exists('json'):
@@ -201,7 +199,7 @@ def get_content():
# 先请求全部的链接获取数据,并将获取到的课程信息保存到数据库中 # 先请求全部的链接获取数据,并将获取到的课程信息保存到数据库中
for course_id in course_ids: for course_id in course_ids:
logging.info(f"Processing course ID: {course_id}") logger.info(f"Processing course ID: {course_id}")
json_filename = os.path.join('json', f'{course_id}.json') json_filename = os.path.join('json', f'{course_id}.json')
# copy_json_file_name = os.path.join('data', 'json', f'{course_ids_dict[course_id]}.json').replace('?', '') # copy_json_file_name = os.path.join('data', 'json', f'{course_ids_dict[course_id]}.json').replace('?', '')
@@ -210,7 +208,7 @@ def get_content():
# md_file_name = os.path.join('data', 'markdown', f'{course_ids_dict[course_id]}.md') # md_file_name = os.path.join('data', 'markdown', f'{course_ids_dict[course_id]}.md')
md_file_name = os.path.join('course', f'{course_id}', f'{course_ids_dict[course_id]}.md') md_file_name = os.path.join('course', f'{course_id}', f'{course_ids_dict[course_id]}.md')
if os.path.exists(json_filename): if os.path.exists(json_filename):
logging.info(f"Course {course_id} JSON file already exists, using local file.") logger.info(f"Course {course_id} JSON file already exists, using local file.")
makedirs(f'course/{course_id}/json', exist_ok=True) makedirs(f'course/{course_id}/json', exist_ok=True)
shutil.copy2(json_filename, copy_json_file_name) shutil.copy2(json_filename, copy_json_file_name)
json_to_markdown(copy_json_file_name, md_file_name) json_to_markdown(copy_json_file_name, md_file_name)
@@ -219,7 +217,7 @@ def get_content():
logseq_md_file_name = os.path.join('course', f'{course_id}', f'{course_ids_dict[course_id]}_logseq.md') logseq_md_file_name = os.path.join('course', f'{course_id}', f'{course_ids_dict[course_id]}_logseq.md')
if os.path.exists(json_filename): if os.path.exists(json_filename):
logging.info(f"Course {course_id} JSON file already exists, using local file.") logger.info(f"Course {course_id} JSON file already exists, using local file.")
shutil.copy2(json_filename, copy_json_file_name) shutil.copy2(json_filename, copy_json_file_name)
json_to_markdown(copy_json_file_name, logseq_md_file_name, logseq=True) json_to_markdown(copy_json_file_name, logseq_md_file_name, logseq=True)
else: else:

56
mongo_manager.py Normal file
View File

@@ -0,0 +1,56 @@
import json
import os
from pymongo import MongoClient
# 连接到 MongoDB
client = MongoClient('mongodb://root:lostecho@192.168.31.3:27017/')
# 选择数据库
db = client['songyi']
# 选择集合
collection = db['course_content']
def insert_course_content(file_path):
file_name = os.path.basename(file_path)
course_id = file_name
print(course_id)
try:
with open(file_path, 'r', encoding='utf-8-sig') as file:
data = json.load(file)
if isinstance(data, list):
for i, document in enumerate(data):
document["_id"] = course_id
else:
data["_id"] = course_id
if isinstance(data, list):
collection.insert_many(data)
else:
collection.insert_one(data)
except FileNotFoundError:
print(f"错误:文件 {file_path} 未找到。")
except Exception as e:
print(f"错误:处理文件 {file_path} 时出现未知错误:{e}")
def get_course_content(id_to_query):
try:
# 根据 _id 查询单个文档
document = collection.find_one({"_id": id_to_query})
if document:
# 移除 _id 字段中的 ObjectId 对象,因为它不能直接被 JSON 序列化
document.pop("_id", None)
# 将查询结果转换为 JSON 字符串
json_str = json.dumps(document)
# 使用 json.loads 加载 JSON 字符串
loaded_data = json.loads(json_str)
print("加载后的数据:" + loaded_data)
return json_str
else:
print(f"未找到 _id 为 {id_to_query} 的文档。")
except Exception as e:
print(f"错误:查询或处理数据时出现未知错误:{e}")

View File

@@ -4,6 +4,7 @@ version = "0.1.0"
description = "Add your description here" description = "Add your description here"
requires-python = ">=3.12" requires-python = ">=3.12"
dependencies = [ dependencies = [
"psycopg2-binary==2.9.10",
"pydub==0.25.1", "pydub==0.25.1",
"requests==2.32.3", "requests~=2.32.3",
] ]

35
uv.lock generated
View File

@@ -54,6 +54,37 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
] ]
[[package]]
name = "psycopg2-binary"
version = "2.9.10"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/cb/0e/bdc8274dc0585090b4e3432267d7be4dfbfd8971c0fa59167c711105a6bf/psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2", size = 385764 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/49/7d/465cc9795cf76f6d329efdafca74693714556ea3891813701ac1fee87545/psycopg2_binary-2.9.10-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0", size = 3044771 },
{ url = "https://files.pythonhosted.org/packages/8b/31/6d225b7b641a1a2148e3ed65e1aa74fc86ba3fee850545e27be9e1de893d/psycopg2_binary-2.9.10-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a", size = 3275336 },
{ url = "https://files.pythonhosted.org/packages/30/b7/a68c2b4bff1cbb1728e3ec864b2d92327c77ad52edcd27922535a8366f68/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539", size = 2851637 },
{ url = "https://files.pythonhosted.org/packages/0b/b1/cfedc0e0e6f9ad61f8657fd173b2f831ce261c02a08c0b09c652b127d813/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526", size = 3082097 },
{ url = "https://files.pythonhosted.org/packages/18/ed/0a8e4153c9b769f59c02fb5e7914f20f0b2483a19dae7bf2db54b743d0d0/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1", size = 3264776 },
{ url = "https://files.pythonhosted.org/packages/10/db/d09da68c6a0cdab41566b74e0a6068a425f077169bed0946559b7348ebe9/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e", size = 3020968 },
{ url = "https://files.pythonhosted.org/packages/94/28/4d6f8c255f0dfffb410db2b3f9ac5218d959a66c715c34cac31081e19b95/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f", size = 2872334 },
{ url = "https://files.pythonhosted.org/packages/05/f7/20d7bf796593c4fea95e12119d6cc384ff1f6141a24fbb7df5a668d29d29/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00", size = 2822722 },
{ url = "https://files.pythonhosted.org/packages/4d/e4/0c407ae919ef626dbdb32835a03b6737013c3cc7240169843965cada2bdf/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5", size = 2920132 },
{ url = "https://files.pythonhosted.org/packages/2d/70/aa69c9f69cf09a01da224909ff6ce8b68faeef476f00f7ec377e8f03be70/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47", size = 2959312 },
{ url = "https://files.pythonhosted.org/packages/d3/bd/213e59854fafe87ba47814bf413ace0dcee33a89c8c8c814faca6bc7cf3c/psycopg2_binary-2.9.10-cp312-cp312-win32.whl", hash = "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64", size = 1025191 },
{ url = "https://files.pythonhosted.org/packages/92/29/06261ea000e2dc1e22907dbbc483a1093665509ea586b29b8986a0e56733/psycopg2_binary-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0", size = 1164031 },
{ url = "https://files.pythonhosted.org/packages/3e/30/d41d3ba765609c0763505d565c4d12d8f3c79793f0d0f044ff5a28bf395b/psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d", size = 3044699 },
{ url = "https://files.pythonhosted.org/packages/35/44/257ddadec7ef04536ba71af6bc6a75ec05c5343004a7ec93006bee66c0bc/psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb", size = 3275245 },
{ url = "https://files.pythonhosted.org/packages/1b/11/48ea1cd11de67f9efd7262085588790a95d9dfcd9b8a687d46caf7305c1a/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7", size = 2851631 },
{ url = "https://files.pythonhosted.org/packages/62/e0/62ce5ee650e6c86719d621a761fe4bc846ab9eff8c1f12b1ed5741bf1c9b/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d", size = 3082140 },
{ url = "https://files.pythonhosted.org/packages/27/ce/63f946c098611f7be234c0dd7cb1ad68b0b5744d34f68062bb3c5aa510c8/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73", size = 3264762 },
{ url = "https://files.pythonhosted.org/packages/43/25/c603cd81402e69edf7daa59b1602bd41eb9859e2824b8c0855d748366ac9/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673", size = 3020967 },
{ url = "https://files.pythonhosted.org/packages/5f/d6/8708d8c6fca531057fa170cdde8df870e8b6a9b136e82b361c65e42b841e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f", size = 2872326 },
{ url = "https://files.pythonhosted.org/packages/ce/ac/5b1ea50fc08a9df82de7e1771537557f07c2632231bbab652c7e22597908/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909", size = 2822712 },
{ url = "https://files.pythonhosted.org/packages/c4/fc/504d4503b2abc4570fac3ca56eb8fed5e437bf9c9ef13f36b6621db8ef00/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1", size = 2920155 },
{ url = "https://files.pythonhosted.org/packages/b2/d1/323581e9273ad2c0dbd1902f3fb50c441da86e894b6e25a73c3fda32c57e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567", size = 2959356 },
{ url = "https://files.pythonhosted.org/packages/08/50/d13ea0a054189ae1bc21af1d85b6f8bb9bbc5572991055d70ad9006fe2d6/psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142", size = 2569224 },
]
[[package]] [[package]]
name = "pydub" name = "pydub"
version = "0.25.1" version = "0.25.1"
@@ -83,14 +114,16 @@ name = "songyi"
version = "0.1.0" version = "0.1.0"
source = { virtual = "." } source = { virtual = "." }
dependencies = [ dependencies = [
{ name = "psycopg2-binary" },
{ name = "pydub" }, { name = "pydub" },
{ name = "requests" }, { name = "requests" },
] ]
[package.metadata] [package.metadata]
requires-dist = [ requires-dist = [
{ name = "psycopg2-binary", specifier = "==2.9.10" },
{ name = "pydub", specifier = "==0.25.1" }, { name = "pydub", specifier = "==0.25.1" },
{ name = "requests", specifier = "==2.32.3" }, { name = "requests", specifier = "~=2.32.3" },
] ]
[[package]] [[package]]