Skip to content

Commit

Permalink
update oauth docs and request interactive input instead of aborting (#…
Browse files Browse the repository at this point in the history
…694)

* update oauth docs and request interactive input instead of aborting

* move input inside oauth path, improve filename output

* update oauth.rst
  • Loading branch information
sigma67 authored Dec 17, 2024
1 parent df1c3bd commit cdd4e38
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 10 deletions.
19 changes: 17 additions & 2 deletions docs/source/setup/oauth.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
OAuth authentication
====================

After you have installed ``ytmusicapi``, simply run
.. attention::

As of November 2024, YouTube Music requires a Client Id and Secret for the YouTube Data API to connect to the API.

Go to the `YouTube Data API docs <https://developers.google.com/youtube/registering_an_application>`_ to
obtain the credentials. This requires a Google Cloud Console account and project.

For your new credentials, select ``OAuth client ID`` and pick ``TVs and Limited Input devices``.

After you have installed ``ytmusicapi``, run

.. code-block:: bash
Expand All @@ -11,5 +20,11 @@ and follow the instructions. This will create a file ``oauth.json`` in the curre

You can pass this file to :py:class:`YTMusic` as explained in :doc:`../usage`.

You will also need to pass ``client_id`` and ``client_secret`` to :py:class:`YTMusic`:

.. code-block::
ytmusic = YTMusic('oauth.json', oauth_credentials=OAuthCredentials(client_id=client_id, client_secret=client_secret)
This OAuth flow uses the
`Google API flow for TV devices <https://developers.google.com/youtube/v3/guides/auth/devices>`_.
`Google API flow for TV devices <https://developers.google.com/youtube/v3/guides/auth/devices>`_.
15 changes: 7 additions & 8 deletions ytmusicapi/setup.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import argparse
import sys
from pathlib import Path
from typing import Optional
from typing import Optional, Union

import requests

Expand Down Expand Up @@ -72,16 +72,15 @@ def parse_args(args):
return parser.parse_args(args)


def main():
def main() -> Union[RefreshingToken, str]:
args = parse_args(sys.argv[1:])
if args.setup_type == "oauth" and (args.client_id is None or args.client_secret is None):
print(
"You have to supply both your Google Youtube API client ID and client secret to create a valid oauth token."
)
return
filename = args.file.as_posix() if args.file else f"{args.setup_type}.json"
print(f"Creating {filename} with your authentication credentials...")
print(f"Creating {Path(filename).as_uri()} with your authentication credentials...")
if args.setup_type == "oauth":
if args.client_id is None:
args.client_id = input("Enter your Google Youtube Data API client ID: ")
if args.client_secret is None:
args.client_secret = input("Enter your Google Youtube Data API client secret: ")
return setup_oauth(
client_id=args.client_id, client_secret=args.client_secret, filepath=filename, open_browser=True
)
Expand Down

0 comments on commit cdd4e38

Please sign in to comment.