Skip to content

Commit 3150bb4

Browse files
authored
Merge pull request #211 from Brskt/fix-tidaltags-dom-recycling
fix(TidalTags): properly update tags when DOM is recycled
2 parents c5b557e + 62e5172 commit 3150bb4

3 files changed

Lines changed: 28 additions & 5 deletions

File tree

plugins/TidalTags/src/index.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export { Settings, unloads };
1111

1212
new StyleTag("TidalTags", unloads, styles);
1313

14-
observe(unloads, 'div[data-test="tracklist-row"]', async (trackRow) => {
14+
const updateTrackRow = async (trackRow: Element) => {
1515
if (!settings.displayQalityTags && !settings.displayFormatColumns) return;
1616
const trackId = trackRow.getAttribute("data-track-id");
1717
if (trackId == null) return;
@@ -21,7 +21,25 @@ observe(unloads, 'div[data-test="tracklist-row"]', async (trackRow) => {
2121

2222
if (settings.displayQalityTags) setQualityTags(trackRow, mediaItem);
2323
if (settings.displayFormatColumns) await setFormatColumns(trackRow, mediaItem);
24+
};
25+
26+
// Observe new tracklist rows
27+
observe(unloads, 'div[data-test="tracklist-row"]', updateTrackRow);
28+
29+
// Observe data-track-id attribute changes (DOM recycling)
30+
const attrObserver = new MutationObserver((mutations) => {
31+
for (const mutation of mutations) {
32+
if (mutation.type === "attributes" && mutation.attributeName === "data-track-id") {
33+
updateTrackRow(mutation.target as Element);
34+
}
35+
}
36+
});
37+
attrObserver.observe(document.body, {
38+
subtree: true,
39+
attributes: true,
40+
attributeFilter: ["data-track-id"],
2441
});
42+
unloads.add(() => attrObserver.disconnect());
2543

2644
MediaItem.onMediaTransition(unloads, setFormatInfo);
2745
MediaItem.fromPlaybackContext().then(setFormatInfo);

plugins/TidalTags/src/lib/setColumn.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ import { isElement } from "./isElement";
22

33
export const setColumn = (trackRow: Element, name: string, sourceSelector: string, content: HTMLElement, beforeSelector?: string | Element) => {
44
let column = trackRow.querySelector<HTMLElement>(`div[data-test="${name}"]`);
5-
if (column !== null) return;
5+
if (column !== null) {
6+
column.innerHTML = "";
7+
column.appendChild(content);
8+
return column;
9+
}
610

711
const sourceColumn = trackRow.querySelector<HTMLElement>(sourceSelector);
812
if (sourceColumn === null) return;

plugins/TidalTags/src/setQualityTags.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ export const setQualityTags = (trackRow: Element, mediaItem: MediaItem) => {
66

77
const { qualityTags, bestQuality } = mediaItem;
88
const id = String(mediaItem.id);
9-
if (qualityTags.length === 0) return;
10-
11-
if (qualityTags.length === 1 && qualityTags[0] === Quality.High && bestQuality === Quality.High) return;
129

1310
let span = trackTitle.querySelector(".quality-tag-container");
1411
if (span?.getAttribute("track-id") === id) return;
1512

13+
// Remove old span before checking if we need a new one
1614
span?.remove();
15+
16+
if (qualityTags.length === 0) return;
17+
if (qualityTags.length === 1 && qualityTags[0] === Quality.High && bestQuality === Quality.High) return;
1718
span = document.createElement("span");
1819

1920
span.className = "quality-tag-container";

0 commit comments

Comments
 (0)