add manga endpoints

This commit is contained in:
Irfan 2020-07-29 03:06:32 +05:00
parent fe0dde56f3
commit 5e2b8cc91f
8 changed files with 107 additions and 74 deletions

View File

@ -3,10 +3,6 @@
namespace App;
use Jenssegers\Mongodb\Eloquent\Model;
use Jikan\Helper\Media;
use Jikan\Helper\Parser;
use Jikan\Jikan;
use Jikan\Model\Common\YoutubeMeta;
class Anime extends Model
{

View File

@ -87,12 +87,12 @@ class GenreController extends Controller
$items = $data->items() ?? [];
foreach ($items as &$item) {
if (isset($item['aired']['from'])) {
$item['airing_start'] = $item['aired']['from'];
if (isset($item['aired'])) {
$item['airing_start'] = $item['aired']['from'] ?? null;
}
if (isset($item['published']['from'])) {
$item['publishing_start'] = $item['aired']['from'];
if (isset($item['published'])) {
$item['publishing_start'] = $item['aired']['from'] ?? null;
}
if (isset($item['serializations'])) {

View File

@ -25,7 +25,7 @@ class MagazineController extends Controller
->paginate(
self::MAX_RESULTS_PER_PAGE,
[
'mal_id', 'url', 'title', 'image_url', 'synopsis', 'type', 'aired.from', 'volumes', 'members', 'genres', 'authors', 'score', 'serializations'
'mal_id', 'url', 'title', 'image_url', 'synopsis', 'type', 'published', 'volumes', 'members', 'genres', 'authors', 'score', 'serializations'
],
null,
$page
@ -60,12 +60,12 @@ class MagazineController extends Controller
$items = $data->items() ?? [];
foreach ($items as &$item) {
if (isset($item['aired']['from'])) {
$item['airing_start'] = $item['aired']['from'];
if (isset($item['aired'])) {
$item['airing_start'] = $item['aired']['from'] ?? null;
}
if (isset($item['published']['from'])) {
$item['publishing_start'] = $item['aired']['from'];
if (isset($item['published'])) {
$item['publishing_start'] = $item['aired']['from'] ?? null;
}
if (isset($item['serializations'])) {

View File

@ -25,7 +25,7 @@ class ProducerController extends Controller
->paginate(
self::MAX_RESULTS_PER_PAGE,
[
'mal_id', 'url', 'title', 'image_url', 'synopsis', 'type', 'airing_start', 'episodes', 'members', 'genres', 'source', 'producers', 'score', 'licensors', 'rating'
'mal_id', 'url', 'title', 'image_url', 'synopsis', 'type', 'aired', 'episodes', 'members', 'genres', 'producers', 'score', 'licensors', 'rating'
],
null,
$page
@ -60,12 +60,12 @@ class ProducerController extends Controller
$items = $data->items() ?? [];
foreach ($items as &$item) {
if (isset($item['aired']['from'])) {
$item['airing_start'] = $item['aired']['from'];
if (isset($item['aired'])) {
$item['airing_start'] = $item['aired']['from'] ?? null;
}
if (isset($item['published']['from'])) {
$item['publishing_start'] = $item['aired']['from'];
if (isset($item['published'])) {
$item['publishing_start'] = $item['aired']['from'] ?? null;
}
if (isset($item['serializations'])) {

View File

@ -4,6 +4,7 @@ namespace App\Http\Controllers\V3;
use App\Anime;
use App\Http\HttpHelper;
use App\Manga;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
@ -155,17 +156,32 @@ class SearchController extends Controller
$genres = $request->get('genre');
$orderBy = $this->getOrderBy($request->get('order_by'));
$sort = $this->getSort($request->get('sort'));
$letter = $request->get('letter');
$magazine = $request->get('magazine');
$results = DB::table('manga')
->select('mal_id', 'url', 'image_url', 'title', 'publishing', 'synopsis', 'type', 'chapters', 'volumes', 'score', 'published.from', 'published.to', 'members');
$results = Manga::query();
if (!empty($query)) {
$results
->where('title', 'like', "%$query%")
->orWhere('title_english', 'like', "%$query%")
->orWhere('title_japanese', 'like', "%$query%");
} else {
->getQuery()->projections = ['distance_score'=>['$meta'=>'textScore']];
$results
->orderBy('distance_score',['$meta'=>'textScore'])
->whereRaw([
'$text' => [
'$search' => "{$query}",
'$language' => 'en'
],
]);
}
if (!is_null($letter)) {
$results = $results
->where('title', 'like', "{$letter}%");
}
if (empty($query)) {
$results = $results
->orderBy('mal_id');
}
@ -185,11 +201,27 @@ class SearchController extends Controller
->where('status', $status);
}
if (!is_null($magazine)) {
$magazine = (int) $magazine;
$results = $results
->where('serializations.mal_id', $magazine);
}
if (!is_null($genres)) {
$genres = explode(',', $genres);
// @todo WIP. Need genre indexing
foreach ($genres as $genre) {
if (empty($genre)) {
continue;
}
$genre = (int) $genre;
$results = $results
->where('genres.mal_id', $genre);
}
}
if (!is_null($orderBy)) {
@ -212,7 +244,7 @@ class SearchController extends Controller
$results = $results
->paginate(
$limit,
null,
['mal_id', 'url', 'image_url', 'title', 'publishing', 'synopsis', 'type', 'chapters', 'volumes', 'score', 'published.from', 'published.to', 'members'],
null,
$page
);
@ -220,13 +252,6 @@ class SearchController extends Controller
$items = $this->applyBackwardsCompatibility($results);
return response()->json($items);
$search = $this->jikan->getMangaSearch(
SearchQueryBuilder::create(
(new MangaSearchRequest())->setPage($page)
)
);
return response($this->filter($search));
}
public function people(int $page = 1)
@ -283,26 +308,20 @@ class SearchController extends Controller
$items = $data->items() ?? [];
foreach ($items as &$item) {
if (isset($item['aired']['from'])) {
$item['start_date'] = $item['aired']['from'];
if (isset($item['aired'])) {
$item['start_date'] = $item['aired']['from'] ?? null;
$item['end_date'] = $item['aired']['to'] ?? null;
}
if (isset($item['aired']['to'])) {
$item['end_date'] = $item['aired']['to'];
}
if (isset($item['published']['from'])) {
$item['start_date'] = $item['published']['from'];
}
if (isset($item['published']['to'])) {
$item['end_date'] = $item['published']['to'];
if (isset($item['published'])) {
$item['start_date'] = $item['published']['from'] ?? null;
$item['end_date'] = $item['published']['to'] ?? null;
}
if (isset($item['rating'])) {
$item['rated'] = $item['rating'];
}
unset($item['_id'], $item['oid'], $item['expiresAt'], $item['aired'], $item['published'], $item['rating']);
unset($item['_id'], $item['oid'], $item['expiresAt'], $item['aired'], $item['published'], $item['rating'], $item['distance_score']);
}
$items = ['results' => $items];

View File

@ -110,12 +110,12 @@ class SeasonController extends Controller
$items = $data->all() ?? [];
foreach ($items as &$item) {
if (isset($item['aired']['from'])) {
$item['airing_start'] = $item['aired']['from'];
if (isset($item['aired'])) {
$item['airing_start'] = $item['aired']['from'] ?? null;
}
if (isset($item['published']['from'])) {
$item['publishing_start'] = $item['aired']['from'];
if (isset($item['published'])) {
$item['publishing_start'] = $item['aired']['from'] ?? null;
}
if (isset($item['licensors'])) {

View File

@ -73,7 +73,7 @@ class TopController extends Controller
->paginate(
self::MAX_RESULTS_PER_PAGE,
[
'mal_id', 'rank', 'title', 'url', 'image_url', 'type', 'episodes', 'aired.from', 'aired.to', 'members', 'score'
'mal_id', 'rank', 'title', 'url', 'image_url', 'type', 'episodes', 'aired', 'members', 'score'
],
null,
$page
@ -82,12 +82,6 @@ class TopController extends Controller
$items = $this->applyBackwardsCompatibility($results);
return response()->json($items);
//
// $anime = $this->jikan->getTopAnime(new TopAnimeRequest($page, $type));
//
// $top = ['top' => $this->jikan->getTopAnime(new TopAnimeRequest($page, $type))];
//
// return response($this->serializer->serialize($top, 'json'));
}
public function manga(Request $request, int $page = 1, string $type = null)
@ -145,7 +139,7 @@ class TopController extends Controller
->paginate(
self::MAX_RESULTS_PER_PAGE,
[
'mal_id', 'rank', 'title', 'url', 'image_url', 'type', 'episodes', 'aired.from', 'aired.to', 'members', 'score'
'mal_id', 'rank', 'title', 'url', 'image_url', 'type', 'volumes', 'chapters', 'published', 'members', 'score'
],
null,
$page
@ -154,10 +148,6 @@ class TopController extends Controller
$items = $this->applyBackwardsCompatibility($results);
return response()->json($items);
// $top = ['top' => $this->jikan->getTopManga(new TopMangaRequest($page, $type))];
//
// return response($this->serializer->serialize($top, 'json'));
}
public function people(int $page = 1)
@ -187,19 +177,13 @@ class TopController extends Controller
$items = $data->items() ?? [];
foreach ($items as &$item) {
if (isset($item['aired']['from'])) {
$item['start_date'] = $item['aired']['from'];
if (isset($item['aired'])) {
$item['start_date'] = $item['aired']['from'] ?? null;
$item['end_date'] = $item['aired']['to'] ?? null;
}
if (isset($item['aired']['to'])) {
$item['end_date'] = $item['aired']['to'];
}
if (isset($item['published']['from'])) {
$item['start_date'] = $item['published']['from'];
}
if (isset($item['published']['to'])) {
$item['end_date'] = $item['published']['to'];
if (isset($item['published'])) {
$item['start_date'] = $item['published']['from'] ?? null;
$item['end_date'] = $item['published']['to'] ?? null;
}
if (isset($item['rating'])) {

34
app/Manga.php Normal file
View File

@ -0,0 +1,34 @@
<?php
namespace App;
use Jenssegers\Mongodb\Eloquent\Model;
class Manga extends Model
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'mal_id', 'url', 'title_english', 'title_synonyms', 'title_japanese', 'status', 'image_url', 'type', 'volumes', 'chapters', 'publishing', 'published', 'rank', 'score', 'scored_by', 'popularity', 'members', 'favorites', 'synopsis', 'background', 'related', 'genres', 'authors', 'serializations'
];
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'manga';
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = [
'_id', 'expiresAt'
];
}