mediathekview / plugin.video.mediathekview

Kodi plugin that gives access to most video-platforms from German public service broadcasters using the database of MediathekView.de
https://mediathekview.de/download/#mediathekview-f%C3%BCr-kodi-fr%C3%BCher-xbmc
MIT License
55 stars 24 forks source link

JSON-Parsing Fehler bei Verwendung von MySQL #234

Closed clocken closed 3 months ago

clocken commented 3 months ago

Hi @codingPF ,

Python myconnpy liest in der aktuellen Version die Ausstrahlungszeitpunkte und Laufzeiten als Python-Datentyp decimal.Decimal aus. Das führt zu mehreren Folgefehlern bei der weiteren Verarbeitung dieser Werte im Kodi-Plugin. Die Python Standard Bibliothek json unterstützt decimal.Decimal nicht ohne Weiteres:

EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--                                                                                                        
    - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!                                                                                                        
     Error Type: <class 'TypeError'>                                                                                                                         
     Error Contents: Object of type Decimal is not JSON serializable                                                                                         
     Traceback (most recent call last):                                                                                                                      
       File "/home/dietpi/.kodi/addons/plugin.video.mediathekview/addon.py", line 26, in <module>                                                            
         PLUGIN.run()                                                                                                                                        
       File "/home/dietpi/.kodi/addons/plugin.video.mediathekview/resources/lib/plugin.py", line 214, in run                                                 
         ui.generate(self.database.getFilms(channel, show))                                                                                                  
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                                   
       File "/home/dietpi/.kodi/addons/plugin.video.mediathekview/resources/lib/storeQuery.py", line 278, in getFilms                                        
         self._cache.save_cache('films', cacheKey, rs)                                                                                                       
       File "/home/dietpi/.kodi/addons/plugin.video.mediathekview/resources/lib/storeCache.py", line 98, in save_cache                                       
         json.dump(cache, json_file)                                                                                                                         
       File "/usr/lib/python3.11/json/__init__.py", line 179, in dump                                                                                        
         for chunk in iterable:                                                                                                                              
       File "/usr/lib/python3.11/json/encoder.py", line 432, in _iterencode                                                                                  
         yield from _iterencode_dict(o, _current_indent_level)                                                                                               
       File "/usr/lib/python3.11/json/encoder.py", line 406, in _iterencode_dict                                                                             
         yield from chunks                                                                                                                                   
       File "/usr/lib/python3.11/json/encoder.py", line 326, in _iterencode_list                                                                             
         yield from chunks                                                                                                                                   
       File "/usr/lib/python3.11/json/encoder.py", line 326, in _iterencode_list                                                                             
         yield from chunks                                                                                                                                   
       File "/usr/lib/python3.11/json/encoder.py", line 439, in _iterencode                                                                                  
         o = _default(o)                                                                                                                                     
             ^^^^^^^^^^^                                                                                                                                     
       File "/usr/lib/python3.11/json/encoder.py", line 180, in default                                                                                      
         raise TypeError(f'Object of type {o.__class__.__name__} '                                                                                           
     TypeError: Object of type Decimal is not JSON serializable                                                                                              
     -->End of Python script error report<--                        

Mit diesem Commit wird Python simplejson statt json verwendet - simplejson unterstützt decimal.Decimal out of the box. Bei der Erstellung der UI-Listenelemente werden dann die decimal.Decimal Werte in float konvertiert, damit die weitere automatische Konvertierung zu String-Werten funktioniert. Folgender Aufruf schlägt sonst fehl: https://github.com/mediathekview/plugin.video.mediathekview/blob/3e4fa90a87c2652f3b0745e55fb0e14f6863da24/resources/lib/ui/filmlistUi.py#L155

Ich habe den Fix mit einem neuen Docker Build und Kodi 20 (Nexus) getestet. Außerdem habe ich die Verwendung einer lokalen SQLite-Datenbank mit den Änderungen getestet.

Wenn etwas nicht passt, sag gern Bescheid, damit ich es korrigieren kann.

Cheers :beers:

codingPF commented 3 months ago

Das muss mit dem letzen commit passiert sein als ich die aired time erweitert habe um „kaputte“ aired time im Jahr 2200 einzulesen. Die hätte ich besser mal beim Import gelöscht…lass mich mal drüber nachdenken ob ich den commit änder oder diesen PR für die Lösung…

clocken commented 3 months ago

Ja, zur Dokumentation: Es liegt wohl an 7dbcbc0ca0eddd3bdb927111c6cb32cf03ec26f1 Kein Problem - dein Code, deine Entscheidung. Ich bin offen für jede Lösung :+1:

codingPF commented 3 months ago

Danke für die Meldung und Analyse. Ich habe es jetzt über den Datentyp gelöst weil ich keine neue Dependency rein bringen wollte.