Quellcode durchsuchen

Perl is faster. And later we can move HTTP directly into it for ever better speed

Zachary Kotlarek vor 14 Jahren
Ursprung
Commit
780a01b497
2 geänderte Dateien mit 84 neuen und 78 gelöschten Zeilen
  1. 84 0
      plexMonitor/plexMonitor.pl
  2. 0 78
      plexMonitor/plexMonitor.sh

+ 84 - 0
plexMonitor/plexMonitor.pl

@@ -0,0 +1,84 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use File::Temp;
+use File::Basename;
+use Time::HiRes qw( usleep );
+
+# App config
+my $TEMP_DIR = `getconf DARWIN_USER_TEMP_DIR`;
+chomp($TEMP_DIR);
+my $DATA_DIR = $TEMP_DIR . '/plexMonitor';
+my $EXEC_DIR = $ENV{'HOME'} . '/bin/video';
+
+# Debug
+my $DEBUG = 0;
+if ($ENV{'DEBUG'}) {
+	$DEBUG = 1;
+}
+
+# Command-line arguments
+my ($DELAY) = @ARGV;
+if (!$DELAY) {
+	$DELAY = 0;
+}
+$DELAY = int($DELAY) * 1000000;    # Microseconds;
+
+# Sanity check
+if (!-d $EXEC_DIR || !-d $TEMP_DIR) {
+	die("Bad config\n");
+}
+
+# Mode
+my $MODE = 'PLAYING';
+my $CMD  = 'plex-playing';
+if (basename($0) =~ /GUI/i) {
+	$MODE = 'GUI';
+	$CMD  = 'plex-gui';
+}
+
+# Add the data directory as needed
+if (!-d $DATA_DIR) {
+	mkdir($DATA_DIR);
+}
+
+# Loop forever (unless no delay is set)
+my $dataLast = '';
+do {
+	my $changed = 0;
+
+	# Run the monitor command
+	my $cmd = $EXEC_DIR . '/' . $CMD;
+	my $data = `$cmd`;
+
+	# Compare this data set to the last
+	if ($data ne $dataLast) {
+		$changed = 1;
+	}
+
+	# If anything changed, save the data to disk
+	if ($changed) {
+		my ($fh, $tmp) = tempfile($DATA_DIR . '/' . $MODE . '.XXXXXXXX', 'UNLINK' => 0);
+		print $fh $data;
+		close($fh);
+		rename($tmp, $DATA_DIR . '/' . $MODE);
+	}
+
+	# Special handling for PLAYING mode -- it's a bit of a hack, but it saves a lot of code other places
+	if ($changed && $MODE eq 'PLAYING') {
+		my $playing = 0;
+		if ($data =~ /PlayStatus\:Playing/) {
+			$playing = 1;
+		}
+		my ($fh, $tmp) = tempfile($DATA_DIR . '/PLAY_STATUS.XXXXXXXX', 'UNLINK' => 0);
+		print $fh $playing;
+		close($fh);
+		rename($tmp, $DATA_DIR . '/PLAY_STATUS');
+	}
+
+	# Delay and loop
+	usleep($DELAY);
+} until ($DELAY == 0);
+
+# Exit cleanly
+exit(0);

+ 0 - 78
plexMonitor/plexMonitor.sh

@@ -1,78 +0,0 @@
-#!/bin/bash
-
-# Config
-EXEC_DIR="${HOME}/bin/video"
-TEMP_DIR="`getconf DARWIN_USER_TEMP_DIR`"
-
-# Compare the current state to the last one
-compareState() {
-	CHANGED=1
-	"${EXEC_DIR}/${CMD}" > "${TEMP_FILE}" 2>/dev/null
-	if [ -r "${MODE}" ]; then
-		diff "${TEMP_FILE}" "${MODE}" > /dev/null
-		if [ $? -eq 0 ]; then
-			CHANGED=0
-		fi
-	fi
-
-	# If anything changed, note the update time and store the current state for future reference
-	if [ $CHANGED -gt 0 ]; then
-		date '+%s' > "${MODE}.lastUpdate"
-		mv "${TEMP_FILE}" "${MODE}"
-	fi
-
-	# Special case for PLAYING mode -- it's a bit of a hack, but it saves a lot of code other places
-	if [ $CHANGED -gt 0 ] && [ "${MODE}" == "PLAYING" ]; then
-		LAST_PLAYING=$PLAYING
-		PLAYING=0
-		if grep -q 'PlayStatus\:Playing' "${MODE}"; then
-			PLAYING=1
-		fi
-		if [ -z "${LAST_PLAYING}" ] || [ $LAST_PLAYING -ne $PLAYING ]; then
-			echo $PLAYING > "PLAY_STATUS"
-			cp "${MODE}.lastUpdate" "PLAY_STATUS.lastUpdate"
-		fi
-	fi
-}
-
-# Sanity check
-if [ ! -d "${EXEC_DIR}" ] || [ ! -d "${TEMP_DIR}" ]; then
-	echo "Bad config" 1>&2
-	exit 1
-fi
-
-# Allow use in daemon mode
-LOOP_DELAY="${1}"
-
-# Determine who we are
-MODE="PLAYING"
-CMD="plex-playing"
-if basename "${0}" | grep -qi GUI; then
-	MODE="GUI"
-	CMD="plex-gui"
-fi
-
-# Construct our runtime paths
-DATA_DIR="${TEMP_DIR}/plexMonitor"
-TEMP_FILE="`mktemp -t plexMonitor.XXXXXXXX`"
-
-# Get into position
-if [ ! -d "${DATA_DIR}" ]; then
-	mkdir -p "${DATA_DIR}"
-fi
-cd "${DATA_DIR}"
-
-# Compare
-compareState
-
-# Sleep and repeat (if requested)
-if [ -n "${LOOP_DELAY}" ]; then
-	while [ 1 ]; do
-		sleep $LOOP_DELAY
-		compareState
-	done
-fi
-
-# Cleanup
-rm -f "${TEMP_FILE}"
-exit 0