ramiro / service.subtitles.subdivx

Subdivx.com subtitles download Add-on for Kodi/XBMC v13 Gotham up to Kodi Matrix v19.
GNU General Public License v2.0
16 stars 22 forks source link

'ascii' codec can't encode character u'\xa4' in position 111: ordinal not in range(128) #12

Closed mkreder closed 7 years ago

mkreder commented 9 years ago

Usando el ultimo service.py de git, obtengo este error con mr robot s01e01

01:38:18 T:1417778064   ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                             - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                            Error Type: <type 'exceptions.UnicodeEncodeError'>
                                            Error Contents: 'ascii' codec can't encode character u'\xa4' in position 111: ordinal not in range(128)
                                            Traceback (most recent call last):
                                              File "/var/lib/kodi/.kodi/addons/service.subtitles.subdivx-0.0.8/service.py", line 570, in <module>
                                                main()
                                              File "/var/lib/kodi/.kodi/addons/service.subtitles.subdivx-0.0.8/service.py", line 552, in main
                                                subs = Download(params["id"], workdir)
                                              File "/var/lib/kodi/.kodi/addons/service.subtitles.subdivx-0.0.8/service.py", line 416, in Download
                                                saved_fname = _save_subtitles(workdir, content)
                                              File "/var/lib/kodi/.kodi/addons/service.subtitles.subdivx-0.0.8/service.py", line 374, in _save_subtitles
                                                rval, fname = _handle_compressed_subs(workdir, tmp_fname)
                                              File "/var/lib/kodi/.kodi/addons/service.subtitles.subdivx-0.0.8/service.py", line 328, in _handle_compressed_subs
                                                if _wait_for_extract(workdir, filecount, base_mtime, MAX_UNZIP_WAIT):
                                              File "/var/lib/kodi/.kodi/addons/service.subtitles.subdivx-0.0.8/service.py", line 301, in _wait_for_extract
                                                mtime = os.stat(pjoin(workdir, fname)).st_mtime
                                            UnicodeEncodeError: 'ascii' codec can't encode character u'\xa4' in position 111: ordinal not in range(128)
                                            -->End of Python script error report<--
01:38:18 T:1582298000   ERROR: GetDirectory - Error getting plugin://service.subtitles.subdivx/?action=download&filename=%2fmnt%2fSeries%2fMr%20Robot%2fmr.robot.101.hdtv-lol.mp4&id=X6XNDMwODM5X-mr-robot-s01e01
ramiro commented 9 years ago

No puedo reproducirlo descargando exactamente el mismo subtítulo que entiendo es este: http://www.subdivx.com/X6XNDMwODM5X-mr-robot-s01e01.html.

Seria genial si podes postear en algun sitio o anexar a este issue el archivo de log completo de Kodi: kodi.log segun se describe en http://forum.kodi.tv/showthread.php?tid=143488 y http://kodi.wiki/index.php?title=Log_file

¡Gracias!

mkreder commented 9 years ago

Trate de reproducir el problema, pero me encontre con otro:

02:02:08 T:1420145552  NOTICE: -->Python Interpreter Initialized<--
02:02:10 T:1420145552   FATAL: SUBDIVX - Download: Expected content not found in selected subtitle intermediate detail page
02:02:12 T:1410487184  NOTICE: Thread LanguageInvoker start, auto delete: false
02:02:12 T:1410487184  NOTICE: -->Python Interpreter Initialized<--
02:02:15 T:1410487184   FATAL: SUBDIVX - Download: Expected content not found in selected subtitle intermediate detail page
02:02:20 T:1410487184  NOTICE: Thread LanguageInvoker start, auto delete: false
02:02:20 T:1410487184  NOTICE: -->Python Interpreter Initialized<--
02:02:22 T:1410487184   FATAL: SUBDIVX - Download: Expected content not found in selected subtitle intermediate detail page
02:02:28 T:1410487184  NOTICE: Thread LanguageInvoker start, auto delete: false
02:02:28 T:1410487184  NOTICE: -->Python Interpreter Initialized<--
02:02:30 T:1410487184   FATAL: SUBDIVX - Download: Expected content not found in selected subtitle intermediate detail page
02:02:36 T:1410487184  NOTICE: Thread BackgroundLoader start, auto delete: false

Esto es KODI para ARM, esta corriendo en una hummingboard (similar a raspberry pi)

kodi.log:

kodi.log.txt

ramiro commented 9 years ago

@mkreder Muchas gracias por tomarte el tiempo de intentar reproducir y continuar investigando.

1) Me llama la atención que en el kodi.log no aparezca una linea del tipo

19:59:27 T:139652711892736    INFO: SUBDIVX - Version: 0.x.y -- Action: search

mediante la cual podríamos identificar qué versión del addon estás usando. Esa línea debería aparecer siempre sin importar si está activa la opción de debugging (ver ítem 2 abajo). ¿Vos has recortado manualmente el kodi.log de alguna forma?

