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.
- ✅ 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.
-
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/.
- 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.
- 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).
- 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+).
- 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.
- 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+.
- Abre el proyecto y Sync.
- Build > Make Project o Run.
git clone <URL_DEL_REPOSITORIO>
cd NowPlayingExporterPy
./gradlew :app:assembleDebug
# APK en: app/build/outputs/apk/debug/app-debug.apk¡Bienvenidas! Abre un issue o un pull request con tu propuesta.
GPL-3.0. Consulta el archivo LICENSE para más detalles.
