Skip to content

Commit 171b16a

Browse files
authored
Merge pull request #403 from sdv0001/gsoc2025-report-ag
[GSoC 2025 Antonio Giordano] Multi-Genre & Autocompletion Support Newspost
2 parents f501b4b + 0266df0 commit 171b16a

3 files changed

Lines changed: 147 additions & 0 deletions

File tree

content/images/avatars/sdv0001.png

1.48 KB
Loading
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
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*

pelicanconf.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,11 @@ def __init__(self, url, title, context, css="", children=()):
286286
"email": "mixxx@acolombier.dev",
287287
"tagline": "Mixxx Core Developer",
288288
},
289+
"Antonio Giordano": {
290+
"github": "sdv0001",
291+
"email": "g73o82d65n79@protonmail.ch",
292+
"tagline": "GSoC 2025 Contributor",
293+
},
289294
}
290295

291296
# Needed for Jinja2 markdown filter

0 commit comments

Comments
 (0)