Autor Thema: fhempy: googlecast  (Gelesen 17197 mal)

Offline hkspks

  • New Member
  • *
  • Beiträge: 36
Antw:fhempy: googlecast
« Antwort #270 am: 07 September 2021, 22:53:31 »
Es gibt schon ein fix bei pychromecast, habe es bei mir eingebaut und dann geht es wieder.
unter \.local\lib\python3.x\site-packages\pychromecast\controllers\spotify.py ersetzen durch:

Hi, ich stochere gerade im Nebelmeer - wo finde ich denn das file auf Buster? /usr/local/lib/python3.7/* war nicht erfolgreich :(

Offline dominik

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2693
Antw:fhempy: googlecast
« Antwort #271 am: 07 September 2021, 23:08:11 »
Hi,
/opt/fhem/.local/......
fhempy -  https://github.com/dominikkarall/fhempy: GoogleCast, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Offline Superposchi

  • Sr. Member
  • ****
  • Beiträge: 635
Antw:fhempy: googlecast
« Antwort #272 am: 08 September 2021, 09:03:29 »
Funktioniert Spotify an Googlecast-Devices nun oder nicht?
Ich verliere den Überblick

Und wenn nicht, gibt es bereits einen Fix?

Offline JF Mennedy

  • Full Member
  • ***
  • Beiträge: 178
Antw:fhempy: googlecast
« Antwort #273 am: 08 September 2021, 09:17:49 »
Hi, es gibt keinen offiziellen fix und wird es vermutlich auch nicht geben.

Wenn Du unter /opt/fhem/.local/lib/python3.x/site-packages/pychromecast/controllers/spotify.py
durch folgenden Code ersetzt, sollte Spotify wieder funktionieren. Bei mir geht es auf jeden Fall...

"""
Controller to interface with Spotify.
"""
import logging
import threading
import requests
import json

from . import BaseController
from ..config import APP_SPOTIFY
from ..error import LaunchError

APP_NAMESPACE = "urn:x-cast:com.spotify.chromecast.secure.v1"
TYPE_GET_INFO = "getInfo"
TYPE_GET_INFO_RESPONSE = "getInfoResponse"
#TYPE_SET_CREDENTIALS = "setCredentials"
#TYPE_SET_CREDENTIALS_ERROR = "setCredentialsError"
#TYPE_SET_CREDENTIALS_RESPONSE = "setCredentialsResponse"
TYPE_ADD_USER = "addUser"
TYPE_ADD_USER_RESPONSE = "addUserResponse"
TYPE_ADD_USER_ERROR = "addUserError"

# pylint: disable=too-many-instance-attributes
class SpotifyController(BaseController):
    """Controller to interact with Spotify namespace."""

    def __init__(self, access_token=None, expires=None):
        super().__init__(APP_NAMESPACE, APP_SPOTIFY)

        self.logger = logging.getLogger(__name__)
        self.session_started = False
        self.access_token = access_token
        self.expires = expires
        self.is_launched = False
        self.device = None
        self.credential_error = False
        self.waiting = threading.Event()

    def receive_message(self, _message, data: dict):
        """
        Handle the auth flow and active player selection.

        Called when a message is received.
        """
        if data["type"] == TYPE_GET_INFO_RESPONSE:
            self.device = data["payload"]["deviceID"]
            self.client = data["payload"]["clientID"]
            headers = {
                'authority': 'spclient.wg.spotify.com',
                'authorization': 'Bearer {}'.format(self.access_token),
                'content-type': 'text/plain;charset=UTF-8'
            }

            request_body = json.dumps({'clientId': self.client, 'deviceId': self.device})

            response = requests.post('https://spclient.wg.spotify.com/device-auth/v1/refresh', headers=headers, data=request_body)
            json_resp = response.json()
            self.send_message({
                "type": TYPE_ADD_USER,
                "payload": {
                    "blob": json_resp["accessToken"],
                    "tokenType": "accesstoken"
                }
            })
        if data["type"] == TYPE_ADD_USER_RESPONSE:
            self.is_launched = True
            self.waiting.set()

        if data["type"] == TYPE_ADD_USER_ERROR:
            self.device = None
            self.credential_error = True
            self.waiting.set()
        return True

    def launch_app(self, timeout=10):
        """
        Launch Spotify application.

        Will raise a LaunchError exception if there is no response from the
        Spotify app within timeout seconds.
        """

        if self.access_token is None or self.expires is None:
            raise ValueError("access_token and expires cannot be empty")

        def callback():
            """Callback function"""
            self.send_message({"type": TYPE_GET_INFO, "payload": {}})
           
        self.device = None
        self.credential_error = False
        self.waiting.clear()
        self.launch(callback_function=callback)

        counter = 0
        while counter < (timeout + 1):
            if self.is_launched:
                return
            self.waiting.wait(1)
            counter += 1

        if not self.is_launched:
            raise LaunchError(
                "Timeout when waiting for status response from Spotify app"
            )

    # pylint: disable=too-many-locals
    def quick_play(self, **kwargs):
        """
        Launches the spotify controller and returns when it's ready.
        To actually play media, another application using spotify connect is required.
        """
        self.access_token = kwargs["access_token"]
        self.expires = kwargs["expires"]

        self.launch_app(timeout=20)

Gruss Jan

Offline hkspks

  • New Member
  • *
  • Beiträge: 36
Antw:fhempy: googlecast
« Antwort #274 am: 08 September 2021, 09:50:44 »
Geht bei mir nicht. Gibt als State ein Timeout vom python-binding ... Webradio klappt famos.

Zur Installationsanleitung: ggf. sollte man in die Anleitung noch aufnehmen, dass auch der auth-code gesetzt werden muss; nicht nur die beiden spotify_sp* attribute
« Letzte Änderung: 08 September 2021, 12:10:41 von hkspks »

Offline Superposchi

  • Sr. Member
  • ****
  • Beiträge: 635
Antw:fhempy: googlecast
« Antwort #275 am: 08 September 2021, 12:20:44 »
Bei mir funktioniert es auf beiden Google-Nest-Lautsprechern. Mal sehen wie lange - Danke für die Lösung.

@hkspks
Trag die beiden Readings spotify_sp und spotify_key mal neu ein, da war mal was, dass die sich nach einer bestimmten Zeit geändert automatisch haben.

Offline Heiner

  • Full Member
  • ***
  • Beiträge: 265
Antw:fhempy
« Antwort #276 am: 13 September 2021, 09:16:03 »
Hi,

ich versuche gerade fhempy ans laufen zu bringen und scheitere leider.

Ich habe auf meinem PI zunaechst Python 3.7 installiert mit
sudo apt install python3 python3-pip python3-dev libffi-dev libssl-dev libjpeg-dev zlib1g-dev autoconf build-essential libglib2.0-dev libdbus-1-dev bluez libbluetooth-devsowie ein
sudo cpan Protocol::WebSocketausgefuehrt.

Dann in fhem mein updatefile erweitert
update add https://raw.githubusercontent.com/dom...und das update durrchgefuehrt
ein
define local_pybinding BindingsIo Python
erzeugt zwar auch ein Pytonbinding_15733 der auch active ist,
aber  leider bekomme ich  nicht den "opened" status im neu definierten "local_pybinding"

fhempy_log meldet:
Unable to install package fhempy>=0.1.12: Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-9ja41_su/websockets/

Was kann ich tun?
« Letzte Änderung: Heute um 09:54:15 von Heiner »
Heiner
--------------------------------
fhem auf BananaPi
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Zigbee, FritzBox, FTUI

 

decade-submarginal