fhempy: googlecast

Begonnen von dominik, 04 Dezember 2020, 23:33:53

Vorheriges Thema - Nächstes Thema

hkspks

Zitat von: JF Mennedy am 16 August 2021, 11:52:19
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 :(

dominik

Hi,
/opt/fhem/.local/......
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

Superposchi

Funktioniert Spotify an Googlecast-Devices nun oder nicht?
Ich verliere den Überblick

Und wenn nicht, gibt es bereits einen Fix?

JF Mennedy

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

hkspks

#274
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

Superposchi

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.

Heiner

#276
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-dev
sowie ein
sudo cpan Protocol::WebSocket
ausgefuehrt.

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?
Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2

thburkhart

welches Update hast du gemacht?
1 RASPI4B, 1 RASPI3B, 2 CUL, 2 Jeelink, 60 Tuya-Devices (Schalter, Dimmer, Sensoren, Cameras), 30 HUE-Lampen, 5 MAX! WTs, 16 MAX! HTs, 12 MAX! FKs, 1 Bresser 5in1, 1 OilFox, 8 ALEXA Echos und Dots, FHEM, 5 Tasmota-Devices, SonOff -Bridge, PowerFox, Buderus KM200

Superposchi

#278
Hat noch jemand probleme Spotify über ein Googlecast-Device abzuspielen?

Auf dem Webplayer hat sich wohl was geändert, jedenfalls wird mir als Streaming-Ziel neuerdings nur noch der Rechner und GoogleCast angezeigt und erst wenn ich GoogleCast auswähle kann ich meine Nest-Geräte auswählen. Früher konnte ich die Nest-Geräte direkt auswählen. Weiß nicht ob das was damit zu tun hat.

Ergänzung:
Die beiden Devices zeigen an ob aus dem Webplayer auf einem der Nest-Geräte gestreamt wird oder nicht.
Lassen sich im streamingfall auch komplett bedienen (Pause, Start, Stop etc.)
Lediglich das Streamen zu starten funktioniert nicht mehr.

SouzA

Zitat von: Superposchi am 07 Oktober 2021, 12:45:15
Hat noch jemand probleme Spotify über ein Googlecast-Device abzuspielen?

Auf dem Webplayer hat sich wohl was geändert, jedenfalls wird mir als Streaming-Ziel neuerdings nur noch der Rechner und GoogleCast angezeigt und erst wenn ich GoogleCast auswähle kann ich meine Nest-Geräte auswählen. Früher konnte ich die Nest-Geräte direkt auswählen. Weiß nicht ob das was damit zu tun hat.


Kann ich bestätigen.
Ist bei mir auch so.

Bis denn
SouzA
Raspi 4, EnOcean TCM310 USB, HM-MOD-UART-USB, Jeelink, hue, AMAD, fully, FRITZBOX, Signalbot, VIERA, Presence BT/Mac, TPLink, Gassistant, Shelly, fhempy, ZigBee

dominik

fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

JF Mennedy

heute morgen gab es bei den kids keine musik aber heute abend geht es wieder...

Superposchi

Nein, bis vorgestern ging es mit der Änderung an der Datei und der .pm.
Doch seit vorgestern geht kein Start mehr.

Wie gesagt, wenn eine Verbindung hergestellt ist funktioniert die Bedienung einwandfrei.
Lediglich das Ansprechen des Googlecast-Gerätes scheint nicht zu funktionieren, was dazu passt, dass Spotify in der Auswahl der Streaming-Ziele wohl was verändert hat.

JF Mennedy

#283
Komisch, bei mir läuft noch alles wie gewünscht...
Die Url wird aus einem Favorit aufgerufen
set Google_Home_Mini_Julia playFavorite 2
attr Google_Home_Mini_Julia favorite_2 https://open.spotify.com/playlist/7r7uO6oaiT0KAmJWksGkED



Superposchi

Nein, bei mir geht weder Play noch PlayFavorit. Der Set-Befehl verpufft einfach und es passiert nichts.

Wie gesagt, wenn etwas gestreamt wird, funktioniert die Bedienung perfekt, ur der Start eines Streams geht nicht.
Wie ist denn bei dir die Auswahl des Streaming-Ziels? Kannst du das Google-Gerät direkt auswählen oder musst du auch erst Googlecast auswählen und dann das Gerät.