db086f833 (server at v2.814+). File references are in grey under each section."Removed" (taken down) is a soft, reversible hide. The song, its audio, plays, likes, comments and tips all stay; only listeners stop seeing it. "Deleted" is a permanent purge. The song row and its audio files are erased, and three things can block it. A takedown by the creator never counts as a strike and the creator can restore it. A takedown by a reviewer counts as a strike, the creator cannot restore or delete it, and only the platform owner can undo it.
| Creator takedown | Reviewer takedown | Delete (purge) | |
|---|---|---|---|
| Who | The song's creator | Any admin / reviewer | The song's creator only (no admin delete) |
| Reversible? | Yes: creator presses Restore | Only the platform owner can undo | No |
| Counts as a strike? | Never | Yes, while the song stays removed | n/a (the song is gone) |
| Audio / plays / comments / tips | Kept (audio frozen) | Kept (audio frozen) | Erased, except it is refused if the song has ever had a tip |
| Creator can then delete it? | Yes (if no blocker) | No, blocked | n/a |
A song is always in exactly one of four states. There is no "deleted" state: a deleted song simply stops existing.
Every takedown records why: creator, or a reviewer reason copyright / violation / other. That one field decides strikes, who can restore, and whether delete is allowed.
States: migrations 000169, 000266 (CHECK). Takedown fields: 000215. Transitions: music/moderation.go:152,183,236-244 · handler.go:1714-1721 · restore.go:58-68. Every change is logged to song_review_events (review_history.go:79).
creator. Never a strike.DELETE /v1/music/songs/{id} (the route still says DELETE but no longer deletes) · handler.go:1692-1742
POST /v1/music/songs/{id}/restore · restore.go:71-162 · QC note "restore for creator takedown only" (restore.go:24)
POST /v1/music/admin/songs/{id}/takedown · moderation.go:195-249
HOOP_OWNER_UID). Reviewers and creators cannot. If no owner is set, nobody can.GET /v1/music/admin/takedowns · POST …/undo-takedown · owner_undo.go:28-136 · decided by Haikal 09-29 ("platform owner", not the creator)
DELETE /v1/music/songs/{id}/permanent · purge.go:56-153 · cascades: migrations 000145, 000148, 000216, 000226, 000227, 000255, 000256, 000267
handler.go:1476-1488 (count) · 2276-2280 (ban on upload)
Decided by Haikal 09-29 ("option A"), live since v2.809.
POST /v1/music/releases/{id}/takedown · release_admin.go:249-426 · republish: release_api.go:523 · commit 77db18419
| Place | What happens |
|---|---|
| Browse, charts, related, "appears on", creator page, profile pin, Liked / Favourites | Hidden (only published songs are listed) |
| Playing it | Only its creator and admins can still play it |
| A user's own playlist | Row stays, marked "No longer available"; adding it again is refused |
| Room playlist | Row stays but is hidden and skipped |
| Like, favourite, share, comment | Refused: "This song has been taken down…" |
| Existing comments | Listeners can no longer read them; the creator and admins still can. Nothing is deleted. |
browse.go:90-190 · related.go:49 · appears_on.go:53,65 · creator_songs.go:55 · user_playlist.go:376-412,552-555 · playlist.go:25-32 · song_state_copy.go:28-33 · handler.go:2183-2195 · comments_removed_0929_db_test.go
| Song is… | Status pill | Buttons |
|---|---|---|
| Published | — | Take It Down · Delete |
| Never published (draft / in review) | — | Delete |
| Taken down by the creator | Taken down | Restore · Delete |
| Removed by a reviewer | Removed by review | Delete is shown but will be refused (see gap 3 below); no Restore |
The reason a reviewer gave appears in the song's review history.
music_studio_screen.dart:5164, 9161-9164, 9216-9269, 9437-9442 · song_edit_locks.dart:137-138 · strings en.json:2241-2263, 2468-2470
| When | Who | What changed |
|---|---|---|
| 07-12 | — | Only hard delete existed |
| 07-16 | — | Admin takedown added |
| 08-12 | Li Min | The creator's "delete" became a takedown: deleting lost tips and left ledger entries pointing at nothing. Only reviewer takedowns count as strikes. |
| 08-23 | Li Min | Two separate buttons: "Take it down" vs "Delete is permanently delete it"; the three delete blockers |
| 09-09 | Leong | Take It Down hidden on songs that were never published |
| 09-23 / 24 | QC | Takedowns became restorable; removed songs' audio is frozen; "restore for creator takedown only" |
| 09-29 | Haikal | Release takedown takes its songs down with it (option A, v2.809); comments on removed songs (v2.807); platform owner can undo a reviewer takedown (v2.814) |
CHANGELOG.md:143-247, 6652-6711 · migrations 000215:1-10 · purge.go:11-19
Found while reading the code. None is broken today, but each is a rule nobody has written down.