[{"data":1,"prerenderedAt":144},["ShallowReactive",2],{"project-es-durvald":3},{"id":4,"title":5,"author":6,"body":7,"company":121,"date":122,"description":123,"extension":124,"highlight":125,"meta":126,"navigation":125,"path":127,"priority":128,"role":129,"section":130,"seo":131,"sitemap":132,"stem":133,"tags":134,"thumbnail":141,"year":142,"__hash__":143},"work\u002Fwork\u002Fes\u002Fdurvald.md","Durvald","Salguento",{"type":8,"value":9,"toc":110},"minimark",[10,15,19,30,34,37,40,44,60,63,67,74,77,81,84,88,91,94,98,101],[11,12,14],"h2",{"id":13},"contexto","Contexto",[16,17,18],"p",{},"Durvald es un reproductor de escritorio local-first para Windows, macOS y Linux, creado para devolver al usuario el control sobre su colección musical. En lugar de depender del catálogo y la conectividad de un servicio de streaming, la aplicación indexa archivos locales, organiza artistas y lanzamientos y mantiene colas, playlists e historial en el dispositivo.",[16,20,21,26],{},[22,23],"img",{"alt":24,"src":25},"Interfaz de Durvald con biblioteca de álbumes y reproductor persistente.","\u002Fimg\u002Fwork\u002Fdurvald\u002Fcover-durvald.jpeg",[27,28,29],"em",{},"Presentación de la interfaz e identidad visual de Durvald.",[11,31,33],{"id":32},"problema-técnico","Problema técnico",[16,35,36],{},"Una biblioteca local combina tareas con características diferentes: lectura intensiva de archivos y metadatos, reproducción de audio en tiempo real, persistencia transaccional y una interfaz que debe responder de inmediato. Ejecutar todo en el proceso de la interfaz bloquearía la UI y mezclaría responsabilidades nativas con la capa de presentación.",[16,38,39],{},"La solución separa responsabilidades mediante una frontera IPC. SolidJS se ocupa de la presentación y el estado reactivo; los comandos de Tauri envían las operaciones privilegiadas a Rust. El núcleo procesa archivos, controla el audio, mantiene la cola y persiste datos sin acoplar esos detalles a los componentes visuales.",[11,41,43],{"id":42},"arquitectura","Arquitectura",[16,45,46,47,51,52,55,56,59],{},"El frontend se organiza en páginas, componentes, hooks y stores. La comunicación con el backend ocurre mediante ",[48,49,50],"code",{},"invoke",", mientras eventos como ",[48,53,54],{},"progress-update"," y ",[48,57,58],{},"song-changed"," llevan los cambios del reproductor de vuelta a la interfaz.",[16,61,62],{},"En el proceso nativo, Tokio coordina tareas asíncronas; Kira reproduce MP3, OGG, FLAC y WAV por streaming; Lofty extrae tags, propiedades técnicas y portadas; y SQLite almacena biblioteca, playlists, cola, historial, ajustes y última sesión. Las operaciones bloqueantes de la base usan un pool de conexiones y tareas dedicadas.",[11,64,66],{"id":65},"reproducción-y-continuidad","Reproducción y continuidad",[16,68,69,70,73],{},"El reproductor mantiene una cola ",[48,71,72],{},"VecDeque",", historial en memoria y la pista actual. Los cambios también se reflejan en SQLite. Un loop asíncrono detecta el final de cada pista, inicia el siguiente elemento y emite el nuevo estado a la interfaz.",[16,75,76],{},"La última sesión registra pista, progreso, volumen, shuffle, modo repeat, snapshot de la cola y contexto de origen. Esto permite retomar la experiencia después de cerrar la aplicación.",[11,78,80],{"id":79},"integración-y-seguridad","Integración y seguridad",[16,82,83],{},"La integración Last.fm implementa autenticación por token, now playing, scrobbling y reintentos offline. Un rate limiter serializa las solicitudes para respetar el intervalo de la API. En macOS, los secretos se guardan en Keychain; en Windows y Linux se cifran con AES-256-GCM y se vinculan a la máquina y al usuario. Los archivos de audio permanecen locales.",[11,85,87],{"id":86},"aplicación-de-escritorio-multiplataforma","Aplicación de escritorio multiplataforma",[16,89,90],{},"Durvald funciona de forma nativa en Windows, macOS y Linux. Tauri combina la interfaz SolidJS y el núcleo Rust en una única aplicación de escritorio, con acceso controlado al sistema de archivos, reproducción de audio y almacenamiento de credenciales específico de cada plataforma.",[16,92,93],{},"El pipeline de producción valida TypeScript antes de que Vite genere los recursos de interfaz incorporados en la aplicación. Cargo verifica el núcleo Rust y Tauri produce instaladores específicos para cada plataforma.",[11,95,97],{"id":96},"límites-y-evolución","Límites y evolución",[16,99,100],{},"La aplicación ya funciona en los tres sistemas operativos compatibles. Los próximos objetivos de calidad son introducir pruebas automatizadas para stores, comandos y persistencia, además de formalizar migrations de la base. La indexación también depende de la consistencia de los metadatos presentes en los archivos del usuario.",[16,102,103],{},[104,105,109],"a",{":rel":106,":target":107,"href":108},"noreferrer","_blank","https:\u002F\u002Fgithub.com\u002Fsalguento\u002Fdurvald","GitHub",{"title":111,"searchDepth":112,"depth":112,"links":113},"",2,[114,115,116,117,118,119,120],{"id":13,"depth":112,"text":14},{"id":32,"depth":112,"text":33},{"id":42,"depth":112,"text":43},{"id":65,"depth":112,"text":66},{"id":79,"depth":112,"text":80},{"id":86,"depth":112,"text":87},{"id":96,"depth":112,"text":97},"Autoral","2026-07","Reproductor de música local-first con interfaz SolidJS y núcleo nativo en Rust","md",true,{},"\u002Fwork\u002Fes\u002Fdurvald","2","Desarrollador Full Stack","featured",{"title":5,"description":123},{"loc":127},"work\u002Fes\u002Fdurvald",[135,136,137,138,139,140],"TypeScript","SolidJS","Rust","Tauri","SQLite","Last.fm","\u002Fimg\u002Fwork\u002Fdurvald\u002Fcover-durvald-card.png",2025,"zXingnFSk8AU34RdpL5MkOogayZRPX6SPbeS23aVVDY",1785351609758]