Initial Commit

This commit is contained in:
2025-07-01 09:46:35 +00:00
commit 6a1ea2e9da
5 changed files with 424 additions and 0 deletions

121
README.md Normal file
View File

@@ -0,0 +1,121 @@
# HandBrake Batch Converter Script
This Bash script converts video files in bulk using **HandBrakeCLI** with predefined presets for Blu-ray and DVD sources.
It supports recursive folder scanning and preserves the folder structure in the output directory.
---
## Features
- Converts all `.mkv` files from the source directory and its subfolders.
- Preserves the original folder structure in the destination directory.
- Select between **Blu-ray** and **DVD** presets.
- Skips already converted files to avoid duplication.
- Logs all conversion activity.
---
## Requirements
1. **Install HandBrakeCLI**
- **Ubuntu/Debian:**
```bash
sudo apt update
sudo apt install handbrake-cli
```
- **Fedora:**
```bash
sudo dnf install HandBrake-cli
```
- **macOS (Homebrew):**
```bash
brew install handbrake
```
- **Windows:** Download from [HandBrake Downloads](https://handbrake.fr/downloads2.php)
2. **Preset JSON files** in the `./profiles/` directory:
- `BluRay H.265 HEVC.json`
- `DVD 720p H.265.json`
---
## Installation
Clone the repository:
```bash
git clone https://github.com/yourusername/handbrake-batch-converter.git
cd handbrake-batch-converter
chmod +x convert.sh
```
---
## Usage
```bash
./convert.sh --source /path/to/source --destination /path/to/destination --mode [bluray|dvd]
```
### Example
```bash
./convert.sh \
--source "/media/movies_raw" \
--destination "/media/movies_converted" \
--mode bluray
```
This will:
1. Search `/media/movies_raw` for all `.mkv` files, including in subdirectories.
2. Re-create the same folder structure under `/media/movies_converted`.
3. Convert each file using the `BluRay H.265 HEVC` preset.
4. Skip files that already exist in the destination.
---
## Modes
| Mode | Preset File | Description |
|----------|-------------------------------------------|-----------------------------|
| bluray | `./profiles/BluRay H.265 HEVC.json` | For high-quality Blu-ray rips |
| dvd | `./profiles/DVD 720p H.265.json` | For standard DVD conversions |
---
## Log File
All conversion logs are saved to:
```
./handbrake_convert.log
```
---
## Directory Structure Example
**Source:**
```
/source
├── Movie1
│ ├── video1.mkv
│ └── video2.mkv
└── Movie2
└── video1.mkv
```
**Destination after conversion:**
```
/destination
├── Movie1
│ ├── video1.mkv
│ └── video2.mkv
└── Movie2
└── video1.mkv
```
---
## License
This project is licensed under the MIT License.

1
gitignore Normal file
View File

@@ -0,0 +1 @@
handbrake_convert.log

74
hanbrake-batch-converteer.sh Executable file
View File

@@ -0,0 +1,74 @@
#!/bin/bash
# === Default settings ===
HANDBRAKE_CLI="/usr/bin/HandBrakeCLI"
LOG_FILE="./handbrake_convert.log"
# === Read parameters ===
while [[ $# -gt 0 ]]; do
case "$1" in
--source)
SOURCE_DIR="$2"
shift 2
;;
--destination)
DEST_DIR="$2"
shift 2
;;
--mode)
MODE="$2"
shift 2
;;
*)
echo "Unknown parameter: $1"
exit 1
;;
esac
done
# === Check required parameters ===
if [[ -z "$SOURCE_DIR" || -z "$DEST_DIR" || -z "$MODE" ]]; then
echo "Usage: $0 --source /path/to/source --destination /path/to/destination --mode [bluray|dvd]"
exit 1
fi
# === Set presets based on mode ===
case "$MODE" in
bluray)
PRESET_FILE="./profiles/BluRay H.265 HEVC.json"
PRESET_NAME="BluRay H.265 HEVC"
;;
dvd)
PRESET_FILE="./profiles/DVD 720p H.265.json"
PRESET_NAME="DVD 720p H.265"
;;
*)
echo "Invalid mode: $MODE (allowed: bluray, dvd)"
exit 1
;;
esac
# === Recursively find all MKV files ===
find "$SOURCE_DIR" -type f -name "*.mkv" | while read -r input_file; do
# Get relative path
rel_path="${input_file#$SOURCE_DIR/}"
rel_dir="$(dirname "$rel_path")"
# Create matching directory structure in destination
mkdir -p "$DEST_DIR/$rel_dir"
base_name="$(basename "$input_file" .mkv)"
output_file="$DEST_DIR/$rel_dir/$base_name.mkv"
# Convert if output does not exist
if [ ! -f "$output_file" ]; then
echo "$(date +"%Y-%m-%d %H:%M:%S") - Converting: $rel_path" >> "$LOG_FILE"
"$HANDBRAKE_CLI" -i "$input_file" -o "$output_file" \
--preset-import-file "$PRESET_FILE" --preset "$PRESET_NAME" >> "$LOG_FILE" 2>&1
else
echo "$(date +"%Y-%m-%d %H:%M:%S") - Skipped (already exists): $rel_path" >> "$LOG_FILE"
fi
done
echo "$(date +"%Y-%m-%d %H:%M:%S") - Finished!" >> "$LOG_FILE"

