2016-10-10 10:57:39 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
2016-12-17 16:59:59 +01:00
|
|
|
use App\AlternativeTitle;
|
2016-11-28 08:48:12 +01:00
|
|
|
use App\Episode;
|
2016-10-10 10:57:39 +02:00
|
|
|
use App\Item;
|
2016-10-18 14:26:24 +02:00
|
|
|
use App\Services\Storage;
|
2016-10-10 10:57:39 +02:00
|
|
|
use App\Services\TMDB;
|
2016-12-12 09:18:13 +01:00
|
|
|
use App\Setting;
|
2016-10-10 10:57:39 +02:00
|
|
|
use Illuminate\Support\Facades\Input;
|
|
|
|
|
|
|
|
class ItemController {
|
|
|
|
|
|
|
|
private $loadingItems;
|
|
|
|
private $item;
|
2016-10-18 14:26:24 +02:00
|
|
|
private $storage;
|
2016-10-10 10:57:39 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the amout of loading items and create an instance for 'item'.
|
|
|
|
*
|
2016-10-18 14:26:24 +02:00
|
|
|
* @param Item $item
|
|
|
|
* @param Storage $storage
|
2016-10-10 10:57:39 +02:00
|
|
|
*/
|
2016-10-18 14:26:24 +02:00
|
|
|
public function __construct(Item $item, Storage $storage)
|
2016-10-10 10:57:39 +02:00
|
|
|
{
|
|
|
|
$this->loadingItems = config('app.LOADING_ITEMS');
|
|
|
|
$this->item = $item;
|
2016-10-18 14:26:24 +02:00
|
|
|
$this->storage = $storage;
|
2016-10-10 10:57:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2016-11-28 08:48:12 +01:00
|
|
|
* Return all items with pagination.
|
2016-10-10 10:57:39 +02:00
|
|
|
*
|
|
|
|
* @param $orderBy
|
|
|
|
* @return mixed
|
|
|
|
*/
|
2016-11-28 08:48:12 +01:00
|
|
|
public function items($type, $orderBy)
|
2016-10-10 10:57:39 +02:00
|
|
|
{
|
|
|
|
$orderType = $orderBy == 'rating' ? 'asc' : 'desc';
|
|
|
|
|
2016-11-28 08:48:12 +01:00
|
|
|
$item = $this->item->orderBy($orderBy, $orderType)->with('latestEpisode');
|
|
|
|
|
|
|
|
if($type != 'home') {
|
|
|
|
$item = $item->where('media_type', $type);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $item->simplePaginate($this->loadingItems);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get all Episodes of an tv show.
|
|
|
|
*
|
|
|
|
* @param $tmdb_id
|
|
|
|
* @return mixed
|
|
|
|
*/
|
|
|
|
public function episodes($tmdb_id)
|
|
|
|
{
|
2016-12-12 09:18:13 +01:00
|
|
|
return [
|
|
|
|
'episodes' => Episode::where('tmdb_id', $tmdb_id)->get()->groupBy('season_number'),
|
2016-12-20 11:17:22 +01:00
|
|
|
'spoiler' => Setting::first()->episode_spoiler_protection
|
2016-12-12 09:18:13 +01:00
|
|
|
];
|
2016-10-10 10:57:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Search for items by 'title' in database or with Laravel Scout.
|
|
|
|
*
|
|
|
|
* @return mixed
|
|
|
|
*/
|
|
|
|
public function search()
|
|
|
|
{
|
|
|
|
$title = Input::get('q');
|
|
|
|
|
|
|
|
if(config('scout.driver')) {
|
|
|
|
return $this->item->search($title)->get();
|
|
|
|
}
|
|
|
|
|
|
|
|
// We don't have an smart search driver and return an simple 'like' query.
|
|
|
|
return $this->item->where('title', 'LIKE', '%' . $title . '%')
|
2016-11-23 16:24:34 +01:00
|
|
|
->orWhere('original_title', 'LIKE', '%' . $title . '%')
|
2016-10-10 10:57:39 +02:00
|
|
|
->get();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Update rating for an movie.
|
|
|
|
*
|
|
|
|
* @param $itemID
|
|
|
|
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
|
|
|
|
*/
|
|
|
|
public function changeRating($itemID)
|
|
|
|
{
|
|
|
|
$item = $this->item->find($itemID);
|
|
|
|
|
|
|
|
if( ! $item) {
|
|
|
|
return response('Not Found', 404);
|
|
|
|
}
|
|
|
|
|
|
|
|
$item->update([
|
|
|
|
'rating' => Input::get('rating')
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add a new movie to database and create the poster image file.
|
|
|
|
*
|
|
|
|
* @param TMDB $tmdb
|
|
|
|
* @return Item
|
|
|
|
*/
|
|
|
|
public function add(TMDB $tmdb)
|
|
|
|
{
|
|
|
|
$data = Input::get('item');
|
|
|
|
|
2016-10-18 14:26:24 +02:00
|
|
|
$this->storage->createPosterFile($data['poster']);
|
2016-10-10 10:57:39 +02:00
|
|
|
|
|
|
|
return $this->createItem($data, $tmdb);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2016-11-28 08:48:12 +01:00
|
|
|
* Delete movie or tv show (with episodes) and remove the poster image file.
|
2016-10-10 10:57:39 +02:00
|
|
|
*
|
|
|
|
* @param $itemID
|
|
|
|
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
|
|
|
|
*/
|
|
|
|
public function remove($itemID)
|
|
|
|
{
|
|
|
|
$item = $this->item->find($itemID);
|
|
|
|
|
|
|
|
if( ! $item) {
|
|
|
|
return response('Not Found', 404);
|
|
|
|
}
|
|
|
|
|
2016-10-18 14:26:24 +02:00
|
|
|
$this->storage->removePosterFile($item->poster);
|
2016-11-28 08:48:12 +01:00
|
|
|
$tmdb_id = $item->tmdb_id;
|
2016-10-10 10:57:39 +02:00
|
|
|
|
|
|
|
$item->delete();
|
2016-11-28 08:48:12 +01:00
|
|
|
|
|
|
|
// Delete all related episodes
|
|
|
|
// todo: Make this possible in migrations
|
|
|
|
Episode::where('tmdb_id', $tmdb_id)->delete();
|
2016-12-17 16:59:59 +01:00
|
|
|
AlternativeTitle::where('tmdb_id', $tmdb_id)->delete();
|
2016-10-10 10:57:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create the new movie.
|
|
|
|
*
|
|
|
|
* @param $data
|
|
|
|
* @return Item
|
|
|
|
*/
|
2016-11-28 08:48:12 +01:00
|
|
|
private function createItem($data, TMDB $tmdb)
|
2016-10-10 10:57:39 +02:00
|
|
|
{
|
2016-11-28 08:48:12 +01:00
|
|
|
$tmdbId = $data['tmdb_id'];
|
|
|
|
$mediaType = $data['media_type'];
|
|
|
|
|
|
|
|
$item = $this->item->create([
|
|
|
|
'tmdb_id' => $tmdbId,
|
2016-10-10 10:57:39 +02:00
|
|
|
'title' => $data['title'],
|
2016-11-28 08:48:12 +01:00
|
|
|
'media_type' => $mediaType,
|
2016-11-23 16:24:34 +01:00
|
|
|
'original_title' => $data['original_title'],
|
2016-10-10 10:57:39 +02:00
|
|
|
'poster' => $data['poster'],
|
|
|
|
'rating' => 1,
|
|
|
|
'released' => $data['released'],
|
2016-10-17 10:57:42 +02:00
|
|
|
'genre' => $data['genre'],
|
2016-10-10 10:57:39 +02:00
|
|
|
'created_at' => time(),
|
|
|
|
]);
|
2016-11-28 08:48:12 +01:00
|
|
|
|
|
|
|
if($mediaType == 'tv') {
|
|
|
|
$this->createEpisodes($tmdbId, $tmdb);
|
|
|
|
}
|
|
|
|
|
2016-12-17 16:59:59 +01:00
|
|
|
$this->addAlternativeTitles($item, $tmdb);
|
|
|
|
|
2016-11-28 08:48:12 +01:00
|
|
|
return $item;
|
|
|
|
}
|
|
|
|
|
2016-12-17 16:59:59 +01:00
|
|
|
/**
|
|
|
|
* Update alternative titles for all tv shows and movies or specific item.
|
|
|
|
* For old versions of flox or hold all alternative titles up to date.
|
|
|
|
*
|
|
|
|
* @param TMDB $tmdb
|
|
|
|
*/
|
|
|
|
public function updateAlternativeTitles(TMDB $tmdb, $tmdbID = null)
|
|
|
|
{
|
|
|
|
set_time_limit(3000);
|
|
|
|
|
|
|
|
$items = $tmdbID ? Item::where('tmdb_id', $tmdbID)->get() : Item::all();
|
|
|
|
|
|
|
|
$items->each(function($item) use ($tmdb) {
|
|
|
|
$this->addAlternativeTitles($item, $tmdb);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Store all alternative titles for tv shows and movies.
|
|
|
|
*
|
|
|
|
* @param $item
|
|
|
|
* @param TMDB $tmdb
|
|
|
|
*/
|
|
|
|
private function addAlternativeTitles($item, TMDB $tmdb)
|
|
|
|
{
|
|
|
|
$alternativeTitles = $tmdb->getAlternativeTitles($item);
|
|
|
|
|
|
|
|
foreach($alternativeTitles as $title) {
|
|
|
|
AlternativeTitle::firstOrCreate([
|
|
|
|
'title' => $title->title,
|
|
|
|
'tmdb_id' => $item['tmdb_id'],
|
|
|
|
'country' => $title->iso_3166_1,
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-30 15:26:38 +01:00
|
|
|
/**
|
|
|
|
* Set an episode as seen/unseen.
|
|
|
|
*
|
|
|
|
* @param $id
|
|
|
|
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
|
|
|
|
*/
|
2016-11-28 08:48:12 +01:00
|
|
|
public function setSeen($id)
|
|
|
|
{
|
|
|
|
$episode = Episode::find($id);
|
|
|
|
$episode->seen = ! $episode->seen;
|
|
|
|
|
|
|
|
if( ! $episode->save()) {
|
|
|
|
return response('Server Error', 500);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-30 15:26:38 +01:00
|
|
|
/**
|
|
|
|
* Toggle all episodes of an season as seen/unseen.
|
|
|
|
*/
|
|
|
|
public function toggleSeason()
|
|
|
|
{
|
|
|
|
$tmdb_id = Input::get('tmdb_id');
|
|
|
|
$season = Input::get('season');
|
|
|
|
$seen = Input::get('seen');
|
|
|
|
|
|
|
|
$episodes = Episode::where('tmdb_id', $tmdb_id)->where('season_number', $season)->get();
|
|
|
|
|
|
|
|
foreach($episodes as $episode) {
|
|
|
|
$episode->seen = $seen;
|
|
|
|
$episode->save();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-28 08:48:12 +01:00
|
|
|
/**
|
|
|
|
* Save all episodes of each season.
|
|
|
|
*
|
|
|
|
* @param $seasons
|
|
|
|
* @param $tmdbId
|
|
|
|
*/
|
2016-12-28 10:14:27 +01:00
|
|
|
protected function createEpisodes($tmdbId, TMDB $tmdb)
|
2016-11-28 08:48:12 +01:00
|
|
|
{
|
|
|
|
$seasons = $tmdb->tvEpisodes($tmdbId);
|
|
|
|
|
|
|
|
foreach($seasons as $season) {
|
|
|
|
foreach($season->episodes as $episode) {
|
|
|
|
$new = new Episode();
|
|
|
|
$new->season_tmdb_id = $season->id;
|
|
|
|
$new->episode_tmdb_id = $episode->id;
|
|
|
|
$new->season_number = $episode->season_number;
|
|
|
|
$new->episode_number = $episode->episode_number;
|
|
|
|
$new->name = $episode->name;
|
|
|
|
$new->tmdb_id = $tmdbId;
|
2016-11-29 12:06:36 +01:00
|
|
|
$new->created_at = time();
|
2016-11-28 08:48:12 +01:00
|
|
|
$new->save();
|
|
|
|
}
|
|
|
|
}
|
2016-10-10 10:57:39 +02:00
|
|
|
}
|
|
|
|
}
|