From 13dc2b5bd0e452d6197579d0e64cd6da9133c214 Mon Sep 17 00:00:00 2001 From: litebito <3867999+litebito@users.noreply.github.com> Date: Wed, 20 May 2026 09:19:55 +0200 Subject: [PATCH] OpenSubsonic: Child.sortName (fixes #135) (#197) * OpenSubsonic: add Child.sortName from FieldKey.TITLE_SORT Bump pom to 13.2.0-SNAPSHOT to start the 13.2.x cycle. fixes #135 * OpenSubsonic: add Child.sortName from FieldKey.TITLE_SORT Bump pom to 13.2.0-SNAPSHOT to start the 13.2.x cycle. fixes #135 --------- Co-authored-by: litebito --- airsonic-main/pom.xml | 2 +- .../org/airsonic/player/domain/MediaFile.java | 13 ++++++++++++- .../player/service/JaxbContentService.java | 1 + .../player/service/MediaFileService.java | 1 + .../service/metadata/JaudiotaggerParser.java | 1 + .../player/service/metadata/MetaData.java | 9 +++++++++ .../liquibase/13.2/add-media-file-sort-name.xml | 17 +++++++++++++++++ .../main/resources/liquibase/13.2/changelog.xml | 6 ++++++ .../main/resources/liquibase/db-changelog.xml | 1 + airsonic-sonos-api/pom.xml | 2 +- docs/release-notes/v13.2.0.md | 10 ++++++++++ install/docker/pom.xml | 4 ++-- integration-test/pom.xml | 2 +- pom.xml | 2 +- subsonic-rest-api/pom.xml | 2 +- .../src/main/resources/subsonic-rest-api.xsd | 1 + 16 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 airsonic-main/src/main/resources/liquibase/13.2/add-media-file-sort-name.xml create mode 100644 airsonic-main/src/main/resources/liquibase/13.2/changelog.xml create mode 100644 docs/release-notes/v13.2.0.md diff --git a/airsonic-main/pom.xml b/airsonic-main/pom.xml index 6e0462d1..10db4ce6 100644 --- a/airsonic-main/pom.xml +++ b/airsonic-main/pom.xml @@ -6,7 +6,7 @@ org.airsonic.player airsonic - 13.1.0 + 13.2.0-SNAPSHOT airsonic-main diff --git a/airsonic-main/src/main/java/org/airsonic/player/domain/MediaFile.java b/airsonic-main/src/main/java/org/airsonic/player/domain/MediaFile.java index bbf7da7e..a387f6de 100644 --- a/airsonic-main/src/main/java/org/airsonic/player/domain/MediaFile.java +++ b/airsonic-main/src/main/java/org/airsonic/player/domain/MediaFile.java @@ -70,6 +70,9 @@ public class MediaFile { @Column(name = "title", nullable = true) private String title; + @Column(name = "sort_name", nullable = true) + private String sortName; + @Column(name = "album", nullable = true) private String albumName; @@ -284,6 +287,14 @@ public class MediaFile { this.title = title; } + public String getSortName() { + return sortName; + } + + public void setSortName(String sortName) { + this.sortName = sortName; + } + public String getAlbumName() { return albumName; } @@ -567,7 +578,7 @@ public class MediaFile { public static final double NOT_INDEXED = -1.0; - public static final int VERSION = 4; + public static final int VERSION = 5; public static enum MediaType { MUSIC, diff --git a/airsonic-main/src/main/java/org/airsonic/player/service/JaxbContentService.java b/airsonic-main/src/main/java/org/airsonic/player/service/JaxbContentService.java index 45b7f6c6..fe50e081 100644 --- a/airsonic-main/src/main/java/org/airsonic/player/service/JaxbContentService.java +++ b/airsonic-main/src/main/java/org/airsonic/player/service/JaxbContentService.java @@ -146,6 +146,7 @@ public class JaxbContentService { // Ignored. } child.setTitle(mediaFile.getName()); + child.setSortName(mediaFile.getSortName()); child.setAlbum(mediaFile.getAlbumName()); child.setArtist(mediaFile.getArtist()); child.setIsDir(mediaFile.isDirectory()); diff --git a/airsonic-main/src/main/java/org/airsonic/player/service/MediaFileService.java b/airsonic-main/src/main/java/org/airsonic/player/service/MediaFileService.java index b870a43d..c3bdf74e 100644 --- a/airsonic-main/src/main/java/org/airsonic/player/service/MediaFileService.java +++ b/airsonic-main/src/main/java/org/airsonic/player/service/MediaFileService.java @@ -1014,6 +1014,7 @@ public class MediaFileService { mediaFile.setAlbumArtist(metaData.getAlbumArtist()); mediaFile.setAlbumName(metaData.getAlbumName()); mediaFile.setTitle(metaData.getTitle()); + mediaFile.setSortName(metaData.getSortName()); mediaFile.setDiscNumber(metaData.getDiscNumber()); mediaFile.setTrackNumber(metaData.getTrackNumber()); mediaFile.setGenre(metaData.getGenre()); diff --git a/airsonic-main/src/main/java/org/airsonic/player/service/metadata/JaudiotaggerParser.java b/airsonic-main/src/main/java/org/airsonic/player/service/metadata/JaudiotaggerParser.java index 57a34c8b..b0fb9d1a 100644 --- a/airsonic-main/src/main/java/org/airsonic/player/service/metadata/JaudiotaggerParser.java +++ b/airsonic-main/src/main/java/org/airsonic/player/service/metadata/JaudiotaggerParser.java @@ -88,6 +88,7 @@ public class JaudiotaggerParser extends MetaDataParser { if (tag != null) { metaData.setAlbumName(getTagField(tag, FieldKey.ALBUM)); metaData.setTitle(getTagField(tag, FieldKey.TITLE)); + metaData.setSortName(getTagField(tag, FieldKey.TITLE_SORT)); metaData.setYear(parseIntegerPattern(getTagField(tag, FieldKey.YEAR), YEAR_NUMBER_PATTERN)); metaData.setGenre(mapGenre(getTagField(tag, FieldKey.GENRE))); metaData.setDiscNumber(parseIntegerPattern(getTagField(tag, FieldKey.DISC_NO), null)); diff --git a/airsonic-main/src/main/java/org/airsonic/player/service/metadata/MetaData.java b/airsonic-main/src/main/java/org/airsonic/player/service/metadata/MetaData.java index 5d8112eb..fc55d848 100644 --- a/airsonic-main/src/main/java/org/airsonic/player/service/metadata/MetaData.java +++ b/airsonic-main/src/main/java/org/airsonic/player/service/metadata/MetaData.java @@ -33,6 +33,7 @@ public class MetaData { private Integer discNumber; private Integer trackNumber; private String title; + private String sortName; private String artist; private String albumArtist; private String albumName; @@ -72,6 +73,14 @@ public class MetaData { this.title = title; } + public String getSortName() { + return sortName; + } + + public void setSortName(String sortName) { + this.sortName = sortName; + } + public String getAlbumArtist() { return albumArtist; } diff --git a/airsonic-main/src/main/resources/liquibase/13.2/add-media-file-sort-name.xml b/airsonic-main/src/main/resources/liquibase/13.2/add-media-file-sort-name.xml new file mode 100644 index 00000000..f459ad30 --- /dev/null +++ b/airsonic-main/src/main/resources/liquibase/13.2/add-media-file-sort-name.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/airsonic-main/src/main/resources/liquibase/13.2/changelog.xml b/airsonic-main/src/main/resources/liquibase/13.2/changelog.xml new file mode 100644 index 00000000..f9b867d6 --- /dev/null +++ b/airsonic-main/src/main/resources/liquibase/13.2/changelog.xml @@ -0,0 +1,6 @@ + + + diff --git a/airsonic-main/src/main/resources/liquibase/db-changelog.xml b/airsonic-main/src/main/resources/liquibase/db-changelog.xml index 1d4408c9..ffe0ad51 100644 --- a/airsonic-main/src/main/resources/liquibase/db-changelog.xml +++ b/airsonic-main/src/main/resources/liquibase/db-changelog.xml @@ -23,4 +23,5 @@ + diff --git a/airsonic-sonos-api/pom.xml b/airsonic-sonos-api/pom.xml index 344ba596..290e80b0 100644 --- a/airsonic-sonos-api/pom.xml +++ b/airsonic-sonos-api/pom.xml @@ -8,7 +8,7 @@ org.airsonic.player airsonic - 13.1.0 + 13.2.0-SNAPSHOT diff --git a/docs/release-notes/v13.2.0.md b/docs/release-notes/v13.2.0.md new file mode 100644 index 00000000..1f3f2582 --- /dev/null +++ b/docs/release-notes/v13.2.0.md @@ -0,0 +1,10 @@ +# Airsonic-Pulse v13.2.0 + +## Library rescan required + +* #135 introduces a `sortName` column on `media_file` populated from `FieldKey.TITLE_SORT`. + Existing rows are re-scanned automatically via the `MediaFile.VERSION` bump. + +## OpenSubsonic + +* #135 OpenSubsonic: Child.sortName from FieldKey.TITLE_SORT diff --git a/install/docker/pom.xml b/install/docker/pom.xml index baa2f80d..5b97fee5 100644 --- a/install/docker/pom.xml +++ b/install/docker/pom.xml @@ -5,7 +5,7 @@ ../../pom.xml airsonic - 13.1.0 + 13.2.0-SNAPSHOT org.airsonic.player pom @@ -16,7 +16,7 @@ org.airsonic.player airsonic-main - 13.1.0 + 13.2.0-SNAPSHOT war diff --git a/integration-test/pom.xml b/integration-test/pom.xml index ebd4ec4c..92ae0eca 100644 --- a/integration-test/pom.xml +++ b/integration-test/pom.xml @@ -9,7 +9,7 @@ org.airsonic.player airsonic - 13.1.0 + 13.2.0-SNAPSHOT diff --git a/pom.xml b/pom.xml index 2c695b0e..9ac43747 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 org.airsonic.player airsonic - 13.1.0 + 13.2.0-SNAPSHOT Airsonic-Pulse pom diff --git a/subsonic-rest-api/pom.xml b/subsonic-rest-api/pom.xml index c1b69736..e1878c56 100644 --- a/subsonic-rest-api/pom.xml +++ b/subsonic-rest-api/pom.xml @@ -8,7 +8,7 @@ org.airsonic.player airsonic - 13.1.0 + 13.2.0-SNAPSHOT diff --git a/subsonic-rest-api/src/main/resources/subsonic-rest-api.xsd b/subsonic-rest-api/src/main/resources/subsonic-rest-api.xsd index 67544ac1..76950ffa 100644 --- a/subsonic-rest-api/src/main/resources/subsonic-rest-api.xsd +++ b/subsonic-rest-api/src/main/resources/subsonic-rest-api.xsd @@ -269,6 +269,7 @@ +