diff --git a/facefusion/apis/endpoints/session.py b/facefusion/apis/endpoints/session.py index 7d3382c1..69444d45 100644 --- a/facefusion/apis/endpoints/session.py +++ b/facefusion/apis/endpoints/session.py @@ -9,6 +9,7 @@ from facefusion.apis import asset_store from facefusion.apis.session_helper import validate_api_key from facefusion.apis.stream_manager import destroy_stream from facefusion.filesystem import is_directory, remove_directory +from facefusion.jobs import job_manager async def create_session(request : Request) -> JSONResponse: @@ -29,6 +30,9 @@ async def create_session(request : Request) -> JSONResponse: process_manager.init() rtc_store.init() + jobs_path = state_manager.get_jobs_path() + job_manager.init_jobs(jobs_path) + return JSONResponse( { 'access_token': session.get('access_token'), diff --git a/facefusion/jobs/job_manager.py b/facefusion/jobs/job_manager.py index 4c9acda8..0f98c29e 100644 --- a/facefusion/jobs/job_manager.py +++ b/facefusion/jobs/job_manager.py @@ -3,6 +3,7 @@ from copy import copy from typing import List, Optional import facefusion.choices +from facefusion import state_manager from facefusion.filesystem import create_directory, get_file_name, is_directory, is_file, move_file, remove_directory, remove_file, resolve_file_pattern from facefusion.jobs.job_helper import get_step_output_path from facefusion.json import read_json, write_json @@ -10,14 +11,9 @@ from facefusion.sanitizer import sanitize_job_id from facefusion.time_helper import get_current_date_time from facefusion.types 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 facefusion.choices.job_statuses ] + job_status_paths = [ os.path.join(jobs_path, job_status) for job_status in facefusion.choices.job_statuses ] for job_status_path in job_status_paths: create_directory(job_status_path) @@ -91,13 +87,14 @@ def find_jobs(job_status : JobStatus) -> JobSet: def find_job_ids(job_status : JobStatus) -> List[str]: - job_pattern = os.path.join(JOBS_PATH, job_status, '*.json') - job_paths = resolve_file_pattern(job_pattern) - job_paths.sort(key = os.path.getmtime) + jobs_path = state_manager.get_jobs_path() + job_file_pattern = os.path.join(jobs_path, job_status, '*.json') + job_file_paths = resolve_file_pattern(job_file_pattern) + job_file_paths.sort(key = os.path.getmtime) job_ids = [] - for job_path in job_paths: - job_id = get_file_name(job_path) + for job_file_path in job_file_paths: + job_id = get_file_name(job_file_path) job_ids.append(job_id) return job_ids @@ -240,23 +237,25 @@ def delete_job_file(job_id : str) -> bool: def suggest_job_path(job_id : str, job_status : JobStatus) -> Optional[str]: + jobs_path = state_manager.get_jobs_path() 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 os.path.join(jobs_path, job_status, job_file_name) return None def find_job_path(job_id : str) -> Optional[str]: + jobs_path = state_manager.get_jobs_path() job_file_name = get_job_file_name(job_id) if job_file_name: for job_status in facefusion.choices.job_statuses: - job_pattern = os.path.join(JOBS_PATH, job_status, job_file_name) - job_paths = resolve_file_pattern(job_pattern) + job_file_pattern = os.path.join(jobs_path, job_status, job_file_name) + job_file_paths = resolve_file_pattern(job_file_pattern) - for job_path in job_paths: - return job_path + for job_file_path in job_file_paths: + return job_file_path return None diff --git a/tests/test_api_assets.py b/tests/test_api_assets.py index 071d616a..246029b6 100644 --- a/tests/test_api_assets.py +++ b/tests/test_api_assets.py @@ -9,7 +9,7 @@ from facefusion import ffmpeg, ffmpeg_builder, metadata, process_manager, sessio from facefusion.apis import asset_store from facefusion.apis.core import create_api from facefusion.download import conditional_download -from .assert_helper import get_test_example_file, get_test_examples_directory +from .assert_helper import get_test_example_file, get_test_examples_directory, get_test_jobs_directory @pytest.fixture(scope = 'module', autouse = True) @@ -42,6 +42,7 @@ def before_each() -> Iterator[None]: session_context.set_session_id(local_id) state_manager.init_item('temp_path', tempfile.gettempdir()) + state_manager.init_item('jobs_path', get_test_jobs_directory()) state_manager.init_item('temp_frame_format', 'png') session_manager.SESSIONS.clear() asset_store.delete_assets() diff --git a/tests/test_api_jobs.py b/tests/test_api_jobs.py index 0cd1ea0d..223da51a 100644 --- a/tests/test_api_jobs.py +++ b/tests/test_api_jobs.py @@ -37,8 +37,9 @@ def before_each() -> Iterator[None]: state_manager.init_item('source_paths', [ get_test_example_file('source.jpg') ]) state_manager.init_item('target_path', get_test_example_file('target-240p.mp4')) state_manager.init_item('temp_path', get_test_jobs_directory()) + state_manager.init_item('jobs_path', get_test_jobs_directory()) clear_jobs(get_test_jobs_directory()) - init_jobs(get_test_jobs_directory()) + init_jobs(state_manager.get_jobs_path()) yield @@ -62,6 +63,8 @@ def test_get_jobs(test_client : TestClient) -> None: }) create_session_body = create_session_response.json() access_token = create_session_body.get('access_token') + session_id = session_manager.find_session_id(access_token) + session_context.set_session_id(session_id) get_jobs_response = test_client.get('/jobs?status=invalid', headers = { @@ -83,6 +86,22 @@ def test_get_jobs(test_client : TestClient) -> None: assert 'job-test-get-jobs' in get_jobs_body assert get_jobs_response.status_code == 200 + create_session_response = test_client.post('/session', json = + { + 'client_version': metadata.get('version') + }) + create_session_body = create_session_response.json() + access_token = create_session_body.get('access_token') + + get_jobs_response = test_client.get('/jobs?status=drafted', headers = + { + 'Authorization': 'Bearer ' + access_token + }) + get_jobs_body = get_jobs_response.json() + + assert get_jobs_body == {} + assert get_jobs_response.status_code == 200 + def test_get_job(test_client : TestClient) -> None: get_job_response = test_client.get('/jobs/job-test-get-job') @@ -95,6 +114,8 @@ def test_get_job(test_client : TestClient) -> None: }) create_session_body = create_session_response.json() access_token = create_session_body.get('access_token') + session_id = session_manager.find_session_id(access_token) + session_context.set_session_id(session_id) get_job_response = test_client.get('/jobs/job-test-unknown', headers = { @@ -116,6 +137,22 @@ def test_get_job(test_client : TestClient) -> None: assert get_job_body.get('version') == '1' assert get_job_response.status_code == 200 + create_session_response = test_client.post('/session', json = + { + 'client_version': metadata.get('version') + }) + create_session_body = create_session_response.json() + access_token = create_session_body.get('access_token') + + get_job_response = test_client.get('/jobs/job-test-get-job', headers = + { + 'Authorization': 'Bearer ' + access_token + }) + get_job_body = get_job_response.json() + + assert get_job_body.get('message') == 'job not found' + assert get_job_response.status_code == 404 + def test_create_job(test_client : TestClient) -> None: create_job_response = test_client.post('/jobs') @@ -128,6 +165,8 @@ def test_create_job(test_client : TestClient) -> None: }) create_session_body = create_session_response.json() access_token = create_session_body.get('access_token') + session_id = session_manager.find_session_id(access_token) + session_context.set_session_id(session_id) create_job_response = test_client.post('/jobs', headers = { @@ -167,6 +206,8 @@ def test_submit_jobs(test_client : TestClient) -> None: }) create_session_body = create_session_response.json() access_token = create_session_body.get('access_token') + session_id = session_manager.find_session_id(access_token) + session_context.set_session_id(session_id) submit_jobs_response = test_client.patch('/jobs?action=invalid', headers = { @@ -218,6 +259,8 @@ def test_submit_job(test_client : TestClient) -> None: }) create_session_body = create_session_response.json() access_token = create_session_body.get('access_token') + session_id = session_manager.find_session_id(access_token) + session_context.set_session_id(session_id) submit_job_response = test_client.patch('/jobs/job-test-submit-job?action=invalid', headers = { @@ -269,6 +312,8 @@ def test_run_jobs(test_client : TestClient) -> None: }) create_session_body = create_session_response.json() access_token = create_session_body.get('access_token') + session_id = session_manager.find_session_id(access_token) + session_context.set_session_id(session_id) run_jobs_response = test_client.patch('/jobs?action=run', headers = { @@ -315,6 +360,8 @@ def test_run_job(test_client : TestClient) -> None: }) create_session_body = create_session_response.json() access_token = create_session_body.get('access_token') + session_id = session_manager.find_session_id(access_token) + session_context.set_session_id(session_id) create_job('job-test-run-job') @@ -362,6 +409,8 @@ def test_retry_jobs(test_client : TestClient) -> None: }) create_session_body = create_session_response.json() access_token = create_session_body.get('access_token') + session_id = session_manager.find_session_id(access_token) + session_context.set_session_id(session_id) retry_jobs_response = test_client.patch('/jobs?action=retry', headers = { @@ -410,6 +459,8 @@ def test_retry_job(test_client : TestClient) -> None: }) create_session_body = create_session_response.json() access_token = create_session_body.get('access_token') + session_id = session_manager.find_session_id(access_token) + session_context.set_session_id(session_id) retry_job_response = test_client.patch('/jobs/job-test-retry-job?action=retry', headers = { @@ -458,6 +509,8 @@ def test_delete_jobs(test_client : TestClient) -> None: }) create_session_body = create_session_response.json() access_token = create_session_body.get('access_token') + session_id = session_manager.find_session_id(access_token) + session_context.set_session_id(session_id) delete_jobs_response = test_client.delete('/jobs', headers = { @@ -491,6 +544,8 @@ def test_delete_job(test_client : TestClient) -> None: }) create_session_body = create_session_response.json() access_token = create_session_body.get('access_token') + session_id = session_manager.find_session_id(access_token) + session_context.set_session_id(session_id) delete_job_response = test_client.delete('/jobs/job-test-unknown', headers = { @@ -526,6 +581,8 @@ def test_create_step(test_client : TestClient) -> None: }) create_session_body = create_session_response.json() access_token = create_session_body.get('access_token') + session_id = session_manager.find_session_id(access_token) + session_context.set_session_id(session_id) create_job('job-test-create-step') @@ -606,6 +663,8 @@ def test_delete_step(test_client : TestClient) -> None: }) create_session_body = create_session_response.json() access_token = create_session_body.get('access_token') + session_id = session_manager.find_session_id(access_token) + session_context.set_session_id(session_id) create_job('job-test-delete-step') diff --git a/tests/test_api_metrics.py b/tests/test_api_metrics.py index ac424bde..cacd54a3 100644 --- a/tests/test_api_metrics.py +++ b/tests/test_api_metrics.py @@ -4,8 +4,15 @@ import pytest from pytest_mock import MockerFixture from starlette.testclient import TestClient -from facefusion import metadata, session_manager +from facefusion import metadata, session_manager, state_manager from facefusion.apis.core import create_api +from .assert_helper import get_test_jobs_directory + + +@pytest.fixture(scope = 'module', autouse = True) +def before_all() -> None: + state_manager.init() + state_manager.init_item('jobs_path', get_test_jobs_directory()) @pytest.fixture(scope = 'function', autouse = True) diff --git a/tests/test_api_ping.py b/tests/test_api_ping.py index 6d01ba95..17562bdf 100644 --- a/tests/test_api_ping.py +++ b/tests/test_api_ping.py @@ -3,8 +3,15 @@ from typing import Iterator import pytest from starlette.testclient import TestClient -from facefusion import metadata, session_manager +from facefusion import metadata, session_manager, state_manager from facefusion.apis.core import create_api +from .assert_helper import get_test_jobs_directory + + +@pytest.fixture(scope = 'module', autouse = True) +def before_all() -> None: + state_manager.init() + state_manager.init_item('jobs_path', get_test_jobs_directory()) @pytest.fixture(scope = 'function', autouse = True) diff --git a/tests/test_api_session.py b/tests/test_api_session.py index 9cc51b0e..0a6bd784 100644 --- a/tests/test_api_session.py +++ b/tests/test_api_session.py @@ -14,7 +14,7 @@ from facefusion.apis.core import create_api from facefusion.download import conditional_download from facefusion.libraries import datachannel as datachannel_module from facefusion.types import RtcPeer, Session -from .assert_helper import get_test_example_file, get_test_examples_directory +from .assert_helper import get_test_example_file, get_test_examples_directory, get_test_jobs_directory @pytest.fixture(scope = 'module', autouse = True) @@ -36,6 +36,7 @@ def before_each() -> Iterator[None]: session_context.set_session_id(local_id) state_manager.init_item('temp_path', tempfile.gettempdir()) + state_manager.init_item('jobs_path', get_test_jobs_directory()) session_manager.SESSIONS.clear() asset_store.delete_assets() diff --git a/tests/test_api_state.py b/tests/test_api_state.py index 070eeeea..f618ce62 100644 --- a/tests/test_api_state.py +++ b/tests/test_api_state.py @@ -8,12 +8,13 @@ from facefusion import capability_store, ffmpeg, ffmpeg_builder, metadata, proce from facefusion.apis import asset_store from facefusion.apis.core import create_api from facefusion.download import conditional_download -from .assert_helper import get_test_example_file, get_test_examples_directory +from .assert_helper import get_test_example_file, get_test_examples_directory, get_test_jobs_directory @pytest.fixture(scope = 'module', autouse = True) def before_all() -> None: state_manager.init() + state_manager.init_item('jobs_path', get_test_jobs_directory()) process_manager.start() program = ArgumentParser() diff --git a/tests/test_api_stream.py b/tests/test_api_stream.py index 2600add1..aaaf349c 100644 --- a/tests/test_api_stream.py +++ b/tests/test_api_stream.py @@ -12,7 +12,7 @@ from facefusion.download import conditional_download from facefusion.hash_helper import create_hash from facefusion.libraries import datachannel as datachannel_module from facefusion.types import VideoCodec -from .assert_helper import get_test_example_file, get_test_examples_directory +from .assert_helper import get_test_example_file, get_test_examples_directory, get_test_jobs_directory @pytest.fixture(scope = 'module', autouse = True) @@ -22,6 +22,7 @@ def before_all() -> None: state_manager.init_item('execution_providers', [ 'cpu' ]) state_manager.init_item('download_providers', [ 'github', 'huggingface' ]) state_manager.init_item('temp_path', tempfile.gettempdir()) + state_manager.init_item('jobs_path', get_test_jobs_directory()) state_manager.init_item('processors', []) pre_check() diff --git a/tests/test_cli_job_manager.py b/tests/test_cli_job_manager.py index bb9488a8..2a24f95d 100644 --- a/tests/test_cli_job_manager.py +++ b/tests/test_cli_job_manager.py @@ -1,4 +1,3 @@ -import os import subprocess import sys @@ -7,13 +6,13 @@ import pytest from facefusion import ffmpeg, ffmpeg_builder, process_manager, state_manager from facefusion.download import conditional_download from facefusion.jobs.job_manager import clear_jobs, count_step_total, init_jobs -from facefusion.session_context import resolve_local_id from .assert_helper import get_test_example_file, get_test_examples_directory, get_test_jobs_directory, get_test_output_path, is_test_job_file @pytest.fixture(scope = 'module', autouse = True) def before_all() -> None: state_manager.init() + state_manager.init_item('jobs_path', get_test_jobs_directory()) process_manager.start() conditional_download(get_test_examples_directory(), @@ -36,11 +35,8 @@ def before_all() -> None: @pytest.fixture(scope = 'function', autouse = True) def before_each() -> None: - local_id = resolve_local_id() - jobs_path = os.path.join(get_test_jobs_directory(), local_id) - clear_jobs(get_test_jobs_directory()) - init_jobs(jobs_path) + init_jobs(state_manager.get_jobs_path()) def test_job_list() -> None: diff --git a/tests/test_cli_job_runner.py b/tests/test_cli_job_runner.py index 10112b47..a2231991 100644 --- a/tests/test_cli_job_runner.py +++ b/tests/test_cli_job_runner.py @@ -1,4 +1,3 @@ -import os import subprocess import sys @@ -7,13 +6,13 @@ import pytest from facefusion import ffmpeg, ffmpeg_builder, process_manager, state_manager from facefusion.download import conditional_download from facefusion.jobs.job_manager import clear_jobs, init_jobs, move_job_file, set_steps_status -from facefusion.session_context import resolve_local_id from .assert_helper import get_test_example_file, get_test_examples_directory, get_test_jobs_directory, get_test_output_path, is_test_output_file, prepare_test_output_directory @pytest.fixture(scope = 'module', autouse = True) def before_all() -> None: state_manager.init() + state_manager.init_item('jobs_path', get_test_jobs_directory()) process_manager.start() conditional_download(get_test_examples_directory(), @@ -36,11 +35,8 @@ def before_all() -> None: @pytest.fixture(scope = 'function', autouse = True) def before_each() -> None: - local_id = resolve_local_id() - jobs_path = os.path.join(get_test_jobs_directory(), local_id) - clear_jobs(get_test_jobs_directory()) - init_jobs(jobs_path) + init_jobs(state_manager.get_jobs_path()) prepare_test_output_directory() diff --git a/tests/test_job_list.py b/tests/test_job_list.py index a1c9dc9a..9501b97f 100644 --- a/tests/test_job_list.py +++ b/tests/test_job_list.py @@ -2,15 +2,22 @@ from time import sleep import pytest +from facefusion import state_manager from facefusion.jobs.job_list import compose_job_list from facefusion.jobs.job_manager import clear_jobs, create_job, init_jobs from .assert_helper import get_test_jobs_directory +@pytest.fixture(scope = 'module', autouse = True) +def before_all() -> None: + state_manager.init() + state_manager.init_item('jobs_path', get_test_jobs_directory()) + + @pytest.fixture(scope = 'function', autouse = True) def before_each() -> None: clear_jobs(get_test_jobs_directory()) - init_jobs(get_test_jobs_directory()) + init_jobs(state_manager.get_jobs_path()) def test_compose_job_list() -> None: diff --git a/tests/test_job_manager.py b/tests/test_job_manager.py index 347d5f6a..c1b53932 100644 --- a/tests/test_job_manager.py +++ b/tests/test_job_manager.py @@ -1,16 +1,46 @@ +import os from time import sleep import pytest +from facefusion import state_manager from facefusion.jobs.job_helper import get_step_output_path from facefusion.jobs.job_manager import add_step, clear_jobs, count_step_total, create_job, delete_job, delete_jobs, find_job_ids, find_jobs, get_steps, init_jobs, insert_step, move_job_file, remix_step, remove_step, set_step_status, set_steps_status, submit_job, submit_jobs +from facefusion.session_context import resolve_local_id, set_session_id from .assert_helper import get_test_jobs_directory +@pytest.fixture(scope = 'module', autouse = True) +def before_all() -> None: + state_manager.init() + state_manager.init_item('jobs_path', get_test_jobs_directory()) + + @pytest.fixture(scope = 'function', autouse = True) def before_each() -> None: + local_id = resolve_local_id() + + set_session_id(local_id) clear_jobs(get_test_jobs_directory()) - init_jobs(get_test_jobs_directory()) + init_jobs(state_manager.get_jobs_path()) + + +def test_init_jobs() -> None: + local_id = resolve_local_id() + + set_session_id('session-a') + state_manager.init() + + assert init_jobs(state_manager.get_jobs_path()) is True + assert os.path.isdir(os.path.join(get_test_jobs_directory(), 'session-a', 'drafted')) is True + + create_job('job-test-init-jobs') + + assert find_job_ids('drafted') == [ 'job-test-init-jobs' ] + + set_session_id(local_id) + + assert find_job_ids('drafted') == [] def test_create_job() -> None: diff --git a/tests/test_job_runner.py b/tests/test_job_runner.py index 96474d48..80243521 100644 --- a/tests/test_job_runner.py +++ b/tests/test_job_runner.py @@ -14,6 +14,7 @@ from .assert_helper import get_test_example_file, get_test_examples_directory, g @pytest.fixture(scope = 'module', autouse = True) def before_all() -> None: state_manager.init() + state_manager.init_item('jobs_path', get_test_jobs_directory()) process_manager.start() conditional_download(get_test_examples_directory(), @@ -37,7 +38,7 @@ def before_all() -> None: @pytest.fixture(scope = 'function', autouse = True) def before_each() -> None: clear_jobs(get_test_jobs_directory()) - init_jobs(get_test_jobs_directory()) + init_jobs(state_manager.get_jobs_path()) prepare_test_output_directory()