olavopeixoto / plugin.video.brplay

Globoplay, Canais Globo, Oi Play, Now Online, TNT Play, Pluto TV and premium channels on Kodi
GNU General Public License v3.0
87 stars 33 forks source link

Lista de canais ao vivo vazia no brplay (RaspberryPi 3 + LibreElec 9.2.7+) #161

Closed renatolfc closed 2 years ago

renatolfc commented 2 years ago

Recentemente assinei GloboPlay + Canais Ao Vivo e comecei a usar o brplay na minha RaspberryPi com LibreElec. Configurei com minhas credenciais e somente com Globo Play habilitado (conforme screenshot abaixo):

image

O que notei é que, dessa forma, a listagem de canais vinha vazia de maneira intermitente.

Inspecionando os logs, vejo que a lista de canais realmente vem vazia:

2021-08-14 07:51:59.469 T:1186980736  NOTICE: [plugin.video.brplay] - []
2021-08-14 07:51:59.469 T:1186980736  NOTICE: [plugin.video.brplay] - No result to display
2021-08-14 07:51:59.469 T:1186980736  NOTICE: [plugin.video.brplay] - Finished Processing

Um pouco antes no log, encontrei o seguinte traceback (que, como veremos adiante, é a causa raiz do problema):

2021-08-14 07:51:59.467 T:1135596416   ERROR: Exception in thread Thread-1:
                                            Traceback (most recent call last):
                                              File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
                                              File "/storage/.kodi/addons/plugin.video.brplay/resources/lib/modules/workers.py", line 19, in run
                                                self._result = self._target(*self._args)
                                              File "/storage/.kodi/addons/plugin.video.brplay/resources/lib/modules/globoplay/scraper_live.py", line 83, in get_live_channels
                                                [live.extend(i.get_result() or []) for i in threads]
                                              File "/storage/.kodi/addons/plugin.video.brplay/resources/lib/modules/globoplay/scraper_live.py", line 630, in get_mais_canais
                                                fanart = title_obj.get('cover', {}).get('landscape', fanart) or fanart
                                            AttributeError: 'NoneType' object has no attribute 'get'

Ok. Parece, então, que alguma suposição não é válida ao tentar buscar o fanart de um canal. Pelo fluxo do código, title_obj é populado a partir do objeto EPG. O EPG imediatamente anterior à exceção no log é este:

{
    u'contentRating': u'L',
    u'description': u'Uma bab\xe1 misteriosa \xe9 contratada para colocar na linha os sete filhos de um vi\xfavo.',
    u'tags': None,
    u'title': {
        u'genres': None,
        u'countries': None,
        u'poster': None,
        u'format': None,
        u'cover': None,
        u'cast': None,
        u'directors': None,
        u'releaseYear': None,
        u'type': None
    },
    u'metadata': u'Nanny McPhee - A Bab\xe1 Encantada',
    u'titleId': u'SmknHTBngG',
    u'durationInMinutes': 114,
    u'startTime': 1628937900,
    u'liveBroadcast': False,
    u'endTime': 1628944799,
    u'name': u'Studio Movie'
}

Ahá! title_obj, portanto, é um dict com todos os valores None! É isso que causa a exceção. O problema é que o código supõe erroneamente que, se um membro do objeto/dict title existe, ele será não-nulo (não-nenhum 😄).

Vendo o fluxo do código, vemos que a mesma suposição é feita para o membro poster e que também falharia nesse caso.

Eu resolvi localmente com um patch simplório, mas efetivo:

--- resources/lib/modules/globoplay/scraper_live.py.old 2021-08-14 08:32:21.147059298 -0300
+++ resources/lib/modules/globoplay/scraper_live.py     2021-08-14 08:31:11.233883856 -0300
@@ -627,8 +627,15 @@

         title = epg.get('name', '')
         description = title_obj.get('description') or epg.get('description', '')
-        fanart = title_obj.get('cover', {}).get('landscape', fanart) or fanart
-        poster = title_obj.get('poster', {}).get('web')
+        try:
+            fanart = title_obj.get('cover', {}).get('landscape', fanart) or fanart
+        except:
+            if not fanart:
+                fanart = ''
+        try:
+            poster = title_obj.get('poster', {}).get('web')
+        except:
+            poster = ''
         thumb = THUMBS.get(str(broadcast.get('transmissionId')))
         thumb = (SNAPSHOT_URL.format(transmission=thumb) + '?=' + str(int(time.time()))) if thumb else fanart

O correto provavelmente seria, ao invés de usar um except cru como esse, capturar AttributeError ou guardar tudo por um ... is not None. No entanto, não tive tempo de fazer isso, dado que a família queria assistir TV. 😅

Acabei fazendo um upload da versão com o patch aplicado em scraper_live.py.txt

ghost commented 2 years ago

Obrigado por compartilhar, também tinha esse problema. Parece que o autor do plugin anda ocupado e não dando muito atenção aos report da galera. Obrigado novamente, aqui deu certo.

renatolfc commented 2 years ago

Fico feliz que deu certo, @danilo759.

Quanto ao autor, tenho certeza que ele está fazendo o melhor dele. Manter um add-on deste porte é um trabalho considerável.

Por sorte, temos as issues do github para trocar ideias e soluções. 😅

olavopeixoto commented 2 years ago

Obrigado, Renato. Esse problema foi resolvido no último release. Me diz se funcionou pra vocês.

Quando encontrar algum problema fique a vontade pra mandar um pull request. Nem sempre tenho tempo pra consertar os problemas prontamente, com a ajuda da comunidade fica mais fácil pra todos. Abraços.