Skip to content

Remove obsolete AIM, IRC, ICQ fields from broadcasting preferences closes #12432 - #16092

Open
prayag-kachhia wants to merge 6 commits into
mixxxdj:mainfrom
prayag-kachhia:my-test-branch
Open

Remove obsolete AIM, IRC, ICQ fields from broadcasting preferences closes #12432#16092
prayag-kachhia wants to merge 6 commits into
mixxxdj:mainfrom
prayag-kachhia:my-test-branch

Conversation

@prayag-kachhia

@prayag-kachhia prayag-kachhia commented Mar 3, 2026

Copy link
Copy Markdown
  • Broadcasting: Remove obsolete AIM, IRC, and ICQ messenger fields
    closes #12432

@prayag-kachhia prayag-kachhia changed the title Remove obsolete AIM, IRC, ICQ fields from broadcasting preferences Remove obsolete AIM, IRC, ICQ fields from broadcasting preferences closes #12432 Mar 3, 2026
@acolombier

Copy link
Copy Markdown
Member

Welcome at Mixxx!
As a first-time contributor we need you to sign the Mixxx Contributor Agreement and comment here when you have done so. It gives us permission to distribute your contribution under the GPL v2 or later license and the Apple Mac App Store. It is also helpful for us to have contact information for contributors in case we may need it in the future.

@acolombier

Copy link
Copy Markdown
Member

Not sure if this issue was suggesting to remove these metadata fields - I certainly know some community still exclusively relying on IRC for comms.
What that what you had in mind @ronso0 ?

@prayag-kachhia

Copy link
Copy Markdown
Author

Welcome at Mixxx! As a first-time contributor we need you to sign the Mixxx Contributor Agreement and comment here when you have done so. It gives us permission to distribute your contribution under the GPL v2 or later license and the Apple Mac App Store. It is also helpful for us to have contact information for contributors in case we may need it in the future.

Done

@prayag-kachhia

prayag-kachhia commented Mar 3, 2026

Copy link
Copy Markdown
Author

Not sure if this issue was suggesting to remove these metadata fields - I certainly know some community still exclusively relying on IRC for comms. What that what you had in mind @ronso0 ?

I took some help from AI -

AIM was shut down in 2017. ICQ officially shut down June 2024. Neither service exists anymore — users cannot meaningfully fill these fields.
IRC is technically still alive. IDJC uses it for stream announcements, so there is a small argument for keeping the IRC field.

Album art / stream logo are the actually-used modern equivalents of these contact fields — SAM Broadcaster exposes them and modern listeners expect them

@acolombier

Copy link
Copy Markdown
Member

Thanks for the info.
FWIW, even if these metadata where initially intended for those defunct software, there remain a way to pass data. In other terms, nothing prevent to use setting your Discord instead of an ICQ or AIM channel. Removing them would mean we remove ways to pass separate metadata, that could then be consumed the final client player.
Wondering if we should consider a relabelling? Also wondering if the community is actually not already using it as is

@ronso0

ronso0 commented Mar 3, 2026

Copy link
Copy Markdown
Member

IIUC the 'icq', 'aim' etc. are just arbitrary char* (a-z0-9) metadata fields we create, and maybe there are streaming hosts that look for any of these fields, maybe not. Meaning: if IRC is still alive let's keep it 🤷‍♂️
But we could as well provide a mask where can name their desired field, eg. 'instagram'.
And if there's a standard for cover art, let's add it, idk.

My reason for filing #12432 back then was simply that Mixxx itself looks kind of outdated if it provides masks for ancient technology ; )

@acolombier

Copy link
Copy Markdown
Member

That's fair. I think as long as we could add some backward compatibility, I'm happy to remove this by default!
At first I thought ICQ/AIM/IRC were standard metadata keys for Icecast but it looks likes these are only libshout aliases!

