Releases: D4vRAM369/NowPlayingExporterPy
NowPlayingExporterPy v1.2 [First stable and published version of public repo]
NowPlayingExporterPy v1.2 [Estable + Feature nueva: descarga a partir del CSV]
Exporta el historial de Now Playing / Está sonando (Android System Intelligence, ASI) de dispositivos Google Pixel a CSV, e incorpora una función para descargar las canciones listadas en ese historial (vía yt-dlp) al almacenamiento de la app. Pensada y construida como proyecto de Aprendizaje Basado en Proyectos (PBL).
⚠️ Requiere root. La base de datos de ASI es privada del sistema. Concede permisos de superusuario (Magisk / KernelSU / aPatch) antes de usarla. Para explorar los ficheros resultantes puede hacer falta un gestor con root.
⚡️ Características
- ✅ Exportación a CSV del historial “Está Sonando”.
- ✅ Deduplicación inteligente (ventanas de tiempo) para limpiar duplicados y “falsos repetidos”.
- ✅ Descarga de canciones desde el CSV con
yt-dlpal directorio privado de la app (no necesita permisos de almacenamiento). - ✅ UI minimalista con feedback de progreso en tiempo real.
📁 Rutas y formatos
-
DB de ASI (ejemplos habituales):
/data/data/com.google.android.as/databases/history_db /data/user_de/0/com.google.android.as/databases/history_db /data/data/com.google.android.as.oss/databases/history_db -
Salida CSV: en
Descargas(MediaStore) con nombrenow_playing_export_YYYYMMDD_HHMMSS[_dedup].csv. -
Descargas de audio (con
yt-dlp):/Android/data/com.d4vram.nowplayingexporterpy/files/Music/NPEpy_download_songs/Formato típico:
.webm(sin post-procesado FFmpeg). Para escucharlas en tu reproductor, mueve/copialas a/sdcard/Music/.
🚀🔍 Cómo funciona (resumen técnico)
- Root (libsu) copia
history_dbde ASI a la sandbox de la app. - Chaquopy (Python) ejecuta
np_export.pypara leer SQLite y generar el CSV temporal. - (Opcional)
np_dedupe.pyaplica deduplicación por ventana temporal. - La app guarda el CSV final en Descargas y ofrece compartir por intent estándar.
- Con el CSV listo,
yt-dlpbusca y descarga los audios a la carpeta privada de la app.
📋 Requisitos
- Root (Magisk / KernelSU Next / aPatch).
- ASI instalado (Android System Intelligence).
- Probado en Android 16 (Pixel con KernelSU Next). Se espera compatibilidad Android 12–15 en Pixel (no garantizada).
✍️ Lecciones aprendidas (problemas → soluciones)
- FFmpeg &
yt-dlp: Chaquopy no aporta FFmpeg vía pip.yt-dlppuede bajar audio nativo (.webm) sin FFmpeg, así que se eliminó la falsa dependencia y se configuró “best audio”. - Progreso en tiempo real: se añadió una interfaz
PythonCallbackdesde Kotlin para recibir logs/estado del script Python y mostrarlos en la UI. - DNS / red intermitente: además de declarar
android.permission.INTERNET, se implementaron reintentos con pausas y “pausa larga” tras N descargas. - Scoped Storage (API 29+): escribir en
Musicpúblico daOperation not permitted. Solución: usar almacenamiento privado de la app en/Android/data/.../files/(no requiere permisos en Android 10+).
🚀 Uso
- Instala el APK.
- Concede root cuando te lo pida.
- Pulsa Exportar para generar el CSV del historial.
- (Opcional, recomendado) Activa Deduplicar.
- Pulsa Descargar canciones para poblar
NPEpy_download_songs/.
Tip importante para buena legibilidad: abrir el CSV en hojas de cálculo sin romper columnas
> Para que no te “trocee” los títulos por espacios, toca exactamente esto:
En Opciones de separador
✅ Coma
⛔ Espacio → DESMARCA
⛔ Punto y coma → DESMARCA
⛔ Tabulador → DESMARCA (déjalo solo si tu archivo lleva tabs)
En Delimitador de cadena → elige " (comillas dobles).
Conjunto de caracteres → Unicode (UTF-8) (como ya tienes).
(Recomendado) En la vista previa, haz clic en el encabezado de la columna timestamp_iso (y cualquier otra de tiempo) y en Tipo de columna pon Texto para que no te lo reinterprete como fecha rara.
Luego pulsa Aceptar.
Con eso la vista previa debe pasar de palabras sueltas en mil columnas a columnas limpias: artist | title | timestamp_iso | ...
👉 Si aun así ves todo roto, abre el archivo en un editor y mira el separador real:
Si ves ; entre campos, importa marcando Punto y coma (y desmarcando lo demás).
Si ves ,, usa Coma como arriba.
⚙️ Arquitectura y tecnologías
- Kotlin (Android): UI + lógica principal.
- Chaquopy (Python): ejecución de scripts (
np_export.py,np_dedupe.py,np_download.py). yt-dlp: búsqueda/descarga de audio.libsu: operaciones root.- SQLite: base de datos de ASI.
- Scoped Storage: políticas de acceso en Android 10+.
🛠️ Compilación
Android Studio
- Abre el proyecto y Sync.
- Build > Make Project o Run.
⌨️ CLI
git clone <URL_DEL_REPOSITORIO>
cd NowPlayingExporterPy
./gradlew :app:assembleDebug
# APK en: app/build/outputs/apk/debug/app-debug.apkContribuciones
¡Bienvenidas! Abre un issue o un pull request con tu propuesta.
Licencia
GPL-3.0. Consulta el archivo LICENSE para más detalles.
💫 Novedades-Updates
-Nueva función añadida: ahora puedes descargar la música con un archivo CSV generado. También se ha implementado que las canciones que ya has descargado no se vuelvan a descargar cuando quieras realizar otra descarga desde un archivo .CSV reciente. Se han añadido algunos intervalos de espera para evitar el «Error 403: prohibido» debido al gran número de solicitudes API a YouTube, ya que este último identifica la aplicación como un bot falso o como 'data scrapping'.
En el futuro intentaré mejorar esto para aumentar el número de canciones descargadas, antes de que los errores sean tantos como para no poder continuar y quede atascado en errores interminables.
///////
-New feature added: now you can download the music with generated CSV file. It has been implemented also that the songs do you already downloaded, aren't downloaded again when you want make another download from a recent .CSV file. Some sleeps intervals to avoid "Error 403: forbidden" due so many API request to YouTube, and this last one identifies the app as a fake bot or like data scrapping.
In the future, I will try to improve this to increase the number of songs downloaded, before the errors become so numerous that I cannot continue and get stuck in endless errors.
NowPlayingExporterPy v1.1
-Corregido label y strings limpios.
-Subida a minSdk a 29 (Android 10) para MediaStore.Downloads
-Exportación en coroutines (la UI ya no se bloquea)
-Layouts pulido
NowPlayingExporterPy
📦 NowPlayingExporterPy v1.0.0
Primera versión funcional y estable de NowPlayingExporterPy.
Exportación de la base de datos de Now Playing con opción de deduplicación (10 min).
Exportación en formato CSV, guardado automáticamente en Descargas.
Opción de compartir el archivo exportado.
Icono propio incluido.
🖼️ Capturas de pantalla
Pantalla principal
Exportación completada
⚙️ Requisitos
Android 12+ (Probado y confirmado su funcionamiento en Pixel 8, Android 16).
Root (Magisk, KernelSU, KernelSU Next, aPatch...).
Android System Intelligence (u otro proveedor del historial Now Playing).
📥 Instalación
Descarga el archivo .apk de la sección Assets más abajo.
Instálalo en tu dispositivo Android con root.
Otorga a la aplicación permisos de superusuario desde Magisk o KSU antes de abrirla.
¡Listo! Pulsa Exportar para generar tu CSV.
Proyecto open source, pensado como utilidad de exportación simple para los usuarios de un dispositivo Pixel.
El archivo CSV generado incluye todas las canciones reconocidas por Now Playing. Recomiendo clickar en Dedupe para eliminar resultados redundantes, aunque pueden ver la diferencia sin éste generando dos archivos.
Se recomienda no subir la base de datos original a internet ya que contiene tu historial completo.

