10 Commits

Author SHA1 Message Date
Derek Christensen
aef3c4062d Disable some shecllcheck errors 2016-12-19 00:22:41 -08:00
Derek Christensen
950b6463c2 Fix mv command 2016-12-19 00:08:59 -08:00
Derek Christensen
31fdda8dbe Comment editiing 2016-12-17 23:49:57 -08:00
Derek Christensen
4a54544eb2 Added Emby processes to more scenarios 2016-12-17 23:25:01 -08:00
muckngrind4
40bfb99eff List parameters at beginning of log file (#31)
* List all parameters in log file
2016-12-16 18:14:18 -08:00
muckngrind4
6dedbf2f72 Option to skip transcoding (#30)
* Option to skip transcoding
2016-12-16 18:09:53 -08:00
muckngrind4
e70bf17a70 Added ability to do MakeMKV backup with main feature = false. (#29) 2016-12-14 22:11:16 -08:00
muckngrind4
1478264a00 Option to automatically scan Emby library after main feature transcoding (#26)
* Options to automatically scan Emby library after main feature transcoding.
* Clean up config.sample
2016-12-12 18:08:56 -08:00
Benjamin Bryan
ffcfb2220d Merge pull request #25 from ahnooie/tvdetection
Handle failed calls to omdbapi better.
2016-12-06 21:55:06 -08:00
Derek Christensen
7a5cfb5306 Handle failed calls to omdbapi better. 2016-12-06 21:17:07 -08:00
5 changed files with 246 additions and 65 deletions

1
.gitignore vendored
View File

@@ -3,3 +3,4 @@ test.sh
archive/
config
temp/
test.py

113
config.sample Normal file → Executable file
View File

@@ -11,42 +11,47 @@ ARM_CHECK_UDF=true
# For BluRays attempts to extract the title from an XML file on the disc
GET_VIDEO_TITLE=true
# Skip transcoding if you want the original MakeMKV files as your final output
# Thiw will produce the highest quality videos (and use the most storage)
# Note: RIPMETHOD must be set to "mkv" for this feature to work
SKIP_TRANSCODE=false
#####################
## Directory setup ##
#####################
#Base directory of ARM media directory
#Ripped and transcoded files end up here
# Base directory of ARM media directory
# Ripped and transcoded files end up here
ARMPATH="/mnt/media/ARM/"
#Path to raw MakeMKV directory
#Destination for MakeMKV and source for HandBrake
# Path to raw MakeMKV directory
# Destination for MakeMKV and source for HandBrake
RAWPATH="/mnt/media/ARM/raw/"
#Path to final media directory
#Destination for final file. Only used for movies that are positively identified
# Path to final media directory
# Destination for final file. Only used for movies that are positively identified
MEDIA_DIR="/mnt/media/ARM/emby/movies/"
#Path to directory to hold log files
#Make sure to include trailing /
# Path to directory to hold log files
# Make sure to include trailing /
LOGPATH="/opt/arm/logs/"
#How long to let log files live before deleting (in days)
# How long to let log files live before deleting (in days)
LOGLIFE=1
########################
## MakeMKV Parameters ##
########################
#Minimum length of track for MakeMKV rip (in seconds)
# Minimum length of track for MakeMKV rip (in seconds)
MINLENGTH="600"
#Method of MakeMKV to use for Blu Ray discs. Options are "mkv" or "backup".
#mkv is the normal method of ripping mkv files directly from the DVD
#backup decrypts the dvd and then copies it to the hard drive. This allows HandBrake to apply some of it's
#analytical abilities such as the main-feature identification. This method seems to offer success on bluray
#discs that fail in "mkv" mode. *** NOTE: MakeMKV only supports the backup method on BluRay discs. Regular
#DVD's will always default back to the "mkv" mode. If this is set to "backup" then you must also set HandBrake's MAINFEATURE to true.
# Method of MakeMKV to use for Blu Ray discs. Options are "mkv" or "backup".
# mkv is the normal method of ripping mkv files directly from the DVD
# backup decrypts the dvd and then copies it to the hard drive. This allows HandBrake to apply some of it's
# analytical abilities such as the main-feature identification. This method seems to offer success on bluray
# discs that fail in "mkv" mode. *** NOTE: MakeMKV only supports the backup method on BluRay discs. Regular
# DVD's will always default back to the "mkv" mode. If this is set to "backup" then you must also set HandBrake's MAINFEATURE to true.
RIPMETHOD="mkv"
##########################
@@ -54,49 +59,83 @@ RIPMETHOD="mkv"
##########################
# Handbrake preset profile
# See https://trac.handbrake.fr/wiki/BuiltInPresets
# Execute "HandBrakeCLI -z" to see a list of all presets
HB_PRESET="High Profile"
#Extension of the final video file
# Extension of the final video file
DEST_EXT=mkv
#Handbrake binary to call
# Handbrake binary to call
HANDBRAKE_CLI=HandBrakeCLI
#Have HandBrake transcode the main feature only. BluRay discs must have RIPMETHOD="backup" for this to work.
#If MAINFEATURE is true, blurays will be backed up to the HD and then HandBrake will go to work on the backed up
#files. For normal DVDs, ARM will by pass MakeMKV and be accessed directly by HandBrake. This will require
#libdvdcss2 be installed.
#NOTE: For the most part, HandBrake correctly identifies the main feature on movie DVD's, although it is not perfect.
#However, it does not handle tv shows well at all. You will likely want this value to be false when ripping tv shows.
#MAINFEATURE=false
# Have HandBrake transcode the main feature only. BluRay discs must have RIPMETHOD="backup" for this to work.
# If MAINFEATURE is true, blurays will be backed up to the HD and then HandBrake will go to work on the backed up
# files. For normal DVDs, ARM will bypass MakeMKV and hand off the dvd directly to HandBrake. This will require
# libdvdcss2 be installed.
# NOTE: For the most part, HandBrake correctly identifies the main feature on movie DVD's, although it is not perfect.
# However, it does not handle tv shows well at all. You will likely want this value to be false when ripping tv shows.
MAINFEATURE=false
#####################
## Emby Parameters ##
#####################
# Parameters to enable automatic library scan in Emby. This will trigger only if MainFeature is true above.
# Scan emby library after succesful placement of mainfeature (see above)
EMBY_REFRESH=false
# Use subfolders in Emby as described here: https://github.com/MediaBrowser/Wiki/wiki/Movie%20naming#movie-extras
EMBY_SUBFOLDERS=true
# Server parameters
# Server can be ip address or domain name
EMBY_SERVER=""
EMBY_PORT="8096"
# Emby authentication fluff parameters. These can be anything.
EMBY_CLIENT="ARM"
EMBY_DEVICE="ARM"
EMBY_DEVICEID="ARM"
# Emby authentication parameters. These are parameters that must be set to a current user in Emby.
EMBY_USERNAME=""
# EMBY_USERID is the user ID associated with the username above. You can find this by going to the following address on your emby server
# <server>:<port>/Users/Public and getting the ID value for the username above.
EMBY_USERID=""
# This is the SHA1 encrypted password for the username above. You can generate the SHA1 hash of your password by executing the following at
# the command line:
# echo -n your-password | sha1sum | awk '{print $1}'
# or using an online generator like the one located at http://www.sha1-online.com/
EMBY_PASSWORD=""
#############################
## Notification Parameters ##
#############################
#Pushbullet API Key
#Leave empty or comment out to disable Pushbullet notifications
# Pushbullet API Key
# Leave empty or comment out to disable Pushbullet notifications
PB_KEY=""
#IFTTT API KEY
#Leave empty or comment out to disable IFTTT notifications
#IFTTT_KEY=""
# IFTTT API KEY
# Leave empty or comment out to disable IFTTT notifications
# IFTTT_KEY=""
#IFTTT Event Name
# IFTTT Event Name
IFTTT_EVENT="arm_event"
#Determine logfile name
#use the label of the DVD/CD or else use empty.log
#this is required for udev events where there is no media available
#such as ejecting the drive
# Determine logfile name
# use the label of the DVD/CD or else use empty.log
# this is required for udev events where there is no media available
# such as ejecting the drive
if [ -z "$ID_FS_LABEL" ]; then
LOGFILE="empty.log"
else
LOGFILE=${ID_FS_LABEL}".log"
fi
#Set full logfile path
# Set full logfile path
LOG=$LOGPATH$LOGFILE

View File

@@ -20,35 +20,59 @@ def getdvdtype():
or a tv series """
dvd_title = args.title
year = dvd_title[(dvd_title.rindex('(')):len(dvd_title)]
year = re.sub('[()]','', year)
try:
year = dvd_title[(dvd_title.rindex('(')):len(dvd_title)]
except:
year = ""
else:
year = re.sub('[()]','', year)
dvd_title = dvd_title[0:(dvd_title.rindex('('))].strip()
dvd_title = cleanupstring(dvd_title)
try:
dvd_title = dvd_title[0:(dvd_title.rindex('('))].strip()
except:
dvd_title_clean = cleanupstring(dvd_title)
else:
dvd_title_clean = cleanupstring(dvd_title)
if year is None:
year = ""
dvd_title_info_json = urllib.request.urlopen("http://www.omdbapi.com/?t={0}&y={1}&plot=short&r=json".format(dvd_title, year)).read()
doc = json.loads(dvd_title_info_json.decode())
return doc['Type']
dvd_type = callwebservice(dvd_title, year)
# handle failures
# first see if there is a hyphen and split it
if (dvd_title.find("-") > -1):
dvd_title_slice = dvd_title[:dvd_title.find("-")]
dvd_title_slice =cleanupstring(dvd_title_slice)
dvd_type = callwebservice(dvd_title_slice)
# if still fail, then try slicing off the last word in a loop
while dvd_type == "fail" and dvd_title_clean.count('+') > 0:
dvd_title_clean = dvd_title_clean.rsplit('+', 1)[0]
dvd_type = callwebservice(dvd_title_clean)
return dvd_type
def cleanupstring(string):
# clean up title string to pass to OMDbapi.org
string = string.strip()
return re.sub('[_ ]',"+",string)
def callwebservice(dvd_title, year=""):
""" Queries OMDbapi.org for title information and parses if it's a movie
or a tv series """
try:
dvd_title_info_json = urllib.request.urlopen("http://www.omdbapi.com/?t={0}&y={1}&plot=short&r=json".format(dvd_title, year)).read()
except:
return "fail"
else:
doc = json.loads(dvd_title_info_json.decode())
if doc['Response'] == "False":
return "fail"
else:
return doc['Type']
args = entry()
try:
dvd_type = getdvdtype()
except:
print("fail")
else:
# we only want "movie" or "series"
if dvd_type == "movie" or dvd_type == "series":
print(dvd_type)
else:
print("other")
dvd_type = getdvdtype()
print(dvd_type)

View File

@@ -13,6 +13,14 @@ mkdir -p "$LOGPATH"
#shellcheck disable=SC2094
{
# echo all config parameters to logfile
# excludes sensative parameters
# shellcheck disable=SC2129
echo "*** Start config parameters ****" >> "$LOG"
# shellcheck disable=SC2002
cat "$ARM_CONFIG"|sed '/^[#;].*$/d;/^$/d;/if/d;/^ /d;/^else/d;/^fi/d;/KEY=/d;/PASSWORD/d' >> "$LOG"
echo "*** End config parameters ****" >> "$LOG"
echo "Starting Identify Script..." >> "$LOG"
VIDEO_TITLE=""

View File

@@ -30,20 +30,50 @@ TIMESTAMP=$5
# DEST="${ARMPATH}/${LABEL}_${TIMESTAMP}"
mkdir "$DEST"
if [ "$RIPMETHOD" = "backup" ] && [ "$MAINFEATURE" = true ] && [ "$ID_CDROM_MEDIA_BD" = "1" ]; then
if [ "$SKIP_TRANSCODE" = true ] && [ "$RIPMETHOD" = "mkv" ]; then
# this only works for files ripped by MakeMKV into .mkv files
echo "Skipping transcode. Moving files from $SRC to $DEST" >> "$LOG"
mv "$SRC"/* "$DEST"/ >> "$LOG"
elif [ "$RIPMETHOD" = "backup" ] && [ "$MAINFEATURE" = true ] && [ "$ID_CDROM_MEDIA_BD" = "1" ]; then
echo "Transcoding BluRay main feature only." >> "$LOG"
$HANDBRAKE_CLI -i "$SRC" -o "$DEST/$LABEL.$DEST_EXT" --main-feature --preset="$HB_PRESET" --subtitle scan -F 2>> "$LOG"
rmdir "$SRC"
elif [ "$RIPMETHOD" = "backup" ] && [ "$MAINFEATURE" = false ] && [ "$ID_CDROM_MEDIA_BD" = "1" ]; then
echo "Transcoding BluRay all titles above minlength." >> "$LOG"
# This fails, need to figure out how to iterate through all fetures on a backup source
$HANDBRAKE_CLI -i "$SRC" -o "$DEST/$LABEL.$DEST_EXT" --min-duration "$MINLENGTH" --preset="$HB_PRESET" --subtitle scan -F 2>> "$LOG"
rmdir "$SRC"
# Itterate through titles of MakeMKV backup
# First check if this is the main title
MAINTITLENO="$(echo ""|HandBrakeCLI --input "$SRC" --title 0 --scan |& grep -B 1 "Main Feature" | sed 's/[^0-9]*//g')"
# Get number of titles
TITLES="$(echo ""|HandBrakeCLI --input "$SRC" --scan |& grep -Po '(?<=scan: BD has )([0-9]+)')"
echo "$TITLES titles on BluRay Disc" >> "$LOG"
for TITLE in $(seq 1 "$TITLES")
do
echo "Processing title $TITLE" >> "$LOG"
TIME="$(echo ""|HandBrakeCLI --input "$SRC" --title "$TITLE" --scan |& grep 'duration is' | sed -r 's/.*\((.*)ms\)/\1/')"
SEC=$(( TIME / 1000 )) >> "$LOG"
echo "Title length is $SEC seconds." >> "$LOG"
if [ $SEC -gt "$MINLENGTH" ]; then
echo "HandBraking title $TITLE"
$HANDBRAKE_CLI -i "$SRC" -o "$DEST/$LABEL-$TITLE.$DEST_EXT" --min-duration="$MINLENGTH" -t "$TITLE" --preset="$HB_PRESET" --subtitle scan -F 2 >> "$LOG"
# Check for main title and rename
if [ "$MAINTITLENO" = "$TITLE" ] && [ "$HAS_NICE_TITLE" = true ]; then
echo "Sending the following command: mv -n \"$DEST/$LABEL-$TITLE.$DEST_EXT\" \"${DEST}/${LABEL}.${DEST_EXT}\"" >> "$LOG"
mv -n "$DEST/$LABEL-$TITLE.$DEST_EXT" "${DEST}/${LABEL}.${DEST_EXT}" >> "$LOG"
fi
else
echo "Title $TITLE lenth less than $MINLENGTH. Skipping." >> "$LOG"
fi
done
rm -rf "$SRC"
elif [ "$MAINFEATURE" = true ] && [ "$ID_CDROM_MEDIA_DVD" = "1" ]; then
echo "Transcoding DVD main feature only." >> "$LOG"
# echo "$HANDBRAKE_CLI -i $DEVNAME -o \"${DEST}/${LABEL}.${DEST_EXT}\" --main-feature --preset="${HB_PRESET}" --subtitle scan -F 2" >> $LOG
$HANDBRAKE_CLI -i "$DEVNAME" -o "${DEST}/${LABEL}.${DEST_EXT}" --main-feature --preset="${HB_PRESET}" --subtitle scan -F 2>> "$LOG"
# $HANDBRAKE_CLI -i $DEVNAME -o "${DEST}/${LABEL}.${DEST_EXT}" --main-feature --preset="${HB_PRESET}">> $LOG
eject "$DEVNAME"
else
echo "Transcoding all files." >> "$LOG"
@@ -62,16 +92,95 @@ TIMESTAMP=$5
rmdir "$SRC"
fi
if [ "$VIDEO_TYPE" = "movie" ] && [ "$MAINFEATURE" = true ] && [ "$HAS_NICE_TITLE" = true ]; then
echo "checing for existing file" >> "$LOG"
embyrefresh ()
{
ApiKey="$(curl -s -H "Authorization: MediaBrowser Client=\"$EMBY_CLIENT\", Device=\"$EMBY_DEVICE\", DeviceId=\"$EMBY_DEVICEID\", Version=1.0.0.0, UserId=\"$EMBY_USERID\"" -d "username=$EMBY_USERNAME" -d "password=$EMBY_PASSWORD" "http://$EMBY_SERVER:$EMBY_PORT/users/authenticatebyname?format=json" | python -m json.tool | grep 'AccessToken' | sed 's/\"//g; s/AccessToken://g; s/\,//g; s/ //g')"
RESPONSE=$(curl -d 'Library' "http://$EMBY_SERVER:$EMBY_PORT/Library/Refresh?api_key=$ApiKey")
if [ ${#RESPONSE} = 0 ]; then
# scan was successful
echo "Emby refresh command sent successfully" >> "$LOG"
else
# scan failed
echo "Emby refresh command failed for some reason. Probably authentication issues" >> "$LOG"
fi
}
if [ "$VIDEO_TYPE" = "movie" ] && [ "$MAINFEATURE" = true ] && [ "$HAS_NICE_TITLE" = true ] && [ "$EMBY_SUBFOLDERS" = false ]; then
# move the file to the final media directory
# shellcheck disable=SC2129,SC2016
echo '$VIDEO_TYPE is movie, $MAINFEATURE is true, $HAS_NICE_TITLE is true, $EMBY_SUBFOLDERS is false' >> "$LOG"
echo "Moving a single file." >> "$LOG"
echo "Checing for existing file..." >> "$LOG"
if [ ! -f "$MEDIA_DIR/$LABEL.$DEST_EXT" ]; then
echo "No file found. Moving \"$DEST/$LABEL.$DEST_EXT to $MEDIA_DIR/$LABEL.$DEST_EXT\"" >> "$LOG"
mv -n "$DEST/$LABEL.$DEST_EXT" "$MEDIA_DIR/$LABEL.$DEST_EXT"
if [ "$EMBY_REFRESH" = true ]; then
# signal emby to scan library
embyrefresh
else
echo "Emby Refresh False. Skipping library scan" >> "$LOG"
fi
else
echo "Warning: $MEDIA_DIR/$LABEL.$DEST_EXT File exists! File moving aborted" >> "$LOG"
fi
else
echo "Nothing here..." >> "$LOG"
elif [ "$VIDEO_TYPE" = "movie" ] && [ "$MAINFEATURE" = true ] && [ "$HAS_NICE_TITLE" = true ] && [ "$EMBY_SUBFOLDERS" = true ]; then
# shellcheck disable=SC2129,SC2016
echo '$VIDEO_TYPE is movie, $MAINFEATURE is true, $HAS_NICE_TITLE is true, $EMBY_SUBFOLDERS is true' >> "$LOG"
echo "Moving a single file to emby subfolders" >> "$LOG"
mkdir "$MEDIA_DIR/$LABEL" >> "$LOG"
if [ ! -f "$MEDIA_DIR/$LABEL/$LABEL.$DEST_EXT" ]; then
echo "No file found. Moving \"$DEST/$LABEL.$DEST_EXT to $MEDIA_DIR/$LABEL/$LABEL.$DEST_EXT\"" >> "$LOG"
mv -n "$DEST/$LABEL.$DEST_EXT" "$MEDIA_DIR/$LABEL/$LABEL.$DEST_EXT"
if [ "$EMBY_REFRESH" = true ]; then
# signal emby to scan library
embyrefresh
else
echo "Emby Refresh False. Skipping library scan" >> "$LOG"
fi
else
echo "Warning: $MEDIA_DIR/$LABEL/$LABEL.$DEST_EXT File exists! File moving aborted" >> "$LOG"
fi
elif [ "$VIDEO_TYPE" = "movie" ] && [ "$MAINFEATURE" = false ] && [ "$HAS_NICE_TITLE" = true ] && [ "$EMBY_SUBFOLDERS" = false ]; then
# shellcheck disable=SC2129,SC2016
echo '$VIDEO_TYPE is movie, $MAINFEATURE is false, $HAS_NICE_TITLE is true, $EMBY_SUBFOLDERS is false' >> "$LOG"
# hopefully this is never happen because it will cause a lot of duplicate files
echo "***WARNING!*** This will likely leave files in the transcoding directory as there is very likely existing files in the media directory"
echo "Moving multiple files to emby movie folder" >> "$LOG"
mv -n "$DEST/$LABEL.$DEST_EXT" "$MEDIA_DIR/$LABEL.$DEST_EXT"
if [ "$EMBY_REFRESH" = true ]; then
# signal emby to scan library
embyrefresh
else
echo "Emby Refresh False. Skipping library scan" >> "$LOG"
fi
elif [ "$VIDEO_TYPE" = "movie" ] && [ "$MAINFEATURE" = false ] && [ "$HAS_NICE_TITLE" = true ] && [ "$EMBY_SUBFOLDERS" = true ]; then
# shellcheck disable=SC2129,SC2016
echo '$VIDEO_TYPE is movie, $MAINFEATURE is false, $HAS_NICE_TITLE is true, $EMBY_SUBFOLDERS is true' >> "$LOG"
echo "Moving multiple files to emby movie subfolders" >> "$LOG"
echo "First move main title" >> "$LOG"
mkdir -v "$MEDIA_DIR/$LABEL" >> "$LOG"
if [ ! -f "$MEDIA_DIR/$LABEL/$LABEL.$DEST_EXT" ]; then
echo "No file found. Moving \"$DEST/$LABEL.$DEST_EXT to $MEDIA_DIR/$LABEL/$LABEL.$DEST_EXT\"" >> "$LOG"
mv -n "$DEST/$LABEL.$DEST_EXT" "$MEDIA_DIR/$LABEL/$LABEL.$DEST_EXT" >> "$LOG"
fi
#now move "extras"
# shellcheck disable=SC2129,SC2016
mkdir -v "$MEDIA_DIR/$LABEL/extras" >> "$LOG"
# shellcheck disable=SC2086
echo "Sending command: mv -n "\"$DEST/$LABEL/*\"" "\"$MEDIA_DIR/$LABEL/extras/\""" >> "$LOG"
mv -n "${DEST}"/* "$MEDIA_DIR/$LABEL/extras/" >> "$LOG"
if [ "$EMBY_REFRESH" = true ]; then
# signal emby to scan library
embyrefresh
else
echo "Emby Refresh False. Skipping library scan" >> "$LOG"
fi
rmdir "$DEST"
fi
rmdir "$SRC"