plexMonitor.pl 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use LWP::Simple;
  5. use File::Basename;
  6. use Time::HiRes qw( usleep );
  7. use File::Temp qw( tempfile );
  8. # Prototypes
  9. sub xbmcHTTP($);
  10. # App config
  11. my $TEMP_DIR = `getconf DARWIN_USER_TEMP_DIR`;
  12. chomp($TEMP_DIR);
  13. my $DATA_DIR = $TEMP_DIR . '/plexMonitor';
  14. # xbmcHTTP commands
  15. my %CMDS = (
  16. 'PLAYING' => 'GetCurrentlyPlaying',
  17. 'GUI' => 'GetGuiStatus'
  18. );
  19. # Debug
  20. my $DEBUG = 0;
  21. if ($ENV{'DEBUG'}) {
  22. $DEBUG = 1;
  23. }
  24. # Command-line arguments
  25. my ($DELAY) = @ARGV;
  26. if (!$DELAY) {
  27. $DELAY = 0;
  28. }
  29. $DELAY *= 1000000; # Microseconds;
  30. # Sanity check
  31. if (!-d $TEMP_DIR) {
  32. die("Bad config\n");
  33. }
  34. # Mode
  35. my $MODE = 'PLAYING';
  36. if (basename($0) =~ /GUI/i) {
  37. $MODE = 'GUI';
  38. }
  39. # Add the data directory as needed
  40. if (!-d $DATA_DIR) {
  41. mkdir($DATA_DIR);
  42. }
  43. # Loop forever (unless no delay is set)
  44. my $data = '';
  45. my $dataLast = '';
  46. do {
  47. # Run the monitor command
  48. my $changed = 0;
  49. $dataLast = $data;
  50. $data = xbmcHTTP($CMDS{$MODE});
  51. # Compare this data set to the last
  52. if ($data ne $dataLast) {
  53. $changed = 1;
  54. if ($DEBUG) {
  55. print STDERR "Change detected in data:\n" . $data . "\n";
  56. }
  57. }
  58. # If anything changed, save the data to disk
  59. if ($changed) {
  60. my ($fh, $tmp) = tempfile($DATA_DIR . '/' . $MODE . '.XXXXXXXX', 'UNLINK' => 0);
  61. print $fh $data;
  62. close($fh);
  63. rename($tmp, $DATA_DIR . '/' . $MODE);
  64. }
  65. # Delay and loop
  66. usleep($DELAY);
  67. } until ($DELAY == 0);
  68. # Exit cleanly
  69. exit(0);
  70. sub xbmcHTTP($) {
  71. my ($cmd) = @_;
  72. my $data = get('http://localhost:3000/xbmcCmds/xbmcHttp?command=' . $cmd);
  73. if (!defined($data)) {
  74. $data = '';
  75. }
  76. return $data;
  77. }