Vier Dinge, an denen ich gerade sitze — mit dem, was technisch dahintersteckt
und was dabei schiefgegangen ist.
wsFloh — Flohmarkt-Helfer
Flutter (Android, Windows) · Node.js · SQLite · mehrere Preis-APIs
Man steht auf dem Flohmarkt vor einer Kiste Schallplatten oder einem anderen Gegenstand und hat keine Ahnung,
ob der geforderte Preis in Ordnung ist. wsFloh beantwortet genau das: Foto machen,
und die App sagt, worum es sich handelt und was vergleichbare Stücke zuletzt
gekostet haben.
Der Weg eines Fotos: von der App über die Bilderkennung zu den Preisquellen,
die je nach erkannter Kategorie unterschiedlich ausfallen.
Wie es funktioniert
Das Foto geht an eine Bilderkennung, die daraus eine strukturierte Beschreibung
macht: Kategorie, Hersteller, eine Kurzbezeichnung, mit der sich der Gegenstand
auf Handelsplattformen wiederfinden lässt. Diese Kurzbezeichnung ist der
eigentliche Knackpunkt: Sie muss so formuliert sein, wie jemand suchen würde,
der das Objekt schon kennt. Dazu gebe ich der Antropic KI konkrete Vorgaben in welchem Format die Beschreibung zurückkommen soll.
Anschließend fragt das Backend die passenden Preisquellen ab. Welche das sind,
hängt von der Kategorie ab. Schallplatten und CDs gehen an Discogs, Magic-Karten
an Scryfall, Videospiele und LEGO-Sets an PriceCharting und BrickLink, alle Kategorien an SoldComps für verkaufte eBay-Angebote. Welche Quelle für welche Kategorie aktiv ist,
lässt sich in der App umschalten.
Wie die App aussieht
Zwei Einträge aus der laufenden App: links eine Keramikvase, rechts
eine Schallplatte. Bei der Vase gibt es keine Datenbank mit Katalognummern,
also bleiben nur verkaufte eBay-Angebote als Vergleich. Bei der Platte
kommt Discogs dazu. Gut zu sehen ist auch, warum die Ersteinschätzung
der Bilderkennung nicht das Ergebnis ist, sondern nur der Einstieg:
Bei der Platte schätzt sie 90 Euro, der Markt sagt 26.
Die finale Einschätzung liegt immer noch in meiner Verantwortung, das Tool
bündelt nur die Informationen.
Keramikvase · nur eBay als Quelle
Schallplatte · Discogs und eBay
Was dabei interessant war
eBay lässt sich nicht scrapen. Auch nicht mit einem echten
Browser über Playwright, Boterkennung. Ausweg war eine
API, die verkaufte Angebote bereitstellt.
MP3-Werkzeugkasten
Python · SQLite · Discogs-Datendump · diverse APIs
Angefangen hat es mit einer einzigen Frage: welche Alben meiner Bands fehlen mir
eigentlich? Daraus ist ein gutes Dutzend Skripte geworden, die sich gegenseitig
füttern: vom Scan der Sammlung über den Abgleich mit Discogs bis zum monatlichen
Newsletter mit Neuerscheinungen, Konzertterminen und Nachrichten.
Wie die Skripte zusammenhängen: links der Scan der eigenen Sammlung, rechts
der Discogs-Dump, in der Mitte die Auswertungen und ganz unten der
Newsletter, in dem alles zusammenläuft.
Der Kern: die eigene Sammlung gegen Discogs abgleichen
Ein Scanner läuft rekursiv über die MP3-Sammlung und baut
einen Katalog: Interpret, Album, Titel. Auf der anderen Seite steht der offizielle
Discogs-Datendump.
In der ersten Fassung wurde dieses XML bei jedem Lauf neu durchgestreamt. Das
dauerte Minuten, und so einen Abgleich macht man nicht einmal, sondern ständig
wieder. Also baut ein eigenes Skript daraus einmalig einen indizierten
SQLite-Index. Dieser Aufbau kostet genauso lange wie ein kompletter Durchlauf,
aber jeder Lauf danach ist nur noch eine indizierte SQL-Abfrage statt mehrerer
Gigabyte Streaming.
Was daraus noch gewachsen ist
Crossreferenzen Welche anderen Bands teilen sich Musiker mit
meinen? Je mehr gemeinsame Personen, desto höher der Ähnlichkeitsfaktor. Eine
Empfehlung, die nicht auf Hörverhalten beruht, sondern auf Besetzungslisten.
Neuerscheinungen der eigenen Bands, per Discogs-API angereichert
um Cover, Label, Spielzeit und Video-Link.
Konzerte aus Ticketmaster, Eventim und Bandsintown für alle Interpreten
der Sammlung, gefiltert auf einen wählbaren Umkreis.
Nachrichten zu den eigenen Bands aus Google News.
YouTube-Playlisten Neuerscheinungen, fehlende Alben oder Crossreferenz werden auf Youtube gesucht und in Playlisten zusammengefasst.
Wie der Newsletter aussieht
Farbschema und Layout sind unabhängig voneinander wählbar und werden beim
Erzeugen der Mail kombiniert. Unten stehen drei von 150+ dieser
Kombinationen, gefüllt mit zufälligen Bands.
Bandnamen sind mehrdeutig. Die Nachrichtensuche nach „Ash Borer"
liefert vor allem Meldungen über einen Schädlingskäfer. Zwei Filter beheben das:
ein angehängtes „(Band OR Music)" und eine Whitelist von Musik-Nachrichtenseiten.
Bemerkenswert dabei: die Whitelist wirkt als Filter nach der Suche besser
als eine Einschränkung innerhalb der Suchanfrage, weil letztere die
Relevanzgewichtung des Bandnamens verschlechtert.
Ortsnamen auch. Berlin gibt es in den USA, Las Vegas in Honduras.
Die Auflösung bevorzugt deshalb zuerst Deutschland, dann Europa, dann den
bevölkerungsreichsten Treffer.
Fossilienalarm
Python · OpenWeatherMap · SQLite
Fossilien findet man nicht bei schönem Wetter. Man findet sie, nachdem Regen und
Wind die Fundstellen abgetragen haben. Erosion legt frei, was vorher im Hang
steckte.
Das Skript prüft an mehreren hinterlegten Orten das aktuelle Wetter und schickt
eine Mail, sobald Niederschlag und Wind über den eingestellten Schwellwerten
liegen. Die Messwerte landen in einer SQLite-Datenbank.
Wie eine Alarmmail aussieht
Von den vier Projekten hier ist das am wenigsten weit. Die Mail unten stammt aus einem
Testlauf mit erfundenem Ort und erfundenen Schwellwerten.
Alarmmail · Testlauf
Der Server dahinter
Ubuntu 24.04 · nginx · systemd · Let's Encrypt
Beide Anwendungen und diese Seite laufen auf einer eigenen virtuellen Maschine.
Vorher hatte ich mit Linux nie ernsthaft gearbeitet, entsprechend war das
Einrichten selbst ein Projekt: Benutzer und SSH-Schlüssel, Firewall, beide Dienste
als systemd-Units, nginx als gemeinsamer Eingang, Zertifikate über Let's Encrypt.