From badf941265cb205be0325bbd9dcd3de7ecf9ec99 Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Fri, 24 Apr 2020 14:14:52 -0400 Subject: [PATCH] Fix some bugs with history view --- src/AnimeClient/API/Kitsu/ListItem.php | 5 ++ src/AnimeClient/API/Kitsu/Model.php | 12 ++-- .../Transformer/AnimeHistoryTransformer.php | 4 +- .../Kitsu/Transformer/HistoryTransformer.php | 60 ++++++++++++++++--- .../Transformer/MangaHistoryTransformer.php | 4 +- src/Ion/View/HtmlView.php | 5 +- 6 files changed, 72 insertions(+), 18 deletions(-) diff --git a/src/AnimeClient/API/Kitsu/ListItem.php b/src/AnimeClient/API/Kitsu/ListItem.php index 2415841a..4b11080e 100644 --- a/src/AnimeClient/API/Kitsu/ListItem.php +++ b/src/AnimeClient/API/Kitsu/ListItem.php @@ -151,6 +151,11 @@ final class ListItem extends AbstractListItem { ] ]; + if (((int) $data->progress) === 0) + { + $data->progress = 0; + } + $request = $this->requestBuilder->newRequest('PATCH', "library-entries/{$id}") ->setJsonBody($requestData); diff --git a/src/AnimeClient/API/Kitsu/Model.php b/src/AnimeClient/API/Kitsu/Model.php index 4a96dad9..9b43dc1d 100644 --- a/src/AnimeClient/API/Kitsu/Model.php +++ b/src/AnimeClient/API/Kitsu/Model.php @@ -186,7 +186,6 @@ final class Model { { $raw = $this->getRawHistoryList('anime'); $organized = JsonAPI::organizeData($raw); - $organized = array_filter($organized, fn ($item) => array_key_exists('relationships', $item)); return (new AnimeHistoryTransformer())->transform($organized); @@ -203,7 +202,6 @@ final class Model { { $raw = $this->getRawHistoryList('manga'); $organized = JsonAPI::organizeData($raw); - $organized = array_filter($organized, fn ($item) => array_key_exists('relationships', $item)); return (new MangaHistoryTransformer())->transform($organized); @@ -1034,11 +1032,13 @@ final class Model { 'offset' => $offset, 'limit' => $limit, ], - 'fields' => ($type === 'anime') - ? ['anime' => 'canonicalTitle,titles,slug,posterImage'] - : ['manga' => 'canonicalTitle,titles,slug,posterImage'], + 'fields' => [ + 'anime' => 'canonicalTitle,titles,slug,posterImage', + 'manga' => 'canonicalTitle,titles,slug,posterImage', + 'libraryEntry' => 'reconsuming,reconsumeCount', + ], 'sort' => '-updated_at', - 'include' => $type, + 'include' => 'anime,manga,libraryEntry', ], ]); } diff --git a/src/AnimeClient/API/Kitsu/Transformer/AnimeHistoryTransformer.php b/src/AnimeClient/API/Kitsu/Transformer/AnimeHistoryTransformer.php index b99d4f9c..58f84023 100644 --- a/src/AnimeClient/API/Kitsu/Transformer/AnimeHistoryTransformer.php +++ b/src/AnimeClient/API/Kitsu/Transformer/AnimeHistoryTransformer.php @@ -23,9 +23,11 @@ class AnimeHistoryTransformer extends HistoryTransformer { protected string $progressAction = 'Watched episode'; - protected string $smallAggregateAction = 'Watched episodes'; + protected string $reconsumeAction = 'Rewatched episode'; protected string $largeAggregateAction = 'Marathoned episodes'; + protected string $reconsumingStatus = 'Rewatching'; + protected array $statusMap = AnimeWatchingStatus::KITSU_TO_TITLE; } \ No newline at end of file diff --git a/src/AnimeClient/API/Kitsu/Transformer/HistoryTransformer.php b/src/AnimeClient/API/Kitsu/Transformer/HistoryTransformer.php index d32320f7..8a2b22da 100644 --- a/src/AnimeClient/API/Kitsu/Transformer/HistoryTransformer.php +++ b/src/AnimeClient/API/Kitsu/Transformer/HistoryTransformer.php @@ -33,15 +33,20 @@ abstract class HistoryTransformer { protected string $progressAction; /** - * @var string The message for going though a small number of media in a series + * @var string The message for rewatching/rereading episode(s)/chapter(s) */ - protected string $smallAggregateAction; + protected string $reconsumeAction; /** * @var string The message for going through a large number of media in a series */ protected string $largeAggregateAction; + /** + * @var string The status for items you are rewatching/rereading + */ + protected string $reconsumingStatus; + /** * @var array The mapping of api status to display status */ @@ -121,7 +126,8 @@ abstract class HistoryTransformer { foreach ($entries as $e) { - $items[] = max($e['original']['attributes']['changedData']['progress']); + $progressItem = $e['original']['attributes']['changedData']['progress']; + $items[] = array_pop($progressItem); $updated[] = $e['updated']; } $firstItem = min($items); @@ -131,15 +137,23 @@ abstract class HistoryTransformer { $title = $entries[0]['title']; - $action = (count($entries) > 3) - ? "{$this->largeAggregateAction} {$firstItem}-{$lastItem}" - : "{$this->smallAggregateAction} {$firstItem}-{$lastItem}"; + if ($this->isReconsuming($entries[0]['original'])) + { + $action = "{$this->reconsumeAction}s {$firstItem}-{$lastItem}"; + } + else + { + $action = (count($entries) > 3) + ? "{$this->largeAggregateAction} {$firstItem}-{$lastItem}" + : "{$this->progressAction}s {$firstItem}-{$lastItem}"; + } $output[] = HistoryItem::from([ 'action' => $action, 'coverImg' => $entries[0]['coverImg'], 'dateRange' => [$firstUpdate, $lastUpdate], 'isAggregate' => true, + 'original' => $entries, 'title' => $title, 'updated' => $entries[0]['updated'], 'url' => $entries[0]['url'], @@ -162,10 +176,14 @@ abstract class HistoryTransformer { $data = $entry['relationships'][$this->type][$id]['attributes']; $title = $this->linkTitle($data); $imgUrl = "images/{$this->type}/{$id}.webp"; - $item = array_pop($entry['attributes']['changedData']['progress']); + $item = end($entry['attributes']['changedData']['progress']); + + $action = ($this->isReconsuming($entry)) + ? "{$this->reconsumeAction} {$item}" + : "{$this->progressAction} {$item}"; return HistoryItem::from([ - 'action' => "{$this->progressAction} {$item}", + 'action' => $action, 'coverImg' => $imgUrl, 'kind' => 'progressed', 'original' => $entry, @@ -189,6 +207,13 @@ abstract class HistoryTransformer { $status = array_pop($entry['attributes']['changedData']['status']); $statusName = $this->statusMap[$status]; + if ($this->isReconsuming($entry)) + { + $statusName = ($statusName === 'Completed') + ? "Finished {$this->reconsumingStatus}" + : $this->reconsumingStatus; + } + return HistoryItem::from([ 'action' => $statusName, 'coverImg' => $imgUrl, @@ -222,4 +247,23 @@ abstract class HistoryTransformer { { return "/{$this->type}/details/{$data['slug']}"; } + + protected function isReconsuming ($entry): bool + { + $le = $this->getLibraryEntry($entry); + return $le['reconsuming']; + } + + private function getLibraryEntry ($entry): ?array + { + if ( ! isset($entry['relationships']['libraryEntry']['libraryEntries'])) + { + return NULL; + } + + $libraryEntries = $entry['relationships']['libraryEntry']['libraryEntries']; + $id = array_keys($libraryEntries)[0]; + + return $libraryEntries[$id]['attributes']; + } } \ No newline at end of file diff --git a/src/AnimeClient/API/Kitsu/Transformer/MangaHistoryTransformer.php b/src/AnimeClient/API/Kitsu/Transformer/MangaHistoryTransformer.php index cb38cceb..844ecd87 100644 --- a/src/AnimeClient/API/Kitsu/Transformer/MangaHistoryTransformer.php +++ b/src/AnimeClient/API/Kitsu/Transformer/MangaHistoryTransformer.php @@ -23,9 +23,11 @@ class MangaHistoryTransformer extends HistoryTransformer { protected string $progressAction = 'Read chapter'; - protected string $smallAggregateAction = 'Read chapters'; + protected string $reconsumeAction = 'Reread chapter'; protected string $largeAggregateAction = 'Blew through chapters'; + protected string $reconsumingStatus = 'Rereading'; + protected array $statusMap = MangaReadingStatus::KITSU_TO_TITLE; } \ No newline at end of file diff --git a/src/Ion/View/HtmlView.php b/src/Ion/View/HtmlView.php index a7bae061..658c7c94 100644 --- a/src/Ion/View/HtmlView.php +++ b/src/Ion/View/HtmlView.php @@ -20,6 +20,7 @@ use Aura\Html\HelperLocator; use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Di\Exception\ContainerException; use Aviat\Ion\Di\Exception\NotFoundException; +use const EXTR_OVERWRITE; /** * View class for outputting HTML @@ -67,13 +68,13 @@ class HtmlView extends HttpView { $data['container'] = $this->container; ob_start(); - extract($data, \EXTR_OVERWRITE); + extract($data, EXTR_OVERWRITE); include_once $path; $buffer = ob_get_clean(); // Very basic html minify, that won't affect content between html tags - // $buffer = preg_replace('/>\s+ <', $buffer); + $buffer = preg_replace('/>\s+ <', $buffer); return $buffer; }