Looking at how it gets consumed, it looks like these just comes out as Key/Value pair, so maybe we could allow settings an arbitrary map? I am thinking some table view where you can set arbitrary pair like instagram=@foobar instead of the current static form layout, but also some easily add well known keys like title, public stream, URL...

Would you like to try and suggest an interface revamp @prayag-kachhia ?

@ronso0

ronso0 commented Mar 3, 2026

Copy link
Copy Markdown
Member

but it looks likes these are only libshout aliases!

Exactly, and I don't find "title" or "artist" there, so these are also just established identifiers?

I am thinking some table view where you can set arbitrary pair like instagram=@foobar

That would be a list view?
Not sure if list/table suit well or if have a list of pairs of combobox + edit field, which would expand dynamically via an 'Add' button. Looking forward to GUI/UX proposals!

@acolombier

Copy link
Copy Markdown
Member

so these are also just established identifiers?

I think they are if this doc is accurate, so is public, description and potentially genre (documented in Available XML data), which we currently have. All seem to be optional tho!

list of pairs of combobox + edit field, which would expand dynamically via an 'Add' button

Yeah that sounds even nicer!

@ronso0

ronso0 commented Mar 3, 2026

Copy link
Copy Markdown
Member

list of pairs of combobox + edit field, which would expand dynamically via an 'Add' button

Yeah that sounds even nicer!

yep, I imagine it be to a compact GUI and probably nice UX -- but I'm not keen on the c++ hazzle this implies 😆

@prayag-kachhia

prayag-kachhia commented Mar 4, 2026

Copy link
Copy Markdown
Author

@acolombier @ronso0 — Thank you both for the detailed feedback! I've done some research on how libshout metadata actually works and what's visible to listeners.

Key findings:

  • SHOUT_META_AIM, SHOUT_META_IRC, SHOUT_META_ICQ are just libshout aliases for legacy Shoutcast ICY headers (icy-aim, icy-irc, icy-icq). Icecast treats them as generic metadata with no special handling (as you have already mentioned)
  • libshout accepts any key/value pair via shout_metadata_add() — there's no restriction to predefined constants.
  • Custom fields are visible in /status-json.xsl, Icecast admin pages, and modern web players (AzuraCast, custom HTML5 players, etc.) — which is where most real-world listeners engage with stream info today.
  • They are not shown in standard players like VLC or foobar2000 — but neither were the old AIM/IRC/ICQ fields, so this is no regression.

I'm happy to implement the dynamic table approach ronso0 suggested. Tell me if I am understanding it correctly, there would be an 'Add', which would allow the user to select the type of metadata they want to send (instagram, discord, twitch etc).

Happy to convert this to Draft and push a prototype UI soon.

list of pairs of combobox + edit field, which would expand dynamically via an 'Add' button

Yeah that sounds even nicer!

yep, I imagine it be to a compact GUI and probably nice UX -- but I'm not keen on the c++ hazzle this implies 😆

I see the complexity that it implies here. Let me give it a shot, I'll post here if I face any challenges. Just to confirm, with regards to the existing presets, we would only keep IRC, and scrap the IQC and AIM fields.

@prayag-kachhia
prayag-kachhia marked this pull request as draft March 4, 2026 04:11
@ronso0

ronso0 commented Mar 4, 2026

Copy link
Copy Markdown
Member

Just to confirm, with regards to the existing presets, we would only keep IRC, and scrap the IQC and AIM fields.

Yes, Ithink that's consensus now.

@prayag-kachhia
prayag-kachhia force-pushed the my-test-branch branch 3 times, most recently from 7d05414 to 7cdb233 Compare March 4, 2026 19:05
…rences

These messenger services are not standard. Removed the UI fields, backend profile storage, and sidechain transmission code entirely.

Fixes mixxxdj#12432
@prayag-kachhia
prayag-kachhia marked this pull request as ready for review March 4, 2026 19:46
@prayag-kachhia

prayag-kachhia commented Mar 4, 2026

Copy link
Copy Markdown
Author

