El tema de las librerías binarias y Python a mí me ha traído de calle siempre, creo que todos lo controláis mucho más que yo pero aún así os cuento algunas cosas que tengo abiertas por si aporta algo.
El programita para descargar vídeos de Aragón TV está hecho en Python, pero utiliza el ejecutable de "rtmpdump" en lugar de la librería.
https://github.com/tvalacarta/descargar ... tv/main.py
Lo que hace es tomar el nombre de la plataforma, y de ahí deduce qué binario tiene que utilizar. En Linux coge el rtmpdump que tengas instalado.
Código: Seleccionar todo
# get_platform_name es: win, linux, android, macosx, ios or unknown
folder_platform = os.path.join( os.getcwd() , "rtmpdump" , self.get_platform_name() )
print "folder_platform="+folder_platform
if self.get_platform_name()=="win":
rtmpdump = os.path.join(folder_platform,"rtmpdump.exe")
elif self.get_platform_name()=="linux":
rtmpdump = "rtmpdump"
else:
rtmpdump = os.path.join(folder_platform,"rtmpdump")
Luego le asigna permisos de ejecución, creo que en realidad esto es no es cosa de Android sino que viene porque Kivy al desplegar el APK primero copia los ficheros y olvida los permisos.
Código: Seleccionar todo
# En Android hay que darle antes expresamente permisos de ejecución al binario de rtmpdump
if self.get_platform_name()=="android":
subprocess.Popen(["chmod","0755",rtmpdump], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
Y finalmente construye el array para Popen.
Código: Seleccionar todo
exe = [rtmpdump]
exe.append("-r")
exe.extend(self.media_url.replace("app=","--app ").replace("playpath=","--playpath ").split(" "))
#exe.append("--live")
exe.append("-o")
exe.append(self.target_file)
Esto falla en Android 5+, porque dice que el binario no es válido... supongo que será lo de la magia élfica de Cmos: "Thinna i ardhon: han mathon ne nen, han mathon ne chef, han noston ne gwilith".
Y sobre todo el problema que tiene esto es que al no usar la librería "librtmp.so", tiene poco control sobre el proceso.
Investigando sobre cómo lo hacen otros por ahí encontré este código, que usa la librería "ctypes" de Python.
https://gist.github.com/athoik/5484842# ... librtmp-L5
Si os fijáis carga la DLL desde un directorio cualquiera, lo que debería resolver el problema de dónde ponemos esos ficheros para cada plataforma:
Código: Seleccionar todo
if os.name == 'nt':
self.lib = cdll.LoadLibrary('lib/librtmp.dll')
elif os.name == 'posix':
self.lib = cdll.LoadLibrary('librtmp.so.0')
Ese es mi plan para la próxima versión de la herramienta de descarga.
Entiendo que la idea con mega y la librería de AES es algo parecido, poner los .so/.dll de cada plataforma en un directorio y hacer esa carga dinámica. Evitaríamos rootear en Android.
Tengo ganas de resolver el problema de las librerías, varios problemas que se me resisten tendrían una solución muy buena si aprendo a mezclar python con librerías