2) No se si en tu caso que estás usando una plataforma en la cual el storage y la tecnologií (flash?) lo permiten pero la versión de kodi.logque es realmente útil es la que se genera cuando la opción de Kodi:

Settings → System → Debugging → Enable debug logging

(Ajustes → Sistema → Depuración → 'Habilitar trazas de depuración' si es que usás Kodi en español)

está activa.

El problema es que en este caso el archivo que genera Kodi es mucho mas grande.

3) Si estás usando la versión 0.0.8 o la 0.1.0 del addon entonces el segundo problema que has encontrado no te va a permitir descargar ningun subtítulo y es el issue #13 que ya solucionamos en la versión 0.2.0. Lo que pasó es que en subdivx.com modificaron el proceso de descarga. Lamentablemente lo hicieron casi en simultaneo con la publicación de la versión 0.1.0

Nosotros ya hemos enviado la versión 0.2.0 a los encargados del repositorio oficial de addons Kodi, pero sucede que esa gente parece estar sobre-cargada de trabajo porque en adición a sus funciones de desarrollador Kodi tiene que revisar y publicar los envíos de todas las versiones de todos los addons. Asi que los tiempos se estiran.

(Para esto estamos analizando usar la posibilidad que brinda Kodi de crear nuestro propio repositorio para el addon de manera que los usuarios que agreguen ese repo a Kodi podran recibir las nuevas versiones de manera mas ágil).

Si queres solucionar el problema ahora podes descargar el .zip del release 0.2.0 de aca de GitHub, descomprimirlo y sobre-escribir con su contenido los archivos homónimos en el directorio .kodi/addons/service.subtitles.subdivx/

mkreder commented 8 years ago

Por el momento parece estar andando bien con el update a 0.2.0. Mantengamos el issue abierto por un par de semanas mas (uso kodi 2 o 3 veces por semana y no siempre tengo que bajar subtitulos) y si no pasa de nuevo lo cerramos. Gracias por tu ayuda.

IvanRF commented 7 years ago

Estoy teniendo el mismo error en una placa china (MXQ Pro+ S905). La causa del issue #17 es la misma. Lo vengo viendo hace meses con todos los subtítulos cuyo nombre de archivo dentro del .zip tiene una ñ. Por ejemplo ayer me pasó con este subtítulo y el nombre del archivo interno es New Girl 6x12 - The Cubicle (Español (España)).srt.

El log contiene:

11:14:29 T:18446744072329818128  NOTICE: Opening stream: 0 source: 1024
11:14:34 T:18446744072330826920  NOTICE: SUBDIVX - Version: 0.2.4 -- Action: search
11:14:38 T:18446744072308039312  NOTICE: SUBDIVX - Version: 0.2.4 -- Action: download
11:14:39 T:18446744072308039312 WARNING: SUBDIVX - Download: Intermediate detail page for selected subtitle or expected content not found. Handling it as final download page
11:14:43 T:18446744072308039312   ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                             - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                            Error Type: <type 'exceptions.UnicodeEncodeError'>
                                            Error Contents: 'ascii' codec can't encode character u'\xa4' in position 148: ordinal not in range(128)
                                            Traceback (most recent call last):
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx/service.py", line 587, in <module>
                                                main()
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx/service.py", line 569, in main
                                                subs = Download(params["id"], workdir)
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx/service.py", line 431, in Download
                                                saved_fname = _save_subtitles(workdir, content)
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx/service.py", line 389, in _save_subtitles
                                                rval, fname = _handle_compressed_subs(workdir, tmp_fname)
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx/service.py", line 345, in _handle_compressed_subs
                                                if _wait_for_extract(workdir, filecount, base_mtime, MAX_UNZIP_WAIT):
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx/service.py", line 315, in _wait_for_extract
                                                mtime = os.stat(pjoin(workdir, fname)).st_mtime
                                            UnicodeEncodeError: 'ascii' codec can't encode character u'\xa4' in position 148: ordinal not in range(128)
                                            -->End of Python script error report<--

Nota: la misma acción sobre Windows anda bien, el subtítulo baja. La raíz tiene que ver con los caracteres que maneja la versión de Android de la placa, seguramente.

Solución relacionada: http://stackoverflow.com/questions/9942594/unicodeencodeerror-ascii-codec-cant-encode-character-u-xa0-in-position-20

No tendría problema en probar código sobre la placa si me indican qué cambiar.

IvanRF commented 7 years ago

Probé la versión del anteúltimo commit y el error todavía existe:

