Created
August 17, 2025 16:50
-
-
Save junaidk/5670ba0fa4da28be2b655c46c1f92283 to your computer and use it in GitHub Desktop.
This script is designed as a front-end automation tool for removing Dolby Vision (DV) and HDR10+ metadata from video files (mainly .mkv, .mp4, .hevc, .h265). It wraps together several third-party tools and provides a text-menu interface.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# Lightweight HDR metadata remover (Linux) | |
# Supports: Dolby Vision (dovi_tool), HDR10+ (hdr10plus_tool), HDR10 (ffmpeg hevc_metadata) | |
# Uses https://github.com/DonaldFaQ/DDVT/blob/Scripts/DDVT_REMOVER.cmd as inspiration | |
# Requirements: | |
# ffmpeg, mkvtoolnix (mkvmerge), gpac (MP4Box), mediainfo | |
# dovi_tool, hdr10plus_tool | |
# Run | |
# remove_hdr_dv.sh <file_name> | |
INPUT="$1" | |
if [[ -z "$INPUT" ]]; then | |
echo "Usage: $0 <video_file>" | |
exit 1 | |
fi | |
if [[ ! -f "$INPUT" ]]; then | |
echo "Error: File not found: $INPUT" | |
exit 1 | |
fi | |
# Extract filename parts | |
BASENAME=$(basename "$INPUT") | |
EXT="${BASENAME##*.}" | |
NAME="${BASENAME%.*}" | |
DIRNAME=$(dirname "$INPUT") | |
# Detect HDR/DV info | |
HDR_INFO=$(mediainfo --Inform="Video;%HDR_Format%" "$INPUT") | |
DV_PROFILE=$(mediainfo --Inform="Video;%HDR_Format_Profile%" "$INPUT") | |
echo "Input file: $BASENAME" | |
echo "HDR: $HDR_INFO" | |
echo "DV Profile: $DV_PROFILE" | |
# Flags | |
REMOVE_HDR10P=false | |
REMOVE_DV=false | |
REMOVE_HDR10=false | |
if [[ "$HDR_INFO" == "HDR10+" ]]; then | |
REMOVE_HDR10P=true | |
fi | |
if [[ "$DV_PROFILE" =~ "dvhe" ]]; then | |
REMOVE_DV=true | |
fi | |
# Ask user if they want to strip HDR10 static metadata too | |
read -p "Also remove HDR10 static metadata (MaxCLL, MaxFALL, mastering display)? [y/N]: " ans | |
if [[ "$ans" =~ ^[Yy]$ ]]; then | |
REMOVE_HDR10=true | |
fi | |
# Work paths | |
OUTPUT="$DIRNAME/$NAME.cleaned.$EXT" | |
TEMP_VIDEO="$DIRNAME/$NAME.video.hevc" | |
# Extract raw video stream | |
echo "Extracting video stream..." | |
ffmpeg -y -i "$INPUT" -c:v copy -bsf:v hevc_mp4toannexb -an -sn -f hevc "$TEMP_VIDEO" | |
# Remove HDR10+ | |
if [[ "$REMOVE_HDR10P" == true ]]; then | |
echo "Stripping HDR10+ metadata..." | |
hdr10plus_tool remove -i "$TEMP_VIDEO" -o "$TEMP_VIDEO.stripped" | |
mv "$TEMP_VIDEO.stripped" "$TEMP_VIDEO" | |
fi | |
# Remove Dolby Vision | |
if [[ "$REMOVE_DV" == true ]]; then | |
echo "Stripping Dolby Vision RPU..." | |
dovi_tool remove -i "$TEMP_VIDEO" -o "$TEMP_VIDEO.stripped" | |
mv "$TEMP_VIDEO.stripped" "$TEMP_VIDEO" | |
fi | |
# Remove HDR10 static metadata | |
if [[ "$REMOVE_HDR10" == true ]]; then | |
echo "Removing HDR10 static metadata (MaxCLL/MaxFALL, mastering display)..." | |
ffmpeg -y -i "$TEMP_VIDEO" -c copy -bsf:v hevc_metadata=remove "$TEMP_VIDEO.stripped.hevc" | |
mv "$TEMP_VIDEO.stripped.hevc" "$TEMP_VIDEO" | |
fi | |
# Remux back into original container | |
echo "Remuxing cleaned video..." | |
if [[ "$EXT" == "mkv" ]]; then | |
mkvmerge -o "$OUTPUT" --video-tracks 0 "$TEMP_VIDEO" -D "$INPUT" | |
elif [[ "$EXT" == "mp4" ]]; then | |
MP4Box -add "$TEMP_VIDEO" -cat "$INPUT" -new "$OUTPUT" | |
else | |
echo "Unsupported extension: $EXT. Output as MKV." | |
mkvmerge -o "$OUTPUT" --video-tracks 0 "$TEMP_VIDEO" -D "$INPUT" | |
fi | |
# Cleanup | |
rm -f "$TEMP_VIDEO" | |
echo "Done. Output file: $OUTPUT" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# Setup script: install dependencies + dovi_tool + hdr10plus_tool | |
set -e | |
echo "=== Updating package lists ===" | |
sudo apt update -y | |
echo "=== Installing dependencies (ffmpeg, mkvtoolnix, gpac, mediainfo) ===" | |
sudo apt install -y ffmpeg mkvtoolnix gpac mediainfo curl jq unzip | |
# Directory for downloaded tools | |
TMP_DIR=$(mktemp -d) | |
cd "$TMP_DIR" | |
echo "=== Fetching latest dovi_tool release ===" | |
DOVI_URL=$(curl -s https://api.github.com/repos/quietvoid/dovi_tool/releases/latest \ | |
| jq -r '.assets[] | select(.name | test("linux.*.tar.gz$")) | .browser_download_url' | head -n1) | |
if [[ -z "$DOVI_URL" ]]; then | |
echo "Error: Could not find dovi_tool release URL" | |
exit 1 | |
fi | |
curl -L "$DOVI_URL" -o dovi_tool.tar.gz | |
tar -xzf dovi_tool.tar.gz | |
sudo mv dovi_tool*/dovi_tool /usr/local/bin/ | |
sudo chmod +x /usr/local/bin/dovi_tool | |
echo "=== Installed dovi_tool ===" | |
dovi_tool -V || true | |
echo "=== Fetching latest hdr10plus_tool release ===" | |
HDR10P_URL=$(curl -s https://api.github.com/repos/quietvoid/hdr10plus_tool/releases/latest \ | |
| jq -r '.assets[] | select(.name | test("linux.*.tar.gz$")) | .browser_download_url' | head -n1) | |
if [[ -z "$HDR10P_URL" ]]; then | |
echo "Error: Could not find hdr10plus_tool release URL" | |
exit 1 | |
fi | |
curl -L "$HDR10P_URL" -o hdr10plus_tool.tar.gz | |
tar -xzf hdr10plus_tool.tar.gz | |
sudo mv hdr10plus_tool*/hdr10plus_tool /usr/local/bin/ | |
sudo chmod +x /usr/local/bin/hdr10plus_tool | |
echo "=== Installed hdr10plus_tool ===" | |
hdr10plus_tool -V || true | |
# Cleanup | |
cd / | |
rm -rf "$TMP_DIR" | |
echo | |
echo "✅ Setup complete!" | |
echo "Installed tools:" | |
echo " - ffmpeg" | |
echo " - mkvtoolnix" | |
echo " - gpac (MP4Box)" | |
echo " - mediainfo" | |
echo " - dovi_tool ($(dovi_tool -V))" | |
echo " - hdr10plus_tool ($(hdr10plus_tool -V))" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment