package Plugins::YouTubeMusic::OAuth2; use strict; use Slim::Utils::Log; use Slim::Utils::Cache; use Slim::Utils::Strings qw(string cstring); use JSON::XS::VersionOneAndTwo; use Data::Dumper; use constant CLIENT_ID => "861556708454-d6dlm3lh05idd8npek18k6be8ba3oc68.apps.googleusercontent.com"; use constant CLIENT_SECRET => "SboVhoG9s0rNafixCSGGKXAT"; my $log = logger('plugin.youtubemusic'); my $cache = Slim::Utils::Cache->new(); sub getDeviceCode { my $post = "client_id=" . CLIENT_ID . "&scope=https://www.googleapis.com/auth/youtube"; my $http = Slim::Networking::SimpleAsyncHTTP->new( sub { my $response = shift; my $result = eval { from_json($response->content) }; if ($@) { $log->error(Data::Dump::dump($response)) unless main::DEBUGLOG && $log->is_debug; $log->error($@); } else { $cache->set("yt:device_code", $result->{device_code}, $result->{expires_in}); $cache->set("yt:verification_url", $result->{verification_url}, $result->{expires_in}); $cache->set("yt:user_code", $result->{user_code}, $result->{expires_in}); $log->debug("content:", $response->content); } }, sub { $log->error($_[1]); }, { timeout => 15, } ); $http->post( "https://www.youtube.com/o/oauth2/device/code", 'Content-Type' => 'application/x-www-form-urlencoded', $post, ); } sub getToken { my $cb = shift; my @params = @_; my $post = "client_id=" . CLIENT_ID . "&client_secret=" . CLIENT_SECRET; my $code = $cache->get('yt:device_code'); if (defined $code) { $post .= "&code=$code&grant_type=http://oauth.net/grant_type/device/1.0"; } else { $post .= "&refresh_token=" . $cache->get('yt:refresh_token') . "&grant_type=refresh_token"; } my $http = Slim::Networking::SimpleAsyncHTTP->new( sub { my $response = shift; my $result = eval { from_json($response->content) }; if ($@) { $log->error(Data::Dump::dump($response)) unless main::DEBUGLOG && $log->is_debug; $log->error($@); } else { $cache->set("yt:access_token", $result->{access_token}, $result->{expires_in} - 60); $cache->set('yt:refresh_token', $result->{refresh_token}) if $result->{refresh_token}; $cache->remove('yt:user_code'); $cache->remove('yt:verification_url'); $cache->remove('yt:device_code'); $log->debug("content:", $response->content); $cb->(@params) if $cb; } }, sub { $log->error($_[1]); $cb->(@params) if $cb; }, { timeout => 15, } ); $http->post( "https://oauth2.googleapis.com/token", 'Content-Type' => 'application/x-www-form-urlencoded', $post, ); } 1;