import os
|
import threading
|
from auto_media_publisher.utils.uploader_helper import create_and_run_uploader
|
from auto_media_publisher.config.conf_base import COOKIE_DIR,VIDEO_DIR_FINAL,MAX_VIDEO_FILES
|
from auto_media_publisher.utils.logger import PLATFORM_LOGGER
|
from auto_media_publisher.utils.utils_file import load_json
|
from auto_media_publisher.proxy.proxy_manager import get_user_proxy
|
from auto_media_publisher.task.task_generator import UserManager
|
import asyncio
|
user_manager = UserManager()
|
|
def find_pending_medias(user_dir):
|
video_json_paths = []
|
for root, dirs, files in os.walk(user_dir):
|
for file in files:
|
if file.endswith(".json") and not file.endswith(".json.ok"):
|
json_path = os.path.join(root, file)
|
if os.path.exists(json_path):
|
video_json_paths.append(json_path)
|
if len(video_json_paths) >= MAX_VIDEO_FILES:
|
return video_json_paths
|
return video_json_paths
|
|
async def upload_user_medias(user):
|
PLATFORM_LOGGER.info(f"[THREAD] Starting upload for user: {user}")
|
cookie_path = os.path.join(COOKIE_DIR, user)
|
video_dir_path = os.path.join(VIDEO_DIR_FINAL, user)
|
|
#platforms = [f.split(".")[0] for f in os.listdir(cookie_path) if f.endswith(".json")]
|
platforms = user_manager.get_user_platforms(user)
|
PLATFORM_LOGGER.info(f"[THREAD] user {user} has {len(platforms)} platforms . which is/are:{platforms}")
|
video_jsons = find_pending_medias(video_dir_path)
|
proxy = get_user_proxy(user)
|
|
for video_json_path in video_jsons:
|
video_json_data = load_json(video_json_path)
|
for platform in platforms:
|
PLATFORM_LOGGER.info(f"[INFO] User {user} -> Platform {platform}, uploading {len(video_jsons)} medias")
|
await create_and_run_uploader(platform=platform,json_data=video_json_data,proxy=proxy)
|
video_json_data["platform"] = platform
|
user_manager.insert_upload_logs_from_json(video_json_data)
|
os.rename(video_json_path, video_json_path + ".ok")
|
|
|
|
def start_user_threads():
|
users = user_manager.get_enabled_users()
|
PLATFORM_LOGGER.info(f"[INFO] Found users: {users}")
|
|
threads = []
|
|
def run_async_upload(user):
|
loop = asyncio.new_event_loop()
|
asyncio.set_event_loop(loop)
|
try:
|
loop.run_until_complete(upload_user_medias(user))
|
finally:
|
loop.close()
|
|
for user in users:
|
thread = threading.Thread(target=run_async_upload, args=(user,))
|
thread.start()
|
threads.append(thread)
|
|
# 🔴 等待所有线程完成再退出主进程
|
for thread in threads:
|
thread.join()
|
|
|
if __name__ == "__main__":
|
start_user_threads()
|