Based on the feedback in the PR review, rather than just restoring IRC as a static field, this implementation replaces the legacy fields with a fully dynamic "Social & Contact Links" table. This allows streamers to add an arbitrary number of custom metadata key-value pairs (like Instagram, Discord, Spotify, or any custom platform) that get passed to the streaming server.

Changes included:

  • UI: Removed the static text fields for AIM, ICQ, and IRC. Added a new "Social & Contact Links" group box containing an auto-expanding table to manage links.
  • UI Logic: Implemented an "Add" and "Remove selected" flow. The Platform column uses an editable dropdown pre-filled with common platforms (IRC, Instagram, Twitter, Facebook, Discord, YouTube, Twitch, Spotify, SoundCloud, Mixcloud) but allows fully custom plain-text keys.
  • Backend: Migrated from hardcoded string members to a flexible QMap for extra metadata.
  • Serialization: The map is saved structurally using a new <StreamExtraMetadata> parent tag containing child entries.
  • Streaming API: Replaced the static metadata calls with a generic loop that iterates over the extra metadata map and pushes all non-empty pairs to the streaming server.
  • Testing: Updated the unit tests to validate the new getter/setter logic and ensure XML serialization round-trips correctly.

Backwards Compatibility / Migration:
To ensure users upgrading to this version of Mixxx do not lose their existing configurations, an explicit migration check was added.
If a legacy <StreamIRC> tag is found in the user's config file during load, it is seamlessly migrated into the new metadata map under the irc key. (AIM and ICQ are silently dropped).

Closes: #12432

Untitled

PS.: AI was used to write and refine this, as I didn't want to write in markdown myself. I hope it is acceptable

@prayag-kachhia

Copy link
Copy Markdown
Author

@ronso0 @acolombier Could you please review this and give me any feedback. I am a bit eager to hear on this

@acolombier

Copy link
Copy Markdown
Member

I think this is aiming in the right direction. Some element of feedback:

  • Treat this section as "Custom Metadata" rather than "Social Contact Link"
  • Don't suggest any social media brand by default, and allow free selection instead

One to be confirmed by @ronso0 - shall we move all metadata in this table? The challenge is that some like Public are boolean, Genre is potentially an enum..

@prayag-kachhia

Copy link
Copy Markdown
Author

I think this is aiming in the right direction. Some element of feedback:

  • Treat this section as "Custom Metadata" rather than "Social Contact Link"
  • Don't suggest any social media brand by default, and allow free selection instead

Well, it is custom. You can type in anything you think appropriate. I thought commonly used socials in a dropdown would make it more intuitive. I will still change if you say so.
Just to clarify, the section is empty intially, I had populated it by selecting it from the dropdowns just to show how it works.

@ronso0

ronso0 commented Mar 5, 2026

Copy link
Copy Markdown
Member

Thank you, looks good already.
I agree with @acolombier's remarks.
Proposing some mainstream platforsm seems nice, but I guess users will know which correct tags to use in order for them being picked up by broadcasters. ('Instagram' vs. 'ista') But I never used a broadcasting platform to know how they handle it.

Some feedback/opinion the UI:

  1. while a tableview seems to be the easist way, I wonder if it's feasible to use the QComboBox / QLineEdit pair I proposed in a QGridLayout and expand/shrink/populate that dynamically?
  2. I find the nested QGroupBox'es kinda distracting. Let's put 'Custom Metadata' in the left column (just below the Genre lable) and the grid/table in the right column(s)

@prayag-kachhia
prayag-kachhia marked this pull request as draft March 6, 2026 18:26
@prayag-kachhia
prayag-kachhia marked this pull request as ready for review March 6, 2026 18:27
@prayag-kachhia

Copy link
Copy Markdown
Author
image

I have made the changes as suggested by @acolombier and @ronso0. Please review and let me know if it is meeting expectations.

@ronso0

ronso0 commented Mar 9, 2026

Copy link
Copy Markdown
Member

UI looks good, but why is the key field still a QComboBox?
Should be a QLineEdit now that we agreed to not propose presets.

