diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index de0e748..679c081 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -3,7 +3,7 @@ name: Build and Publish on: push: tags: - - 'v*' + - 'v*' permissions: contents: write @@ -22,19 +22,19 @@ jobs: dotnet-version: 10.0.x - name: Restore - run: dotnet restore -r win-x64 + run: dotnet restore Splitter-UI/Splitter-UI.csproj -r win-x64 - - name: 'Get Version' + - name: Get Version id: version uses: battila7/get-version-action@v2 - name: Publish Release - run: dotnet publish splitter-cli/splitter.csproj -c Release -r win-x64 /p:Version=${{ steps.version.outputs.version-without-v }} /p:BuildNumber=${{ github.run_number }} /p:SourceRevisionId=${{ github.sha }} + run: dotnet publish Splitter-UI/Splitter-UI.csproj -c Release -r win-x64 /p:Version=${{ steps.version.outputs.version-without-v }} /p:BuildNumber=${{ github.run_number }} /p:SourceRevisionId=${{ github.sha }} - name: Create ZIP shell: pwsh run: | - $publish = "splitter-cli/bin/Release/net10.0/win-x64/publish" + $publish = "Splitter-UI/bin/Release/net10.0/win-x64/publish" $version = "${{ steps.version.outputs.version-without-v }}" $zip = "splitter-win-x64-$version.zip" @@ -51,5 +51,3 @@ jobs: files: splitter-win-x64-${{ steps.version.outputs.version-without-v }}.zip env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - diff --git a/README.md b/README.md index bee255e..f92009f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Splitter +This application was built to help me with maintaining my YouTube channel - [UnclShura](https://www.youtube.com/@UnclShura). + Splitter is a high-performance command line tool for cutting one or more video files into equal or fixed‑length segments using multi‑threaded FFmpeg execution. It supports batch input, flexible duration formats, rotation, smart face/body‑aware cropping, ETA and speed reporting, with nice GUI diff --git a/Splitter-UI/screenshot.png b/Splitter-UI/screenshot.png index c788c27..4522793 100644 Binary files a/Splitter-UI/screenshot.png and b/Splitter-UI/screenshot.png differ diff --git a/splitter-cli/README.md b/splitter-cli/README.md index b9c7741..c1268e9 100644 --- a/splitter-cli/README.md +++ b/splitter-cli/README.md @@ -140,24 +140,41 @@ All option names are preserved exactly, and descriptions are consolidated for cl ## Options -| Option | Description | -|--------|-------------| -| **--out=** | Output folder for generated segments. Default: `/Splitter`. | -| **--file=** | Input file list or file mask. If omitted, the first non-option argument is used as input. Examples: `--file=videos/*.mp4`, `--file=file_list.txt`. | -| **--mask=** | Custom output filename pattern. Default: `[NAME]_seg[NN].[EXT]`. Supports `[NAME]`, `[N]`, `[NN]`, `[NNN]`, `[NNNN]`, `[EXT]`. Example: `--mask="[NAME]_[NNNN].mp4"`. | -| **--duration=** | Override target segment duration. Formats: `Ns`, `NmMs`, `N`. Examples: `--duration=90s`, `--duration=2m30s`, `--duration=45`. Without `--force`: max 58 seconds, equalized across segments. | -| **--force** | Use the duration exactly as provided. Last segment may be shorter. | -| **--enhance** | Enable video enhancement. Increases output resolution x4 using RealBasicVSR_x4 model. | -| **--rotate=** | Rotate video by 90, 180, or 270 degrees. Useful for correcting orientation metadata. | -| **--rotate-auto** | Use automatic rotation detection. | -| **--estimate** | Print calculated segment information and exit. No splitting is performed. | -| **--crop[=]** | Crop video to a target width and height with face/body tracking. Default: 607x1080. Ideal for Shorts, TikTok, Reels. | -| **--detect=** | Object detector for tracking. Values: `face` (UltraFace), `body` (YoloOnnx, default), `none` (center crop). | -| **--gravitate=** | Bias the crop window toward a normalized point in the frame. Example: `--gravitate=0.2:0.5`. | -| **--text** | Use plain-text logging instead of the rich terminal UI. | -| **--single-thread** | Disable parallel FFmpeg execution. Useful for debugging or low-resource systems. | -| **--debug** | Show debug overlay during tracking. No cropping performed, but crop region shown. | -| **-p:=** | Set custom parameters for the object detector. Example: `-p:confidence=0.5`. Defaults: DropoutToleranceFrames=20, EmaFactor=0.65, CameraEasing=0.03, LostFreezeFrames=60. | +| Parameter | Description | +|----------|-------------| +| --out=<folder> | Output folder for segments. Default: same folder as input video + "Splitter". | +| --file=<path> | Input names or file masks (e.g. "videos/*.mp4"). If not specified, the first non-option argument is used as input. | +| --mask=<pattern> | Output filename pattern. Default: [NAME]_seg[NN].[EXT]. Supports [NAME], [N], [NN], [NNN], [NNNN], [EXT] placeholders. | +| --duration=<value> | Override target segment duration. Formats: Ns, NmMs, N. Examples: 90s, 2m30s, 45. Default (without --force): max 58s, equalized segment lengths. | +| --force | Use fixed segment duration exactly as given. Last segment may be shorter. Default OFF. | +| --enhance | Enable video enhancement. Output resolution x4 using RealBasicVSR_x4 model. | +| --rotate=<degrees> | Rotate video by 90, 180, or 270 degrees. | +| --rotate-auto | Auto-detect rotation using edge orientation statistics. | +| --estimate | Print calculated segment information and exit. No splitting performed. | +| --crop[=<w:h>] | Crop video to width w and height h with face tracking. Default: 607x1080. | +| --detect=<name> | Object detector: face (UltraFace), body (YoloOnnx, default), none. | +| --detect-above=<0-1> | Report detections only if upper bound starts below this threshold (0.0–1.0 mapped to 0..Height). | +| --detect-id=<hex> | Hexadecimal ID of face/person to track across segments. Obtained via --debug overlay. | +| --gravitate=<x:y> | Gravitate tracking toward normalized point (0.0–1.0). Example: 0.2:0.5. | +| --text | Display log in plain text. | +| --single-thread | Run in single-threaded mode. Useful for debugging or constrained systems. | +| --debug | Show debug overlay during face tracking. | +| -p:<name>=<value> | Set custom detector parameter. Example: -p:EmaFactor=0.65. | + +Tracking splitter defaults: + + DropoutToleranceFrames = 20; + EmaFactor = 0.65; + CameraEasing = 0.03; + LostFreezeFrames = 60; + +Rotation detector defaults: + + RotationDetectorSampleCount = 5; + RotationDetectorSampleLength = 0.15; + RotationDetectorFrameWidth = 320; + RotationDetectorFrameHeight = 180; + ## FFmpeg Passthrough