Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Overview


Variables

VariableDescriptionDetails
passadmin passwordbase64encoded password
EMAIL_TO/EMAIL_FROM

SHOWRSS_FEED

TEMP_FOLDER

DEST_FOLDER


Scripts

In order to make it easier to run your php scripts, we can wrap them in a shell script like the following:

Code Block
#!/bin/sh

PHP=/mnt/ext/opt/apache/bin/php
SCRIPT_PATH=/share/homes/xxx/scripts/
cd $SCRIPT_PATH
$PHP $SCRIPT_PATH/showRss.php <ACTION>


showRss.php

Usage:

> php showRss.php <download/removeCompleted/listDownloads/removeAll>


Code Block
languagephp
titleshowrss.php
linenumberstrue
collapsetrue
<?php

//custom variables
$pass=urlencode("xxx_BASE64ENCODEDPASSWORD_xxx");
$EMAIL_TO="xxxx@xxx.com";
$EMAIL_FROM="xxxx@xxx.com";
$SHOWRSS_FEED="http://showrss.info/user/xxxx.rss?magnets=true&namespaces=true&name=clean&quality=hd&re=null";
$TEMP_FOLDER="tv/tmp";
$DEST_FOLDER="tv/incoming";

//default variables
$baseURL="http://localhost:8080";
$DB_FILE_NAME="db_showrss.json";
$EMAIL_SUBJECT_DOWNLOADED="DOWNLOADED - ";
$EMAIL_SUBJECT_STARTED="DOWNLOAD STARTED - ";
$EMAIL_SUBJECT_FAILED="FAILED TO DOWNLOAD - ";
$EMAIL_SUBJECT_REMOVED="CANCELLED DOWNLOAD - ";

//login
$sid=loginToQnap();

// Process Command Line
$cmd="download";
if ($argc > 1) {
  $cmd=$argv[1];
};

switch ($cmd) {
  case "download":
    echo "DOWNLOAD:\n";
    download();
    break;
  case "removeCompleted":
    echo "REMOVE COMPLETED:\n";
    removeCompleted();
    break;
  case "listDownloads":
    echo "LIST DOWNLOADS:\n";
    listDownloads();
    break;
  case "removeAll":
    echo "REMOVE ALL:\n";
    removeAll();
    break;
  default:
    showUsage();
    exit(1);
}

//done
exit(0);

//***************************************
// download
//***************************************
function download(){
  global $SHOWRSS_FEED, $DB_FILE_NAME, $baseURL, $sid, $EMAIL_TO, $EMAIL_FROM, $EMAIL_SUBJECT_DOWNLOADED;

  //get showRSS Feed
  $xml = file_get_contents($SHOWRSS_FEED);
  //echo $xml;
 
  //process xml
  $xml = simplexml_load_file($SHOWRSS_FEED);
 
  $showArray = array();
 
  $showdb = json_decode(file_get_contents($DB_FILE_NAME), true);
  if($showdb==null){
    $showdb = array();
  }
 
  // loop through
  foreach ($xml->channel->item as $item) {
    $title =  $item->title;
    $link = $item->link;
    //echo "title=" . $title ."\n";
 
    $pattern = "/(\d{1,2})x(\d{1,2})/";
    preg_match($pattern, $title, $matches);
    if(sizeof($matches)>=3){
      $season=intval($matches[1]);
      $episode=intval($matches[2]);
      $show = trim(substr($title,0,strrpos($title,$matches[0])));  
      $showAndEpisode=sprintf("%s %02dx%02d", $show,$season,$episode);
    }else{
      $show=(string)$title;
      $showAndEpisode=(string)$title;
      $season=0;
      $episode=0;
    }
 
    //echo "SHOW: " . $show . "\n";
    //echo "SEASON: " . $season . "\n";
    //echo "EPISODE: " . $episode . "\n";
         
    $showInfo=array($showAndEpisode, $show, $season, $episode, $link);
    array_push($showArray, $showInfo); 
  } //for
 
  sort($showArray);
  //print_r($showArray);
 
  foreach ($showArray as $show) {
 
    //echo "show: " .  $show[0] . "\n";
    //add torrent
 
    $found =false;
    foreach($showdb as &$showEntry){
      $showName = $showEntry[0];
 
      if($showName==$show[1]){
        $found=true;
        //echo "Found " . $show[1] . " in showdb \n";
        $newSeason=$show[2];
        $newEpisode=$show[3];
        $lastSeason=$showEntry[1];  
        $lastEpisode=$showEntry[2];
        //echo "--- " . $lastSeason . "x" . $lastEpisode . " -> " .  $newSeason . "x" . $newEpisode ."\n";
 
        if($lastSeason == $newSeason && $newEpisode > $lastEpisode){
          if(downloadShow($show)){
            $showEntry[2]= $newEpisode;
            echo "U " . $showEntry[0] . " " . $showEntry[1] . "x" . $showEntry[2] . "\n";
          }else{
            echo "F " . $showEntry[0] . " " . $showEntry[1] . "x" . $showEntry[2] . "\n";
          }
        }elseif ($newSeason > $lastSeason ){
          if(downloadShow($show)){
            $showEntry[1]= $newSeason;
            $showEntry[2]= $newEpisode;
            echo "U+ " . $showEntry[0] . " " . $showEntry[1] . "x" . $showEntry[2] . "\n";
          }else{
            echo "F+ " . $showEntry[0] . " " . $showEntry[1] . "x" . $showEntry[2] . "\n";
          }
        }else{
          // echo "WTF " . $lastSeason . "x" . $lastEpisode . " -> " .  $newSeason . "x" . $newEpisode ."\n";
        }
        break;
      }
    }
  
    //set latest season/episode
    if ($found==false) {
 
      if(downloadShow($show)){
        echo "A " . $show[1] .  " " . $show[2] . "x" . $show[3] . "\n" ;
        $showDetails=array($show[1], $show[2], $show[3]);
        array_push($showdb, $showDetails);
      }else{
        echo "F " . $show[1] .  " " . $show[2] . "x" . $show[3] . "\n" ;
      }
    }
   
  }
 
  //save showdb to file
  //print_r($showdb);
 
  file_put_contents($DB_FILE_NAME,json_encode($showdb));

}