@acolombier

acolombier commented Mar 9, 2026

Copy link
Copy Markdown
Member

Wondering if we could use a QComboBox to suggest the standard metadata (public, stream name, description, website, ...)?

@prayag-kachhia

Copy link
Copy Markdown
Author

I have changed and removed the QComboBox. I think this is ready to merge

@prayag-kachhia

Copy link
Copy Markdown
Author

Wondering if we could use a QComboBox to suggest the standard metadata (public, stream name, description, website, ...)?

We could discuss this in a new issue, but if we think from first principles, why do we need to change it? Is it improving user experience? Please let me know if this sounds rude. I am here to learn.

}

void DlgPrefBroadcast::addSocialLinkRow(const QString& key, const QString& value) {
QWidget* rowWidget = new QWidget(this);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rowLayout->setContentsMargins(0, 0, 0, 0);

// Column 0: QComboBox (editable, no default items)
QComboBox* keyCombo = new QComboBox(rowWidget);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

QLineEdit

keyCombo->setEditable(true);
// As per review feedback, no default social platforms

if (!key.isEmpty()) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's check if both key and value are not empty (trim first)

}

void DlgPrefBroadcast::addSocialLinkRow(const QString& key, const QString& value) {
QWidget* rowWidget = new QWidget(this);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if (!key.isEmpty()) {
keyCombo->setCurrentText(key);
}
rowLayout->addWidget(keyCombo);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

with std::unique_ptr and QLineEdit:

Suggested change
rowLayout->addWidget(keyCombo);
rowLayout->addWidget(pKeyEdit.release());

since layout takes ownership

Comment on lines +743 to +745
void DlgPrefBroadcast::btnAddSocialLinkClicked() {
addSocialLinkRow();
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

would be good to align the function/var names with the UI labels and the object names in the ui file:
btnCustomMetadataAdd
btnCustomMetadataRemove
::btnCustomMetadataAddClicked()
etc.

// Column 0: QComboBox (editable, no default items)
QComboBox* keyCombo = new QComboBox(rowWidget);
keyCombo->setEditable(true);
// As per review feedback, no default social platforms

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

obsolete with QLineEdit

Suggested change
// As per review feedback, no default social platforms

@ronso0

ronso0 commented Mar 27, 2026

Copy link
Copy Markdown
Member

Thank you, mosty looks good and works as expected.
The combobox is still there. I left some comments.

Also, some UX ideas:

  1. when the profile has no custom metadata yet, let's show blank lineedits with an 'Add' button at the right
    -> after adding this becomes 'Remove'
    -> users know instantly how to populate and don't have to click 'Add' to prepare
    -> minor: might not be clear what happens when you click 'Add' with no metadata present
  2. nice to have (and to avoid button resizing when using 1.): use ➕ and 🗑️ icons instead of 'Add' and 'Remove'
    -> probably create both buttons and show only the relevant one
    -> also requires dark and light icons, see
    // Check the text color of the palette for whether to use dark or light icons
    if (!Color::isDimColor(palette().text().color())) {
    m_iconsPath.setPath(":/images/preferences/light/");
    } else {
    m_iconsPath.setPath(":/images/preferences/dark/");
    }

@github-actions

Copy link
Copy Markdown

This PR is marked as stale because it has been open 90 days with no activity.

@github-actions github-actions Bot added the stale Stale issues that haven't been updated for a long time. label Jun 26, 2026
@ronso0

ronso0 commented Jun 26, 2026

Copy link
Copy Markdown
Member

@prayag-kachhia Do you have time to finish this?

@github-actions github-actions Bot removed the stale Stale issues that haven't been updated for a long time. label Jun 27, 2026
@prayag-kachhia

Copy link
Copy Markdown
Author

@prayag-kachhia Do you have time to finish this?

Yes, I will finish this before the next weekend. Thanks for the push.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

update messenger fields in Broadcasting preferences

3 participants