Document local folder scheduler profile
This commit is contained in:
parent
90cadbe097
commit
8e67566f0d
|
|
@ -30,7 +30,7 @@ Note: the local machine's filesystem root is read-only in this workspace, so abs
|
||||||
10. [x] Add failure handling for FFmpeg or filesystem errors.
|
10. [x] Add failure handling for FFmpeg or filesystem errors.
|
||||||
11. [x] Add unit tests for ordering, invalid-file handling, repeat prevention, and state transitions.
|
11. [x] Add unit tests for ordering, invalid-file handling, repeat prevention, and state transitions.
|
||||||
12. [x] Add optional FFmpeg integration test for a short fixture.
|
12. [x] Add optional FFmpeg integration test for a short fixture.
|
||||||
13. [ ] Add local profile or documented runtime config for enabling the scheduler.
|
13. [x] Add local profile or documented runtime config for enabling the scheduler.
|
||||||
14. [ ] Run verification and mark feature complete.
|
14. [ ] Run verification and mark feature complete.
|
||||||
|
|
||||||
## Format Recommendation
|
## Format Recommendation
|
||||||
|
|
@ -77,6 +77,18 @@ video-clipping.folder-scheduler.exact-preset=veryfast
|
||||||
|
|
||||||
Keep the existing API-driven clipper config separate from this folder scheduler. The folder scheduler is a direct filesystem workflow, not an API/upload/session workflow.
|
Keep the existing API-driven clipper config separate from this folder scheduler. The folder scheduler is a direct filesystem workflow, not an API/upload/session workflow.
|
||||||
|
|
||||||
|
### Running Locally
|
||||||
|
|
||||||
|
Install `ffmpeg` and `ffprobe`, then start the service with the repository-local scheduler profile:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn spring-boot:run -Dspring-boot.run.profiles=folder-scheduler-local
|
||||||
|
```
|
||||||
|
|
||||||
|
Place source videos in `input/source`. The service creates `input/working`, `input/processed`, and `input/rejected` at startup and writes clips to `output/clips/<video-name>`.
|
||||||
|
|
||||||
|
For production, keep the default absolute paths and mount persistent writable volumes at `/input` and `/output`. Run only one scheduler replica unless a cross-process lease is added.
|
||||||
|
|
||||||
## Processing Rules
|
## Processing Rules
|
||||||
|
|
||||||
The scheduler should:
|
The scheduler should:
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
video-clipping.folder-scheduler.enabled=true
|
||||||
|
video-clipping.folder-scheduler.input-directory=./input/source
|
||||||
|
video-clipping.folder-scheduler.output-directory=./output/clips
|
||||||
|
video-clipping.folder-scheduler.processed-directory=./input/processed
|
||||||
|
video-clipping.folder-scheduler.rejected-directory=./input/rejected
|
||||||
|
video-clipping.folder-scheduler.working-directory=./input/working
|
||||||
|
video-clipping.folder-scheduler.poll-interval-ms=5000
|
||||||
|
video-clipping.folder-scheduler.segment-duration-seconds=8
|
||||||
|
video-clipping.folder-scheduler.ffmpeg-binary=ffmpeg
|
||||||
|
video-clipping.folder-scheduler.ffprobe-binary=ffprobe
|
||||||
|
video-clipping.folder-scheduler.output-container=mp4
|
||||||
|
video-clipping.folder-scheduler.exact-preset=veryfast
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
package org.example.videoclips.folder;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.core.io.ClassPathResource;
|
||||||
|
import org.springframework.core.io.support.PropertiesLoaderUtils;
|
||||||
|
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
class FolderSchedulerLocalProfileTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void enablesSchedulerWithRepositoryLocalEightSecondPaths() throws Exception {
|
||||||
|
Properties properties = PropertiesLoaderUtils.loadProperties(
|
||||||
|
new ClassPathResource("application-folder-scheduler-local.properties"));
|
||||||
|
|
||||||
|
assertEquals("true", properties.getProperty("video-clipping.folder-scheduler.enabled"));
|
||||||
|
assertEquals("./input/source", properties.getProperty("video-clipping.folder-scheduler.input-directory"));
|
||||||
|
assertEquals("./output/clips", properties.getProperty("video-clipping.folder-scheduler.output-directory"));
|
||||||
|
assertEquals("./input/working", properties.getProperty("video-clipping.folder-scheduler.working-directory"));
|
||||||
|
assertEquals("./input/processed", properties.getProperty("video-clipping.folder-scheduler.processed-directory"));
|
||||||
|
assertEquals("./input/rejected", properties.getProperty("video-clipping.folder-scheduler.rejected-directory"));
|
||||||
|
assertEquals("8", properties.getProperty("video-clipping.folder-scheduler.segment-duration-seconds"));
|
||||||
|
assertEquals("mp4", properties.getProperty("video-clipping.folder-scheduler.output-container"));
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue