def test_cluster_match_default_queue(self, mock_ffmpeg_details, mock_info_parser, mock_os_rename, mock_os_remove, mock_filter_threshold, mock_run_remote): setup = ConfigFile(self.get_setup()) # # setup all mocks # mock_run_remote.return_value = 0 mock_filter_threshold.return_value = True mock_os_rename.return_value = None mock_os_remove.return_value = None info = TranscoderTests.make_media('/dev/null', 'x264', 500, 480, 30 * 60, 420, 24, None, [], []) mock_info_parser.return_value = info mock_ffmpeg_details.return_value = info # # configure the cluster, add the job, and run # cluster = self.setup_cluster1(setup) qname, job = cluster.enqueue('/dev/null.mp4', None) self.assertEqual(qname, '_default', 'Job placed in wrong queue') self.assertEqual(job.profile_name, 'vintage_tv', 'Rule matched to wrong profile') cluster.testrun() for host in cluster.hosts: if host.hostname == 'workstation' and len(host._complete) > 0: dump_stats(host._complete) filename, elapsed = host.completed.pop() self.assertEqual('/dev/null.mp4', filename, 'Completed filename missing from assigned host') break
def start(): if len(sys.argv) == 2 and sys.argv[1] == '-h': print(f'pytrancoder (ver {__version__})') print('usage: pytrancoder [OPTIONS]') print(' or pytrancoder [OPTIONS] --from-file <filename>') print(' or pytrancoder [OPTIONS] file ...') print(' or pytrancoder -c <cluster> file... [--host <name>] -c <cluster> file...') print('No parameters indicates to process the default queue files using profile matching rules.') print( 'The --from-file filename is a file containing a list of full paths to files for transcoding. ') print('OPTIONS:') print(' --host <name> Name of a specific host in your cluster configuration to target, otherwise load-balanced') print(' -s Process files sequentially even if configured for multiple concurrent jobs') print(' --dry-run Run without actually transcoding or modifying anything, useful to test rules and profiles') print(' -v Verbose output, helpful in debugging profiles and rules') print( ' -k Keep source files after transcoding. If used, the transcoded file will have the same ' 'name and .tmp extension') print(' -y <file> Full path to configuration file. Default is ~/.transcode.yml') print(' -p profile to use. If used with --from-file, applies to all listed media in <filename>') print(' -m Add mixins to profile. Separate multiples with a comma') print('\n** PyPi Repo: https://pypi.org/project/pytranscoder-ffmpeg/') print('** Read the docs at https://pytranscoder.readthedocs.io/en/latest/') sys.exit(0) install_sigint_handler() files = list() profile = None mixins = None queue_path = None cluster = None configfile: Optional[ConfigFile] = None host_override = None if len(sys.argv) > 1: files = [] arg = 1 while arg < len(sys.argv): if sys.argv[arg] == '--from-file': # load filenames to encode from given file queue_path = sys.argv[arg + 1] arg += 1 tmpfiles = files_from_file(queue_path) if cluster is None: files.extend([(f, profile) for f in tmpfiles]) else: files.extend([(f, cluster) for f in tmpfiles]) elif sys.argv[arg] == '-p': # specific profile profile = sys.argv[arg + 1] arg += 1 elif sys.argv[arg] == '-y': # specify yaml config file arg += 1 configfile = ConfigFile(sys.argv[arg]) elif sys.argv[arg] == '-k': # keep original pytranscoder.keep_source = True elif sys.argv[arg] == '--dry-run': pytranscoder.dry_run = True elif sys.argv[arg] == '--host': # run all cluster encodes on specific host host_override = sys.argv[arg + 1] arg += 1 elif sys.argv[arg] == '-v': # verbose pytranscoder.verbose = True elif sys.argv[arg] == '-c': # cluster cluster = sys.argv[arg + 1] arg += 1 elif sys.argv[arg] == '-m': # mixins mixins = sys.argv[arg + 1].split(',') arg += 1 else: if os.name == "nt": expanded_files: List = glob.glob(sys.argv[arg]) # handle wildcards in Windows else: expanded_files = [sys.argv[arg]] for f in expanded_files: if cluster is None: files.append((f, profile, mixins)) else: files.append((f, cluster, profile, mixins)) arg += 1 if configfile is None: configfile = ConfigFile(DEFAULT_CONFIG) if not configfile.colorize: crayons.disable() else: crayons.enable() if len(files) == 0 and queue_path is None and configfile.default_queue_file is not None: # # load from list of files # tmpfiles = files_from_file(configfile.default_queue_file) queue_path = configfile.default_queue_file if cluster is None: files.extend([(f, profile, mixins) for f in tmpfiles]) else: files.extend([(f, cluster, profile) for f in tmpfiles]) if len(files) == 0: print(crayons.yellow(f'Nothing to do')) sys.exit(0) if cluster is not None: if host_override is not None: # disable all other hosts in-memory only - to force encodes to the designated host cluster_config = configfile.settings['clusters'] for cluster in cluster_config.values(): for name, this_config in cluster.items(): if name != host_override: this_config['status'] = 'disabled' completed: List = manage_clusters(files, configfile) if len(completed) > 0: qpath = queue_path if queue_path is not None else configfile.default_queue_file pathlist = [p for p, _ in completed] cleanup_queuefile(qpath, set(pathlist)) dump_stats(completed) sys.exit(0) host = LocalHost(configfile) host.enqueue_files(files) # # start all threads and wait for work to complete # host.start() if len(host.complete) > 0: completed_paths = [p for p, _ in host.complete] cleanup_queuefile(queue_path, set(completed_paths)) dump_stats(host.complete) os.system("stty sane")