#!/bin/sh

PLEX_DIR="/var/packages/Plex Media Server/target"
PLEX_LIBRARY_PATH=$(cat "$PLEX_DIR/plex_library_path")
PID_FILE="$PLEX_LIBRARY_PATH/Plex Media Server/plexmediaserver.pid"

# DSM version variables
DSM_VERSION="$(get_key_value /etc.defaults/VERSION productversion)"
DSM_BUILD="$(get_key_value /etc.defaults/VERSION buildnumber)"
DSM_UPDATE="$(get_key_value /etc.defaults/VERSION smallfixnumber)"

# Set identification variables
PMS_INFO_VENDOR=Synology
PMS_INFO_DEVICE="$(get_key_value /etc.defaults/synoinfo.conf unique|cut -d'_' -f3|sed 's/^ds/DS/;s/^fs/FS/;s/^rs/RS/'|sed 's/^\([0-9]\)/DS\1/')"
PMS_INFO_MODEL="$(uname -m)"
PMS_INFO_PLATFORM_VERSION="DSM $DSM_VERSION.$DSM_BUILD-$DSM_UPDATE"

start_plex () {

  # Verify device permissions are intact
  Changed=0

  # Ensure the TV Butler udev rule exists
  if [ ! -f /lib/udev/rules.d/60-tv-butler-fix.rules ]; then
    echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="1d19", ATTRS{idProduct}=="0100", GROUP="video", MODE="0660"' > /lib/udev/rules.d/60-tv-butler-fix.rules
    Changed=1
  fi

  # Check if this model supports HW transcoding
  if [ -d /dev/dri ]; then

    # Ensure the HW Transcoding udev rule exists
    if [ ! -f /lib/udev/rules.d/60-fix-plex-hw-transcoding.rules ]; then
      echo 'SUBSYSTEM=="drm", GROUP="video"' > /lib/udev/rules.d/60-fix-plex-hw-transcoding.rules
      Changed=1

    # If the HW Transcoding udev rule exists, ensure it is correct
    elif [ "$(grep -c drm /lib/udev/rules.d/60-fix-plex-hw-transcoding.rules)" -eq 0 ]; then
      echo 'SUBSYSTEM=="drm", GROUP="video"' > /lib/udev/rules.d/60-fix-plex-hw-transcoding.rules
      Changed=1
    fi

    # Check if permissions correct
    if [ "$(ls -la /dev/dri/renderD128 | awk -F' ' '{print $4}')" != "video" ]; then
      Changed=1
    fi

  fi

  # Retrigger udevadm if needed
  if [ $Changed -eq 1 ]; then
    sync
    udevadm trigger
    sleep 3
  fi

  # Continue with normal PMS start
  PLEX_PATH=$(/usr/syno/sbin/synoshare --get Plex | grep Path | awk -F[ '{print $2}' | awk -F] '{print $1}')
  su plex -s /bin/sh -c \
    "export LC_ALL=en_US.utf8; \
     export LANG=en_US.utf8; \
     export LD_LIBRARY_PATH='$PLEX_DIR/lib'; \
     export PLEX_MEDIA_SERVER_MAX_PLUGIN_PROCS=6; \
     export PLEX_MEDIA_SERVER_APPLICATION_SUPPORT_DIR='$PLEX_LIBRARY_PATH'; \
     export TMPDIR=$PLEX_PATH/tmp_transcoding; \
     export PLEX_MEDIA_SERVER_DEFAULT_PREFERENCES='TranscoderCanOnlyRemuxVideo=true'; \
     export PLEX_MEDIA_SERVER_INFO_VENDOR='$PMS_INFO_VENDOR'; \
     export PLEX_MEDIA_SERVER_INFO_DEVICE='$PMS_INFO_DEVICE'; \
     export PLEX_MEDIA_SERVER_INFO_MODEL='$PMS_INFO_MODEL'; \
     export PLEX_MEDIA_SERVER_INFO_PLATFORM_VERSION='$PMS_INFO_PLATFORM_VERSION'; \
     ulimit -s 3000; \
     sleep 3; \
     /var/packages/Plex\ Media\ Server/target/Plex\ Media\ Server &"

  counter=20
  while [ $counter -gt 0 ]; do
    plex_status && break
    let counter=counter-1
    sleep 1
  done

  # create DSM shortcut (show PMS as started)
  if [ ! -f "/usr/syno/synoman/webman/3rdparty/plex" ]; then
    ln -s "$PLEX_DIR/dsm_config/plex" /usr/syno/synoman/webman/3rdparty
  fi

  # check if PMS has started; exit with status code 1 if we failed to start, 0 if we started successfully
  plex_status
}

stop_plex () {

  # Kill Plex.
  if [ -f "$PID_FILE" ]; then
    kill $(cat "$PID_FILE")
  fi

  # remove DSM shortcut (show PMS as stopped)
  rm -rf /usr/syno/synoman/webman/3rdparty/plex
}

# check if PMS is running; return '0' if yes, '1' if no
plex_status () {
  if [ ! -f "$PID_FILE" ]; then
    return 1
  fi

  if [ -d /proc/$(cat "$PID_FILE") ]; then
    return 0
  else
    return 1
  fi
}

case $1 in
  start)
    echo "Starting Plex ..."
    start_plex
    exit $?
  ;;

  stop)
    echo "Stopping Plex ..."
    stop_plex
    exit $?
  ;;

  status)
    if plex_status; then
      echo "Plex is running"
      exit 0
    else
      echo "Plex is not running"
      exit 1
    fi
  ;;

  log)
    echo "$PLEX_LIBRARY_PATH/Plex Media Server/Logs/Plex Media Server.log"
    exit 0
  ;;

  *)
    exit 1
  ;;
esac