114
profiles/BluRay H.265 HEVC.json Executable file
View File

@@ -0,0 +1,114 @@
{
"PresetList": [
{
"AlignAVStart": false,
"AudioCopyMask": [
"copy:aac"
],
"AudioEncoderFallback": "av_aac",
"AudioLanguageList": [
"any"
],
"AudioList": [
{
"AudioBitrate": 448,
"AudioCompressionLevel": 0,
"AudioEncoder": "ac3",
"AudioMixdown": "5point1",
"AudioNormalizeMixLevel": false,
"AudioSamplerate": "48",
"AudioTrackQualityEnable": false,
"AudioTrackQuality": -1,
"AudioTrackGainSlider": 0,
"AudioTrackDRCSlider": 0
}
],
"AudioSecondaryEncoderMode": true,
"AudioTrackSelectionBehavior": "all",
"ChapterMarkers": true,
"ChildrenArray": [],
"Default": false,
"FileFormat": "av_mkv",
"Folder": false,
"FolderOpen": false,
"Optimize": false,
"Mp4iPodCompatible": false,
"PictureCropMode": 0,
"PictureBottomCrop": 0,
"PictureLeftCrop": 0,
"PictureRightCrop": 0,
"PictureTopCrop": 0,
"PictureDARWidth": 0,
"PictureDeblockPreset": "off",
"PictureDeblockTune": "medium",
"PictureDeblockCustom": "strength=strong:thresh=20:blocksize=8",
"PictureDeinterlaceFilter": "decomb",
"PictureCombDetectPreset": "default",
"PictureCombDetectCustom": "",
"PictureDeinterlacePreset": "default",
"PictureDeinterlaceCustom": "",
"PictureDenoiseCustom": "",
"PictureDenoiseFilter": "off",
"PictureSharpenCustom": "",
"PictureSharpenFilter": "off",
"PictureSharpenPreset": "medium",
"PictureSharpenTune": "none",
"PictureDetelecine": "off",
"PictureDetelecineCustom": "",
"PictureColorspacePreset": "off",
"PictureColorspaceCustom": "",
"PictureChromaSmoothPreset": "off",
"PictureChromaSmoothTune": "none",
"PictureChromaSmoothCustom": "",
"PictureItuPAR": false,
"PictureKeepRatio": true,
"PicturePAR": "auto",
"PicturePARWidth": 0,
"PicturePARHeight": 0,
"PictureWidth": 1920,
"PictureHeight": 1080,
"PictureUseMaximumSize": true,
"PictureAllowUpscaling": false,
"PictureForceHeight": 0,
"PictureForceWidth": 0,
"PicturePadMode": "none",
"PicturePadTop": 0,
"PicturePadBottom": 0,
"PicturePadLeft": 0,
"PicturePadRight": 0,
"PresetName": "BluRay H.265 HEVC",
"Type": 1,
"SubtitleAddCC": false,
"SubtitleAddForeignAudioSearch": true,
"SubtitleAddForeignAudioSubtitle": false,
"SubtitleBurnBehavior": "foreign",
"SubtitleBurnBDSub": false,
"SubtitleBurnDVDSub": false,
"SubtitleLanguageList": [
"any"
],
"SubtitleTrackSelectionBehavior": "all",
"VideoAvgBitrate": 0,
"VideoColorMatrixCode": 0,
"VideoEncoder": "x265_10bit",
"VideoFramerateMode": "cfr",
"VideoGrayScale": false,
"VideoScaler": "swscale",
"VideoPreset": "slow",
"VideoTune": "",
"VideoProfile": "main10",
"VideoLevel": "5.1",
"VideoOptionExtra": "strong-intra-smoothing=0:rect=0:aq-mode=1:rd=4:psy-rd=0.75:psy-rdoq=4.0:rdoq-level=1:rskip=2",
"VideoQualityType": 2,
"VideoQualitySlider": 24,
"VideoMultiPass": true,
"VideoTurboMultiPass": true,
"x264UseAdvancedOptions": false,
"PresetDisabled": false,
"MetadataPassthru": false
}
],
"VersionMajor": 59,
"VersionMicro": 0,
"VersionMinor": 0
}

