diff --git a/build.gradle b/build.gradle index ec24f86..6ec448d 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { } group = 'com.josdem.jmetadata' -version = '1.3.4' +version = '1.3.5' java { toolchain { diff --git a/src/main/java/com/josdem/jmetadata/controller/CompleteController.java b/src/main/java/com/josdem/jmetadata/controller/CompleteController.java index 715e596..2762d13 100644 --- a/src/main/java/com/josdem/jmetadata/controller/CompleteController.java +++ b/src/main/java/com/josdem/jmetadata/controller/CompleteController.java @@ -38,12 +38,12 @@ import java.util.List; import javax.annotation.PostConstruct; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.asmatron.messengine.annotations.RequestMethod; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import retrofit2.Response; +@Slf4j @Controller @RequiredArgsConstructor public class CompleteController { @@ -57,8 +57,6 @@ public class CompleteController { private RestService restService; private CoverArtRestService coverArtRestService; - private final Logger log = LoggerFactory.getLogger(this.getClass()); - @PostConstruct void setup() { restService = RetrofitHelper.getRetrofit().create(RestService.class); @@ -85,6 +83,9 @@ public synchronized ActionResult completeAlbumMetadata(List metadataLi String albumName = metadataList.getFirst().getAlbum(); ApplicationState.cache.put(albumName, musicBrainzResponse); log.info("MusicBrainz Response: {}", musicBrainzResponse); + if (musicBrainzResponse.getReleases().isEmpty()) { + return ActionResult.Ready; + } Album album = musicBrainzService.getAlbumByName(albumName); log.info("MusicBrainz Album: {}", album); musicBrainzService.completeYear(metadataList, album); @@ -116,7 +117,7 @@ public ActionResult completeLastFmMetadata(List metadataList) { if (!lastFMCompleteServiceAdapter.canComplete(metadataList)) { return ActionResult.Ready; } - metadataList.forEach(metadata -> lastfmService.completeLastFM(metadata)); + metadataList.forEach(lastfmService::completeLastFM); return ActionResult.New; } diff --git a/src/main/java/com/josdem/jmetadata/gui/MainWindow.java b/src/main/java/com/josdem/jmetadata/gui/MainWindow.java index 850ab84..4019549 100644 --- a/src/main/java/com/josdem/jmetadata/gui/MainWindow.java +++ b/src/main/java/com/josdem/jmetadata/gui/MainWindow.java @@ -949,10 +949,9 @@ protected Boolean doInBackground() throws Exception { public void onResponse(ActionResult response) { updateStatus(counter++, metadataList.size()); log.info( - "response in getting from MusicBrainz album " - + metadata.getTitle() - + ": " - + response); + "response in getting information from MusicBrainz track{}: {}", + metadata.getTitle(), + response); if (response.equals(ActionResult.New)) { metadataWithAlbum.add(metadata); getDescriptionTable() diff --git a/src/main/java/com/josdem/jmetadata/service/impl/LastFMCompleteServiceAdapter.java b/src/main/java/com/josdem/jmetadata/service/impl/LastFMCompleteServiceAdapter.java index ea440d9..c5f9f16 100644 --- a/src/main/java/com/josdem/jmetadata/service/impl/LastFMCompleteServiceAdapter.java +++ b/src/main/java/com/josdem/jmetadata/service/impl/LastFMCompleteServiceAdapter.java @@ -38,8 +38,7 @@ public class LastFMCompleteServiceAdapter implements CompleteService { @Override public boolean canComplete(List metadataList) { - return (!metadataService.isSameAlbum(metadataList) - || !metadataService.isSameArtist(metadataList)); + return metadataService.isSameAlbum(metadataList) || metadataService.isSameArtist(metadataList); } @Override diff --git a/src/main/java/com/josdem/jmetadata/service/impl/MusicBrainzCompleteServiceAdapter.java b/src/main/java/com/josdem/jmetadata/service/impl/MusicBrainzCompleteServiceAdapter.java index 85bff43..b2ef1d3 100644 --- a/src/main/java/com/josdem/jmetadata/service/impl/MusicBrainzCompleteServiceAdapter.java +++ b/src/main/java/com/josdem/jmetadata/service/impl/MusicBrainzCompleteServiceAdapter.java @@ -38,8 +38,7 @@ public class MusicBrainzCompleteServiceAdapter implements CompleteService { @Override public boolean canComplete(List metadataList) { - return (!metadataService.isSameAlbum(metadataList) - || !metadataService.isSameArtist(metadataList)); + return metadataService.isSameAlbum(metadataList) || metadataService.isSameArtist(metadataList); } @Override diff --git a/src/test/java/com/josdem/jmetadata/service/LastFmCompleteServiceAdapterTest.java b/src/test/java/com/josdem/jmetadata/service/LastFmCompleteServiceAdapterTest.java new file mode 100644 index 0000000..2fd2b21 --- /dev/null +++ b/src/test/java/com/josdem/jmetadata/service/LastFmCompleteServiceAdapterTest.java @@ -0,0 +1,75 @@ +/* + Copyright 2025 Jose Morales contact@josdem.io + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.service; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.when; + +import com.josdem.jmetadata.model.Metadata; +import com.josdem.jmetadata.service.impl.LastFMCompleteServiceAdapter; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@Slf4j +class LastFmCompleteServiceAdapterTest { + + private LastFMCompleteServiceAdapter lastFMCompleteServiceAdapter; + + @Mock private LastFMCompleteService lastFMCompleteService; + @Mock private MetadataService metadataService; + + private final Metadata metadata = new Metadata(); + + @BeforeEach + void setup() { + MockitoAnnotations.openMocks(this); + lastFMCompleteServiceAdapter = + new LastFMCompleteServiceAdapter(lastFMCompleteService, metadataService); + } + + @Test + @DisplayName("detecting I can complete metadata due to same album") + void shouldDetectIfCanCompleteMetadataDueToSameAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + when(metadataService.isSameAlbum(List.of(metadata))).thenReturn(true); + assertTrue(lastFMCompleteServiceAdapter.canComplete(List.of(metadata))); + } + + @Test + @DisplayName("detecting I can complete metadata due to same artist") + void shouldDetectIfCanCompleteMetadataDueToSameArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + when(metadataService.isSameArtist(List.of(metadata))).thenReturn(true); + assertTrue(lastFMCompleteServiceAdapter.canComplete(List.of(metadata))); + } + + @Test + @DisplayName("detecting I cannot complete metadata") + void shouldDetectIfCannotCompleteMetadata(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + when(metadataService.isSameAlbum(List.of(metadata))).thenReturn(false); + when(metadataService.isSameArtist(List.of(metadata))).thenReturn(false); + assertFalse(lastFMCompleteServiceAdapter.canComplete(List.of(metadata))); + } +} diff --git a/src/test/java/com/josdem/jmetadata/service/MusicBrainzCompleteServiceAdapterTest.java b/src/test/java/com/josdem/jmetadata/service/MusicBrainzCompleteServiceAdapterTest.java new file mode 100644 index 0000000..7408367 --- /dev/null +++ b/src/test/java/com/josdem/jmetadata/service/MusicBrainzCompleteServiceAdapterTest.java @@ -0,0 +1,75 @@ +/* + Copyright 2025 Jose Morales contact@josdem.io + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.service; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.when; + +import com.josdem.jmetadata.model.Metadata; +import com.josdem.jmetadata.service.impl.MusicBrainzCompleteServiceAdapter; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@Slf4j +class MusicBrainzCompleteServiceAdapterTest { + + private MusicBrainzCompleteServiceAdapter musicBrainzCompleteServiceAdapter; + + @Mock private MusicBrainzService musicBrainzService; + @Mock private MetadataService metadataService; + + private final Metadata metadata = new Metadata(); + + @BeforeEach + void setup() { + MockitoAnnotations.openMocks(this); + musicBrainzCompleteServiceAdapter = + new MusicBrainzCompleteServiceAdapter(musicBrainzService, metadataService); + } + + @Test + @DisplayName("detecting I can complete metadata due to same album") + void shouldDetectIfCanCompleteMetadataDueToSameAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + when(metadataService.isSameAlbum(List.of(metadata))).thenReturn(true); + assertTrue(musicBrainzCompleteServiceAdapter.canComplete(List.of(metadata))); + } + + @Test + @DisplayName("detecting I can complete metadata due to same artist") + void shouldDetectIfCanCompleteMetadataDueToSameArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + when(metadataService.isSameArtist(List.of(metadata))).thenReturn(true); + assertTrue(musicBrainzCompleteServiceAdapter.canComplete(List.of(metadata))); + } + + @Test + @DisplayName("detecting I cannot complete metadata") + void shouldDetectIfCannotCompleteMetadata(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + when(metadataService.isSameAlbum(List.of(metadata))).thenReturn(false); + when(metadataService.isSameArtist(List.of(metadata))).thenReturn(false); + assertFalse(musicBrainzCompleteServiceAdapter.canComplete(List.of(metadata))); + } +}