//***************************************
// downloadShow
//***************************************
function downloadShow($show){
    global $baseURL,$sid, $TEMP_FOLDER, $DEST_FOLDER;
 
    $showAndEpisode =  $show[1] .  " " . $show[2] . "x" . $show[3];
    //echo "D: " . $showAndEpisode . "\n";
    //echo "L: " . $show[4] . "\n\n";
 
    $temp=$TEMP_FOLDER;
    $dest=$DEST_FOLDER . "/" . $show[1];
     
    $realDest = "/share/" . $dest;
    if (!file_exists($realDest)) {
      mkdir($realDest, 0777, true);
    }
 
    if($show[2]>0){
      $dest=$dest . "/Season " . $show[2];
    }
    //echo "Dest: " . $dest . "\n";
 
    $realDest = "/share/" . $dest;
    if (!file_exists($realDest)) {
      mkdir($realDest, 0777, true);
    }
 
    $url = $baseURL . '/downloadstation/V4/Task/AddUrl?sid=' . $sid  . '&temp=' . urlencode($temp) . '&move=' . urlencode($dest) . '&url=' . urlencode($show[4]);
    //echo "URL: " . $url . "\n";
    $resp=file_get_contents($url);
    //echo $resp;
    if($resp=='{"error":0}'){
      //sendNotification($showAndEpisode,"started"); 
      return true;
    }else{
      sendNotification($showAndEpisode,"failed"); 
      return false;
    }
}

//***************************************
// sendNotification
//***************************************
function sendNotification($showAndEpisode,$status){
    global $EMAIL_SUBJECT_DOWNLOADED, $EMAIL_SUBJECT_STARTED,$EMAIL_SUBJECT_REMOVED, $EMAIL_SUBJECT_FAILED, $EMAIL_FROM, $EMAIL_TO;

    if($status == "started"){
      $subject= "\"" . $EMAIL_SUBJECT_STARTED . $showAndEpisode . "\"";
    }else if($status == "downloaded"){
      $subject= "\"" . $EMAIL_SUBJECT_DOWNLOADED . $showAndEpisode . "\"";
    }else if($status == "failed"){
      $subject= "\"" . $EMAIL_SUBJECT_FAILED . $showAndEpisode . "\"";
    }else if($status == "removed"){
      $subject= "\"" . $EMAIL_SUBJECT_REMOVED . $showAndEpisode . "\"";
    }else{
      $subject= "\"" . "ERROR " . $showAndEpisode . "\"";
    }

    $cmd= getCwd() . "/sendEmail.sh " . $subject  . " " . $EMAIL_FROM . " " . $EMAIL_TO . " " . $subject;
    shell_exec($cmd);
 
}

