facetest / facefusion /jobs /job_manager.py
LULDev's picture
Upload folder using huggingface_hub
a1da63c verified
raw
history blame
6.56 kB
import glob
import os
from copy import copy
from typing import List, Optional
from facefusion.choices import job_statuses
from facefusion.date_helper import get_current_date_time
from facefusion.filesystem import create_directory, is_directory, is_file, move_file, remove_directory, remove_file
from facefusion.jobs.job_helper import get_step_output_path
from facefusion.json import read_json, write_json
from facefusion.temp_helper import create_base_directory
from facefusion.typing import Args, Job, JobSet, JobStatus, JobStep, JobStepStatus
JOBS_PATH : Optional[str] = None
def init_jobs(jobs_path : str) -> bool:
global JOBS_PATH
JOBS_PATH = jobs_path
job_status_paths = [ os.path.join(JOBS_PATH, job_status) for job_status in job_statuses ]
create_base_directory()
for job_status_path in job_status_paths:
create_directory(job_status_path)
return all(is_directory(status_path) for status_path in job_status_paths)
def clear_jobs(jobs_path : str) -> bool:
return remove_directory(jobs_path)
def create_job(job_id : str) -> bool:
job : Job =\
{
'version': '1',
'date_created': get_current_date_time().isoformat(),
'date_updated': None,
'steps': []
}
return create_job_file(job_id, job)
def submit_job(job_id : str) -> bool:
drafted_job_ids = find_job_ids('drafted')
steps = get_steps(job_id)
if job_id in drafted_job_ids and steps:
return set_steps_status(job_id, 'queued') and move_job_file(job_id, 'queued')
return False
def submit_jobs() -> bool:
drafted_job_ids = find_job_ids('drafted')
if drafted_job_ids:
for job_id in drafted_job_ids:
if not submit_job(job_id):
return False
return True
return False
def delete_job(job_id : str) -> bool:
return delete_job_file(job_id)
def delete_jobs() -> bool:
job_ids = find_job_ids('drafted') + find_job_ids('queued') + find_job_ids('failed') + find_job_ids('completed')
if job_ids:
for job_id in job_ids:
if not delete_job(job_id):
return False
return True
return False
def find_jobs(job_status : JobStatus) -> JobSet:
job_ids = find_job_ids(job_status)
jobs : JobSet = {}
for job_id in job_ids:
jobs[job_id] = read_job_file(job_id)
return jobs
def find_job_ids(job_status : JobStatus) -> List[str]:
job_pattern = os.path.join(JOBS_PATH, job_status, '*.json')
job_files = glob.glob(job_pattern)
job_files.sort(key = os.path.getmtime)
job_ids = []
for job_file in job_files:
job_id, _ = os.path.splitext(os.path.basename(job_file))
job_ids.append(job_id)
return job_ids
def validate_job(job_id : str) -> bool:
job = read_job_file(job_id)
return bool(job and 'version' in job and 'date_created' in job and 'date_updated' in job and 'steps' in job)
def has_step(job_id : str, step_index : int) -> bool:
step_total = count_step_total(job_id)
return step_index in range(step_total)
def add_step(job_id : str, step_args : Args) -> bool:
job = read_job_file(job_id)
if job:
job.get('steps').append(
{
'args': step_args,
'status': 'drafted'
})
return update_job_file(job_id, job)
return False
def remix_step(job_id : str, step_index : int, step_args : Args) -> bool:
steps = get_steps(job_id)
step_args = copy(step_args)
if step_index and step_index < 0:
step_index = count_step_total(job_id) - 1
if has_step(job_id, step_index):
output_path = steps[step_index].get('args').get('output_path')
step_args['target_path'] = get_step_output_path(job_id, step_index, output_path)
return add_step(job_id, step_args)
return False
def insert_step(job_id : str, step_index : int, step_args : Args) -> bool:
job = read_job_file(job_id)
step_args = copy(step_args)
if step_index and step_index < 0:
step_index = count_step_total(job_id) - 1
if job and has_step(job_id, step_index):
job.get('steps').insert(step_index,
{
'args': step_args,
'status': 'drafted'
})
return update_job_file(job_id, job)
return False
def remove_step(job_id : str, step_index : int) -> bool:
job = read_job_file(job_id)
if step_index and step_index < 0:
step_index = count_step_total(job_id) - 1
if job and has_step(job_id, step_index):
job.get('steps').pop(step_index)
return update_job_file(job_id, job)
return False
def get_steps(job_id : str) -> List[JobStep]:
job = read_job_file(job_id)
if job:
return job.get('steps')
return []
def count_step_total(job_id : str) -> int:
steps = get_steps(job_id)
if steps:
return len(steps)
return 0
def set_step_status(job_id : str, step_index : int, step_status : JobStepStatus) -> bool:
job = read_job_file(job_id)
if job:
steps = job.get('steps')
if has_step(job_id, step_index):
steps[step_index]['status'] = step_status
return update_job_file(job_id, job)
return False
def set_steps_status(job_id : str, step_status : JobStepStatus) -> bool:
job = read_job_file(job_id)
if job:
for step in job.get('steps'):
step['status'] = step_status
return update_job_file(job_id, job)
return False
def read_job_file(job_id : str) -> Optional[Job]:
job_path = find_job_path(job_id)
return read_json(job_path) #type:ignore[return-value]
def create_job_file(job_id : str, job : Job) -> bool:
job_path = find_job_path(job_id)
if not is_file(job_path):
job_create_path = suggest_job_path(job_id, 'drafted')
return write_json(job_create_path, job) #type:ignore[arg-type]
return False
def update_job_file(job_id : str, job : Job) -> bool:
job_path = find_job_path(job_id)
if is_file(job_path):
job['date_updated'] = get_current_date_time().isoformat()
return write_json(job_path, job) #type:ignore[arg-type]
return False
def move_job_file(job_id : str, job_status : JobStatus) -> bool:
job_path = find_job_path(job_id)
job_move_path = suggest_job_path(job_id, job_status)
return move_file(job_path, job_move_path)
def delete_job_file(job_id : str) -> bool:
job_path = find_job_path(job_id)
return remove_file(job_path)
def suggest_job_path(job_id : str, job_status : JobStatus) -> Optional[str]:
job_file_name = get_job_file_name(job_id)
if job_file_name:
return os.path.join(JOBS_PATH, job_status, job_file_name)
return None
def find_job_path(job_id : str) -> Optional[str]:
job_file_name = get_job_file_name(job_id)
if job_file_name:
for job_status in job_statuses:
job_pattern = os.path.join(JOBS_PATH, job_status, job_file_name)
job_paths = glob.glob(job_pattern)
for job_path in job_paths:
return job_path
return None
def get_job_file_name(job_id : str) -> Optional[str]:
if job_id:
return job_id + '.json'
return None