| 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 utils.base_social_media import get_supported_social_media, get_cli_action, SOCIAL_MEDIA_DOUYIN, \ |
| SOCIAL_MEDIA_TENCENT, SOCIAL_MEDIA_TIKTOK, SOCIAL_MEDIA_KUAISHOU |
| 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': |
| |
| 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}_{args.account_name}.json") |
| account_file.parent.mkdir(exist_ok=True) |
|
|
| |
| 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.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) |
| else: |
| print("Wrong platform, please check your input") |
| exit() |
|
|
| await app.main() |
|
|
|
|
| if __name__ == "__main__": |
| asyncio.run(main()) |
|
|