//***************************************
// removeCompleted
//***************************************
function removeCompleted(){
  global $baseURL, $sid, $EMAIL_TO, $EMAIL_FROM, $EMAIL_SUBJECT_DOWNLOADED;
  
  $resp=file_get_contents($baseURL . '/downloadstation/V4/Task/Query?start=0&limit=25&status=completed&from=0&to=25&sid=' . $sid);
  //echo $resp . "\n";
 
  $json = json_decode($resp);
  $data = $json->{'data'};
  //var_dump($data);
  file_put_contents("/var/log/download.log",$json,FILE_APPEND | LOCK_EX);
  //echo "CWD: " . getCwd() . "\n";

  if(count($data)==0){
    echo "- no completed downloads\n";
  }else{
 
    foreach($data as $torrent){
      $name= $torrent->{'source_name'};
      $hash=$torrent->{'hash'};
      echo "removing torrent: " . $name . "\n";
      //echo "hash: " . $hash . "\n";
 
      if(endsWith($name,".torrent")){
      //  echo "torrent file - just delete\n";
      }else{
        sendNotification($name,"downloaded"); 
      }
 
      //remove torrent
      $resp=file_get_contents($baseURL . '/downloadstation/V4/Task/Remove?clean=0&hash=' . $hash . '&sid=' . $sid);
    }
  }
}
//***************************************
// removeAll
//***************************************
function removeAll(){
  global $baseURL, $sid, $EMAIL_TO, $EMAIL_FROM, $EMAIL_SUBJECT_DOWNLOADED;

  $resp=file_get_contents($baseURL . '/downloadstation/V4/Task/Query?start=0&limit=100&status=all&from=0&to=100&sid=' . $sid);
 
  $json = json_decode($resp);
  $data = $json->{'data'};

  if(count($data)==0){
    echo "- no downloads\n";
  }else{ 
    foreach($data as $torrent){
      $name= $torrent->{'source_name'};
      $hash=$torrent->{'hash'};
 
      if(endsWith($name,".torrent")){
      //  echo "torrent file - just delete\n";
      }else{
        echo "- " . $name . "\n";
        //echo "file - notify completion\n";
        //sendNotification($name,"removed"); 
      }
 
      //remove torrent
      $resp=file_get_contents($baseURL . '/downloadstation/V4/Task/Remove?clean=0&hash=' . $hash . '&sid=' . $sid);
    }
  }
}

//***************************************
// listDownloads
//***************************************
function listDownloads(){
  global $baseURL, $sid;

  $resp=file_get_contents($baseURL . '/downloadstation/V4/Task/Query?start=0&limit=100&status=all&from=0&to=100&sid=' . $sid);
  //echo $resp . "\n";
 
  $json = json_decode($resp);
  $data = $json->{'data'};

  if(count($data)==0){
    echo "- no downloads\n";
  }else{  
    foreach($data as $torrent){
      $name= $torrent->{'source_name'};
      echo "torrent: " . $name . "\n";
    }
  }
}

//***************************************
// loginToQnap
//***************************************
function loginToQnap(){
  global $baseURL, $pass;
 
  //login
  $vars = 'user=admin&pass=' . $pass;
  $ch = curl_init( $baseURL . '/downloadstation/V4/Misc/Login' );
  curl_setopt( $ch, CURLOPT_POST, 1);
  curl_setopt( $ch, CURLOPT_POSTFIELDS, $vars);
  curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt( $ch, CURLOPT_HEADER, 0);
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
  $resp = curl_exec( $ch );
  //echo $resp;
 
  $sid = json_decode($resp)->{'sid'};
  //echo "sid='" . $sid . "'\n";
 
  return $sid;
}

//***************************************
// endsWith
//***************************************
function endsWith($haystack, $needle)
{
    $length = strlen($needle);
    if ($length == 0) {
        return true;
    }
    return (substr($haystack, -$length) === $needle);
}

//******************************************
// showUsage
//******************************************
function showUsage(){
  global $argv;
  echo "Usage: php " . $argv[0] . " download/removeCompleted/listDownloads/removeAll\n";
}

?>


sendEmail.sh

Code Block
languagebash
titlesendEmail.sh
collapsetrue
#!/bin/sh

SUBJECT=$1
TO=$2
FROM=$3
CONTENT=$4

echo "Subject: $SUBJECT"
echo "From: $FROM"
echo "To: $TO"
echo "CONTENT $CONTENT"

echo "Subject: $SUBJECT" > mail.txt
echo "From: $FROM" >> mail.txt
echo "To: $TO" >> mail.txt
echo "" >> mail.txt
echo $CONTENT >> mail.txt

cat mail.txt |sendmail -t
#rm mail.txt

To get your QNAP credentials

 

Download OWASP ZAP

 

https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project

 

Startup OWASP zap

 

Set Proxy in OWASP Zap by selecting Tools, Options, Local Proxy.

 

Set local proxy to localhost and a port, say 8090

 

Image Removed

 

Now, change the proxy settings on your browser to proxy through the proxy you defined above.

 

Now open up the URL to your QNAP and login.

 

Check through the

 Image Removed

Look through the list of URLs until you find a call to authLogin.cgi. Click on it and note the request parameters.

 

In the above case you will need the user=admin and pwd=….

 

Update the your showRss.php file with the proper path:

 

 Image Removed

                           

 

Also, look for this path in the other php files.

 

That’s it. Try running the .sh files manually and see if they work.

Maybe start with the showTorrents.sh script first since it will show you what you are currently downloading.

 

...