-
Notifications
You must be signed in to change notification settings - Fork 324
Open
@shpshp
Description
Использую следующий python-скрипт для загрузки видео mp4 в канал на vkvideo. Как к этому видео добавить субтитры? Встроенные в видео субтитры не видятся.
import vk_api import requests import json import os import glob import time import shutil import argparse from tqdm import tqdm import config class VKVideoUploader: def __init__(self, access_token): self.vk_session = vk_api.VkApi(token=access_token) self.vk = self.vk_session.get_api() def upload_to_group(self, video_path, group_id, title="Group Video", description=""): try: upload_server = self.vk.video.save( group_id=abs(group_id), name=title, description=description ) upload_url = upload_server['upload_url'] file_size = os.path.getsize(video_path) with open(video_path, 'rb') as video_data: print(f" Uploading to group: {title} ({file_size / (1024*1024):.2f} MB)") class ProgressBar: def __init__(self, total_size): self.total_size = total_size self.progress_bar = tqdm( total=total_size, unit='B', unit_scale=True, unit_divisor=1024, desc="Uploading", bar_format='{l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, {rate_fmt}]' ) self.uploaded = 0 def __call__(self, chunk): self.uploaded += len(chunk) self.progress_bar.update(len(chunk)) def close(self): self.progress_bar.close() class ReadableWithProgress: def __init__(self, file_obj, callback): self.file_obj = file_obj self.callback = callback self.total_read = 0 def read(self, size=-1): chunk = self.file_obj.read(size) if chunk and self.callback: self.callback(chunk) return chunk progress_tracker = ProgressBar(file_size) files = { 'video_file': ( os.path.basename(video_path), ReadableWithProgress(video_data, progress_tracker), 'video/mp4' ) } try: response = requests.post(upload_url, files=files) finally: progress_tracker.close() if response.status_code == 200: result = response.json() print(f"✅ Video '{title}' uploaded to group successfully!") return result else: print(f"❌ Upload failed for '{title}': {response.text}") return None except Exception as e: print(f"❌ Error uploading '{title}': {str(e)}") return None def upload_all_videos_to_group(input_folder, output_folder, group_id, uploader): video_files = glob.glob(os.path.join(input_folder, "*.mp4")) if not video_files: print("⚠️ No .mp4 files found in the input folder.") return os.makedirs(output_folder, exist_ok=True) print(f" Found {len(video_files)} video(s) to upload.") for i, video_path in enumerate(video_files, 1): file_size = os.path.getsize(video_path) print(f"{i}. {os.path.basename(video_path)} ({file_size / (1024*1024):.2f} MB)") print(f"\n{'='*60}") print(f" Overall Progress: 0/{len(video_files)} videos") print('='*60) successful_uploads = 0 failed_uploads = 0 for idx, video_path in enumerate(video_files, 1): filename = os.path.basename(video_path) title = os.path.splitext(filename)[0] print(f"\n Processing video {idx}/{len(video_files)}: {filename}") print(f"{'='*40}") result = uploader.upload_to_group( video_path=video_path, group_id=group_id, title=title, description=f"Uploaded {time.strftime('%Y-%m-%d %H:%M:%S')}" ) if result: successful_uploads += 1 try: dest_path = os.path.join(output_folder, filename) shutil.move(video_path, dest_path) print(f" Moved to: {dest_path}") except Exception as move_error: print(f"⚠️ Failed to move file: {move_error}") else: failed_uploads += 1 print(f"{'='*60}") print(f" Overall Progress: {idx}/{len(video_files)} videos") print(f"✅ Successful: {successful_uploads} | ❌ Failed: {failed_uploads}") print(f"{'='*60}") if idx < len(video_files): print("⏳ Waiting 2 seconds before next upload...") time.sleep(2) print(f"\n{'='*60}") print(" UPLOAD SUMMARY") print(f"{'='*60}") print(f" Total videos found: {len(video_files)}") print(f"✅ Successfully uploaded: {successful_uploads}") print(f"❌ Failed: {failed_uploads}") print(f"{'='*60}") def main(): parser = argparse.ArgumentParser(description="Upload MP4 videos to a VK group.") parser.add_argument( "--input", type=str, default="input", help="Input folder containing .mp4 files (default: 'input')" ) parser.add_argument( "--output", type=str, default="output", help="Output folder to move uploaded videos (default: 'output')" ) parser.add_argument( "--group-id", type=int, default=config.DEFAULT_GROUP_ID, help=f"VK group ID (default: {config.DEFAULT_GROUP_ID})" ) args = parser.parse_args() if not os.path.isdir(args.input): print(f"❌ Input folder '{args.input}' does not exist.") return uploader = VKVideoUploader(config.ACCESS_TOKEN) upload_all_videos_to_group(args.input, args.output, args.group_id, uploader) if __name__ == "__main__": main()
Окружение
vk_api: 11.10.0
Metadata
Metadata
Assignees
Labels
No labels