Skip to content

Releases: D4vRAM369/NowPlayingExporterPy

NowPlayingExporterPy v1.2 [First stable and published version of public repo]

15 Sep 03:34
02e0fe7

Choose a tag to compare

NowPlayingExporterPy v1.2 [Estable + Feature nueva: descarga a partir del CSV]

NowPlayingExporterPy (1)

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-dlp al 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 nombre now_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)

  1. Root (libsu) copia history_db de ASI a la sandbox de la app.
  2. Chaquopy (Python) ejecuta np_export.py para leer SQLite y generar el CSV temporal.
  3. (Opcional) np_dedupe.py aplica deduplicación por ventana temporal.
  4. La app guarda el CSV final en Descargas y ofrece compartir por intent estándar.
  5. Con el CSV listo, yt-dlp busca 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)

  1. FFmpeg & yt-dlp: Chaquopy no aporta FFmpeg vía pip. yt-dlp puede bajar audio nativo (.webm) sin FFmpeg, así que se eliminó la falsa dependencia y se configuró “best audio”.
  2. Progreso en tiempo real: se añadió una interfaz PythonCallback desde Kotlin para recibir logs/estado del script Python y mostrarlos en la UI.
  3. DNS / red intermitente: además de declarar android.permission.INTERNET, se implementaron reintentos con pausas y “pausa larga” tras N descargas.
  4. Scoped Storage (API 29+): escribir en Music público da Operation not permitted. Solución: usar almacenamiento privado de la app en /Android/data/.../files/ (no requiere permisos en Android 10+).

🚀 Uso

  1. Instala el APK.
  2. Concede root cuando te lo pida.
  3. Pulsa Exportar para generar el CSV del historial.
  4. (Opcional, recomendado) Activa Deduplicar.
  5. 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.apk

Contribuciones

¡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

26 Aug 02:06

Choose a tag to compare

-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

20 Aug 04:40
3069c7d

Choose a tag to compare

📦 NowPlayingExporterPy v1.0.0

NowPlayingExporterPy (1)

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

image

Exportación completada

image

⚙️ 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.

⚠️ Notas

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.