From e9e279dba4e2f5167952aef50ef9eee8a167580f Mon Sep 17 00:00:00 2001 From: Marvin Schenkel Date: Wed, 6 Jul 2022 11:38:05 +0200 Subject: [PATCH] Add authentication from config --- examples/ytmusic.py | 25 +++++++++++++++++++-- music_assistant/music_providers/ytmusic.py | 26 +++++++++++++--------- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/examples/ytmusic.py b/examples/ytmusic.py index 61b34e21..60b6408a 100644 --- a/examples/ytmusic.py +++ b/examples/ytmusic.py @@ -1,4 +1,5 @@ """Example file to play music from YTM. Might omit later""" +import argparse import asyncio import logging import os @@ -13,6 +14,19 @@ from music_assistant.models.config import MassConfig, MusicProviderConfig from music_assistant.models.enums import ProviderType from music_assistant.models.player import Player, PlayerState +parser = argparse.ArgumentParser(description="MusicAssistant") +parser.add_argument( + "--youtubemusic_username", + required=False, + help="YoutubeMusic username", +) +parser.add_argument( + "--youtubemusic_cookie", + required=False, + help="YoutubeMusic cookie", +) +args = parser.parse_args() + # setup logger logging.basicConfig( level=logging.DEBUG, @@ -37,7 +51,14 @@ mass_conf = MassConfig( database_url=f"sqlite:///{db_file}", ) -mass_conf.providers.append(MusicProviderConfig(ProviderType.YTMUSIC)) +if args.youtubemusic_username and args.youtubemusic_cookie: + mass_conf.providers.append( + MusicProviderConfig( + ProviderType.YTMUSIC, + username=args.youtubemusic_username, + password=args.youtubemusic_cookie, + ) + ) class TestPlayer(Player): @@ -103,7 +124,7 @@ async def main(): async with MusicAssistant(mass_conf) as mass: # get some data # ytm = mass.music.get_provider(ProviderType.YTMUSIC) - # track = await yt.get_track("pE3ju1qS848") + # track = await ytm.get_track("pE3ju1qS848") # album = await ytm.get_album("MPREb_AYetWMZunqA") # print(album) # start sync diff --git a/music_assistant/music_providers/ytmusic.py b/music_assistant/music_providers/ytmusic.py index eeaf3f66..dbeb99c1 100644 --- a/music_assistant/music_providers/ytmusic.py +++ b/music_assistant/music_providers/ytmusic.py @@ -7,11 +7,10 @@ from urllib.parse import unquote import pytube import ytmusicapi -from requests.structures import CaseInsensitiveDict from music_assistant.helpers.audio import get_http_stream from music_assistant.models.enums import ProviderType -from music_assistant.models.errors import MediaNotFoundError +from music_assistant.models.errors import LoginFailed, MediaNotFoundError from music_assistant.models.media_items import ( Album, AlbumType, @@ -48,7 +47,11 @@ class YTMusic(MusicProvider): async def setup(self) -> bool: """Set up the YTMusic provider.""" - await self._initialize_headers() + if not self.config.enabled: + return False + if not self.config.username or not self.config.password: + raise LoginFailed("Invalid login credentials") + await self._initialize_headers(cookie=self.config.password) await self._initialize_context() self._cookies = {"CONSENT": "YES+1"} return True @@ -304,14 +307,17 @@ class YTMusic(MusicProvider): ) as response: return await response.text() - async def _initialize_headers(self) -> Dict[str, str]: + async def _initialize_headers(self, cookie: str) -> Dict[str, str]: """Return headers to include in the requests.""" - # TODO: Replace with Cookie string from Config - path = "../headers_auth.json" - headers = None - with open(path, mode="r", encoding="utf-8") as json_file: - headers = CaseInsensitiveDict(json.load(json_file)) - cookie = headers.get("cookie") + headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0", + "Accept": "*/*", + "Accept-Language": "en-US,en;q=0.5", + "Content-Type": "application/json", + "X-Goog-AuthUser": "0", + "x-origin": "https://music.youtube.com", + "Cookie": cookie, + } sapisid = ytmusicapi.helpers.sapisid_from_cookie(cookie) origin = headers.get("origin", headers.get("x-origin")) headers["Authorization"] = ytmusicapi.helpers.get_authorization( -- 2.34.1