15:34:58 T:18446744072321215368  NOTICE: Opening stream: 0 source: 1024
15:35:02 T:18446744072310156488  NOTICE: SUBDIVX - Version: 0.2.5 -- Action: search
15:35:08 T:18446744072310156488  NOTICE: SUBDIVX - Version: 0.2.5 -- Action: download
15:35:08 T:18446744072310156488 WARNING: SUBDIVX - Download: Intermediate detail page for selected subtitle or expected content not found. Handling it as final download page
15:35:13 T:18446744072310156488   ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                             - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                            Error Type: <type 'exceptions.UnicodeEncodeError'>
                                            Error Contents: 'ascii' codec can't encode character u'\xa4' in position 148: ordinal not in range(128)
                                            Traceback (most recent call last):
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx-f156a238ff4988a3a39756c7934903c85c88231c/service.py", line 587, in <module>
                                                main()
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx-f156a238ff4988a3a39756c7934903c85c88231c/service.py", line 569, in main
                                                subs = Download(params["id"], workdir)
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx-f156a238ff4988a3a39756c7934903c85c88231c/service.py", line 431, in Download
                                                saved_fname = _save_subtitles(workdir, content)
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx-f156a238ff4988a3a39756c7934903c85c88231c/service.py", line 389, in _save_subtitles
                                                rval, fname = _handle_compressed_subs(workdir, tmp_fname)
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx-f156a238ff4988a3a39756c7934903c85c88231c/service.py", line 345, in _handle_compressed_subs
                                                if _wait_for_extract(workdir, filecount, base_mtime, MAX_UNZIP_WAIT):
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx-f156a238ff4988a3a39756c7934903c85c88231c/service.py", line 315, in _wait_for_extract
                                                mtime = os.stat(pjoin(workdir, fname)).st_mtime
                                            UnicodeEncodeError: 'ascii' codec can't encode character u'\xa4' in position 148: ordinal not in range(128)
                                            -->End of Python script error report<--
IvanRF commented 7 years ago

Estuve haciendo un par de tests antes de la línea en la que falla.

En otras palabras, XBMC.Extract() lo baja con un nombre raro y después falla en el os.stat(pjoin(workdir, fname)) por esos caracteres.

IvanRF commented 7 years ago

Último comentario. Encontré que en Windows y en la placa Android la función xbmc.translatePath(fname) genera los caracteres raros, es decir New Girl 6x12 - The Cubicle (Espa¤ol (Espa¤a)).srt. Por lo tanto probé agregar esta función para que ande en ambos SO:

def get_mtime(workdir, fname):
    try:
        mtime = os.stat(pjoin(workdir, fname)).st_mtime
    except UnicodeEncodeError:
        fname = xbmc.translatePath(fname)
        mtime = os.stat(pjoin(workdir, fname)).st_mtime
    return mtime

La uso en _wait_for_extract() y en _handle_compressed_subs(). El problema es que ahora en el bloque del except me tira este error:

01:15:09 T:18446744072313888904   ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                             - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                            Error Type: <type 'exceptions.UnicodeDecodeError'>
                                            Error Contents: 'ascii' codec can't decode byte 0xc2 in position 33: ordinal not in range(128)
                                            Traceback (most recent call last):
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx-editada/service.py", line 598, in <module>
                                                main()
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx-editada/service.py", line 580, in main
                                                subs = Download(params["id"], workdir)
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx-editada/service.py", line 442, in Download
                                                saved_fname = _save_subtitles(workdir, content)
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx-editada/service.py", line 400, in _save_subtitles
                                                rval, fname = _handle_compressed_subs(workdir, tmp_fname)
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx-editada/service.py", line 355, in _handle_compressed_subs
                                                if _wait_for_extract(workdir, filecount, base_mtime, MAX_UNZIP_WAIT):
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx-editada/service.py", line 325, in _wait_for_extract
                                                mtime = get_mtime(workdir, fname)
                                              File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/service.subtitles.subdivx-editada/service.py", line 304, in get_mtime
                                                mtime = os.stat(pjoin(workdir, fname)).st_mtime
                                              File "/home/jenkins/workspace/Android-ARM/tools/depends/xbmc-depends/arm-linux-androideabi-android-17/lib/python2.6/posixpath.py", line 68, in join
                                            UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 33: ordinal not in range(128)
                                            -->End of Python script error report<--

Links relacionados:

IvanRF commented 7 years ago

@ramiro después de muchas horas de testeo pude evitar el error en la placa Android. La idea del código es que cuando falla la lectura del st_mtime por un tema de codificación en el nombre del archivo, salto la espera para que el proceso pueda continuar. Después de todo de movida ya espera 1 segundo después de extraer un archivo, y este fix sólo se ejecutaría en estos casos raros. Ya lo re contra probé y anda de diez! 😃

ramiro commented 7 years ago

Fixed by e8f0fe04cc656c8f00d125014e5dbffa6f7d083c

IvanRF commented 7 years ago

sólo para confirmar, probé esta última versión en la placa Android y anda bien 👍