plexMonitor.pl 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use LWP::Simple;
  5. use File::Basename;
  6. use Time::HiRes qw( sleep );
  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. # Sanity check
  30. if (!-d $TEMP_DIR) {
  31. die("Bad config\n");
  32. }
  33. # Mode
  34. my $MODE = 'PLAYING';
  35. if (basename($0) =~ /GUI/i) {
  36. $MODE = 'GUI';
  37. }
  38. # Add the data directory as needed
  39. if (!-d $DATA_DIR) {
  40. mkdir($DATA_DIR);
  41. }
  42. # Loop forever (unless no delay is set)
  43. my $data = '';
  44. my $dataLast = '';
  45. do {
  46. # Run the monitor command
  47. my $changed = 0;
  48. $dataLast = $data;
  49. $data = xbmcHTTP($CMDS{$MODE});
  50. # Compare this data set to the last
  51. if ($data ne $dataLast) {
  52. $changed = 1;
  53. if ($DEBUG) {
  54. print STDERR "Change detected in data:\n" . $data . "\n";
  55. }
  56. }
  57. # If anything changed, save the data to disk
  58. if ($changed) {
  59. my ($fh, $tmp) = tempfile($DATA_DIR . '/' . $MODE . '.XXXXXXXX', 'UNLINK' => 0);
  60. print $fh $data;
  61. close($fh);
  62. rename($tmp, $DATA_DIR . '/' . $MODE);
  63. }
  64. # Delay and loop
  65. sleep($DELAY);
  66. } until ($DELAY == 0);
  67. # Exit cleanly
  68. exit(0);
  69. sub xbmcHTTP($) {
  70. my ($cmd) = @_;
  71. my $data = get('http://localhost:3000/xbmcCmds/xbmcHttp?command=' . $cmd);
  72. if (!defined($data)) {
  73. $data = '';
  74. }
  75. return $data;
  76. }