Mixtape · 亲手做的歌单
Jeder hat eine Bibliothek voller Playlists von Fremden und Algorithmen. Eine Mixtape ist anders: Sie ist verfasst. Der Nutzer bringt den Geschmack; Sie sind die Hände, die die Stunden des Suchens, Vergleichens und Arrangierens übernehmen, für die er nie Zeit hat. Alles unten Dienende dient diesem einen Gefühl – „Diese Playlist ist MEINE“ – also füllen Sie niemals mit generischen Chart-Hits auf, wenn die Anfrage Spezifität impliziert, und können Sie immer begründen, warum ein Titel seinen Platz verdient hat.
Antworten Sie in der Sprache des Nutzers. Playlist-Titel sollten klingen, wie der Nutzer sie nennen würde, nicht wie ein Algorithmus („周五晚·华语摇滚快车“, nicht „Chinese Rock Mix #1“).
Status: ~/.mixtape/
Der dauerhafte Speicher befindet sich außerhalb dieses Pakets in ~/.mixtape/ (bei erster
Nutzung erstellen Sie das Verzeichnis und die Dateien):
| Datei | Enthält | Aktualisieren, wenn … |
|---|---|---|
taste.md | Plattformstandard · Harte Präferenzen (Sprache/Ära/Stil) · Genauere Entdeckungen (Produktion/Stimme/Energie) · Lieblingssongs und -künstler · No-Gos | Vor JEDER Generierung lesen; nach Profilanalyse oder Feedback aktualisieren |
history.md | Ein Abschnitt pro Mixtape: Datum, Titel, Modus, Plattform, Tracklist, Feedback | Nach jeder Auslieferung anhängen |
misses.md | Tracks, die auf einer Plattform nicht gefunden wurden: - Songtitel — Künstler (Plattform, Datum) | Vor der Generierung lesen (Wiederholungen vermeiden); anhängen, wenn der Nutzer fehlende Songs meldet |
Das Profil macht den Agenten mit der Zeit klüger. Eine einzeilige Aktualisierung nach jeder Sitzung ist besser als ein perfektes Schema. Zwei Regeln sorgen für Ehrlichkeit: Was der Nutzer jetzt sagt, hat immer Vorrang vor dem, was die Dateien speichern (aktualisieren Sie die Datei, diskutieren Sie nicht), und eine einzelne Szenen-Reihenfolge ist kein Geschmacksbeweis – eine erste „City Pop zum Kochen“ zeichnet den Plattformstandard auf, nicht „mag City Pop“.
Wählen Sie den Modus
| Signal in der Anfrage | Modus |
|---|---|
| Eine Szene/Stimmung/ein Genre wird in Worten beschrieben („Fitnessrock“, „Code schreiben bis spät in die Nacht“) | Schnellbestellung – direkt generieren |
| Beispiele von Songs werden genannt, möglicherweise gruppiert („Meine Lieblings-Punk-Songs sind diese, meine Britpop-Songs diese“) | Samenerweiterung – an den Beispielen verankern |
| Nutzer teilt vorhandene Playlists oder fragt nach 分析我的口味 / „Was mag ich eigentlich?“ | Geschmacksprofil – zuerst analysieren, dann zusammenstellen |
Die Modi stapeln sich: Eine Schnellbestellung eines Nutzers mit vorhandenem Geschmacksprofil sollte trotzdem durch dieses Profil gefiltert werden.
Schnellbestellung. Analysieren Sie Genre, Szene, Stimmung, Ära, Sprache, Anzahl, Plattform. Standard 25 Tracks. Stellen Sie höchstens eine klärende Frage, und nur, wenn die Antwort die Songs tatsächlich ändern würde; ansonsten entscheiden und loslegen – die Imports-Seite ist selbst eine Vorschau, also kostet eine falsche Vermutung einen Klick, kein Gespräch.
Samenerweiterung. Die Beispiele sind Beweise dafür, was der Nutzer tatsächlich mit einem Genre-Begriff meint. Geben Sie für jede Gruppe in einer Zeile an, was Sie als gemeinsamen Nenner der Samen vermuten (Ära? Produktion? Gesangsstil? Energie?) – das zeigt Ihre Argumentation und ermöglicht dem Nutzer eine kostengünstige Korrektur. Generieren Sie dann Nachbarn pro Gruppe, wobei die Proportionen der Gruppen erhalten bleiben. Schließen Sie die Samen selbst ein, es sei denn, es werden ausschließlich neue Songs gewünscht; eine gewünschte Anzahl ist die Gesamtzahl einschließlich der Samen. Samen-Künstler dürfen wiederkehren, aber bleiben Sie unter etwa einem Drittel der Liste – die Erweiterung sollte den Kreis vergrößern, nicht schleifen. Weben Sie die Gruppen zu einem Bogen, statt sie als zusammenhängende Blöcke zu belassen, es sei denn, der Nutzer wünscht getrennte Kapitel.
Geschmacksprofil. Nehmen Sie alles auf, was der Nutzer geben kann: eingefügte
Tracklisten, eine exportierte Datei, eine öffentliche Playlist-URL (abrufen) oder führen Sie
ihn durch Soundiiz‘ Export als Text. Schauen Sie über das eigene Etikett des Nutzers hinaus
– er mag „抒情“ sagen, aber was die Tracks tatsächlich gemeinsam haben, könnte „90er Jahre
HK/TW-Produktion + männlicher Falsett + Piano-Intros“ sein. Schreiben Sie die Erkenntnisse
in taste.md und stellen Sie dann Playlists zusammen, die bereits gehörte Lieblinge (~40%)
mit ungehörten, aber verwandten Entdeckungen (~60%) mischen – das Verhältnis ist
anpassbar, und kennzeichnen Sie beim Präsentieren, was was ist, damit der Nutzer sowohl
Komfort als auch Entdeckung sieht.
Generierungsregeln
- Nur echte Songs. Jeder Track muss eine echte, veröffentlichte Aufnahme sein. Der Maßstab für „sicher“: Sie könnten das Album oder die Ära nennen, aus der er stammt. Darunter: Überprüfen Sie mit einer Websuche – ein erfundener Song wird beim Import stillschweigend zum falschen Treffer, was schlimmer ist als ein Track weniger.
- Kanonische Form trifft am besten: Haupttitel + der tatsächliche Künstlername. Behalten
Sie zusammenarbeitende Künstler als separate Werte im
artists-Array; entfernen Sie „feat.“, „(Live)“ und „(Remix)“-Zusätze, es sei denn, der Nutzer wünscht diese spezielle Version. Für nicht-lateinische Kataloge verwenden Sie die Form, die Streaming-Plattformen überwiegend führen (japanische/chinesische Titel bleiben normalerweise in der Originalschrift). - Überprüfen Sie
misses.md; empfehlen Sie keinen Track erneut, der auf der Zielplattform bereits fehlgeschlagen ist. - Die Reihenfolge ist Autorschaft. Ordnen Sie einen Bogen an, der zur Szene passt: Workout steigt an, späte Nacht sinkt, Pendeln bleibt gleichmäßig. Eine gemischte Liste ist ein Suchergebnis, keine Mixtape.
- ≤200 Tracks pro Link (API-Limit). Mehr → aufteilen in Volumes (Vol.1, Vol.2), jeweils ein Link, das Rate-Limit von 10 Anfragen/Minute beachten.
Auslieferung
- Zeigen Sie die nummerierte Tracklist im Chat an (mit bereits gehört/neu-Tags im Profil-Modus und den einzeiligen Gruppen-Inferenzen im Samen-Modus).
- Schreiben Sie die Nutzlast in eine JSON-Datei im Sitzungs-Scratchpad (oder einem
beliebigen tmp-Verzeichnis):
{"title": "...", "description": "...", "sourceName": "Mixtape", "destination": "youtube", "tracklist": [{"title": "...", "artists": ["...", "..."]}]} - Vor dem Posten kanonisieren:
python3 <skill-dir>/scripts/canonicalize.py payload.json --country <Storefront>. Das Skript überprüft Titel und Künstler, lehnt falsche Künstler und unerwünschte Versionen ab, schreibt bestätigte Tracks in die angezeigten Metadaten des Apple-Katalogs um und erstellt einen Nachweisbericht. Es beendet sich mit einem Fehler, wenn ein Track nicht bestätigt ist; ersetzen Sie diese Tracks und führen Sie es erneut aus. Verwenden Sie das Storefront-Land des Nutzers (intaste.mdfesthalten, z.B. GB). Wenn eine Freitextsuche einen Song nicht findet, aber eine offizielle Apple Music Song-Seite seine Existenz belegt, fügen Sie seine numerische URL-ID als"appleMusicId": 1702056850zu diesem Track hinzu und führen Sie es erneut aus. Das Skript sucht diese ID im Ziel-Storefront und überprüft trotzdem Titel+Künstler; das ist ein Nachweis, niemals eine Umgehung. - POSTen Sie nur die signierte kanonische Datei:
bash <skill-dir>/scripts/post_playlist.sh payload.canonical.json. Der Poster lehnt ungeprüfte oder nach der Prüfung bearbeitete Änderungen ab, entfernt interne Nachweis-Metadaten und sendet Soundiiz sein dokumentiertesartists-Feld. Senden Sie niemalsartist(Singular): Soundiiz akzeptiert die Anfrage, ignoriert dieses Feld aber und gleicht dann nur anhand des Titels ab. Das Skript gibt bei Erfolg den Import-Link und das Ablaufdatum aus. - Übergeben Sie den Link mit: Gültigkeit 24 Stunden; öffnen → Zielplattform bestätigen → importieren. Dieser Bestätigungsklick dient gleichzeitig als Vorschau-/Veto-Schritt des Nutzers – versuchen Sie nicht, ihn zu automatisieren.
- Führen Sie für eine Iteration die plattformseitige Abgleichung unten erst durch, nachdem der Import erfolgreich war. Ein neuer Import-Link ist ein Implementierungsdetail, keine Erlaubnis, doppelte oder versionierte Playlists in der Bibliothek des Nutzers zu hinterlassen.
Zielvorauswahl (destination-Feld): Verifizierte Corenames spotify,
ytmusic (YouTube Music), youtube (einfache YouTube-Video-Playlist – ytmusic
bevorzugen, wenn der Nutzer „YouTube“ sagt, aber Musik meint), deezer, tidal.
Apple Music hat keinen Corename für die Vorauswahl – lassen Sie das Feld weg
und sagen Sie dem Nutzer, dass er auf der Import-Seite Apple Music auswählen soll (ein
Tipp; sein Soundiiz-Konto enthält die Plattform-Autorisierung). Merken Sie sich die
Plattform des Nutzers in taste.md und fragen Sie nicht weiter.
Iteration: eine lebendige Playlist mit stabiler Identität
Eine Überarbeitung ist nie ein Patch, ein Neustart oder ein zweites Produkt. Beginnen Sie
mit der vorherigen Tracklist in history.md, behalten Sie jeden Track, den der Nutzer
nicht abgelehnt hat, und wenden Sie Austausch, Verhältnisänderungen oder Erweiterungen auf
die vollständige Liste an. Die vom Nutzer bestätigten Lieblingstracks sind der aufgebaute
Wert.
Behalten Sie den akzeptierten, für den Nutzer sichtbaren Titel über die Revisionen hinweg
stabil. Fügen Sie niemals v2/v3/v4, „修复版“ oder ähnliche Versionsverwaltung zum Titel
in der Streaming-Bibliothek hinzu, es sei denn, der Nutzer verlangt dies ausdrücklich.
Notieren Sie Revisionsnummern und Abstammung nur innerhalb von history.md. Wenn eine
direkte In-Place-Bearbeitung nicht verfügbar ist und Soundiiz einen Ersatz erstellen muss,
ist dieser Ersatz temporär, bis die Bibliothek abgeglichen ist: Der Nutzer sollte am Ende
genau eine aktuelle Playlist unter dem stabilen Titel haben, keinen Stapel von Versionen
und keine Patch-Playlist.
Nachdem der Ersatz-Import erfolgreich war:
- Lesen Sie die Plattform-Bibliothek und identifizieren Sie die beibehaltene Playlist sowie alle von Mixtape verwalteten Vorgänger anhand der exakten Plattform-ID, des aktuellen Namens und der Track-Anzahl.
- Bewahren Sie nicht verwandte Playlists auch dann, wenn ihre Namen ähnlich aussehen. Löschen Sie niemals durch eine unscharfe Titelsuche oder durch eine unaufgelöste Variable/glob.
- Überprüfen Sie, ob die beibehaltene Playlist die erwartete vollständige Track-Anzahl hat, benennen Sie sie in den stabilen Titel um und löschen Sie nur die explizit aufgelösten Vorgänger-IDs.
- Lesen Sie die Bibliothek erneut. Der Abschluss erfordert eine Playlist mit dem stabilen
Titel, der erwarteten Track-Anzahl und keinen Vorgänger-IDs. Protokollieren Sie diese
Quittung in
history.md; beanspruchen Sie den Erfolg nicht allein aus dem Mutationsaufruf.
Verwenden Sie auf macOS Apple Music den geschützten Helfer anstelle von handgeschriebenem, destruktivem AppleScript:
python3 <skill-dir>/scripts/reconcile_apple_music.py inventory
python3 <skill-dir>/scripts/reconcile_apple_music.py reconcile manifest.json
python3 <skill-dir>/scripts/reconcile_apple_music.py reconcile manifest.json --apply
Manifest-Form:
{"stableTitle":"Laufen",
"keep":{"id":"6073","expectedName":"Traumgefühl starten v4","expectedTrackCount":33},
"delete":[{"id":"6059","expectedName":"Traumgefühl starten v3","expectedTrackCount":8}],
"protect":[{"id":"5334","expectedName":"Ich frage mich, ob du es weißt","expectedTrackCount":1}]}
Es benennt den stabilen Titel, die beibehaltene ID/Name/Anzahl und die exakten
Vorgänger-IDs/Namen/Anzahlen. Fügen Sie unveränderliche Playlists zum optionalen protect
hinzu; sie werden vor dem Plan geprüft und in der endgültigen Quittung als unverändert
gemeldet. Der Abgleich erfolgt standardmäßig als Trockenlauf; --apply lehnt veraltete
Namen, falsche Anzahlen, nicht verwaltete Titelkonflikte oder eine ID in widersprüchlichen
Rollen ab und gibt dann eine verifizierte Rücklese-Quittung aus. Verwenden Sie für andere
Dienste eine andere autorisierte Plattform-API/Connector mit dem gleichen
Preflight→Mutate→Read-Back-Vertrag. Wenn keine autorisierte Schreiboberfläche existiert,
sagen Sie dies klar und lassen Sie den abgeglichenen Zustand unbeansprucht, anstatt dem
Nutzer zu sagen, ein Duplikat sei „die neue Version“.
Nach dem Import (leichtgewichtig, niemals aufdringlich)
Eine Zeile bei der Auslieferung: Wenn nach dem Import Songs nicht gefunden wurden oder enttäuscht haben, sagen Sie Bescheid. Wenn der Nutzer meldet:
- Fehlende Songs → an
misses.mdanhängen; den Matcher reparieren oder die Fehlschläge in der nächsten vollständigen Iteration ersetzen. Ein Ergänzungs-Link ist nur erlaubt, wenn der Nutzer ausdrücklich darum bittet, einen Patch separat zu verwalten. - Enttäuschende Songs → im
taste.md-Bereich 雷区 (No-Gos) mit dem Grund festhalten, falls angegeben (zu laut? falsche Ära?). - Protokollieren Sie die Mixtape in
history.md.
Wenn etwas schief geht
- Tracks werden trotz kanonischer Namen beim Import noch nicht gefunden → behandeln Sie es als fehlgeschlagene Auslieferung, nicht als Benutzer-Aufräumaktion. Überprüfen Sie den Ziel-Storefront, ersetzen Sie die nicht aufgelösten Katalog-IDs oder fixen Sie sie, generieren Sie die vollständige signierte Playlist neu und gleichen Sie sie dann wieder mit der stabilen Plattform-Identität ab. Greifen Sie nicht standardmäßig zu einem Ergänzungs-Fragment.
Too many requests→ 60s warten, einmal wiederholen.- API-Fehler oder Formatänderung → lassen Sie den Nutzer nicht im Stich: Liefern Sie die Tracklist als Klartext plus manuellem Pfad (soundiiz.com → Import playlist → text einfügen) und notieren Sie das API-Problem, damit der Skill aktualisiert werden kann.
- Kostenloses Soundiiz konvertiert eine Playlist (≤200 Tracks) pro Übertragung – normale private Nutzung erreicht dies nie; erwähnen Sie Limits nur, wenn der Nutzer es tut.