|
| 1 | +title: GSoC 2025 - Multi-Genre & Autocompletion Support Implementation |
| 2 | +authors: Antonio Giordano |
| 3 | +status: draft |
| 4 | +tags: GSoC2025, features, library, metadata, genres, multitrack |
| 5 | +comments: yes |
| 6 | + |
| 7 | + |
| 8 | +Hello everyone! I'm **Antonio Giordano**, and I'm excited to share the results of my **Google Summer of Code 2025** work on Mixxx. We've introduced **true multi-genre support** with smart autocompletion, a cleaner editing experience, and tools to migrate your existing library without breaking your flow. |
| 9 | + |
| 10 | +### Project Vision & Evolution |
| 11 | + |
| 12 | +Our goal was to give DJs flexible, reliable control over genres beyond a single free-text field. In earlier versions, you could type multiple genres (e.g., `Dance/Electronic/House`), but Mixxx treated that as **plain text**. It couldn't understand or manage individual tags. |
| 13 | + |
| 14 | +To get this right, we started with a **solid multi-genre foundation** that's fast, consistent, and future-friendly. This foundation paves the way for richer features like hierarchical genres. |
| 15 | + |
| 16 | +### What's New |
| 17 | + |
| 18 | +#### Single-Track Genre Editing (Chip UI + Autocomplete) |
| 19 | + |
| 20 | +The **Track Properties** dialog now shows genres as compact **chips** with a white **x** to remove, plus **autocomplete** to add existing genres quickly. |
| 21 | + |
| 22 | +- **Clean look & feel:** compact chips, thin scrollbar, readable contrast. |
| 23 | +- **Autocomplete:** type a few letters and pick from existing genres. |
| 24 | +- **No more long strings:** add/remove individual genres directly. |
| 25 | +- **Always consistent:** the track table shows human-readable names everywhere. |
| 26 | + |
| 27 | +**Note:** If you type a genre that doesn't exist yet, Mixxx keeps it as a literal. You can map it later using the Orphan Genres tool (see below). |
| 28 | + |
| 29 | +#### Multi-Track Editing (Experimental) |
| 30 | + |
| 31 | +You can now edit genres across multiple tracks in one go (experimental): |
| 32 | + |
| 33 | +- **Common view:** shows the **intersection** of genres shared by all selected tracks. |
| 34 | +- **Batch operations:** add or remove genres for the whole selection. |
| 35 | +- **Safe by design:** unique per-track genres are preserved. |
| 36 | + |
| 37 | +#### A Smarter Library: Tree, Counts, and Drag & Drop |
| 38 | + |
| 39 | +Genres now live in a **tree**. Each node shows **track count** and **total duration**. When you select a track, the genres it belongs to become **bold** in the tree crate-like ergonomics for quick navigation. |
| 40 | + |
| 41 | +- **Drag & drop:** drag tracks from the Tracklist onto a genre to assign it. |
| 42 | +- **Quick menu:** right-click a track then **Genres** to (de)select on the fly. |
| 43 | +- **Rename safely:** renaming a genre changes the **name**, not the ID, so tracks keep their associations. |
| 44 | + |
| 45 | +#### Clean Migration: "Orphan Genres" |
| 46 | + |
| 47 | +If your library contains free-text genres, Mixxx detects **orphans** and helps you clean them up: |
| 48 | + |
| 49 | +- Right-click the **root** of the genre tree then **Edit Orphan Genres**. |
| 50 | +- **Add** a new genre or **Link** a string to an existing one. |
| 51 | +- Multi-word strings appear as both a full string *and* individual tokens; add the full string first if you want to keep it as a single genre. |
| 52 | + |
| 53 | + |
| 54 | +### Why This Matters for DJs |
| 55 | + |
| 56 | +**Before:** |
| 57 | + |
| 58 | +- One free-text field. No understanding of individual genres. |
| 59 | +- No autocomplete. |
| 60 | +- Editing meant retyping a whole string. |
| 61 | +- Inconsistent naming ("Electronic" vs "electronic"). |
| 62 | +- No real bulk editing. |
| 63 | + |
| 64 | +**Now:** |
| 65 | + |
| 66 | +- **True multi-genre:** each tag is a first-class citizen. |
| 67 | +- **Autocomplete:** fast, consistent tagging. |
| 68 | +- **Visual editing:** add/remove with chips. |
| 69 | +- **Bulk-friendly:** multi-track editor (experimental) for common operations. |
| 70 | +- **Library-aware:** a genre tree with counts, duration, and drag & drop. |
| 71 | +- **Backwards-compatible:** your library keeps working; migrate at your pace. |
| 72 | + |
| 73 | +### How to Use It |
| 74 | + |
| 75 | +#### Single Track |
| 76 | + |
| 77 | +1. Right-click a track, **Properties**. |
| 78 | +2. In **Genre**, start typing and pick from autocomplete. |
| 79 | +3. Click the **x** to remove a tag. |
| 80 | +4. **OK** or **Apply** to save. |
| 81 | + |
| 82 | +#### Multi Track (Experimental) |
| 83 | + |
| 84 | +1. Select multiple tracks then right-click then **Properties**. |
| 85 | +2. See the **common** genres across the selection. |
| 86 | +3. Add or remove tags in bulk. |
| 87 | +4. Save: Mixxx preserves track-specific genres. |
| 88 | + |
| 89 | +#### Clean Up Old Text Tags |
| 90 | + |
| 91 | +1. In the genre tree, right-click the **root** then **Edit Orphan Genres**. |
| 92 | +2. **Add** new genres or **Link** strings to existing ones. |
| 93 | +3. Repeat as needed, your sets keep running. |
| 94 | + |
| 95 | +#### Under the Hood (Brief) |
| 96 | + |
| 97 | +- **Stable IDs** for genres and a fast **join table** (`genre_tracks`) so filtering and counts are snappy. |
| 98 | +- A central **Genre DAO** (data access layer) that maps between IDs and names and normalizes raw data. |
| 99 | +- The UI always shows **human-friendly names**; the storage format stays robust behind the scenes. |
| 100 | + |
| 101 | +### Demo video (quick tour) |
| 102 | + |
| 103 | +@Video(https://www.youtube.com/watch?v=46gCxOuhvPg) |
| 104 | +*This short video bundles all demos: single-track tag chips, multi-track bulk edit, the Genre Tree with drag-and-drop and **F2** rename, and the **Edit Orphan Genres** flow* |
| 105 | + |
| 106 | +### What's Next |
| 107 | + |
| 108 | +This foundation unlocks a lot of potential. Based on community input, we're exploring: |
| 109 | + |
| 110 | +- A **full hierarchical** genre tree with multi-level editing. |
| 111 | +- **Fuzzy autocomplete** to handle typos gracefully. |
| 112 | +- **Search** that also matches genre names. |
| 113 | +- Smarter **import/export** of genre structures (share your taxonomy). |
| 114 | +- Better **metadata export** across formats for multi-genre fields. |
| 115 | +- Optional **auto-conversion** of known strings to stable IDs on import. |
| 116 | + |
| 117 | +### Thank You |
| 118 | + |
| 119 | +Huge thanks to the Mixxx mentors and community for guidance, reviews, and real-world feedback. This is a big step forward, and we'll keep refining it together. |
| 120 | +Please try it and tell us what works for you. |
| 121 | + |
| 122 | +### Learn More |
| 123 | + |
| 124 | +For comprehensive project details: |
| 125 | + |
| 126 | +- **[Complete Project Documentation](https://github.com/mixxxdj/mixxx/issues/14897)**: Full development journey, technical decisions, and lessons learned |
| 127 | +- **[GSoC Project Page](https://summerofcode.withgoogle.com/programs/2025/projects/sHcUR4s0)**: Official Google Summer of Code project details |
| 128 | + |
| 129 | +**Feedback & Support:** |
| 130 | + |
| 131 | +Report issues on GitHub, share ideas on the forums, or chat with us on Zulip. We'd love to hear about your experience with the new genre features: |
| 132 | + |
| 133 | +- **Report Issues**: [GitHub Issues](https://github.com/mixxxdj/mixxx/issues) |
| 134 | +- **Share Feedback**: [Community Forums](https://mixxx.discourse.group) |
| 135 | +- **Join Discussion**: [Zulip Chat](https://mixxx.zulipchat.com) |
| 136 | +- **Feature Requests**: Help shape future enhancements! |
| 137 | + |
| 138 | +--- |
| 139 | + |
| 140 | +*Happy mixing!* |
| 141 | +**Antonio Giordano** |
| 142 | +*GSoC 2025 Contributor* |
0 commit comments