114
profiles/DVD 720p H.265.json Executable file
View File

@@ -0,0 +1,114 @@
{
"PresetList": [
{
"AlignAVStart": false,
"AudioCopyMask": [
"copy:aac"
],
"AudioEncoderFallback": "av_aac",
"AudioLanguageList": [
"any"
],
"AudioList": [
{
"AudioBitrate": 448,
"AudioCompressionLevel": 0,
"AudioEncoder": "ac3",
"AudioMixdown": "stereo",
"AudioNormalizeMixLevel": false,
"AudioSamplerate": "auto",
"AudioTrackQualityEnable": false,
"AudioTrackQuality": -1,
"AudioTrackGainSlider": 0,
"AudioTrackDRCSlider": 0
}
],
"AudioSecondaryEncoderMode": true,
"AudioTrackSelectionBehavior": "all",
"ChapterMarkers": true,
"ChildrenArray": [],
"Default": false,
"FileFormat": "av_mkv",
"Folder": false,
"FolderOpen": false,
"Optimize": false,
"Mp4iPodCompatible": false,
"PictureCropMode": 0,
"PictureBottomCrop": 0,
"PictureLeftCrop": 14,
"PictureRightCrop": 14,
"PictureTopCrop": 8,
"PictureDARWidth": 738,
"PictureDeblockPreset": "off",
"PictureDeblockTune": "medium",
"PictureDeblockCustom": "strength=strong:thresh=20:blocksize=8",
"PictureDeinterlaceFilter": "decomb",
"PictureCombDetectPreset": "default",
"PictureCombDetectCustom": "",
"PictureDeinterlacePreset": "default",
"PictureDeinterlaceCustom": "",
"PictureDenoiseCustom": "",
"PictureDenoiseFilter": "off",
"PictureSharpenCustom": "",
"PictureSharpenFilter": "off",
"PictureSharpenPreset": "medium",
"PictureSharpenTune": "none",
"PictureDetelecine": "off",
"PictureDetelecineCustom": "",
"PictureColorspacePreset": "off",
"PictureColorspaceCustom": "",
"PictureChromaSmoothPreset": "off",
"PictureChromaSmoothTune": "none",
"PictureChromaSmoothCustom": "",
"PictureItuPAR": false,
"PictureKeepRatio": true,
"PicturePAR": "auto",
"PicturePARWidth": 16,
"PicturePARHeight": 15,
"PictureWidth": 1280,
"PictureHeight": 720,
"PictureUseMaximumSize": true,
"PictureAllowUpscaling": false,
"PictureForceHeight": 0,
"PictureForceWidth": 0,
"PicturePadMode": "none",
"PicturePadTop": 0,
"PicturePadBottom": 0,
"PicturePadLeft": 0,
"PicturePadRight": 0,
"PresetName": "DVD 720p H.265",
"Type": 1,
"SubtitleAddCC": false,
"SubtitleAddForeignAudioSearch": true,
"SubtitleAddForeignAudioSubtitle": false,
"SubtitleBurnBehavior": "foreign",
"SubtitleBurnBDSub": false,
"SubtitleBurnDVDSub": false,
"SubtitleLanguageList": [
"any"
],
"SubtitleTrackSelectionBehavior": "all",
"VideoAvgBitrate": 0,
"VideoColorMatrixCode": 0,
"VideoEncoder": "x265_10bit",
"VideoFramerateMode": "cfr",
"VideoGrayScale": false,
"VideoScaler": "swscale",
"VideoPreset": "slow",
"VideoTune": "",
"VideoProfile": "auto",
"VideoLevel": "auto",
"VideoOptionExtra": "",
"VideoQualityType": 2,
"VideoQualitySlider": 22,
"VideoMultiPass": true,
"VideoTurboMultiPass": true,
"x264UseAdvancedOptions": false,
"PresetDisabled": false,
"MetadataPassthru": false
}
],
"VersionMajor": 59,
"VersionMicro": 0,
"VersionMinor": 0
}