Er is nu ook een speler voor GNOME #108
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "gnome-speler"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Een tweede desktopspeler, GTK4 en libadwaita over GirCore. Vijfde project in de solution, referenceert
RockHeaven.Commonalleen — dus geen DbContext en geen TagLib#, afgedwongen door de csproj in plaats van door discipline.De twee keuzes die je gemaakt hebt
.NET met GirCore, niet Python met PyGObject. De doorslag gaf de contracten: een Python-client zou een eigen handgeschreven kopie van
Contracts.csbijhouden — precies wat de Android-app doet en precies waar diens eigen CLAUDE.md voor waarschuwt. Dit referenceert Common en kan dus niet uit elkaar lopen.Luisterclient: bladeren, afspelen, hervatten, waarderen. Geen scan, fill, bewerkvenster, verwijderen of beheer — dezelfde streep die
RockHeaven.Androidtrekt.Wat er draaiend gezien is
In de geneste headless
kwin_wayland --virtualop een eigen D-Bus, tegen de live server met jouw token en jouw bibliotheek:RockHeaven Vol. 001…), Albums (artiesten met de plaatkolom ertussen).Drie fouten die alleen dáár zichtbaar werden, en geen ervan zou een build of een type-check hebben gevangen:
queue, en die wordt alleen gevuld door een dubbelklik.AdoptQueueis er nu, en de hervatting wacht op de lijst die ze zoekt.value-changedgehangen kun je de luisteraar niet onderscheiden van mpv's eigen vier meldingen per seconde;change-valuewordt alleen voor de luisteraar zelf uitgezonden.En één valkuil van de binding die een echte bug was: een GObject-subklasse draagt gewone C#-properties, en die muteren verandert niets op het scherm.
ItemsChanged(0, n, n)zet de waarden wél op de objecten (teruggelezen en bewezen) en laat de kolommen Tijd en Jaar voorgoed leeg, omdatGtkListViewhet al gebonden widget behoudt als het item op die positie hetzelfde object is. De tagvulling maakt nu verse rij-objecten enSplicet ze erin. Staat uitgeschreven in de CLAUDE.md, want dit komt terug.Bijwerkingen, en wat ik teruggezet heb
Om het afspelen te kunnen zien heb ik mpv met
--ao=nulllaten draaien — geen geluid — en de speler één track laten hervatten. Dat schrijft in de gedeeldeplayback-rij. Ik heb je positie exact teruggezet (track 31408, 54,581 s); alleenupdatedUtcverschilt, en omdat het dezelfde collectie is en die rij al de nieuwste was, verandert dat niets aan "waar was ik het laatst".Bewust nog niet
MPRIS (dus de GNOME-shell ziet hem niet), hoezen — nergens, geen omslag in de transportbalk en geen raster —, geen artwork-cache, geen zoeken, en waarderen kan alleen voor wat er speelt. Geen daarvan is een besluit ertegen.
Wat het kost
MpvPlaybackService,SessionStoreen de vorm vanApiClientzijn kopieën van de Avalonia-speler. Bewust: in die mpv-driver is elk commentaar betaald. Maar een fix moet nu twee keer gemaakt worden. Het antwoord daarop is niet meer kopiëren maar de gedeelde helft optillen naar eenRockHeaven.Clientdat beide spelers referenceren — een verbouwing van een wérkende speler, en daarom geen onderdeel van deze PR.dotnet build RockHeaven.slnis schoon.libadwaitamoest erbij (jij hebt hem geïnstalleerd); GirCore is een binding en brengt zelf geen bibliotheken mee, dus het bouwt zonder en start niet zonder.Elk plaatje dat die speler laat zien staat er nu ook in: het duimnagel- plaatje naast elke rij van de zijbalk en van de platenkolom, het grotere eronder van wat er geselecteerd is, de hoes van wat er speelt, en de brede foto van de artiest achter de trackkolom. Zelfde endpoints, zelfde regels — alleen het gereedschap verschilt, en vier van die verschillen kostten iets om te vinden. - **Gtk.Image voor alles met een vaste maat, geen Gtk.Picture.** Een Gtk.Picture vraagt om de maat van het plaatje dát erin zit, en SetSizeRequest verhoogt alleen zijn *minimum* — een op 512 gedecodeerde hoes kwam zo 512 pixels breed in de transportbalk, en het plaatje van de collectie pakte twee derde van de zijbalk af van de artiestenlijst. Gtk.Image vraagt om zijn pixelmaat, wat precies de bovengrens is die hier bedoeld werd. Wat het kost is de uitsnede: dit past het hele plaatje in het vierkant in plaats van het te vullen. De backdrop blijft een Gtk.Picture, want vullen is daar juist de bedoeling. - **Een plaatje krijg je niet op een rij door een property te zetten**, om precies de reden die de Tijd- en Jaar-kolom al leerde. Splicen kan hier niet: de plaatjes komen één voor één over minuten binnen, en een splice per plaatje zou de lijst honderd keer herbinden en telkens de selectie weggooien. IPictured houdt daarom de weg terug naar de widget bij — de factory zet Bound bij het binden en wist het bij unbind. - **De volumeplaatjes komen hier van de server.** De Avalonia-speler draagt ze in zijn eigen assembly; dit project kent alleen Common en vraagt volumes/{n}/image, dat precies diezelfde bestanden serveert. - **Eén plaatje onder de zijbalk waar de Avalonia-speler er twee toont**, omdat deze zijbalk 260 tot 360 pixels breed is. De hoes staat in de transportbalk, waar een GNOME-speler hem toch al zet. De artwork-cache is die van de Avalonia-speler, map en al. Dat mag hier wel waar player.json dat niet mocht: het zijn de bytes zoals de server ze stuurde, op adres en pad gesleuteld. Het scheelt een tweede gigabyte, en het beantwoordt het enige wat deze speler zelf niet kan — wanneer een plaatje verandert. Deze client cureert niets, dus hij heeft geen moment om iets weg te gooien; de Avalonia-speler leegt die map bij elke run achter zijn scanknop, en dat leegt daarmee ook deze. Draaiend nagekeken tegen de live server, in alle drie de vormen: de Top 2000 (met collectieplaatje en backdrop), RockHeaven (volumeplaatjes) en Albums (hoezen in de platenkolom). Geen enkele Gtk-CRITICAL meer. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>Er is nu ook een speler voor GNOME, en die cureert nietsto Er is nu ook een speler voor GNOME