Skip to content
Snippets Groups Projects
Select Git revision
  • 33117b2101628256986ac390c02ec01f6c1609f6
  • master default
2 results

api.php

Blame
  • api.php 12.33 KiB
    <?php
    include_once 'config.php';
    
    if ($_GET['get'] == 'shows' && $_GET['limit'] && isset($_GET['offset'])) {
    
      $output = array();
      $shows = querySB('shows');
      uasort($shows, function($a, $b) {
        return strcmp($a['show_name'], $b['show_name']);
      });
      $shows = array_slice($shows, $_GET['offset'], $_GET['limit'], true);
      foreach($shows as $key => $show) {
        $dataShow = querySB('show', $key);    
        $dataSeasons = querySB('show.seasons', $key);
        $seasons = array();
        foreach($dataSeasons as $season => $episodes) {
          array_push($seasons, array("season" => $season, "count" => count($episodes)));
        }
        array_push($output, array(
          "id" => $key,
          "name" => $show['show_name'],
          "folder" => str_replace($showsPath.'/', '', $dataShow['location']),
          "seasons" => $seasons
        ));
        unset($seasons);
      }
      header('Content-Type: application/json');
      echo json_encode($output);
      die;
    
    }
    
    
    if ($_GET['get'] == 'movies' && $_GET['limit'] && isset($_GET['offset'])) {
    
      $movies = queryCP('media.list', 'type=movie&status=done&release_status=done&status_or=1');
      $movies = array_slice($movies, $_GET['offset'], $_GET['limit'], true);
      $output = array();
      foreach ($movies as $movie) {
        array_push($output, array(
          "imdb" => $movie['info']['imdb'],
          "title" => $movie['title'],
          "year" => $movie['info']['year'],
          "tagline" => $movie['info']['tagline'], 
          "plot" => $movie['info']['plot'],
          "rating" => $movie['info']['rating']['imdb'][0].' ('.$movie['info']['rating']['imdb'][1].')',
          "status" => $movie['status'],
          "folder" => current(explode('/', current(str_replace($moviesPath.'/', '', $movie['releases'][release_with_file($movie['releases'])]['files']['movie']))))
        ));
      }
      header('Content-Type: application/json');
      echo json_encode($output);
      die;
    
    }
    
    
    if ($_GET['get'] == 'comics' && $_GET['limit'] && isset($_GET['offset'])) {
    
      $comics = queryML('getIndex');
      $comics = array_slice($comics, $_GET['offset'], $_GET['limit'], true);
      $output = array();
      foreach ($comics as $comic) {
        $issues = queryML('getComic', $comic['ComicID']);
        array_push($output, array(
          "id" => $comic['ComicID'],
          "title" => $comic['ComicName'],
          "year" => $comic['ComicYear'],
          "publisher" => $comic['ComicPublisher'],
          "have" => $comic['Have'],
          "total" => $comic['Total'],
          "status" => $comic['Status'],
          "folder" => str_replace($comicsPath.'/', '', $comic['ComicLocation']),
          "issues" => $issues['issues']
        ));
      }
      header('Content-Type: application/json');
      echo json_encode($output);
      die;
    
    }
    
    
    if ($_GET['get'] == 'poster' && (!empty($_GET['show']) || !empty($_GET['movie']) || !empty($_GET['comic']))) {
    
      if(isset($_GET['show'])) {
        $type = 'show';
      }elseif(isset($_GET['movie'])) {
        $type = 'movie';
      }elseif(isset($_GET['comic'])) {
        $type = 'comic';
      }
    
      if($_GET['show'] && $_GET['season'])
        $poster = get_absolute_path('cache/poster/'.$type.'/'.cleanName($_GET[$type]).'-S'.$_GET['season'].'.jpg');
      else
        $poster = get_absolute_path('cache/poster/'.$type.'/'.cleanName($_GET[$type]).'.jpg');
    
      if(!file_exists($poster)) {
    
        if ($_GET['show']) {
          $path = '/'.get_absolute_path($showsPath.'/'.cleanName($_GET[$type], false));
          if($_GET['season']) {
            $filenames = array(
              'season'.$_GET['season'].'-poster.jpg'
            );
          }else {
            $filenames = array(
              'poster.jpg',
            );
          }
        } elseif ($_GET['movie']) {
          $path = '/'.get_absolute_path($moviesPath.'/'.cleanName($_GET[$type], false));
          $filenames = array(
            cleanName($_GET['movie'], false).'-poster.jpg',
            'poster.jpg',
          );
        } elseif ($_GET['comic']) {
          $path = '/'.get_absolute_path($comicsPath.'/'.cleanName($_GET[$type], false));
          $filenames = array(
            'cover.jpg',
          );
        }
    
        foreach($filenames as $filename) {
          if(file_exists($path.'/'.$filename)) {
            $source = $path.'/'.$filename;
            break;
          }
        }
    
        if($source) {
          $img = new Imagick();
          $img->setOption('jpeg:size', '800x532');
          $img->readImage($source);
          $img->thumbnailImage(0, 220);
          $img->setImageCompression(Imagick::COMPRESSION_JPEG);
          $img->setImageCompressionQuality(70);
          $img->writeImage($poster);
        }elseif($_GET['season'] != '') {
          header("HTTP/1.0 404 Not Found");
          die;
        }else{
          //$poster = 'img/no_poster.jpg';
          header("Location: ../../img/no_poster.jpg");
        }
      }
    
      header('Content-type: image/jpeg');
      header('Content-length: '.filesize($poster));
      readfile($poster);
      die;
    }
    
    
    if ($_GET['get'] == 'fanart' && (!empty($_GET['show']) || !empty($_GET['movie']) || !empty($_GET['comic']))) {
    
      if(isset($_GET['show'])) {
        $type = 'show';
      }elseif(isset($_GET['movie'])) {
        $type = 'movie';
      }elseif(isset($_GET['comic'])) {
        $type = 'comic';
      }
      
      $fanart = get_absolute_path('cache/fanart/'.$type.'/'. cleanName($_GET[$type]).'.jpg');
    
      if(!file_exists($fanart)) {
    
        if($_GET['show']) {
          $path = '/'.get_absolute_path($showsPath.'/'.cleanName($_GET[$type], false));
          $filenames = array(
          'fanart.jpg',
          );
        } elseif($_GET['movie']) {
          $path = '/'.get_absolute_path($moviesPath.'/'.cleanName($_GET[$type], false));
          $filenames = array(
            cleanName($_GET['movie'], false).'-fanart.jpg',
            'fanart.jpg',
          );
        } elseif($_GET['comic']) {
          $path = '/'.get_absolute_path($comicsPath.'/'.cleanName($_GET[$type], false));
          $filenames = array(
            'cover.jpg',
          );
        }
    
        foreach($filenames as $filename) {
          if(file_exists($path.'/'.$filename)) {
            $source = $path.'/'.$filename;
            break;
          }
        }
    
        if($source) {
          $img = new Imagick();
          $overlay = new Imagick();
          $img->setOption('jpeg:size', '1024x576');
          $img->readImage($source);
          $res = $img->getImageGeometry();
          if($res['width'] >= $res['height']) {
            $ar = $res['height'] / $res['width'];
            $img->thumbnailImage(1024, 0);
            $overlay->newImage(1024, ceil(1024*$ar), new ImagickPixel('white'));
            $overlay->setOption('jpeg:size', '1024x'.ceil(1024*$ar));
          } else {
            $ar = $res['width'] / $res['height'];
            $img->thumbnailImage(0, 1024);
            $overlay->newImage(ceil(1024*$ar), 1024, new ImagickPixel('white'));
            $overlay->setOption('jpeg:size', ceil(1024*$ar).'x1024');
          }      
          $overlay->setImageOpacity(0.50);
          $img->compositeImage($overlay, imagick::COMPOSITE_OVER, 0, 0);
          $img->setImageCompression(Imagick::COMPRESSION_JPEG);
          $img->setImageCompressionQuality(50);
          $img->writeImage($fanart);
        }else{
          //$fanart = 'img/no_fanart.jpg';
          header("Location: ../../img/no_fanart.jpg");
        }
      }
    
      header('Content-type: image/jpeg');
      header('Content-length: '.filesize($fanart));
      readfile($fanart);
      die;
    }
    
    
    if ($_GET['get'] == 'logo' && (!empty($_GET['show']) || !empty($_GET['movie']))) {
    
      if(isset($_GET['show'])) {
        $type = 'show';
      }else{
        $type = 'movie';
      }
      
      $logo = get_absolute_path('cache/logo/'.$type.'/'.cleanName($_GET[$type]).'.png');
    
      if(!file_exists($logo)) {
    
        if($_GET['show']) {
          $path = '/'.get_absolute_path($showsPath.'/'.cleanName($_GET[$type], false));
          $filenames = array(
          'clearlogo.png',
          'logo.png',
          );
        } else {
          $path = '/'.get_absolute_path($moviesPath.'/'.cleanName($_GET[$type], false));
          $filenames = array(
            cleanName($_GET['movie'], false).'-clearlogo.png',
            'clearlogo.png',
            cleanName($_GET['movie'], false).'-logo.png',
            'logo.png',
          );
        }
    
        foreach($filenames as $filename) {
          if(file_exists($path.'/'.$filename)) {
            $source = $path.'/'.$filename;
            break;
          }
        }
    
        if($source) {
          $img = new Imagick();
          $img->readImage($source);
          $img->thumbnailImage(0, 50);
          $img->writeImage($logo);
        }else{
          header("HTTP/1.0 404 Not Found");
          die;
        }
      }
    
      header('Content-type: image/png');
      header('Content-length: '.filesize($logo));
      readfile($logo);
      die;
    }
    
    
    if ($_GET['get'] == 'episodes' && !empty($_GET['show']) && isset($_GET['season'])) {
      $output = array();
      if($json = file_get_contents('http://'.$sb['host'].':'.$sb['port'].$sb['path'].'/api/'.$sb['key'].'/?cmd=show.seasons&tvdbid='.$_GET['show'].'&season='.$_GET['season'])) {
        $data = current(json_decode($json, true));
        foreach ($data as $key => $episode) {
          array_push($output, array("episode" => $key, "name" => $episode['name'], "status" => $episode['status'], "airdate" => $episode['airdate']));
        }
      }
      echo json_encode($output);
      die;
    }
    
    if ($_GET['get'] == 'latest' && $_GET['type'] == 'shows') {
      
      $eps = querySB('history');
      $output = array();
      foreach ($eps as $ep) {
        if($ep['status'] == 'Downloaded') {
          array_push($output, array("show" => $ep['show_name'], "episode" => "S".str_pad($ep['season'], 2, '0', STR_PAD_LEFT)."E".str_pad($ep['episode'], 2, '0', STR_PAD_LEFT), "airdate" => $ep['date']));
        }
      }
      $output = array_slice($output, 0, 10);
      echo json_encode($output);
      die;
      
    }
    
    if ($_GET['get'] == 'latest' && $_GET['type'] == 'movies') {
    
      $movies = queryCP('media.list', 'type=movie&status=done&release_status=done&status_or=1');
      uasort($movies, function($a, $b) {
        return $b['releases'][0]['last_edit'] - $a['releases'][0]['last_edit'];
      });
      $output = array();
      foreach ($movies as $movie) {
        array_push($output, array("movie" => $movie['title'].' ('.$movie['info']['year'].')'));
      }
      $output = array_slice($output, 0, 10);
      echo json_encode($output);
      die;
      
    }
    
    
    function cleanName($name, $strict = true) {
      if($strict == true)
        return preg_replace("/[^a-zA-Z0-9]/", "_", $name);
      else
        return preg_replace("/:/", "", $name);
    }
    
    
    function get_absolute_path($path) {
      $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
      $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
      $absolutes = array();
      foreach ($parts as $part) {
        if ('.' == $part) continue;
        if ('..' == $part) {
          array_pop($absolutes);
        } else {
          $absolutes[] = $part;
        }
      }
      return implode(DIRECTORY_SEPARATOR, $absolutes);
    }
    
    function querySB($cmd, $id = '', $season = '') {
      
      global $sb, $cacheTTL;
      if($id == '') {
        $cache = './cache/json/sb_'.$cmd.'.json';
      }else{
        $cache = './cache/json/sb_'.$cmd.'-'.$id.'.json';
      }
      if (!file_exists($cache) || filemtime($cache) < time()-$cacheTTL) {
        file_put_contents($cache, file_get_contents('http://'.$sb['host'].':'.$sb['port'].$sb['path'].'/api/'.$sb['key'].'/?cmd='.$cmd.'&tvdbid='.$id.'&season='.$season));
      }
      $json = file_get_contents($cache);
      $data = current(json_decode($json, true));
      return $data;
      
    }
    
    function queryCP($cmd, $params = '') {
      
      global $cp, $cacheTTL;
      if($params != '') {
        $params = '?'.$params;
      }
      $cache = './cache/json/cp_'.$cmd.'.json';
      if (!file_exists($cache) || filemtime($cache) < time()-$cacheTTL) {
        file_put_contents($cache, file_get_contents('http://'.$cp['host'].':'.$cp['port'].$cp['path'].'/api/'.$cp['key'].'/'.$cmd.'/'.$params));
      }
      $json = file_get_contents($cache);
      $data = current(json_decode($json, true));
      return $data;
      
    }
    
    function queryML($cmd, $id = '') {
      
      global $ml, $cacheTTL;
      if($id == '') {
        $cache = './cache/json/ml_'.$cmd.'.json';
      }else{
        $cache = './cache/json/ml_'.$cmd.'-'.$id.'.json';
      }
      if (!file_exists($cache) || filemtime($cache) < time()-$cacheTTL) {
        file_put_contents($cache, file_get_contents('http://'.$ml['host'].':'.$ml['port'].$ml['path'].'/api?apikey='.$ml['key'].'&cmd='.$cmd.'&id='.$id));
      }
      $json = file_get_contents($cache);
      $data = json_decode($json, true);
      return $data;  
    }
    
    function release_with_file($releases) {
        foreach($releases as $release => $value) {
            if($releases[$release]['status'] == 'done' && count($releases[$release]['files']['movie']) > 0) {
                return $release;
            }
        }
        return false;
    }
    
    ?>