diff options
Diffstat (limited to 'ssh/app/Http/Controllers/CinemaController.php')
| -rw-r--r-- | ssh/app/Http/Controllers/CinemaController.php | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/ssh/app/Http/Controllers/CinemaController.php b/ssh/app/Http/Controllers/CinemaController.php new file mode 100644 index 0000000..75c93aa --- /dev/null +++ b/ssh/app/Http/Controllers/CinemaController.php @@ -0,0 +1,233 @@ +<?php + +namespace App\Http\Controllers; + +use Illuminate\Support\Facades\DB; +use Illuminate\Http\Request; + +class CinemaController extends Controller +{ + public function cinema(Request $request) + { + $order = $request->input('order', 'ref_count'); + $direction = $request->input('direction', 'desc'); + $validOrders = ['ref_count', 'score', 'num_votes', 'num_accolades', 'start_year']; + $validDirections = ['asc', 'desc']; + if (! in_array($order, $validOrders)) { + $order = 'ref_count'; + } + if (! in_array($direction, $validDirections)) { + $direction = 'desc'; + } + + $refCounts = DB::connection('cinema') + ->table('links') + ->select('links.param', DB::raw('COUNT(*) as ref_count')) + ->where('links.host', 'www.imdb.com') + ->where('links.field', 1) + ->groupBy('links.param'); + + $movies = DB::connection('cinema') + ->table('imdb') + ->select( + 'imdb.id', + 'imdb.imdb_id', + 'imdb.primary_title', + 'imdb.original_title', + 'imdb.start_year', + 'imdb.average_rating', + 'imdb.num_votes', + 'imdb.synopsis', + 'imdb.poster_url', + 'imdb.title_type', + 'imdb.runtime_minutes', + 'imdb.has_people', + 'imdb.average_rating as score', + 'imdb.num_accolades', + DB::raw('COALESCE(ref.ref_count, 0) as ref_count') + ) + ->leftJoinSub($refCounts, 'ref', function ($join) { + $join->on('ref.param', '=', 'imdb.imdb_id'); + }) + ->whereNotNull('imdb.primary_title') + ->whereNotNull('imdb.wiki_article') + ->where('imdb.title_type', 'movie') + ->orderBy($order, $direction) + ->simplePaginate(12); + + $total = DB::connection('cinema') + ->table('imdb') + ->whereNotNull('primary_title') + ->whereNotNull('wiki_article') + ->where('title_type', 'movie') + ->count(); + + return view('cinema', ['movies' => $movies, 'count' => $total, 'order' => $order, 'direction' => $direction]); + } + + public function show($id) + { + $movie = DB::connection('cinema') + ->table('imdb') + ->where('imdb.imdb_id', $id) + ->first(); + + if (! $movie) { + abort(404); + } + + $genres = DB::connection('cinema') + ->table('imdb_genre') + ->join('genre', 'genre.id', '=', 'imdb_genre.genre_id') + ->where('imdb_genre.imdb_id', $movie->id) + ->pluck('genre.name'); + + $casts = DB::connection('cinema') + ->table('who') + ->join('people', 'people.id', '=', 'who.people_id') + ->join('profession', 'profession.id', '=', 'who.profession_id') + ->where('who.imdb_id', $movie->id) + ->select('people.name', 'profession.name as profession') + ->get(); + + $actors = $casts->where('profession', 'actor')->take(8); + $directors = $casts->where('profession', 'director'); + $screenwriters = $casts->where('profession', 'screenwriter')->take(3); + + $hnStories = DB::connection('cinema') + ->table('links') + ->join('story', 'story.id', '=', 'links.story_id') + ->select( + 'story.story_id', + 'story.title', + 'story.type', + 'story.text', + 'story.score', + 'story.descendants', + 'story.time' + ) + ->where('links.host', 'www.imdb.com') + ->where('links.field', 1) + ->where('links.param', $id) + ->orderBy('story.time', 'desc') + ->get(); + + return view('cinema_show', [ + 'movie' => $movie, + 'genres' => $genres, + 'actors' => $actors, + 'directors' => $directors, + 'screenwriters' => $screenwriters, + 'hnStories' => $hnStories, + ]); + } + + public function genres() + { + $genres = DB::connection('cinema') + ->table('genre') + ->select('genre.name', DB::raw('COUNT(imdb_genre.imdb_id) as count')) + ->join('imdb_genre', 'imdb_genre.genre_id', '=', 'genre.id') + ->join('imdb', 'imdb.id', '=', 'imdb_genre.imdb_id') + ->whereNotNull('imdb.primary_title') + ->whereNotNull('imdb.wiki_article') + ->where('imdb.title_type', 'movie') + ->groupBy('genre.name') + ->orderBy('count', 'desc') + ->get(); + + return view('genres', ['genres' => $genres]); + } + + public function genre($name) + { + $genre = DB::connection('cinema') + ->table('genre') + ->where('name', $name) + ->first(); + + if (! $genre) { + abort(404); + } + + $movies = DB::connection('cinema') + ->table('imdb') + ->select( + 'imdb.id', + 'imdb.imdb_id', + 'imdb.primary_title', + 'imdb.original_title', + 'imdb.start_year', + 'imdb.average_rating', + 'imdb.num_votes', + 'imdb.synopsis', + 'imdb.poster_url', + 'imdb.title_type', + 'imdb.runtime_minutes' + ) + ->join('imdb_genre', 'imdb_genre.imdb_id', '=', 'imdb.id') + ->join('genre', 'genre.id', '=', 'imdb_genre.genre_id') + ->where('genre.name', $name) + ->whereNotNull('imdb.primary_title') + ->whereNotNull('imdb.wiki_article') + ->where('imdb.title_type', 'movie') + ->orderBy('imdb.average_rating', 'desc') + ->simplePaginate(12); + + $count = DB::connection('cinema') + ->table('imdb') + ->join('imdb_genre', 'imdb_genre.imdb_id', '=', 'imdb.id') + ->join('genre', 'genre.id', '=', 'imdb_genre.genre_id') + ->where('genre.name', $name) + ->whereNotNull('imdb.primary_title') + ->whereNotNull('imdb.wiki_article') + ->where('imdb.title_type', 'movie') + ->count(); + + return view('genre_movies', ['movies' => $movies, 'count' => $count, 'genre_name' => $name]); + } + + public function search(Request $request) + { + $query = $request->input('q', ''); + + $movies = DB::connection('cinema') + ->table('imdb') + ->select( + 'imdb.id', + 'imdb.imdb_id', + 'imdb.primary_title', + 'imdb.original_title', + 'imdb.start_year', + 'imdb.average_rating', + 'imdb.num_votes', + 'imdb.synopsis', + 'imdb.poster_url', + 'imdb.title_type', + 'imdb.runtime_minutes' + ) + ->whereNotNull('imdb.primary_title') + ->whereNotNull('imdb.wiki_article') + ->where('imdb.title_type', 'movie') + ->where(function ($q) use ($query) { + $q->where('imdb.primary_title', 'like', '%' . $query . '%') + ->orWhere('imdb.original_title', 'like', '%' . $query . '%') + ->orWhere('imdb.synopsis', 'like', '%' . $query . '%'); + }) + ->simplePaginate(12); + + $total = DB::connection('cinema') + ->table('imdb') + ->whereNotNull('primary_title') + ->whereNotNull('wiki_article') + ->where('title_type', 'movie') + ->where(function ($q) use ($query) { + $q->where('primary_title', 'like', '%' . $query . '%') + ->orWhere('original_title', 'like', '%' . $query . '%') + ->orWhere('synopsis', 'like', '%' . $query . '%'); + }) + ->count(); + + return view('cinema', ['movies' => $movies, 'count' => $total, 'search_query' => $query]); + } +} |
