Version 5.1 - All the GraphQL #32
21
src/API/AbstractListItem.php
Normal file
21
src/API/AbstractListItem.php
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* Anime List Client
|
||||||
|
*
|
||||||
|
* An API client for Kitsu and MyAnimeList to manage anime and manga watch lists
|
||||||
|
*
|
||||||
|
* PHP version 7
|
||||||
|
*
|
||||||
|
* @package AnimeListClient
|
||||||
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
|
* @copyright 2015 - 2016 Timothy J. Warren
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
* @version 4.0
|
||||||
|
* @link https://github.com/timw4mail/HummingBirdAnimeClient
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Aviat\AnimeClient\API;
|
||||||
|
|
||||||
|
abstract class AbstractListItem implements ListItemInterface {
|
||||||
|
|
||||||
|
}
|
108
src/API/Kitsu/Auth.php
Normal file
108
src/API/Kitsu/Auth.php
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* Anime List Client
|
||||||
|
*
|
||||||
|
* An API client for Kitsu and MyAnimeList to manage anime and manga watch lists
|
||||||
|
*
|
||||||
|
* PHP version 7
|
||||||
|
*
|
||||||
|
* @package AnimeListClient
|
||||||
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
|
* @copyright 2015 - 2016 Timothy J. Warren
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
* @version 4.0
|
||||||
|
* @link https://github.com/timw4mail/HummingBirdAnimeClient
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Aviat\AnimeClient\API\Kitsu;
|
||||||
|
|
||||||
|
use Aviat\AnimeClient\AnimeClient;
|
||||||
|
use Aviat\Ion\Di\{ContainerAware, ContainerInterface};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Kitsu API Authentication
|
||||||
|
*/
|
||||||
|
class Auth {
|
||||||
|
|
||||||
|
use ContainerAware;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Anime API Model
|
||||||
|
*
|
||||||
|
* @var \Aviat\AnimeClient\API\Kitsu\Model
|
||||||
|
*/
|
||||||
|
protected $model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Session object
|
||||||
|
*
|
||||||
|
* @var Aura\Session\Segment
|
||||||
|
*/
|
||||||
|
protected $segment;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @param ContainerInterface $container
|
||||||
|
*/
|
||||||
|
public function __construct(ContainerInterface $container)
|
||||||
|
{
|
||||||
|
$this->setContainer($container);
|
||||||
|
$this->segment = $container->get('session')
|
||||||
|
->getSegment(AnimeClient::SESSION_SEGMENT);
|
||||||
|
$this->model = $container->get('kitsu-model');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make the appropriate authentication call,
|
||||||
|
* and save the resulting auth token if successful
|
||||||
|
*
|
||||||
|
* @param string $password
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function authenticate($password)
|
||||||
|
{
|
||||||
|
$username = $this->container->get('config')
|
||||||
|
->get('kitsu_username');
|
||||||
|
$auth_token = $this->model->authenticate($username, $password);
|
||||||
|
|
||||||
|
if (FALSE !== $auth_token)
|
||||||
|
{
|
||||||
|
$this->segment->set('auth_token', $auth_token);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether the current user is authenticated
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function is_authenticated()
|
||||||
|
{
|
||||||
|
return ($this->get_auth_token() !== FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear authentication values
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function logout()
|
||||||
|
{
|
||||||
|
$this->segment->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the authentication token from the session
|
||||||
|
*
|
||||||
|
* @return string|false
|
||||||
|
*/
|
||||||
|
public function get_auth_token()
|
||||||
|
{
|
||||||
|
return $this->segment->get('auth_token', FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// End of KitsuAuth.php
|
29
src/API/Kitsu/Enum/AnimeAiringStatus.php
Normal file
29
src/API/Kitsu/Enum/AnimeAiringStatus.php
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* Anime List Client
|
||||||
|
*
|
||||||
|
* An API client for Kitsu and MyAnimeList to manage anime and manga watch lists
|
||||||
|
*
|
||||||
|
* PHP version 7
|
||||||
|
*
|
||||||
|
* @package AnimeListClient
|
||||||
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
|
* @copyright 2015 - 2016 Timothy J. Warren
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
* @version 4.0
|
||||||
|
* @link https://github.com/timw4mail/HummingBirdAnimeClient
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Aviat\AnimeClient\API\Kitsu\Enum;
|
||||||
|
|
||||||
|
use Aviat\Ion\Enum as BaseEnum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Status of when anime is being/was/will be aired
|
||||||
|
*/
|
||||||
|
class AnimeAiringStatus extends BaseEnum {
|
||||||
|
const NOT_YET_AIRED = 'Not Yet Aired';
|
||||||
|
const AIRING = 'Currently Airing';
|
||||||
|
const FINISHED_AIRING = 'Finished Airing';
|
||||||
|
}
|
||||||
|
// End of AnimeAiringStatus.php
|
32
src/API/Kitsu/Enum/AnimeShowType.php
Normal file
32
src/API/Kitsu/Enum/AnimeShowType.php
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* Anime List Client
|
||||||
|
*
|
||||||
|
* An API client for Kitsu and MyAnimeList to manage anime and manga watch lists
|
||||||
|
*
|
||||||
|
* PHP version 7
|
||||||
|
*
|
||||||
|
* @package AnimeListClient
|
||||||
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
|
* @copyright 2015 - 2016 Timothy J. Warren
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
* @version 4.0
|
||||||
|
* @link https://github.com/timw4mail/HummingBirdAnimeClient
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Aviat\AnimeClient\API\Kitsu\Enum;
|
||||||
|
|
||||||
|
use Aviat\Ion\Enum as BaseEnum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type of Anime
|
||||||
|
*/
|
||||||
|
class AnimeShowType extends BaseEnum {
|
||||||
|
const TV = 'TV';
|
||||||
|
const MOVIE = 'Movie';
|
||||||
|
const OVA = 'OVA';
|
||||||
|
const ONA = 'ONA';
|
||||||
|
const SPECIAL = 'Special';
|
||||||
|
const MUSIC = 'Music';
|
||||||
|
}
|
||||||
|
// End of AnimeShowType.php
|
31
src/API/Kitsu/Enum/AnimeWatchingStatus.php
Normal file
31
src/API/Kitsu/Enum/AnimeWatchingStatus.php
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* Anime List Client
|
||||||
|
*
|
||||||
|
* An API client for Kitsu and MyAnimeList to manage anime and manga watch lists
|
||||||
|
*
|
||||||
|
* PHP version 7
|
||||||
|
*
|
||||||
|
* @package AnimeListClient
|
||||||
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
|
* @copyright 2015 - 2016 Timothy J. Warren
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
* @version 4.0
|
||||||
|
* @link https://github.com/timw4mail/HummingBirdAnimeClient
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Aviat\AnimeClient\API\Kitsu\Enum;
|
||||||
|
|
||||||
|
use Aviat\Ion\Enum as BaseEnum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Possible values for watching status for the current anime
|
||||||
|
*/
|
||||||
|
class AnimeWatchingStatus extends BaseEnum {
|
||||||
|
const WATCHING = 'current';
|
||||||
|
const PLAN_TO_WATCH = 'planned';
|
||||||
|
const COMPLETED = 'completed';
|
||||||
|
const ON_HOLD = 'on_hold';
|
||||||
|
const DROPPED = 'dropped';
|
||||||
|
}
|
||||||
|
// End of AnimeWatchingStatus.php
|
31
src/API/Kitsu/Enum/MangaReadingStatus.php
Normal file
31
src/API/Kitsu/Enum/MangaReadingStatus.php
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* Anime List Client
|
||||||
|
*
|
||||||
|
* An API client for Kitsu and MyAnimeList to manage anime and manga watch lists
|
||||||
|
*
|
||||||
|
* PHP version 7
|
||||||
|
*
|
||||||
|
* @package AnimeListClient
|
||||||
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
|
* @copyright 2015 - 2016 Timothy J. Warren
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
* @version 4.0
|
||||||
|
* @link https://github.com/timw4mail/HummingBirdAnimeClient
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Aviat\AnimeClient\API\Kitsu\Enum;
|
||||||
|
|
||||||
|
use Aviat\Ion\Enum as BaseEnum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Possible values for current reading status of manga
|
||||||
|
*/
|
||||||
|
class MangaReadingStatus extends BaseEnum {
|
||||||
|
const READING = 'Currently Reading';
|
||||||
|
const PLAN_TO_READ = 'Plan to Read';
|
||||||
|
const DROPPED = 'Dropped';
|
||||||
|
const ON_HOLD = 'On Hold';
|
||||||
|
const COMPLETED = 'Completed';
|
||||||
|
}
|
||||||
|
// End of MangaReadingStatus.php
|
68
src/API/Kitsu/Model.php
Normal file
68
src/API/Kitsu/Model.php
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* Anime List Client
|
||||||
|
*
|
||||||
|
* An API client for Kitsu and MyAnimeList to manage anime and manga watch lists
|
||||||
|
*
|
||||||
|
* PHP version 7
|
||||||
|
*
|
||||||
|
* @package AnimeListClient
|
||||||
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
|
* @copyright 2015 - 2016 Timothy J. Warren
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
* @version 4.0
|
||||||
|
* @link https://github.com/timw4mail/HummingBirdAnimeClient
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Aviat\AnimeClient\API\Kitsu;
|
||||||
|
|
||||||
|
use Aviat\AnimeClient\Model\API;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Kitsu API Model
|
||||||
|
*/
|
||||||
|
class Model extends API {
|
||||||
|
|
||||||
|
const CLIENT_ID = 'dd031b32d2f56c990b1425efe6c42ad847e7fe3ab46bf1299f05ecd856bdb7dd';
|
||||||
|
const CLIENT_SECRET = '54d7307928f63414defd96399fc31ba847961ceaecef3a5fd93144e960c0e151';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base url for Kitsu API
|
||||||
|
*/
|
||||||
|
protected $baseUrl = 'https://kitsu.io/api/edge/';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default settings for Guzzle
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $connectionDefaults = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the access token from the Kitsu API
|
||||||
|
*
|
||||||
|
* @param string $username
|
||||||
|
* @param string $password
|
||||||
|
* @return bool|string
|
||||||
|
*/
|
||||||
|
public function authenticate(string $username, string $password)
|
||||||
|
{
|
||||||
|
$response = $this->post('https://kitsu.io/api/oauth/token', [
|
||||||
|
'body' => http_build_query([
|
||||||
|
'grant_type' => 'password',
|
||||||
|
'username' => $username,
|
||||||
|
'password' => $password,
|
||||||
|
'client_id' => self::CLIENT_ID,
|
||||||
|
'client_secret' => self::CLIENT_SECRET
|
||||||
|
])
|
||||||
|
]);
|
||||||
|
|
||||||
|
$info = $response->getBody();
|
||||||
|
|
||||||
|
if (array_key_exists('access_token', $info)) {
|
||||||
|
// @TODO save token
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
149
src/API/Kitsu/Transformer/AnimeListTransformer.php
Normal file
149
src/API/Kitsu/Transformer/AnimeListTransformer.php
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* Anime List Client
|
||||||
|
*
|
||||||
|
* An API client for Kitsu and MyAnimeList to manage anime and manga watch lists
|
||||||
|
*
|
||||||
|
* PHP version 7
|
||||||
|
*
|
||||||
|
* @package AnimeListClient
|
||||||
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
|
* @copyright 2015 - 2016 Timothy J. Warren
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
* @version 4.0
|
||||||
|
* @link https://github.com/timw4mail/HummingBirdAnimeClient
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Aviat\AnimeClient\API\Kitsu\Transformer;
|
||||||
|
|
||||||
|
use Aviat\Ion\Transformer\AbstractTransformer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transformer for anime list
|
||||||
|
*/
|
||||||
|
class AnimeListTransformer extends AbstractTransformer {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert raw api response to a more
|
||||||
|
* logical and workable structure
|
||||||
|
*
|
||||||
|
* @param array $item API library item
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function transform($item)
|
||||||
|
{
|
||||||
|
print_r($item);
|
||||||
|
die();
|
||||||
|
$anime =& $item['anime'];
|
||||||
|
$genres = $this->linearizeGenres($item['anime']['genres']);
|
||||||
|
|
||||||
|
$rating = NULL;
|
||||||
|
if ($item['rating']['type'] === 'advanced')
|
||||||
|
{
|
||||||
|
$rating = is_numeric($item['rating']['value'])
|
||||||
|
? (int) 2 * $item['rating']['value']
|
||||||
|
: '-';
|
||||||
|
}
|
||||||
|
|
||||||
|
$total_episodes = is_numeric($anime['episode_count'])
|
||||||
|
? $anime['episode_count']
|
||||||
|
: '-';
|
||||||
|
|
||||||
|
$alternate_title = NULL;
|
||||||
|
if (array_key_exists('alternate_title', $anime))
|
||||||
|
{
|
||||||
|
// If the alternate title is very similar, or
|
||||||
|
// a subset of the main title, don't list the
|
||||||
|
// alternate title
|
||||||
|
$not_subset = stripos($anime['title'], $anime['alternate_title']) === FALSE;
|
||||||
|
$diff = levenshtein($anime['title'], $anime['alternate_title'] ?? '');
|
||||||
|
if ($not_subset && $diff >= 5)
|
||||||
|
{
|
||||||
|
$alternate_title = $anime['alternate_title'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
'id' => $item['id'],
|
||||||
|
'episodes' => [
|
||||||
|
'watched' => $item['episodes_watched'],
|
||||||
|
'total' => $total_episodes,
|
||||||
|
'length' => $anime['episode_length'],
|
||||||
|
],
|
||||||
|
'airing' => [
|
||||||
|
'status' => $anime['status'],
|
||||||
|
'started' => $anime['started_airing'],
|
||||||
|
'ended' => $anime['finished_airing']
|
||||||
|
],
|
||||||
|
'anime' => [
|
||||||
|
'age_rating' => $anime['age_rating'],
|
||||||
|
'title' => $anime['title'],
|
||||||
|
'alternate_title' => $alternate_title,
|
||||||
|
'slug' => $anime['slug'],
|
||||||
|
'url' => $anime['url'],
|
||||||
|
'type' => $anime['show_type'],
|
||||||
|
'image' => $anime['cover_image'],
|
||||||
|
'genres' => $genres,
|
||||||
|
],
|
||||||
|
'watching_status' => $item['status'],
|
||||||
|
'notes' => $item['notes'],
|
||||||
|
'rewatching' => (bool) $item['rewatching'],
|
||||||
|
'rewatched' => $item['rewatched_times'],
|
||||||
|
'user_rating' => $rating,
|
||||||
|
'private' => (bool) $item['private'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert transformed data to
|
||||||
|
* api response format
|
||||||
|
*
|
||||||
|
* @param array $item Transformed library item
|
||||||
|
* @return array API library item
|
||||||
|
*/
|
||||||
|
public function untransform($item)
|
||||||
|
{
|
||||||
|
// Messy mapping of boolean values to their API string equivalents
|
||||||
|
$privacy = 'public';
|
||||||
|
if (array_key_exists('private', $item) && $item['private'])
|
||||||
|
{
|
||||||
|
$privacy = 'private';
|
||||||
|
}
|
||||||
|
|
||||||
|
$rewatching = 'false';
|
||||||
|
if (array_key_exists('rewatching', $item) && $item['rewatching'])
|
||||||
|
{
|
||||||
|
$rewatching = 'true';
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
'id' => $item['id'],
|
||||||
|
'status' => $item['watching_status'],
|
||||||
|
'sane_rating_update' => $item['user_rating'] / 2,
|
||||||
|
'rewatching' => $rewatching,
|
||||||
|
'rewatched_times' => $item['rewatched'],
|
||||||
|
'notes' => $item['notes'],
|
||||||
|
'episodes_watched' => $item['episodes_watched'],
|
||||||
|
'privacy' => $privacy
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simplify structure of genre list
|
||||||
|
*
|
||||||
|
* @param array $rawGenres
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function linearizeGenres(array $rawGenres): array
|
||||||
|
{
|
||||||
|
$genres = [];
|
||||||
|
|
||||||
|
foreach ($rawGenres as $genre)
|
||||||
|
{
|
||||||
|
$genres[] = $genre['name'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $genres;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// End of AnimeListTransformer.php
|
121
src/API/Kitsu/Transformer/MangaListTransformer.php
Normal file
121
src/API/Kitsu/Transformer/MangaListTransformer.php
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* Anime List Client
|
||||||
|
*
|
||||||
|
* An API client for Kitsu and MyAnimeList to manage anime and manga watch lists
|
||||||
|
*
|
||||||
|
* PHP version 7
|
||||||
|
*
|
||||||
|
* @package AnimeListClient
|
||||||
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
|
* @copyright 2015 - 2016 Timothy J. Warren
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
* @version 4.0
|
||||||
|
* @link https://github.com/timw4mail/HummingBirdAnimeClient
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Aviat\AnimeClient\API\Kitsu\Transformer;
|
||||||
|
|
||||||
|
use Aviat\Ion\Transformer\AbstractTransformer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data transformation class for zippered Hummingbird manga
|
||||||
|
*/
|
||||||
|
class MangaListTransformer extends AbstractTransformer {
|
||||||
|
|
||||||
|
use \Aviat\Ion\StringWrapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remap zipped anime data to a more logical form
|
||||||
|
*
|
||||||
|
* @param array $item manga entry item
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function transform($item)
|
||||||
|
{
|
||||||
|
$manga =& $item['manga'];
|
||||||
|
|
||||||
|
$rating = (is_numeric($item['rating']))
|
||||||
|
? intval(2 * $item['rating'])
|
||||||
|
: '-';
|
||||||
|
|
||||||
|
$total_chapters = ($manga['chapter_count'] > 0)
|
||||||
|
? $manga['chapter_count']
|
||||||
|
: '-';
|
||||||
|
|
||||||
|
$total_volumes = ($manga['volume_count'] > 0)
|
||||||
|
? $manga['volume_count']
|
||||||
|
: '-';
|
||||||
|
|
||||||
|
$map = [
|
||||||
|
'id' => $item['id'],
|
||||||
|
'chapters' => [
|
||||||
|
'read' => $item['chapters_read'],
|
||||||
|
'total' => $total_chapters
|
||||||
|
],
|
||||||
|
'volumes' => [
|
||||||
|
'read' => $item['volumes_read'],
|
||||||
|
'total' => $total_volumes
|
||||||
|
],
|
||||||
|
'manga' => [
|
||||||
|
'title' => $manga['romaji_title'],
|
||||||
|
'alternate_title' => NULL,
|
||||||
|
'slug' => $manga['id'],
|
||||||
|
'url' => 'https://hummingbird.me/manga/' . $manga['id'],
|
||||||
|
'type' => $manga['manga_type'],
|
||||||
|
'image' => $manga['poster_image_thumb'],
|
||||||
|
'genres' => $manga['genres'],
|
||||||
|
],
|
||||||
|
'reading_status' => $item['status'],
|
||||||
|
'notes' => $item['notes'],
|
||||||
|
'rereading' => (bool)$item['rereading'],
|
||||||
|
'reread' => $item['reread_count'],
|
||||||
|
'user_rating' => $rating,
|
||||||
|
];
|
||||||
|
|
||||||
|
if (array_key_exists('english_title', $manga))
|
||||||
|
{
|
||||||
|
$diff = levenshtein($manga['romaji_title'], $manga['english_title']);
|
||||||
|
|
||||||
|
// If the titles are REALLY similar, don't bother showing both
|
||||||
|
if ($diff >= 5)
|
||||||
|
{
|
||||||
|
$map['manga']['alternate_title'] = $manga['english_title'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $map;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Untransform data to update the api
|
||||||
|
*
|
||||||
|
* @param array $item
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function untransform($item)
|
||||||
|
{
|
||||||
|
$rereading = (array_key_exists('rereading', $item)) && (bool)$item['rereading'];
|
||||||
|
|
||||||
|
$map = [
|
||||||
|
'id' => $item['id'],
|
||||||
|
'manga_id' => $item['manga_id'],
|
||||||
|
'status' => $item['status'],
|
||||||
|
'chapters_read' => (int)$item['chapters_read'],
|
||||||
|
'volumes_read' => (int)$item['volumes_read'],
|
||||||
|
'rereading' => $rereading,
|
||||||
|
'reread_count' => (int)$item['reread_count'],
|
||||||
|
'notes' => $item['notes'],
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($item['new_rating'] !== $item['old_rating'] && $item['new_rating'] !== "")
|
||||||
|
{
|
||||||
|
$map['rating'] = ($item['new_rating'] > 0)
|
||||||
|
? $item['new_rating'] / 2
|
||||||
|
: $item['old_rating'] / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $map;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// End of MangaListTransformer.php
|
56
src/API/ListItemInterface.php
Normal file
56
src/API/ListItemInterface.php
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* Anime List Client
|
||||||
|
*
|
||||||
|
* An API client for Kitsu and MyAnimeList to manage anime and manga watch lists
|
||||||
|
*
|
||||||
|
* PHP version 7
|
||||||
|
*
|
||||||
|
* @package AnimeListClient
|
||||||
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
|
* @copyright 2015 - 2016 Timothy J. Warren
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
* @version 4.0
|
||||||
|
* @link https://github.com/timw4mail/HummingBirdAnimeClient
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Aviat\AnimeClient\API;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Common interface for anime and manga list item CRUD
|
||||||
|
*/
|
||||||
|
interface ListItemInterface {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a list item
|
||||||
|
*
|
||||||
|
* @param array $data -
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function create(array $data): bool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve a list item
|
||||||
|
*
|
||||||
|
* @param string $id - The id of the list item
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function get(string $id): array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update a list item
|
||||||
|
*
|
||||||
|
* @param string $id - The id of the list tiem to update
|
||||||
|
* @param array $data - The data with which to update the list itme
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function update(string $id, array $data): bool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a list item
|
||||||
|
*
|
||||||
|
* @param string $id - The id of the list item to delete
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function delete(string $id): bool;
|
||||||
|
}
|
108
src/API/MAL/Auth.php
Normal file
108
src/API/MAL/Auth.php
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* Anime List Client
|
||||||
|
*
|
||||||
|
* An API client for Kitsu and MyAnimeList to manage anime and manga watch lists
|
||||||
|
*
|
||||||
|
* PHP version 7
|
||||||
|
*
|
||||||
|
* @package AnimeListClient
|
||||||
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
|
* @copyright 2015 - 2016 Timothy J. Warren
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
* @version 4.0
|
||||||
|
* @link https://github.com/timw4mail/HummingBirdAnimeClient
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Aviat\AnimeClient\API\MAL;
|
||||||
|
|
||||||
|
use Aviat\AnimeClient\AnimeClient;
|
||||||
|
use Aviat\Ion\Di\{ContainerAware, ContainerInterface};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MAL API Authentication
|
||||||
|
*/
|
||||||
|
class Auth {
|
||||||
|
|
||||||
|
use \Aviat\Ion\Di\ContainerAware;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Anime API Model
|
||||||
|
*
|
||||||
|
* @var \Aviat\AnimeClient\Model\API
|
||||||
|
*/
|
||||||
|
protected $model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Session object
|
||||||
|
*
|
||||||
|
* @var Aura\Session\Segment
|
||||||
|
*/
|
||||||
|
protected $segment;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @param ContainerInterface $container
|
||||||
|
*/
|
||||||
|
public function __construct(ContainerInterface $container)
|
||||||
|
{
|
||||||
|
$this->setContainer($container);
|
||||||
|
$this->segment = $container->get('session')
|
||||||
|
->getSegment(AnimeClient::SESSION_SEGMENT);
|
||||||
|
$this->model = $container->get('api-model');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make the appropriate authentication call,
|
||||||
|
* and save the resulting auth token if successful
|
||||||
|
*
|
||||||
|
* @param string $password
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function authenticate($password)
|
||||||
|
{
|
||||||
|
$username = $this->container->get('config')
|
||||||
|
->get('hummingbird_username');
|
||||||
|
$auth_token = $this->model->authenticate($username, $password);
|
||||||
|
|
||||||
|
if (FALSE !== $auth_token)
|
||||||
|
{
|
||||||
|
$this->segment->set('auth_token', $auth_token);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether the current user is authenticated
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function is_authenticated()
|
||||||
|
{
|
||||||
|
return ($this->get_auth_token() !== FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear authentication values
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function logout()
|
||||||
|
{
|
||||||
|
$this->segment->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the authentication token from the session
|
||||||
|
*
|
||||||
|
* @return string|false
|
||||||
|
*/
|
||||||
|
public function get_auth_token()
|
||||||
|
{
|
||||||
|
return $this->segment->get('auth_token', FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// End of KitsuAuth.php
|
63
src/API/MAL/Model.php
Normal file
63
src/API/MAL/Model.php
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* Anime List Client
|
||||||
|
*
|
||||||
|
* An API client for Kitsu and MyAnimeList to manage anime and manga watch lists
|
||||||
|
*
|
||||||
|
* PHP version 7
|
||||||
|
*
|
||||||
|
* @package AnimeListClient
|
||||||
|
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||||
|
* @copyright 2015 - 2016 Timothy J. Warren
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
* @version 4.0
|
||||||
|
* @link https://github.com/timw4mail/HummingBirdAnimeClient
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Aviat\AnimeClient\API\Kitsu;
|
||||||
|
|
||||||
|
use Aviat\AnimeClient\Model\API;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MyAnimeList API Model
|
||||||
|
*/
|
||||||
|
class Model extends API {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base url for Kitsu API
|
||||||
|
*/
|
||||||
|
protected $baseUrl = 'https://myanimelist.net/api/';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default settings for Guzzle
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $connectionDefaults = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the access token from the Kitsu API
|
||||||
|
*
|
||||||
|
* @param string $username
|
||||||
|
* @param string $password
|
||||||
|
* @return bool|string
|
||||||
|
*/
|
||||||
|
public function authenticate(string $username, string $password)
|
||||||
|
{
|
||||||
|
$response = $this->post('account/', [
|
||||||
|
'body' => http_build_query([
|
||||||
|
'grant_type' => 'password',
|
||||||
|
'username' => $username,
|
||||||
|
'password' => $password
|
||||||
|
])
|
||||||
|
]);
|
||||||
|
|
||||||
|
$info = $response->getBody();
|
||||||
|
|
||||||
|
if (array_key_exists('access_token', $info)) {
|
||||||
|
// @TODO save token
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user