├── README.md └── RemuxAutoScript.sh /README.md: -------------------------------------------------------------------------------- 1 | # Remuxlinux 2 | 3 | All you need is in that little script ! 4 | 5 | ## Main features 6 | 7 | * Make Remux for you without the need to know the good order for your episodes 8 | * Easy to use it, scripted with love ;) 9 | 10 | ## Description 11 | 12 | * Everyone knows it is exhausting to make Remux manually for a whole season. 13 | * With my script and docker image you can automatically make the remux from the Blu-Ray, works for 20/40 min episodes and for movies. 14 | * The result : Episodes are ordered accordingly with the Blu-Ray watching order (VOL 01 or DISC1) but aren't for the Global Season Order (E20 - E21...) that's your job ;). 15 | * It use a docker container to escape the need of installing mono. 16 | * Patched [BDInfoCLI-Lite](https://github.com/HatchiFr/BDInfoCLI) for easier use. 17 | * RegHex are used to do that job ! 18 | * Full Path with no escape for space characters need double quote "". 19 | * Example of use : ./RemuxAutoScript.sh --type movie --time movie --folder "/home/hatchi/BluRay/Some Movie/" 20 | * Possible arguments --type episodes | movie --time 20 | 30 | 40 | 50 | 60 | movie --folder "Full Path Of The Blu-ray Folder" 21 | * Know Issues : BDInfo don't give you the possibility to check the presence of Bonus. 22 | 23 | ## Requirements 24 | 25 | * Docker. 26 | * MkvToolnix. 27 | * Hands and Internet. 28 | 29 | ## Installation 30 | 31 | * Download the Docker Image : docker pull hatchi/bdinfocli 32 | * Download the script : wget https://raw.githubusercontent.com/HatchiFr/Remuxlinux/master/RemuxAutoScript.sh 33 | * Give good authorization : chmod u+x RemuxAutoScript.sh 34 | * Change the variable REMUXPATH in the script to your Remux storage specific path. 35 | 36 | ## ToDo 37 | 38 | * Add Iso Support 39 | * Check for duplicat m2ts call in playlist 40 | * Eliminate Bonus -------------------------------------------------------------------------------- /RemuxAutoScript.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #### Description: Auto Remux Script for Bluray 3 | #### CSV file must use : as separator 4 | #### Written by: Hatchi - on 03-2017 5 | #### Last Update : Hatchi - on 04-2020 6 | 7 | REMUXPATH="/home/hatchi/scripts/Remux-Auto/result/" 8 | 9 | 10 | function usage 11 | { 12 | echo -e " One or more arguments are missing" 13 | echo -e " $0 --type (episodes, movie, debug) --time (20, 30, 40, 50 or 60 for episodes and movie for movie) --folder (Full Path of the Bluray Folder)" 14 | exit 0 15 | } 16 | 17 | function checkdata 18 | { 19 | if [ ! -d "$BLURAYPATH" ] 20 | then 21 | echo -e "The path of the Bluray is incorrect" 22 | exit 0 23 | fi 24 | } 25 | 26 | function cleanblurayname 27 | { 28 | CLEANBLURAYNAME="$(echo "$BLURAYNAME" | tr '[:space:]' '.')" 29 | CLEANBLURAYNAME="$(echo "$CLEANBLURAYNAME" | sed s'/[.]$//')" 30 | CLEANBLURAYNAME="$(echo "$CLEANBLURAYNAME" | tr -d '(')" 31 | CLEANBLURAYNAME="$(echo "$CLEANBLURAYNAME" | tr -d ')')" 32 | } 33 | 34 | #Remove duplicated episodes (Fuc**** playlist creator) 35 | function deduplication 36 | { 37 | SIZE="$(echo "$BDINFO" | sed '/Disc Size/d' | grep -oP '(([0-9]{2}|[0-9]{1}),[0-9]{3},[0-9]{3},[0-9]{3})' | sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P')" 38 | for n in $SIZE 39 | do 40 | DEDUPLINE="$(echo "$BDINFO" | grep $n | head -n1)" 41 | DEDUPBDINFO="$DEDUPBDINFO\n$DEDUPLINE" 42 | done 43 | BDINFO="$(echo -e "$DEDUPBDINFO" | uniq)" 44 | } 45 | 46 | #Check number of arguments 47 | if [ "$#" -ne 6 ] 48 | then 49 | usage 50 | fi 51 | 52 | #Check arguments 53 | if [ "$2" != "episodes" ] && [ "$2" != "movie" ] && [ "$2" != "debug" ] 54 | then 55 | echo -e "Bad argument for attribute type" 56 | exit 0 57 | fi 58 | 59 | if [ "$4" != "20" ] && [ "$4" != "30" ] && [ "$4" != "40" ] && [ "$4" != "50" ] && [ "$4" != "60" ] && [ "$4" != "movie" ] 60 | then 61 | echo -e "Bad argument for attribute time" 62 | exit 0 63 | fi 64 | 65 | #MOVIE 66 | if [ "$2" = "movie" ] 67 | then 68 | BDINFO="$(docker run --rm -v "$6":"$6" hatchi/bdinfocli "$6" /tmp/)" 69 | BLURAYPATH="$(echo "$BDINFO" | grep -oP '(\/[A-z0-9,.;&_ \-\[\]\(\)\{\}]*)+(\/BDMV)')" 70 | BLURAYNAME="$(echo "$BDINFO" | grep -oP '(\()+([A-z0-9,.;&_ \-\[\]\(\)\{\}]*)+(\))')" 71 | 72 | #Check if the BlurayPath is good 73 | checkdata 74 | #Clear the BLURAYNAME (remove () and space) 75 | cleanblurayname 76 | PLAYLISTPATH="$BLURAYPATH/PLAYLIST/" 77 | 78 | #Extract Movie specific data 79 | DATA="$(echo "$BDINFO" | grep -oP '([0-9]{1})[ ]+([0-9]{5}.MPLS)[ ]+([0][1-3]:[0-9]{2}:[0-9]{2})')" 80 | MPLSFILE="$(echo "$DATA" | grep -oP '([0-9]{5}.MPLS)')" 81 | echo "$MPLSFILE" 82 | 83 | #Create TAB and REMUX 84 | i=1 85 | for x in $MPLSFILE 86 | do 87 | #For DEBUG 88 | #TAB_MPLS[$i]=$x 89 | #Stock location 90 | TAB_LOCATION[$i]="$(find "$PLAYLISTPATH" -iname "$x")" 91 | i=$((i + 1)) 92 | done 93 | 94 | mkdir -p "$REMUXPATH"/"$CLEANBLURAYNAME" 95 | 96 | #Remux just the first MPLS that correpsond to movie 97 | mkvmerge -o "$REMUXPATH/$CLEANBLURAYNAME/$CLEANBLURAYNAME.mkv" "${TAB_LOCATION[1]}" 98 | fi 99 | 100 | #EPISODES 101 | if [ "$2" = "episodes" ] 102 | then 103 | 104 | if [ "$4" = "20" ] 105 | then 106 | REGEX='([0-9]{1})[ ]+([0-9]{5}.MPLS)[ ]+([0]{2}:([1][6-9]|[2][0-7]):[0-9]{2})' 107 | elif [ "$4" = "30" ] 108 | then 109 | REGEX='([0-9]{1})[ ]+([0-9]{5}.MPLS)[ ]+([0]{2}:([2][7-9]|[3][0-6]):[0-9]{2})' 110 | elif [ "$4" = "40" ] 111 | then 112 | REGEX='([0-9]{1})[ ]+([0-9]{5}.MPLS)[ ]+([0]{2}:([3][6-9]|[4][0-8]):[0-9]{2})' 113 | elif [ "$4" = "50" ] || [ "$4" = "60" ] 114 | then 115 | REGEX='([0-9]{1})[ ]+([0-9]{5}.MPLS)[ ]+(([0]{2}:([4][7-9]|[5][0-9]):[0-9]{2})|([0][1]:([0-3][0-9]:[0-9]{2})))' 116 | else 117 | echo "Bad argument for attribute time" 118 | exit 0 119 | fi 120 | 121 | BDINFO="$(docker run --rm -v "$6":"$6" hatchi/bdinfocli "$6" /tmp/)" 122 | BLURAYPATH="$(echo "$BDINFO" | grep -oP '(\/[A-z0-9,.;&_ \-\[\]\(\)\{\}]*)+(\/BDMV)')" 123 | BLURAYNAME="$(echo "$BDINFO" | grep -oP '(\()+([A-z0-9,.;&_ \-\[\]\(\)\{\}]*)+(\))')" 124 | 125 | #Check if the BlurayPath is good 126 | checkdata 127 | #Clear the BLURAYNAME (remove () and space) 128 | cleanblurayname 129 | PLAYLISTPATH="$BLURAYPATH/PLAYLIST/" 130 | 131 | #Extract Episodes specific time 132 | DATA="$(echo "$BDINFO" | grep -oP "$REGEX")" 133 | 134 | #Extract MPLSFILES 135 | MPLSFILE="$(echo "$DATA" | grep -oP '([0-9]{5}.MPLS)' | sort -n)" 136 | 137 | mkdir -p "$REMUXPATH"/"$CLEANBLURAYNAME" 138 | 139 | i=0 140 | for x in $MPLSFILE 141 | do 142 | #Stock location 143 | MPLS_LOCATION="$(find "$PLAYLISTPATH" -iname "$x")" 144 | #Register informations 145 | echo "Analysing M2TS List for : $x" 146 | M2TS_TAB_[$i]="$(mediainfo "$MPLS_LOCATION" | grep -oP '([0-9]{5}.m2ts)' | sort -n | uniq)" 147 | MEDIAINFO_TAB_[$i]="$(mediainfo "$MPLS_LOCATION")" 148 | i=$((i + 1)) 149 | done 150 | 151 | DUPLICATED="0" 152 | #Array FINAL_MPLSFILE counter 153 | a=0 154 | #Compare Variable to build final list 155 | i=0 156 | for x in $MPLSFILE 157 | do 158 | #Compare each MPLS information with others to determine duplicate M2TS source 159 | j=0 160 | for y in $MPLSFILE 161 | do 162 | if [[ "${M2TS_TAB_[$j]}" =~ "${M2TS_TAB_[$i]}" && "${M2TS_TAB_[$j]}" != "${M2TS_TAB_[$i]}" ]] 163 | then 164 | DUPLICATED="1" 165 | if [ "${#MEDIAINFO_TAB_[$i]}" -lt "${#MEDIAINFO_TAB_[$j]}" ] 166 | then 167 | FINAL_MPLSFILE[$a]=$y 168 | fi 169 | 170 | if [ "${#M2TS_TAB_[$i]}" -lt "${#M2TS_TAB_[$j]}" ] && [ "${#MEDIAINFO_TAB_[$i]}" -le "${#MEDIAINFO_TAB_[$j]}" ] 171 | then 172 | FINAL_MPLSFILE[$a]=$y 173 | fi 174 | fi 175 | j=$((j + 1)) 176 | done 177 | 178 | if [ "${FINAL_MPLSFILE[$a]}" ] 179 | then 180 | a=$((a + 1)) 181 | elif [ "$DUPLICATED" -eq "0" ] 182 | then 183 | FINAL_MPLSFILE[$a]=$x 184 | a=$((a + 1)) 185 | fi 186 | i=$((i + 1)) 187 | done 188 | 189 | echo "FINAL LIST :" 190 | for i in "${FINAL_MPLSFILE[@]}" 191 | do 192 | echo "$i" 193 | done 194 | 195 | #Create TAB and REMUX 196 | i=0 197 | for x in "${FINAL_MPLSFILE[@]}" 198 | do 199 | #For DEBUG 200 | #TAB_MPLS[$i]=$x 201 | #Stock location 202 | TAB_LOCATION[$i]="$(find "$PLAYLISTPATH" -iname "$x")" 203 | mkvmerge -o "$REMUXPATH/$CLEANBLURAYNAME/$CLEANBLURAYNAME.E$i.mkv" "${TAB_LOCATION[$i]}" 204 | i=$((i + 1)) 205 | done 206 | fi 207 | 208 | if [ "$2" = "debug" ] 209 | then 210 | 211 | if [ "$4" = "20" ] 212 | then 213 | REGEX='([0-9]{1})[ ]+([0-9]{5}.MPLS)[ ]+([0]{2}:([1][6-9]|[2][0-7]):[0-9]{2})' 214 | elif [ "$4" = "30" ] 215 | then 216 | REGEX='([0-9]{1})[ ]+([0-9]{5}.MPLS)[ ]+([0]{2}:([2][7-9]|[3][0-6]):[0-9]{2})' 217 | elif [ "$4" = "40" ] 218 | then 219 | REGEX='([0-9]{1})[ ]+([0-9]{5}.MPLS)[ ]+([0]{2}:([3][6-9]|[4][0-8]):[0-9]{2})' 220 | elif [ "$4" = "50" ] || [ "$4" = "60" ] 221 | then 222 | REGEX='([0-9]{1})[ ]+([0-9]{5}.MPLS)[ ]+(([0]{2}:([4][7-9]|[5][0-9]):[0-9]{2})|([0][1]:([0-3][0-9]:[0-9]{2})))' 223 | else 224 | echo "Bad argument for attribute time" 225 | exit 0 226 | fi 227 | 228 | BDINFO="$(docker run --rm -v "$6":"$6" hatchi/bdinfocli "$6" /tmp/)" 229 | BLURAYPATH="$(echo "$BDINFO" | grep -oP '(\/[A-z0-9,.;&_ \-\[\]\(\)\{\}]*)+(\/BDMV)')" 230 | BLURAYNAME="$(echo "$BDINFO" | grep -oP '(\()+([A-z0-9,.;&_ \-\[\]\(\)\{\}]*)+(\))')" 231 | 232 | 233 | #Check if the BlurayPath is good 234 | checkdata 235 | #Clear the BLURAYNAME (remove () and space) 236 | cleanblurayname 237 | PLAYLISTPATH="$BLURAYPATH/PLAYLIST/" 238 | 239 | deduplication 240 | 241 | #Extract Episodes specific time 242 | DATA="$(echo "$BDINFO" | grep -oP "$REGEX")" 243 | #Extract MPLSFILES 244 | MPLSFILE="$(echo "$DATA" | grep -oP '([0-9]{5}.MPLS)' | sort -n)" 245 | echo "BDINFO :" 246 | echo "$BDINFO" 247 | echo "" 248 | echo "SELECTED TIME : $4" 249 | echo "" 250 | echo "SELECTED MPLS FILES WITH REGEX :" 251 | echo "" 252 | echo "$DATA" 253 | echo "" 254 | echo "MPLSFILES NAMES :" 255 | echo "" 256 | echo "$MPLSFILE" 257 | echo "" 258 | #Analyse mediainfo for each MPLS File 259 | i=0 260 | for x in $MPLSFILE 261 | do 262 | #Stock location 263 | MPLS_LOCATION="$(find "$PLAYLISTPATH" -iname "$x")" 264 | #Register informations 265 | echo "Analysing M2TS List for : $x" 266 | M2TS_TAB_[$i]="$(mediainfo "$MPLS_LOCATION" | grep -oP '([0-9]{5}.m2ts)' | sort -n | uniq)" 267 | MEDIAINFO_TAB_[$i]="$(mediainfo "$MPLS_LOCATION")" 268 | i=$((i + 1)) 269 | done 270 | 271 | DUPLICATED="0" 272 | #Array FINAL_MPLSFILE counter 273 | a=0 274 | #Compare Variable to build final list 275 | i=0 276 | for x in $MPLSFILE 277 | do 278 | #Compare each MPLS information with others to determine duplicate M2TS source 279 | j=0 280 | for y in $MPLSFILE 281 | do 282 | if [[ "${M2TS_TAB_[$j]}" =~ "${M2TS_TAB_[$i]}" && "${M2TS_TAB_[$j]}" != "${M2TS_TAB_[$i]}" ]] 283 | then 284 | DUPLICATED="1" 285 | if [ "${#MEDIAINFO_TAB_[$i]}" -lt "${#MEDIAINFO_TAB_[$j]}" ] 286 | then 287 | FINAL_MPLSFILE[$a]=$y 288 | fi 289 | 290 | if [ "${#M2TS_TAB_[$i]}" -lt "${#M2TS_TAB_[$j]}" ] && [ "${#MEDIAINFO_TAB_[$i]}" -le "${#MEDIAINFO_TAB_[$j]}" ] 291 | then 292 | FINAL_MPLSFILE[$a]=$y 293 | fi 294 | fi 295 | j=$((j + 1)) 296 | done 297 | 298 | if [ "${FINAL_MPLSFILE[$a]}" ] 299 | then 300 | a=$((a + 1)) 301 | elif [ "$DUPLICATED" -eq "0" ] 302 | then 303 | FINAL_MPLSFILE[$a]=$x 304 | a=$((a + 1)) 305 | fi 306 | i=$((i + 1)) 307 | done 308 | 309 | echo "FINAL LIST :" 310 | for i in "${FINAL_MPLSFILE[@]}" 311 | do 312 | echo "$i" 313 | done 314 | fi 315 | exit 0 316 | --------------------------------------------------------------------------------