diff --git a/YouTubeMusic/HTML/EN/plugins/YouTubeMusic/settings/basic.html b/YouTubeMusic/HTML/EN/plugins/YouTubeMusic/settings/basic.html index 83f2d05..3da6e9d 100644 --- a/YouTubeMusic/HTML/EN/plugins/YouTubeMusic/settings/basic.html +++ b/YouTubeMusic/HTML/EN/plugins/YouTubeMusic/settings/basic.html @@ -11,6 +11,10 @@ [% IF user_code %] [% "PLUGIN_YOUTUBEMUSIC_VERIFICATIONURL" | string %]
[% user_code %]
+ + [% IF access_token %] +
Success
+ [% END %] [% END %] [% END %] diff --git a/YouTubeMusic/OAuth2.pm b/YouTubeMusic/OAuth2.pm index 9cf1eb0..74cbdfa 100644 --- a/YouTubeMusic/OAuth2.pm +++ b/YouTubeMusic/OAuth2.pm @@ -8,12 +8,14 @@ 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=861556708454-d6dlm3lh05idd8npek18k6be8ba3oc68.apps.googleusercontent.com" . - "&scope=https://www.googleapis.com/auth/youtube"; + my $post = "client_id=" . CLIENT_ID . "&scope=https://www.googleapis.com/auth/youtube"; my $http = Slim::Networking::SimpleAsyncHTTP->new( sub { @@ -46,4 +48,53 @@ sub getDeviceCode { ); } +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=" . $prefs->get('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); + $prefs->set('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; diff --git a/YouTubeMusic/Settings.pm b/YouTubeMusic/Settings.pm index 95f59f5..666acd2 100644 --- a/YouTubeMusic/Settings.pm +++ b/YouTubeMusic/Settings.pm @@ -29,9 +29,11 @@ sub handler { } Plugins::YouTubeMusic::OAuth2::getDeviceCode if $params->{get_device_code}; + Plugins::YouTubeMusic::OAuth2::getToken if $params->{get_token}; $params->{user_code} = $cache->get('yt:user_code'); $params->{verification_url} = $cache->get('yt:verification_url'); + $params->{access_token} = $cache->get('yt:access_token'); return $class->SUPER::handler($client, $params); }