cli_main.py 7.15 KB
import argparse
import asyncio
from datetime import datetime
from os.path import exists
from pathlib import Path

from conf import BASE_DIR
from uploader.douyin_uploader.main import douyin_setup, DouYinVideo
from uploader.ks_uploader.main import ks_setup, KSVideo
from uploader.tencent_uploader.main import weixin_setup, TencentVideo
from uploader.tk_uploader.main_chrome import tiktok_setup, TiktokVideo
from uploader.xhs_uploader.main import xhs_setup, XHSVideo
from uploader.wyh_uploader.main import wyh_setup
from uploader.sohu_uploader.main import sohu_setup, SOHUVideo
from uploader.toutiao_uploader.main import toutiao_setup
from utils.base_social_media import get_supported_social_media, get_cli_action, SOCIAL_MEDIA_DOUYIN, \
    SOCIAL_MEDIA_TENCENT, SOCIAL_MEDIA_TIKTOK, SOCIAL_MEDIA_KUAISHOU, SOCIAL_MEDIA_WANGYIHAO, \
    SOCIAL_MEDIA_XHS, SOCIAL_MEDIA_TOUTIAO, SOCIAL_MEDIA_BAIJIAHAO, SOCIAL_MEDIA_SOHU
from utils.constant import TencentZoneTypes
from utils.files_times import get_title_and_hashtags


def parse_schedule(schedule_raw):
    if schedule_raw:
        schedule = datetime.strptime(schedule_raw, '%Y-%m-%d %H:%M')
    else:
        schedule = None
    return schedule


async def main():
    # 主解析器
    parser = argparse.ArgumentParser(description="Upload video to multiple social-media.")
    parser.add_argument("platform", metavar='platform', choices=get_supported_social_media(), help="Choose social-media platform: douyin tencent tiktok kuaishou")

    parser.add_argument("account_name", type=str, help="Account name for the platform: xiaoA")
    subparsers = parser.add_subparsers(dest="action", metavar='action', help="Choose action", required=True)

    actions = get_cli_action()
    for action in actions:
        action_parser = subparsers.add_parser(action, help=f'{action} operation')
        if action == 'login':
            # Login 不需要额外参数
            continue
        elif action == 'upload':
            action_parser.add_argument("video_file", help="Path to the Video file")
            action_parser.add_argument("-pt", "--publish_type", type=int, choices=[0, 1],
                                       help="0 for immediate, 1 for scheduled", default=0)
            action_parser.add_argument('-t', '--schedule', help='Schedule UTC time in %Y-%m-%d %H:%M format')

    # 解析命令行参数
    args = parser.parse_args()
    # 参数校验
    if args.action == 'upload':
        if not exists(args.video_file):
            raise FileNotFoundError(f'Could not find the video file at {args["video_file"]}')
        if args.publish_type == 1 and not args.schedule:
            parser.error("The schedule must must be specified for scheduled publishing.")

    account_file = Path(BASE_DIR / "cookies" / f"{args.platform}_uploader" / f"{args.platform}_{args.account_name}.json")
    account_file.parent.mkdir(exist_ok=True)

    print(account_file)

    # 根据 action 处理不同的逻辑
    if args.action == 'login':
        print(f"Logging in with account {args.account_name} on platform {args.platform}")
        if args.platform == SOCIAL_MEDIA_DOUYIN:
            await douyin_setup(str(account_file), handle=True)
        elif args.platform == SOCIAL_MEDIA_TIKTOK:
            await tiktok_setup(str(account_file), handle=True)
        elif args.platform == SOCIAL_MEDIA_TENCENT:
            await weixin_setup(str(account_file), handle=True)
        elif args.platform == SOCIAL_MEDIA_KUAISHOU:
            await ks_setup(str(account_file), handle=True)
        elif args.platform == SOCIAL_MEDIA_WANGYIHAO:
            await wyh_setup(str(account_file), handle=True, auto=False)
        # elif args.platform == SOCIAL_MEDIA_XHS:
        #     await xhs_setup(str(account_file), handle=True)
            await wyh_setup(str(account_file), handle=True)
        elif args.platform == SOCIAL_MEDIA_XHS:
            await xhs_setup(str(account_file), handle=True)
        elif args.platform == SOCIAL_MEDIA_TOUTIAO:
            await toutiao_setup(str(account_file), handle=True, auto=False)
        elif args.platform == SOCIAL_MEDIA_BAIJIAHAO:
            await toutiao_setup(str(account_file), handle=True, auto=False)
        elif args.platform == SOCIAL_MEDIA_SOHU:
            await sohu_setup(str(account_file), handle=True)

    elif args.action == 'auto_login':
        print(f"auto Logging in with account {args.account_name} on platform {args.platform}")
        if args.platform == SOCIAL_MEDIA_DOUYIN:
            await douyin_setup(str(account_file), handle=True)
        elif args.platform == SOCIAL_MEDIA_TIKTOK:
            await tiktok_setup(str(account_file), handle=True)
        elif args.platform == SOCIAL_MEDIA_TENCENT:
            await weixin_setup(str(account_file), handle=True)
        elif args.platform == SOCIAL_MEDIA_KUAISHOU:
            await ks_setup(str(account_file), handle=True)
        elif args.platform == SOCIAL_MEDIA_WANGYIHAO:
            await wyh_setup(str(account_file), handle=True, auto=True)
        # elif args.platform == SOCIAL_MEDIA_XHS:
        #     await xhs_setup(str(account_file), handle=True)
        elif args.platform == SOCIAL_MEDIA_TOUTIAO:
            await toutiao_setup(str(account_file), handle=True, auto=True)
        elif args.platform == SOCIAL_MEDIA_BAIJIAHAO:
            await toutiao_setup(str(account_file), handle=True, auto=True)
            await toutiao_setup(str(account_file), handle=True)
        elif args.platform == SOCIAL_MEDIA_SOHU:
            await sohu_setup(str(account_file), handle=True)

    elif args.action == 'upload':
        title, tags = get_title_and_hashtags(args.video_file)
        video_file = args.video_file

        if args.publish_type == 0:
            print("Uploading immediately...")
            publish_date = 0
        else:
            print("Scheduling videos...")
            publish_date = parse_schedule(args.schedule)

        if args.platform == SOCIAL_MEDIA_DOUYIN:
            await douyin_setup(account_file, handle=False)
            app = DouYinVideo(title, video_file, tags, publish_date, account_file)
        elif args.platform == SOCIAL_MEDIA_TIKTOK:
            await tiktok_setup(account_file, handle=True)
            app = TiktokVideo(title, video_file, tags, publish_date, account_file)
        elif args.platform == SOCIAL_MEDIA_TENCENT:
            await weixin_setup(account_file, handle=True)
            category = TencentZoneTypes.LIFESTYLE.value  # 标记原创需要否则不需要传
            app = TencentVideo(title, video_file, tags, publish_date, account_file, category)
        elif args.platform == SOCIAL_MEDIA_KUAISHOU:
            await ks_setup(account_file, handle=True)
            app = KSVideo(title, video_file, tags, publish_date, account_file)
        elif args.platform == SOCIAL_MEDIA_XHS:
            await xhs_setup(account_file, handle=True)
            app = XHSVideo(title, video_file, tags, publish_date, account_file)
        elif args.platform == SOCIAL_MEDIA_SOHU:
            await sohu_setup(account_file, handle=True)
            app = SOHUVideo(title, video_file, tags, None, account_file)
        else:
            print("Wrong platform, please check your input")
            exit()

        await app.main()


if __name__ == "__main__":
    asyncio.run(main())