From c76a92746dcf28e6d2452c77be0401aec5acd20f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois-Xavier=20Thomas?= Date: Sun, 5 Nov 2017 14:56:52 +0100 Subject: [PATCH] Issue #164: Show link to MusicBrainz release on album pages --- .../player/controller/MainController.java | 10 ++++++++++ .../java/org/airsonic/player/dao/AlbumDao.java | 13 ++++++++----- .../org/airsonic/player/dao/MediaFileDao.java | 14 +++++++++----- .../java/org/airsonic/player/domain/Album.java | 12 +++++++++++- .../org/airsonic/player/domain/MediaFile.java | 12 +++++++++++- .../player/service/MediaFileService.java | 1 + .../player/service/MediaScannerService.java | 3 +++ .../service/metadata/JaudiotaggerParser.java | 1 + .../player/service/metadata/MetaData.java | 9 +++++++++ .../liquibase/6.4/add-album-mb-release-id.xml | 17 +++++++++++++++++ .../6.4/add-media-file-mb-release-id.xml | 17 +++++++++++++++++ .../main/resources/liquibase/6.4/changelog.xml | 7 +++++++ .../main/resources/liquibase/db-changelog.xml | 3 ++- .../src/main/webapp/WEB-INF/jsp/albumMain.jsp | 5 +++++ 14 files changed, 111 insertions(+), 13 deletions(-) create mode 100644 airsonic-main/src/main/resources/liquibase/6.4/add-album-mb-release-id.xml create mode 100644 airsonic-main/src/main/resources/liquibase/6.4/add-media-file-mb-release-id.xml create mode 100644 airsonic-main/src/main/resources/liquibase/6.4/changelog.xml diff --git a/airsonic-main/src/main/java/org/airsonic/player/controller/MainController.java b/airsonic-main/src/main/java/org/airsonic/player/controller/MainController.java index 27a52bc9..2c91de3a 100644 --- a/airsonic-main/src/main/java/org/airsonic/player/controller/MainController.java +++ b/airsonic-main/src/main/java/org/airsonic/player/controller/MainController.java @@ -134,6 +134,7 @@ public class MainController { map.put("sieblingAlbums", sieblingAlbums); map.put("artist", guessArtist(children)); map.put("album", guessAlbum(children)); + map.put("musicBrainzReleaseId", guessMusicBrainzReleaseId(children)); } try { @@ -241,6 +242,15 @@ public class MainController { return null; } + private String guessMusicBrainzReleaseId(List children) { + for (MediaFile child : children) { + if (child.isFile() && child.getMusicBrainzReleaseId() != null) { + return child.getMusicBrainzReleaseId(); + } + } + return null; + } + private List getMultiFolderChildren(List mediaFiles) throws IOException { SortedSet result = new TreeSet<>(new MediaFileComparator(settingsService.isSortAlbumsByYear())); for (MediaFile mediaFile : mediaFiles) { diff --git a/airsonic-main/src/main/java/org/airsonic/player/dao/AlbumDao.java b/airsonic-main/src/main/java/org/airsonic/player/dao/AlbumDao.java index 2fbb685c..2fd823d6 100644 --- a/airsonic-main/src/main/java/org/airsonic/player/dao/AlbumDao.java +++ b/airsonic-main/src/main/java/org/airsonic/player/dao/AlbumDao.java @@ -40,7 +40,8 @@ import java.util.*; @Repository public class AlbumDao extends AbstractDao { private static final String INSERT_COLUMNS = "path, name, artist, song_count, duration_seconds, cover_art_path, " + - "year, genre, play_count, last_played, comment, created, last_scanned, present, folder_id"; + "year, genre, play_count, last_played, comment, created, last_scanned, present, " + + "folder_id, mb_release_id"; private static final String QUERY_COLUMNS = "id, " + INSERT_COLUMNS; @@ -127,19 +128,20 @@ public class AlbumDao extends AbstractDao { "created=?," + "last_scanned=?," + "present=?, " + - "folder_id=? " + + "folder_id=?, " + + "mb_release_id=? " + "where artist=? and name=?"; int n = update(sql, album.getPath(), album.getSongCount(), album.getDurationSeconds(), album.getCoverArtPath(), album.getYear(), album.getGenre(), album.getPlayCount(), album.getLastPlayed(), album.getComment(), album.getCreated(), - album.getLastScanned(), album.isPresent(), album.getFolderId(), album.getArtist(), album.getName()); + album.getLastScanned(), album.isPresent(), album.getFolderId(), album.getMusicBrainzReleaseId(), album.getArtist(), album.getName()); if (n == 0) { update("insert into album (" + INSERT_COLUMNS + ") values (" + questionMarks(INSERT_COLUMNS) + ")", album.getPath(), album.getName(), album.getArtist(), album.getSongCount(), album.getDurationSeconds(), album.getCoverArtPath(), album.getYear(), album.getGenre(), album.getPlayCount(), album.getLastPlayed(), - album.getComment(), album.getCreated(), album.getLastScanned(), album.isPresent(), album.getFolderId()); + album.getComment(), album.getCreated(), album.getLastScanned(), album.isPresent(), album.getFolderId(), album.getMusicBrainzReleaseId()); } int id = queryForInt("select id from album where artist=? and name=?", null, album.getArtist(), album.getName()); @@ -404,7 +406,8 @@ public class AlbumDao extends AbstractDao { rs.getTimestamp(13), rs.getTimestamp(14), rs.getBoolean(15), - rs.getInt(16)); + rs.getInt(16), + rs.getString(17)); } } } diff --git a/airsonic-main/src/main/java/org/airsonic/player/dao/MediaFileDao.java b/airsonic-main/src/main/java/org/airsonic/player/dao/MediaFileDao.java index c258cecc..c9e7e6f1 100644 --- a/airsonic-main/src/main/java/org/airsonic/player/dao/MediaFileDao.java +++ b/airsonic-main/src/main/java/org/airsonic/player/dao/MediaFileDao.java @@ -45,7 +45,8 @@ public class MediaFileDao extends AbstractDao { private static final Logger logger = LoggerFactory.getLogger(MediaFileDao.class); private static final String INSERT_COLUMNS = "path, folder, type, format, title, album, artist, album_artist, disc_number, " + "track_number, year, genre, bit_rate, variable_bit_rate, duration_seconds, file_size, width, height, cover_art_path, " + - "parent_path, play_count, last_played, comment, created, changed, last_scanned, children_last_updated, present, version"; + "parent_path, play_count, last_played, comment, created, changed, last_scanned, children_last_updated, present, " + + "version, mb_release_id"; private static final String QUERY_COLUMNS = "id, " + INSERT_COLUMNS; private static final String GENRE_COLUMNS = "name, song_count, album_count"; @@ -162,7 +163,8 @@ public class MediaFileDao extends AbstractDao { "last_scanned=?," + "children_last_updated=?," + "present=?, " + - "version=? " + + "version=?, " + + "mb_release_id=? " + "where path=?"; logger.trace("Updating media file {}", Util.debugObject(file)); @@ -172,7 +174,8 @@ public class MediaFileDao extends AbstractDao { file.getAlbumArtist(), file.getDiscNumber(), file.getTrackNumber(), file.getYear(), file.getGenre(), file.getBitRate(), file.isVariableBitRate(), file.getDurationSeconds(), file.getFileSize(), file.getWidth(), file.getHeight(), file.getCoverArtPath(), file.getParentPath(), file.getPlayCount(), file.getLastPlayed(), file.getComment(), - file.getChanged(), file.getLastScanned(), file.getChildrenLastUpdated(), file.isPresent(), VERSION, file.getPath()); + file.getChanged(), file.getLastScanned(), file.getChildrenLastUpdated(), file.isPresent(), VERSION, + file.getMusicBrainzReleaseId(), file.getPath()); if (n == 0) { @@ -190,7 +193,7 @@ public class MediaFileDao extends AbstractDao { file.isVariableBitRate(), file.getDurationSeconds(), file.getFileSize(), file.getWidth(), file.getHeight(), file.getCoverArtPath(), file.getParentPath(), file.getPlayCount(), file.getLastPlayed(), file.getComment(), file.getCreated(), file.getChanged(), file.getLastScanned(), - file.getChildrenLastUpdated(), file.isPresent(), VERSION); + file.getChildrenLastUpdated(), file.isPresent(), VERSION, file.getMusicBrainzReleaseId()); } int id = queryForInt("select id from media_file where path=?", null, file.getPath()); @@ -717,7 +720,8 @@ public class MediaFileDao extends AbstractDao { rs.getTimestamp(27), rs.getTimestamp(28), rs.getBoolean(29), - rs.getInt(30)); + rs.getInt(30), + rs.getString(31)); } } diff --git a/airsonic-main/src/main/java/org/airsonic/player/domain/Album.java b/airsonic-main/src/main/java/org/airsonic/player/domain/Album.java index 33723264..ca4102da 100644 --- a/airsonic-main/src/main/java/org/airsonic/player/domain/Album.java +++ b/airsonic-main/src/main/java/org/airsonic/player/domain/Album.java @@ -43,13 +43,14 @@ public class Album { private Date lastScanned; private boolean present; private Integer folderId; + private String musicBrainzReleaseId; public Album() { } public Album(int id, String path, String name, String artist, int songCount, int durationSeconds, String coverArtPath, Integer year, String genre, int playCount, Date lastPlayed, String comment, Date created, Date lastScanned, - boolean present, Integer folderId) { + boolean present, Integer folderId, String musicBrainzReleaseId) { this.id = id; this.path = path; this.name = name; @@ -66,6 +67,7 @@ public class Album { this.lastScanned = lastScanned; this.folderId = folderId; this.present = present; + this.musicBrainzReleaseId = musicBrainzReleaseId; } public int getId() { @@ -195,4 +197,12 @@ public class Album { public Integer getFolderId() { return folderId; } + + public String getMusicBrainzReleaseId() { + return musicBrainzReleaseId; + } + + public void setMusicBrainzReleaseId(String musicBrainzReleaseId) { + this.musicBrainzReleaseId = musicBrainzReleaseId; + } } 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 b026da93..7b7e0cc7 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 @@ -67,12 +67,13 @@ public class MediaFile { private Date childrenLastUpdated; private boolean present; private int version; + private String musicBrainzReleaseId; public MediaFile(int id, String path, String folder, MediaType mediaType, String format, String title, String albumName, String artist, String albumArtist, Integer discNumber, Integer trackNumber, Integer year, String genre, Integer bitRate, boolean variableBitRate, Integer durationSeconds, Long fileSize, Integer width, Integer height, String coverArtPath, String parentPath, int playCount, Date lastPlayed, String comment, Date created, Date changed, Date lastScanned, - Date childrenLastUpdated, boolean present, int version) { + Date childrenLastUpdated, boolean present, int version, String musicBrainzReleaseId) { this.id = id; this.path = path; this.folder = folder; @@ -103,6 +104,7 @@ public class MediaFile { this.childrenLastUpdated = childrenLastUpdated; this.present = present; this.version = version; + this.musicBrainzReleaseId = musicBrainzReleaseId; } public MediaFile() { @@ -405,6 +407,14 @@ public class MediaFile { this.starredDate = starredDate; } + public String getMusicBrainzReleaseId() { + return musicBrainzReleaseId; + } + + public void setMusicBrainzReleaseId(String musicBrainzReleaseId) { + this.musicBrainzReleaseId = musicBrainzReleaseId; + } + /** * Returns when the children was last updated in the database. */ 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 fe173b95..68e78a15 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 @@ -503,6 +503,7 @@ public class MediaFileService { mediaFile.setVariableBitRate(metaData.getVariableBitRate()); mediaFile.setHeight(metaData.getHeight()); mediaFile.setWidth(metaData.getWidth()); + mediaFile.setMusicBrainzReleaseId(metaData.getMusicBrainzReleaseId()); } String format = StringUtils.trimToNull(StringUtils.lowerCase(FilenameUtils.getExtension(mediaFile.getPath()))); mediaFile.setFormat(format); diff --git a/airsonic-main/src/main/java/org/airsonic/player/service/MediaScannerService.java b/airsonic-main/src/main/java/org/airsonic/player/service/MediaScannerService.java index c7fcde2b..427346b5 100644 --- a/airsonic-main/src/main/java/org/airsonic/player/service/MediaScannerService.java +++ b/airsonic-main/src/main/java/org/airsonic/player/service/MediaScannerService.java @@ -298,6 +298,9 @@ public class MediaScannerService { album.setArtist(artist); album.setCreated(file.getChanged()); } + if (file.getMusicBrainzReleaseId() != null) { + album.setMusicBrainzReleaseId(file.getMusicBrainzReleaseId()); + } if (file.getYear() != null) { album.setYear(file.getYear()); } 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 6ed31550..a469572b 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 @@ -92,6 +92,7 @@ public class JaudiotaggerParser extends MetaDataParser { metaData.setGenre(mapGenre(getTagField(tag, FieldKey.GENRE))); metaData.setDiscNumber(parseInteger(getTagField(tag, FieldKey.DISC_NO))); metaData.setTrackNumber(parseTrackNumber(getTagField(tag, FieldKey.TRACK))); + metaData.setMusicBrainzReleaseId(getTagField(tag, FieldKey.MUSICBRAINZ_RELEASEID)); String songArtist = getTagField(tag, FieldKey.ARTIST); String albumArtist = getTagField(tag, FieldKey.ALBUM_ARTIST); 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 02e9949d..1a2f615f 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 @@ -38,6 +38,7 @@ public class MetaData { private Integer durationSeconds; private Integer width; private Integer height; + private String musicBrainzReleaseId; public Integer getDiscNumber() { return discNumber; @@ -142,4 +143,12 @@ public class MetaData { public void setHeight(Integer height) { this.height = height; } + + public String getMusicBrainzReleaseId() { + return musicBrainzReleaseId; + } + + public void setMusicBrainzReleaseId(String musicBrainzReleaseId) { + this.musicBrainzReleaseId = musicBrainzReleaseId; + } } diff --git a/airsonic-main/src/main/resources/liquibase/6.4/add-album-mb-release-id.xml b/airsonic-main/src/main/resources/liquibase/6.4/add-album-mb-release-id.xml new file mode 100644 index 00000000..d8240b48 --- /dev/null +++ b/airsonic-main/src/main/resources/liquibase/6.4/add-album-mb-release-id.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/airsonic-main/src/main/resources/liquibase/6.4/add-media-file-mb-release-id.xml b/airsonic-main/src/main/resources/liquibase/6.4/add-media-file-mb-release-id.xml new file mode 100644 index 00000000..5ce5d45a --- /dev/null +++ b/airsonic-main/src/main/resources/liquibase/6.4/add-media-file-mb-release-id.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/airsonic-main/src/main/resources/liquibase/6.4/changelog.xml b/airsonic-main/src/main/resources/liquibase/6.4/changelog.xml new file mode 100644 index 00000000..1042817c --- /dev/null +++ b/airsonic-main/src/main/resources/liquibase/6.4/changelog.xml @@ -0,0 +1,7 @@ + + + + diff --git a/airsonic-main/src/main/resources/liquibase/db-changelog.xml b/airsonic-main/src/main/resources/liquibase/db-changelog.xml index 052fb226..59768f89 100644 --- a/airsonic-main/src/main/resources/liquibase/db-changelog.xml +++ b/airsonic-main/src/main/resources/liquibase/db-changelog.xml @@ -10,4 +10,5 @@ - \ No newline at end of file + + diff --git a/airsonic-main/src/main/webapp/WEB-INF/jsp/albumMain.jsp b/airsonic-main/src/main/webapp/WEB-INF/jsp/albumMain.jsp index ed97fdfe..105c7b96 100644 --- a/airsonic-main/src/main/webapp/WEB-INF/jsp/albumMain.jsp +++ b/airsonic-main/src/main/webapp/WEB-INF/jsp/albumMain.jsp @@ -262,6 +262,11 @@ Wikipedia | allmusic | Last.fm | + + + + MusicBrainz | +