Compare commits

...

3 commits

Author SHA1 Message Date
6d807f59c0 ⬆️ Upgrade to latest PHP 2025-10-27 08:56:35 -05:00
5fd2fd103e Add current tiem to output filename 2025-10-27 08:54:39 -05:00
d0c3002bf1 Add login/refresh token commands 2025-04-07 11:05:40 -05:00
5 changed files with 1775 additions and 1272 deletions

View file

@ -0,0 +1,55 @@
<?php
declare(strict_types=1);
namespace App\Commands;
use App\Services\Trakt;
class TraktLogin extends Command
{
protected $signature = 'trakt:login';
protected $description = 'Login and get new token.';
public function handle(Trakt $trakt): int
{
$data = [
'client_id' => env('TRAKT_APP_ID'),
];
$resp = $trakt->requestNoAuth()->post('/oauth/device/code', $data);
if (!$resp->ok()) {
$this->line('Failed to get device code: ' . $resp->status());
$this->line($resp->body());
return static::FAILURE;
}
$body = $resp->json();
$this->line("Visit {$body['verification_url']} and enter the code {$body['user_code']}");
if (!$this->confirm('Ready to continue?')) {
return static::FAILURE;
}
$this->line("TRAKT_DEVICE_RESP='" . json_encode($body) . "'");
$data = [
'client_id' => env('TRAKT_APP_ID'),
'client_secret' => env('TRAKT_APP_SECRET'),
'code' => $body['device_code'],
];
$resp = $trakt->requestNoAuth()->post('/oauth/device/token', $data);
if (!$resp->ok()) {
$this->line('Failed to get new token');
return static::FAILURE;
}
$body = $resp->json();
$this->line("TRAKT_OAUTH_RESP='" . json_encode($body) . "'");
$this->line('TRAKT_OAUTH_TOKEN=' . $body['access_token']);
return static::SUCCESS;
}
}

View file

@ -0,0 +1,45 @@
<?php
declare(strict_types=1);
namespace App\Commands;
use App\Services\Trakt;
class TraktRefreshLogin extends Command
{
protected $signature = 'trakt:refresh';
protected $description = 'Refresh access token.';
public function handle(Trakt $trakt): int
{
$oauth_resp = json_decode(env('TRAKT_OAUTH_RESP'), true);
if (empty($oauth_resp)) {
$this->line("Failed to get OAuth response");
return static::FAILURE;
}
$data = [
'refresh_token' => $oauth_resp['refresh_token'],
'client_id' => env('TRAKT_APP_ID'),
'client_secret' => env('TRAKT_APP_SECRET'),
'redirect_uri' => env('TRAKT_REDIRECT_URI'),
'grant_type' => 'refresh_token',
];
$resp = $trakt->request()->post('/oauth/token', $data);
if (!$resp->ok()) {
$this->line('Failed to get new token');
return static::FAILURE;
}
// $this->line(json_encode($resp->body()));
// $body = $json->body();
$body = $resp->json();
$this->line("TRAKT_OAUTH_RESP='" . json_encode($body) . "'");
$this->line('TRAKT_OAUTH_TOKEN=' . $body['access_token']);
return static::SUCCESS;
}
}

View file

@ -20,18 +20,21 @@ class ParseWatchFile implements DataPipe
{
public function handle(mixed $payload, DataClass $class, Collection $properties): Collection
{
$n = now()->format('U');
$properties['watched'] = Carbon::now();
$properties['output'] = match ($properties['type']) {
Type::Movie => sprintf(
'%s-%d.json',
'%s-%d-%s.json',
Str::slug($properties['showTitle'] ?? uniqid()),
$properties['movieYear'],
$n,
),
default => sprintf(
'%s-%dx%02d.json',
'%s-%dx%02d-%s.json',
Str::slug($properties['showTitle'] ?? uniqid()),
$properties['season'],
$properties['episode']
$properties['episode'],
$n,
),
};

View file

@ -26,7 +26,12 @@ class Trakt
return Http::withHeaders($this->headers + $headers)->baseUrl('https://api.trakt.tv');
}
public function syncHistory(WatchData $data, OutputInterface $output = null): Response
public function requestNoAuth(array $headers = []): PendingRequest
{
return Http::withHeaders(['trakt-api-version' => 2] + $headers)->baseUrl('https://api.trakt.tv');
}
public function syncHistory(WatchData $data, ?OutputInterface $output = null): Response
{
$output?->writeln(sprintf('Submitting %s to trakt with headers %s', json_encode($data->structuredData), json_encode($this->headers)));

2931
composer.lock generated

File diff suppressed because it is too large Load diff