From a8a8ba1ab2f76cef12f64607470b0709167c67e7 Mon Sep 17 00:00:00 2001 From: dominikkarall Date: Sat, 3 Mar 2018 21:21:19 +0000 Subject: [PATCH] 98_GOOGLECAST: fix crash on reconnect git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@16322 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- FHEM/98_GOOGLECAST.pm | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/FHEM/98_GOOGLECAST.pm b/FHEM/98_GOOGLECAST.pm index 3a5cb9822..70bf44473 100755 --- a/FHEM/98_GOOGLECAST.pm +++ b/FHEM/98_GOOGLECAST.pm @@ -7,10 +7,14 @@ # FHEM module to communicate with Google Cast devices # e.g. Chromecast Video, Chromecast Audio, Google Home # -# Version: 2.1.0 +# Version: 2.1.1 # ############################################################# # +# v2.1.1 - 20180303 +# - BUGFIX: fix crash on connection failures +# - BUGFIX: update FHEM socket on pychromecast reconnect +# # v2.1.0 - 20180218 # - BUGFIX: one more socket_client fix # - BUGFIX: offline state fix @@ -142,7 +146,7 @@ sub GOOGLECAST_Initialize($) { $hash->{AttrList} = "favoriteURL_1 favoriteURL_2 favoriteURL_3 favoriteURL_4 ". "favoriteURL_5 ".$readingFnAttributes; - Log3 $hash, 3, "GOOGLECAST: GoogleCast v2.1.0"; + Log3 $hash, 3, "GOOGLECAST: GoogleCast v2.1.1"; return undef; } @@ -310,6 +314,7 @@ sub GOOGLECAST_setSpeak { $ttsText = uri_escape($ttsText); my $ttsUrl = "http://translate.google.com/translate_tts?tl=$ttsLang&client=tw-ob&q=$ttsText"; + Log3 $hash, 4, "GOOGLECAST($hash->{NAME}): setSpeak $ttsUrl"; eval { $hash->{helper}{ccdevice}->{media_controller}->play_media($ttsUrl, "audio/mpeg"); @@ -364,7 +369,8 @@ sub GOOGLECAST_setPlayMedia_String { if($videoUrl ne "") { GOOGLECAST_setPlayMedia($hash, $videoUrl); } else { - GOOGLECAST_setPlayMedia($hash, $origUrl); + Log3 $hash, 3, "GOOGLECAST($name): setPlayMedia_String, youtube-dl couldn't find video"; + #GOOGLECAST_setPlayMedia($hash, $origUrl); } } @@ -407,6 +413,7 @@ sub GOOGLECAST_setPlayYtDlBlocking { $videoUrl = GOOGLECAST_getYTVideoURLPython($ytUrl); }; + return $name."|".$videoUrl."|".$ytUrl; } @@ -548,8 +555,12 @@ sub GOOGLECAST_addSocketToMainloop { my ($hash) = @_; my $sock; + #delete any previous sockets + delete($selectlist{"GOOGLECAST-".$hash->{NAME}}); + eval { $sock = $hash->{helper}{ccdevice}->{socket_client}->get_socket(); + $hash->{helper}{currentsock} = $sock; }; my $chash = GOOGLECAST_newChash($hash, $sock, {NAME => "GOOGLECAST-".$hash->{NAME}}); @@ -567,11 +578,20 @@ sub GOOGLECAST_checkConnection { if($@ || !defined($selectlist{"GOOGLECAST-".$hash->{NAME}})) { Log3 $hash, 4, "GOOGLECAST ($hash->{NAME}): checkConnection, connection failure, reconnect..."; delete($selectlist{"GOOGLECAST-".$hash->{NAME}}); - $hash->{helper}{ccdevice}->{socket_client}->_cleanup(); + $hash->{helper}{ccdevice}->{socket_client}->_cleanup() if(defined($hash->{helper}{ccdevice}->{socket_client}->get_socket())); GOOGLECAST_initDevice($hash); GOOGLECAST_updateReading($hash, "presence", "offline"); GOOGLECAST_updateReading($hash, "state", "offline"); return undef; + } else { + #update socket + my $sock = $hash->{helper}{ccdevice}->{socket_client}->get_socket(); + if(defined($sock) && $hash->{helper}{currentsock} ne $sock) { + GOOGLECAST_addSocketToMainloop($hash); + Log3 $hash, 4, "GOOGLECAST ($hash->{NAME}): checkConnection, pychromecast reconnected-update fhem socket"; + } elsif(!defined($sock)) { + Log3 $hash, 4, "GOOGLECAST ($hash->{NAME}): checkConnection, pychromecast socket=NULL"; + } } InternalTimer(gettimeofday()+10, "GOOGLECAST_checkConnection", $hash, 0); @@ -594,7 +614,7 @@ sub GOOGLECAST_Read { eval { delete($selectlist{$name}); }; - $hash->{helper}{ccdevice}->{socket_client}->_cleanup(); + $hash->{helper}{ccdevice}->{socket_client}->_cleanup() if(defined($hash->{helper}{ccdevice}->{socket_client}->get_socket())); GOOGLECAST_initDevice($hash); GOOGLECAST_updateReading($hash, "presence", "offline"); GOOGLECAST_updateReading($hash, "state", "offline"); @@ -676,11 +696,7 @@ def GOOGLECAST_createChromecastPython(ip, port, uuid, model_name, friendly_name) def GOOGLECAST_getYTVideoURLPython(yt_url): ydl = youtube_dl.YoutubeDL({'forceurl': True, 'simulate': True, 'quiet': '1', 'no_warnings': '1', 'skip_download': True, 'format': 'best', 'youtube_include_dash_manifest': False}) - with ydl: - result = ydl.extract_info( - yt_url, - download=False # We just want to extract the info - ) + result = ydl.extract_info(yt_url, download=False) if 'entries' in result: # Can be a playlist or a list of videos @@ -718,12 +734,12 @@ PYTHON_CODE_END

GOOGLECAST