rebuild file struct
This commit is contained in:
82902
audio_transcription.log
82902
audio_transcription.log
File diff suppressed because it is too large
Load Diff
13
config.ini
13
config.ini
@@ -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
|
||||||
96
course.py
96
course.py
@@ -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()
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
注意力>时间>金钱
|
|
||||||
1. DeepSeek
|
|
||||||
2. 哪吒
|
|
||||||
任何 “生成式人工智能” 都是 ”可疑“ 的,要做事实核查才行,不能拿着它生成的东西直接使用……
|
|
||||||
工具越厉害,就越应该去锻炼自己的能力…… 因为工具是能力的放大器。
|
|
||||||
@@ -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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
1.定投财富
|
|
||||||
定投成长,读书写作
|
|
||||||
Garbage In, Garbage Out
|
|
||||||
定投陪家人
|
|
||||||
Simple Piano
|
|
||||||
https://scratch.mit.edu/projects/1104414057/
|
|
||||||
总结
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -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()
|
||||||
BIN
courses.db
BIN
courses.db
Binary file not shown.
64
fileconvert.py
Normal file
64
fileconvert.py
Normal 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
70
json/insert_mongodb.py
Normal 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
18
logging_config.py
Normal 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__)
|
||||||
4
main.py
4
main.py
@@ -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()
|
||||||
|
|||||||
@@ -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
56
mongo_manager.py
Normal 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}")
|
||||||
@@ -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
35
uv.lock
generated
@@ -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]]
|
||||||
|
|||||||
Reference in New Issue
Block a user