diff --git a/packages/media/ref/handbrake/Convert-Videos.ps1 b/packages/media/ref/handbrake/Convert-Videos.ps1 new file mode 100644 index 00000000..75061ebd --- /dev/null +++ b/packages/media/ref/handbrake/Convert-Videos.ps1 @@ -0,0 +1,116 @@ +<# +.SYNOPSIS + Converts video files using HandBrakeCLI. + +.DESCRIPTION + This script processes video files matching a specified pattern using HandBrakeCLI with a specified preset. + It creates output files with "-converted" added to the original filenames. + +.PARAMETER InputPattern + Glob pattern to match input video files (e.g., "C:\Videos\*.mp4"). + +.PARAMETER Preset + HandBrake preset to use for conversion. Defaults to "Fast 1080p30". + +.EXAMPLE + .\Convert-Videos.ps1 -InputPattern "C:\Videos\*.mp4" + Converts all MP4 files in C:\Videos using the default preset. + +.EXAMPLE + .\Convert-Videos.ps1 -InputPattern "C:\Videos\*.mkv" -Preset "Very Fast 720p30" + Converts all MKV files in C:\Videos using the "Very Fast 720p30" preset. +#> + +[CmdletBinding()] +param ( + [Parameter(Mandatory = $true, Position = 0, HelpMessage = "Glob pattern for input video files")] + [ValidateNotNullOrEmpty()] + [string]$InputPattern, + + [Parameter(Mandatory = $false, Position = 1, HelpMessage = "HandBrake preset to use")] + [string]$Preset = "Fast 1080p30" +) + +function Test-CommandExists { + param ( + [Parameter(Mandatory = $true)] + [string]$Command + ) + + $exists = $null -ne (Get-Command -Name $Command -ErrorAction SilentlyContinue) + return $exists +} + +# Display script banner +Write-Host "Video Conversion Script" -ForegroundColor Cyan +Write-Host "======================" -ForegroundColor Cyan +Write-Host "Input Pattern: $InputPattern" -ForegroundColor Green +Write-Host "Using Preset: $Preset" -ForegroundColor Green +Write-Host "" + +# Check if HandBrakeCLI is available +if (-not (Test-CommandExists "HandBrakeCLI")) { + Write-Error "HandBrakeCLI is not found in PATH. Please install HandBrake CLI and ensure it's in your PATH." + exit 1 +} + +# Get matching files +try { + $files = Get-Item -Path $InputPattern -ErrorAction Stop + $fileCount = ($files | Measure-Object).Count + + if ($fileCount -eq 0) { + Write-Warning "No files found matching the pattern: $InputPattern" + exit 0 + } + + Write-Host "Found $fileCount files to process." -ForegroundColor Yellow +} +catch { + Write-Error "Error finding files: $_" + exit 1 +} + +# Process each file +$currentFile = 0 +foreach ($file in $files) { + $currentFile++ + $percentComplete = [math]::Round(($currentFile / $fileCount) * 100) + + # Create output filename by adding "-converted" before the extension + $directory = [System.IO.Path]::GetDirectoryName($file.FullName) + $filename = [System.IO.Path]::GetFileNameWithoutExtension($file.Name) + $extension = [System.IO.Path]::GetExtension($file.Name) + $outputFile = Join-Path -Path $directory -ChildPath "$filename-converted$extension" + + Write-Progress -Activity "Converting Videos" -Status "Processing $($file.Name)" -PercentComplete $percentComplete + Write-Host "[$currentFile/$fileCount] Converting: $($file.Name)" -ForegroundColor Cyan + + try { + # Run HandBrakeCLI + $handbrakeArgs = @( + "-i", "`"$($file.FullName)`"", + "-o", "`"$outputFile`"", + "--preset", "`"$Preset`"" + ) + + Write-Host " Command: HandBrakeCLI $($handbrakeArgs -join ' ')" -ForegroundColor DarkGray + + $process = Start-Process -FilePath "HandBrakeCLI" -ArgumentList $handbrakeArgs -NoNewWindow -PassThru -Wait + + if ($process.ExitCode -eq 0) { + Write-Host " Success: Created $outputFile" -ForegroundColor Green + } else { + Write-Host " Failed: HandBrakeCLI returned exit code $($process.ExitCode)" -ForegroundColor Red + } + } + catch { + Write-Host " Error processing $($file.Name): $_" -ForegroundColor Red + } + + Write-Host "" +} + +Write-Progress -Activity "Converting Videos" -Completed +Write-Host "Conversion process completed. Processed $fileCount files." -ForegroundColor Green + diff --git a/packages/media/ref/handbrake/convert-videos.sh b/packages/media/ref/handbrake/convert-videos.sh new file mode 100644 index 00000000..9c0ef134 --- /dev/null +++ b/packages/media/ref/handbrake/convert-videos.sh @@ -0,0 +1,104 @@ +#!/bin/bash +# convert-videos.sh - Convert videos using HandBrakeCLI +# Usage: ./convert-videos.sh "input_pattern" [--preset "preset_name"] + +# Exit on error, undefined variable, or pipe failure +set -euo pipefail + +# Default values +PRESET="Fast 1080p30" +INPUT_PATTERN="" +TOTAL_FILES=0 +CURRENT_FILE=0 + +# Print usage information +usage() { + echo "Usage: $(basename "$0") INPUT_PATTERN [--preset PRESET]" + echo + echo "Arguments:" + echo " INPUT_PATTERN Glob pattern for input files (e.g., '*.mp4' or 'videos/*.mkv')" + echo " --preset PRESET HandBrake preset to use (default: 'Fast 1080p30')" + echo + echo "Example:" + echo " $(basename "$0") '*.mp4'" + echo " $(basename "$0") 'videos/*.mkv' --preset 'Very Fast 720p30'" + exit 1 +} + +# Parse command line arguments +if [[ $# -lt 1 ]]; then + usage +fi + +INPUT_PATTERN="$1" +shift + +while [[ $# -gt 0 ]]; do + case "$1" in + --preset) + if [[ $# -gt 1 ]]; then + PRESET="$2" + shift 2 + else + echo "Error: --preset requires a value" >&2 + usage + fi + ;; + *) + echo "Error: Unknown argument: $1" >&2 + usage + ;; + esac +done + +# Check if HandBrakeCLI is installed +if ! command -v HandBrakeCLI &> /dev/null; then + echo "Error: HandBrakeCLI is not installed or not in your PATH" >&2 + echo "Please install HandBrake CLI from https://handbrake.fr/downloads.php" >&2 + exit 1 +fi + +# Expand the input pattern and count files +mapfile -t FILES < <(find . -path "$INPUT_PATTERN" -type f 2>/dev/null || find "$INPUT_PATTERN" -type f 2>/dev/null || echo "$INPUT_PATTERN") +TOTAL_FILES=${#FILES[@]} + +if [[ $TOTAL_FILES -eq 0 ]]; then + echo "Error: No files match the pattern '$INPUT_PATTERN'" >&2 + exit 1 +fi + +echo "Found $TOTAL_FILES file(s) to convert using preset '$PRESET'" +echo + +# Process each file +for input_file in "${FILES[@]}"; do + ((CURRENT_FILE++)) + + # Check if file exists and is readable + if [[ ! -f "$input_file" || ! -r "$input_file" ]]; then + echo "Warning: Cannot access file: $input_file - skipping" + continue + fi + + # Generate output filename with "-converted" suffix + filename=$(basename -- "$input_file") + extension="${filename##*.}" + filename="${filename%.*}" + dirname=$(dirname -- "$input_file") + output_file="$dirname/$filename-converted.$extension" + + # Display progress + echo -e "[$CURRENT_FILE/$TOTAL_FILES] Converting: $input_file" + echo -e " Output to: $output_file" + + # Run HandBrakeCLI + HandBrakeCLI --preset="$PRESET" --input="$input_file" --output="$output_file" || { + echo "Error: Failed to convert $input_file" >&2 + continue + } + + echo -e "Completed: $output_file\n" +done + +echo "Conversion complete! Processed $CURRENT_FILE of $TOTAL_FILES files." + diff --git a/packages/media/ref/yt-dlp/.gitignore b/packages/media/ref/yt-dlp/.gitignore new file mode 100644 index 00000000..4428759c --- /dev/null +++ b/packages/media/ref/yt-dlp/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/coverage +*.log +.DS_Store +clear_history.sh +./tests/assets diff --git a/packages/media/ref/README.md b/packages/media/ref/yt-dlp/README.md similarity index 100% rename from packages/media/ref/README.md rename to packages/media/ref/yt-dlp/README.md diff --git a/packages/media/ref/dist/__tests__/mp3.test.d.ts b/packages/media/ref/yt-dlp/dist/__tests__/mp3.test.d.ts similarity index 100% rename from packages/media/ref/dist/__tests__/mp3.test.d.ts rename to packages/media/ref/yt-dlp/dist/__tests__/mp3.test.d.ts diff --git a/packages/media/ref/dist/__tests__/mp3.test.d.ts.map b/packages/media/ref/yt-dlp/dist/__tests__/mp3.test.d.ts.map similarity index 100% rename from packages/media/ref/dist/__tests__/mp3.test.d.ts.map rename to packages/media/ref/yt-dlp/dist/__tests__/mp3.test.d.ts.map diff --git a/packages/media/ref/dist/__tests__/mp3.test.js b/packages/media/ref/yt-dlp/dist/__tests__/mp3.test.js similarity index 100% rename from packages/media/ref/dist/__tests__/mp3.test.js rename to packages/media/ref/yt-dlp/dist/__tests__/mp3.test.js diff --git a/packages/media/ref/dist/__tests__/mp3.test.js.map b/packages/media/ref/yt-dlp/dist/__tests__/mp3.test.js.map similarity index 100% rename from packages/media/ref/dist/__tests__/mp3.test.js.map rename to packages/media/ref/yt-dlp/dist/__tests__/mp3.test.js.map diff --git a/packages/media/ref/dist/__tests__/tiktok.test.d.ts b/packages/media/ref/yt-dlp/dist/__tests__/tiktok.test.d.ts similarity index 100% rename from packages/media/ref/dist/__tests__/tiktok.test.d.ts rename to packages/media/ref/yt-dlp/dist/__tests__/tiktok.test.d.ts diff --git a/packages/media/ref/dist/__tests__/tiktok.test.d.ts.map b/packages/media/ref/yt-dlp/dist/__tests__/tiktok.test.d.ts.map similarity index 100% rename from packages/media/ref/dist/__tests__/tiktok.test.d.ts.map rename to packages/media/ref/yt-dlp/dist/__tests__/tiktok.test.d.ts.map diff --git a/packages/media/ref/dist/__tests__/tiktok.test.js b/packages/media/ref/yt-dlp/dist/__tests__/tiktok.test.js similarity index 100% rename from packages/media/ref/dist/__tests__/tiktok.test.js rename to packages/media/ref/yt-dlp/dist/__tests__/tiktok.test.js diff --git a/packages/media/ref/dist/__tests__/tiktok.test.js.map b/packages/media/ref/yt-dlp/dist/__tests__/tiktok.test.js.map similarity index 100% rename from packages/media/ref/dist/__tests__/tiktok.test.js.map rename to packages/media/ref/yt-dlp/dist/__tests__/tiktok.test.js.map diff --git a/packages/media/ref/dist/__tests__/youtube.test.d.ts b/packages/media/ref/yt-dlp/dist/__tests__/youtube.test.d.ts similarity index 100% rename from packages/media/ref/dist/__tests__/youtube.test.d.ts rename to packages/media/ref/yt-dlp/dist/__tests__/youtube.test.d.ts diff --git a/packages/media/ref/dist/__tests__/youtube.test.d.ts.map b/packages/media/ref/yt-dlp/dist/__tests__/youtube.test.d.ts.map similarity index 100% rename from packages/media/ref/dist/__tests__/youtube.test.d.ts.map rename to packages/media/ref/yt-dlp/dist/__tests__/youtube.test.d.ts.map diff --git a/packages/media/ref/dist/__tests__/youtube.test.js b/packages/media/ref/yt-dlp/dist/__tests__/youtube.test.js similarity index 100% rename from packages/media/ref/dist/__tests__/youtube.test.js rename to packages/media/ref/yt-dlp/dist/__tests__/youtube.test.js diff --git a/packages/media/ref/dist/__tests__/youtube.test.js.map b/packages/media/ref/yt-dlp/dist/__tests__/youtube.test.js.map similarity index 100% rename from packages/media/ref/dist/__tests__/youtube.test.js.map rename to packages/media/ref/yt-dlp/dist/__tests__/youtube.test.js.map diff --git a/packages/media/ref/dist/cli-bundle.js b/packages/media/ref/yt-dlp/dist/cli-bundle.js similarity index 100% rename from packages/media/ref/dist/cli-bundle.js rename to packages/media/ref/yt-dlp/dist/cli-bundle.js diff --git a/packages/media/ref/dist/cli.d.ts b/packages/media/ref/yt-dlp/dist/cli.d.ts similarity index 100% rename from packages/media/ref/dist/cli.d.ts rename to packages/media/ref/yt-dlp/dist/cli.d.ts diff --git a/packages/media/ref/dist/cli.d.ts.map b/packages/media/ref/yt-dlp/dist/cli.d.ts.map similarity index 100% rename from packages/media/ref/dist/cli.d.ts.map rename to packages/media/ref/yt-dlp/dist/cli.d.ts.map diff --git a/packages/media/ref/dist/cli.js b/packages/media/ref/yt-dlp/dist/cli.js similarity index 100% rename from packages/media/ref/dist/cli.js rename to packages/media/ref/yt-dlp/dist/cli.js diff --git a/packages/media/ref/dist/cli.js.map b/packages/media/ref/yt-dlp/dist/cli.js.map similarity index 100% rename from packages/media/ref/dist/cli.js.map rename to packages/media/ref/yt-dlp/dist/cli.js.map diff --git a/packages/media/ref/dist/index.d.ts b/packages/media/ref/yt-dlp/dist/index.d.ts similarity index 100% rename from packages/media/ref/dist/index.d.ts rename to packages/media/ref/yt-dlp/dist/index.d.ts diff --git a/packages/media/ref/dist/index.d.ts.map b/packages/media/ref/yt-dlp/dist/index.d.ts.map similarity index 100% rename from packages/media/ref/dist/index.d.ts.map rename to packages/media/ref/yt-dlp/dist/index.d.ts.map diff --git a/packages/media/ref/dist/index.js b/packages/media/ref/yt-dlp/dist/index.js similarity index 100% rename from packages/media/ref/dist/index.js rename to packages/media/ref/yt-dlp/dist/index.js diff --git a/packages/media/ref/dist/index.js.map b/packages/media/ref/yt-dlp/dist/index.js.map similarity index 100% rename from packages/media/ref/dist/index.js.map rename to packages/media/ref/yt-dlp/dist/index.js.map diff --git a/packages/media/ref/dist/logger.d.ts b/packages/media/ref/yt-dlp/dist/logger.d.ts similarity index 100% rename from packages/media/ref/dist/logger.d.ts rename to packages/media/ref/yt-dlp/dist/logger.d.ts diff --git a/packages/media/ref/dist/logger.d.ts.map b/packages/media/ref/yt-dlp/dist/logger.d.ts.map similarity index 100% rename from packages/media/ref/dist/logger.d.ts.map rename to packages/media/ref/yt-dlp/dist/logger.d.ts.map diff --git a/packages/media/ref/dist/logger.js b/packages/media/ref/yt-dlp/dist/logger.js similarity index 100% rename from packages/media/ref/dist/logger.js rename to packages/media/ref/yt-dlp/dist/logger.js diff --git a/packages/media/ref/dist/logger.js.map b/packages/media/ref/yt-dlp/dist/logger.js.map similarity index 100% rename from packages/media/ref/dist/logger.js.map rename to packages/media/ref/yt-dlp/dist/logger.js.map diff --git a/packages/media/ref/dist/main.js b/packages/media/ref/yt-dlp/dist/main.js similarity index 100% rename from packages/media/ref/dist/main.js rename to packages/media/ref/yt-dlp/dist/main.js diff --git a/packages/media/ref/dist/tiktok-scraper.d.ts b/packages/media/ref/yt-dlp/dist/tiktok-scraper.d.ts similarity index 100% rename from packages/media/ref/dist/tiktok-scraper.d.ts rename to packages/media/ref/yt-dlp/dist/tiktok-scraper.d.ts diff --git a/packages/media/ref/dist/tiktok-scraper.d.ts.map b/packages/media/ref/yt-dlp/dist/tiktok-scraper.d.ts.map similarity index 100% rename from packages/media/ref/dist/tiktok-scraper.d.ts.map rename to packages/media/ref/yt-dlp/dist/tiktok-scraper.d.ts.map diff --git a/packages/media/ref/dist/tiktok-scraper.js b/packages/media/ref/yt-dlp/dist/tiktok-scraper.js similarity index 100% rename from packages/media/ref/dist/tiktok-scraper.js rename to packages/media/ref/yt-dlp/dist/tiktok-scraper.js diff --git a/packages/media/ref/dist/tiktok-scraper.js.map b/packages/media/ref/yt-dlp/dist/tiktok-scraper.js.map similarity index 100% rename from packages/media/ref/dist/tiktok-scraper.js.map rename to packages/media/ref/yt-dlp/dist/tiktok-scraper.js.map diff --git a/packages/media/ref/dist/types.d.ts b/packages/media/ref/yt-dlp/dist/types.d.ts similarity index 100% rename from packages/media/ref/dist/types.d.ts rename to packages/media/ref/yt-dlp/dist/types.d.ts diff --git a/packages/media/ref/dist/types.d.ts.map b/packages/media/ref/yt-dlp/dist/types.d.ts.map similarity index 100% rename from packages/media/ref/dist/types.d.ts.map rename to packages/media/ref/yt-dlp/dist/types.d.ts.map diff --git a/packages/media/ref/dist/types.js b/packages/media/ref/yt-dlp/dist/types.js similarity index 100% rename from packages/media/ref/dist/types.js rename to packages/media/ref/yt-dlp/dist/types.js diff --git a/packages/media/ref/dist/types.js.map b/packages/media/ref/yt-dlp/dist/types.js.map similarity index 100% rename from packages/media/ref/dist/types.js.map rename to packages/media/ref/yt-dlp/dist/types.js.map diff --git a/packages/media/ref/dist/ytdlp.d.ts b/packages/media/ref/yt-dlp/dist/ytdlp.d.ts similarity index 100% rename from packages/media/ref/dist/ytdlp.d.ts rename to packages/media/ref/yt-dlp/dist/ytdlp.d.ts diff --git a/packages/media/ref/dist/ytdlp.d.ts.map b/packages/media/ref/yt-dlp/dist/ytdlp.d.ts.map similarity index 100% rename from packages/media/ref/dist/ytdlp.d.ts.map rename to packages/media/ref/yt-dlp/dist/ytdlp.d.ts.map diff --git a/packages/media/ref/dist/ytdlp.js b/packages/media/ref/yt-dlp/dist/ytdlp.js similarity index 100% rename from packages/media/ref/dist/ytdlp.js rename to packages/media/ref/yt-dlp/dist/ytdlp.js diff --git a/packages/media/ref/dist/ytdlp.js.map b/packages/media/ref/yt-dlp/dist/ytdlp.js.map similarity index 100% rename from packages/media/ref/dist/ytdlp.js.map rename to packages/media/ref/yt-dlp/dist/ytdlp.js.map diff --git a/packages/media/ref/package-lock.json b/packages/media/ref/yt-dlp/package-lock.json similarity index 100% rename from packages/media/ref/package-lock.json rename to packages/media/ref/yt-dlp/package-lock.json diff --git a/packages/media/ref/package.json b/packages/media/ref/yt-dlp/package.json similarity index 100% rename from packages/media/ref/package.json rename to packages/media/ref/yt-dlp/package.json diff --git a/packages/media/ref/pnpm-lock.yaml b/packages/media/ref/yt-dlp/pnpm-lock.yaml similarity index 100% rename from packages/media/ref/pnpm-lock.yaml rename to packages/media/ref/yt-dlp/pnpm-lock.yaml diff --git a/packages/media/ref/src/__tests__/mp3.test.ts b/packages/media/ref/yt-dlp/src/__tests__/mp3.test.ts similarity index 100% rename from packages/media/ref/src/__tests__/mp3.test.ts rename to packages/media/ref/yt-dlp/src/__tests__/mp3.test.ts diff --git a/packages/media/ref/src/__tests__/tiktok.test.ts b/packages/media/ref/yt-dlp/src/__tests__/tiktok.test.ts similarity index 100% rename from packages/media/ref/src/__tests__/tiktok.test.ts rename to packages/media/ref/yt-dlp/src/__tests__/tiktok.test.ts diff --git a/packages/media/ref/src/__tests__/youtube.test.ts b/packages/media/ref/yt-dlp/src/__tests__/youtube.test.ts similarity index 100% rename from packages/media/ref/src/__tests__/youtube.test.ts rename to packages/media/ref/yt-dlp/src/__tests__/youtube.test.ts diff --git a/packages/media/ref/src/cli.ts b/packages/media/ref/yt-dlp/src/cli.ts similarity index 100% rename from packages/media/ref/src/cli.ts rename to packages/media/ref/yt-dlp/src/cli.ts diff --git a/packages/media/ref/src/index.ts b/packages/media/ref/yt-dlp/src/index.ts similarity index 100% rename from packages/media/ref/src/index.ts rename to packages/media/ref/yt-dlp/src/index.ts diff --git a/packages/media/ref/src/logger.ts b/packages/media/ref/yt-dlp/src/logger.ts similarity index 100% rename from packages/media/ref/src/logger.ts rename to packages/media/ref/yt-dlp/src/logger.ts diff --git a/packages/media/ref/src/tiktok-scraper.ts b/packages/media/ref/yt-dlp/src/tiktok-scraper.ts similarity index 100% rename from packages/media/ref/src/tiktok-scraper.ts rename to packages/media/ref/yt-dlp/src/tiktok-scraper.ts diff --git a/packages/media/ref/src/types.ts b/packages/media/ref/yt-dlp/src/types.ts similarity index 100% rename from packages/media/ref/src/types.ts rename to packages/media/ref/yt-dlp/src/types.ts diff --git a/packages/media/ref/src/ytdlp.ts b/packages/media/ref/yt-dlp/src/ytdlp.ts similarity index 100% rename from packages/media/ref/src/ytdlp.ts rename to packages/media/ref/yt-dlp/src/ytdlp.ts diff --git a/packages/media/ref/test-downloads/tiktok-test-1741614936684.mp4 b/packages/media/ref/yt-dlp/test-downloads/tiktok-test-1741614936684.mp4 similarity index 100% rename from packages/media/ref/test-downloads/tiktok-test-1741614936684.mp4 rename to packages/media/ref/yt-dlp/test-downloads/tiktok-test-1741614936684.mp4 diff --git a/packages/media/ref/test-downloads/tiktok-test-1741633820843.mp4 b/packages/media/ref/yt-dlp/test-downloads/tiktok-test-1741633820843.mp4 similarity index 100% rename from packages/media/ref/test-downloads/tiktok-test-1741633820843.mp4 rename to packages/media/ref/yt-dlp/test-downloads/tiktok-test-1741633820843.mp4 diff --git a/packages/media/ref/test-downloads/tiktok-test-1741633842260.mp4 b/packages/media/ref/yt-dlp/test-downloads/tiktok-test-1741633842260.mp4 similarity index 100% rename from packages/media/ref/test-downloads/tiktok-test-1741633842260.mp4 rename to packages/media/ref/yt-dlp/test-downloads/tiktok-test-1741633842260.mp4 diff --git a/packages/media/ref/test-downloads/youtube-test-_oVI0GW-Xd4.mp4 b/packages/media/ref/yt-dlp/test-downloads/youtube-test-_oVI0GW-Xd4.mp4 similarity index 100% rename from packages/media/ref/test-downloads/youtube-test-_oVI0GW-Xd4.mp4 rename to packages/media/ref/yt-dlp/test-downloads/youtube-test-_oVI0GW-Xd4.mp4 diff --git a/packages/media/ref/tsconfig.json b/packages/media/ref/yt-dlp/tsconfig.json similarity index 100% rename from packages/media/ref/tsconfig.json rename to packages/media/ref/yt-dlp/tsconfig.json diff --git a/packages/media/ref/vitest.config.ts b/packages/media/ref/yt-dlp/vitest.config.ts similarity index 100% rename from packages/media/ref/vitest.config.ts rename to packages/media/ref/yt-dlp/vitest.config.ts diff --git a/packages/media/ref/webpack.config.js b/packages/media/ref/yt-dlp/webpack.config.js similarity index 100% rename from packages/media/ref/webpack.config.js rename to packages/media/ref/yt-dlp/webpack.config.js