Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
ecb64bd
#118 Adding Kotlin configuration
josdem Apr 20, 2025
3e7a9ca
#118 Adding application context singleton test
josdem Apr 20, 2025
9775bc2
#118 Making application context singleton test pass
josdem Apr 20, 2025
dcd5ee2
#118 Translating artwork helper test to kotlin
josdem Apr 20, 2025
e45c175
#118 Translating audio file helper test to kotlin
josdem Apr 20, 2025
4606aa2
#118 Translating expoerter helper test to kotlin
josdem Apr 20, 2025
819c4c5
#118 Translating expoerter helper test to kotlin
josdem Apr 20, 2025
b2b52e2
#118 Translating formatter helper test to kotlin
josdem Apr 20, 2025
799c795
#118 Translating formatter helper test to kotlin
josdem Apr 20, 2025
975e072
#118 improving test
josdem Apr 20, 2025
fcaf1b0
#118 Translating image exporter helper test to kotlin
josdem Apr 20, 2025
db44052
#118 Translating should export different images to Kotlin
josdem Apr 21, 2025
60becac
#118 Translating should not export when no image to Kotlin
josdem Apr 21, 2025
c0053df
#118 Moving image service test to the right package
josdem Apr 21, 2025
eca5a22
#118 Translating lastFM album helper test to kotlin
josdem Apr 21, 2025
78b7dc5
#118 Translating lastFM album helper missing test to kotlin
josdem Apr 21, 2025
f548092
#118 Translating lastFM authenticator test to kotlin
josdem Apr 21, 2025
42e2f25
#118 Translating lastFM authenticator test to kotlin
josdem Apr 21, 2025
8625e82
#118 Translating lastFM authenticator missing test to kotlin
josdem Apr 21, 2025
c8954d1
#118 Translating metadata adapter test to kotlin
josdem Apr 21, 2025
1ff1d41
#118 Translating metadata adapter test to kotlin
josdem Apr 21, 2025
6c9284b
#118 Translating metadata exproter test to kotlin
josdem Apr 21, 2025
e983fb1
#118 Translating metadata helper test to kotlin
josdem Apr 21, 2025
77cc78f
#118 Translating reader helper test to kotlin
josdem Apr 21, 2025
444adaf
#118 Translating scrobbler helper test to kotlin
josdem Apr 21, 2025
e83811d
#118 Translating scrobbler helper missing test to kotlin
josdem Apr 21, 2025
c77fa2b
#118 Updating version
josdem Apr 21, 2025
50b333f
#118 Updating version
josdem Apr 21, 2025
a1dfa67
#118 Deleting public modifier
josdem Apr 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,25 @@ plugins {
id 'application'
id 'jacoco'
id 'org.sonarqube' version '6.0.0.5145'
id 'com.diffplug.spotless' version '6.25.0'
id 'com.diffplug.spotless' version '7.0.2'
id 'org.springframework.boot' version '3.4.1'
id 'io.spring.dependency-management' version '1.1.7'
id 'org.jetbrains.kotlin.jvm' version '2.1.20'
}

group = 'com.josdem.jmetadata'
version = '1.4.2'
version = '1.4.3'

java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}

kotlin {
jvmToolchain(21)
}

application {
mainClass = 'com.josdem.jmetadata.Launcher'
}
Expand All @@ -34,6 +39,7 @@ ext {
mockitoVersion = '3.12.4'
mockitoInlineVersion = '5.2.0'
targetDir = "src/main/java/com/josdem/jmetadata"
mockitoKotlinVersion = "5.4.0"
}

configurations {
Expand All @@ -56,6 +62,15 @@ spotless {
removeUnusedImports()
endWithNewline()
}
kotlin {
target fileTree('.') {
include 'src/**/*.kt'
exclude '/build/**'
}
ktlint()
trimTrailingWhitespace()
endWithNewline()
}
}

dependencies {
Expand All @@ -79,6 +94,7 @@ dependencies {
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
implementation files('lib/last.fm-bindings-0.1.0.jar')
}

Expand Down
7 changes: 4 additions & 3 deletions src/main/java/com/josdem/jmetadata/helper/ExporterHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,18 @@
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.jaudiotagger.audio.exceptions.CannotReadException;
import org.jaudiotagger.audio.exceptions.ReadOnlyFileException;
import org.jaudiotagger.tag.TagException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class ExporterHelper {

@Autowired private ImageExporter imageExporter;
@Autowired private MetadataExporter metadataExporter;
private final ImageExporter imageExporter;
private final MetadataExporter metadataExporter;

public ActionResult export(ExportPackage exportPackage)
throws IOException,
Expand Down
10 changes: 4 additions & 6 deletions src/main/java/com/josdem/jmetadata/helper/LastFMAlbumHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,8 @@
import com.josdem.jmetadata.Auth;
import com.josdem.jmetadata.model.GenreTypes;
import de.umass.lastfm.Album;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
Expand All @@ -35,14 +34,13 @@ public Album getAlbum(String artist, String album) {
return Album.getInfo(artist, album, Auth.KEY);
}

public String getYear(Date releaseDate) {
public String getYear(LocalDate releaseDate) {
if (releaseDate == null) {
return StringUtils.EMPTY;
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy");
String year = simpleDateFormat.format(releaseDate);
var year = releaseDate.getYear();
log.info("Year: {}", year);
return year;
return String.valueOf(year);
}

public String getGenre(Album album) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,15 @@

import de.umass.lastfm.Session;
import java.io.IOException;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class LastFMAuthenticator {

@Autowired private AuthenticatorHelper authenticatorHelper;
private final AuthenticatorHelper authenticatorHelper;

public Session login(String username, String password) throws IOException {
if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
import de.umass.lastfm.Session;
import de.umass.lastfm.Track;
import de.umass.lastfm.scrobble.ScrobbleResult;
import org.springframework.stereotype.Component;

@Component
public class LastFMTrackHelper {

public ScrobbleResult scrobble(String artist, String title, int time, Session session) {
Expand Down
23 changes: 12 additions & 11 deletions src/main/java/com/josdem/jmetadata/helper/MetadataExporter.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,28 +27,29 @@
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jaudiotagger.audio.exceptions.CannotReadException;
import org.jaudiotagger.audio.exceptions.ReadOnlyFileException;
import org.jaudiotagger.tag.TagException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@RequiredArgsConstructor
public class MetadataExporter {
private static final String NEW_LINE = "\n";
private static final String DASH = " - ";
private static final String DOT = ". ";
private static final String PAR_OPEN = " (";
private static final String PAR_CLOSE = ")";
private static final String BY = " by ";
private FileUtils fileUtils = new FileUtils();
private OutStreamWriter outputStreamWriter = new OutStreamWriter();

@Autowired private MetadataService metadataService;
@Autowired private FormatterService formatter;
private final FileUtils fileUtils;
private final OutStreamWriter outputStreamWriter;
private final MetadataService metadataService;
private final FormatterService formatter;

public void export(ExportPackage exportPackage)
throws IOException,
Expand All @@ -59,18 +60,18 @@ public void export(ExportPackage exportPackage)
File file =
fileUtils.createFile(
exportPackage.getRoot(), StringUtils.EMPTY, ApplicationConstants.FILE_EXT);
log.info("Exporting metadata to: " + file.getAbsolutePath());
log.info("Exporting metadata to: {}", file.getAbsolutePath());
OutputStream writer = outputStreamWriter.getWriter(file);
int counter = 1;
List<Metadata> metadatas = exportPackage.getMetadataList();
if (metadataService.isSameAlbum(metadatas)) {
writer.write(metadatas.get(0).getAlbum().getBytes());
List<Metadata> metadataList = exportPackage.getMetadataList();
if (metadataService.isSameAlbum(metadataList)) {
writer.write(metadataList.getFirst().getAlbum().getBytes());
writer.write(BY.getBytes());
writer.write(metadatas.get(0).getArtist().getBytes());
writer.write(metadataList.getFirst().getArtist().getBytes());
Comment on lines +67 to +70
Copy link

Copilot AI Apr 21, 2025

Choose a reason for hiding this comment

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

The method 'getFirst()' is not part of the standard java.util.List API; consider using 'get(0)' or another appropriate method to retrieve the first element.

Copilot uses AI. Check for mistakes.
writer.write(NEW_LINE.getBytes());
writer.write(NEW_LINE.getBytes());
}
for (Metadata metadata : metadatas) {
for (Metadata metadata : metadataList) {
writer.write(Integer.toString(counter++).getBytes());
writer.write(DOT.getBytes());
writer.write(metadata.getArtist().getBytes());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.springframework.stereotype.Component;

@Component
public class OutStreamWriter {

public OutputStream getWriter(File file) throws FileNotFoundException {
Expand Down
40 changes: 18 additions & 22 deletions src/main/java/com/josdem/jmetadata/helper/ScrobblerHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,29 +31,30 @@
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.asmatron.messengine.ControlEngine;
import org.springframework.stereotype.Service;

@Slf4j

/**
* @understands A class who knows how to send scrobblings
*/
@Service
@RequiredArgsConstructor
public class ScrobblerHelper {
private static final int ONE_THOUSAND = 1000;
private static final int MIN_LENGHT = 240;
private static final int MIN_LENGTH = 240;
private static final int REQUEST_PERIOD = 250;
private Map<Metadata, Long> metadataMap = new HashMap<Metadata, Long>();
private LastFMTrackHelper lastFMTrackHelper = new LastFMTrackHelper();
private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
private final Map<Metadata, Long> metadataMap = new HashMap<Metadata, Long>();
private static final int DELTA = 120;

private ControlEngine controlEngine;
private final LastFMTrackHelper lastFMTrackHelper;

@Setter private ControlEngine controlEngine;

private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

private ActionResult scrobbling(Metadata metadata) throws IOException, InterruptedException {
private ActionResult scrobbling(Metadata metadata) throws InterruptedException {
User currentUser = controlEngine.get(Model.CURRENT_USER);
if (StringUtils.isEmpty(currentUser.getUsername())) {
return ActionResult.NOT_LOGGED;
Expand Down Expand Up @@ -84,18 +85,14 @@ public ActionResult send(Metadata metadata) throws IOException, InterruptedExcep
// According to submission rules http://www.last.fm/api/submissions
if (StringUtils.isNotEmpty(metadata.getArtist())
&& StringUtils.isNotEmpty(metadata.getTitle())
&& metadata.getLength() > MIN_LENGHT) {
long startTime = time - (metadataMap.size() * DELTA);
&& metadata.getLength() > MIN_LENGTH) {
long startTime = time - ((long) metadataMap.size() * DELTA);
metadataMap.put(metadata, startTime);
return scrobbling(metadata);
}
return ActionResult.NOT_RECORDED;
}

public void setControlEngine(ControlEngine controlEngine) {
this.controlEngine = controlEngine;
}

private class ScrobbleTask implements Callable<ActionResult> {
private final Metadata metadata;
private final Session session;
Expand All @@ -114,14 +111,13 @@ public ActionResult call() throws Exception {
metadataMap.get(metadata).intValue(),
session);
if (result.isSuccessful() && !result.isIgnored()) {
log.debug(
metadata.getArtist()
+ " - "
+ metadata.getTitle()
+ " scrobbling to Last.fm was Successful");
log.info(
"{} - {} scrobbling to Last.fm was Successful",
metadata.getArtist(),
metadata.getTitle());
return ActionResult.SENT;
} else {
log.error("Submitting track " + metadata.getTitle() + " to Last.fm failed: " + result);
log.error("Submitting track {} to Last.fm failed: {}", metadata.getTitle(), result);
return ActionResult.ERROR;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
import de.umass.lastfm.ImageSize;
import java.awt.Image;
import java.io.IOException;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand Down Expand Up @@ -117,7 +119,8 @@ private void setYear(Metadata metadata, LastfmAlbum lastfmAlbum) {
}
if (release != null) {
log.info("Year date format: {}", release);
lastfmAlbum.setYear(lastfmHelper.getYear(release));
var localDate = convertToLocalDateViaInstant(release);
lastfmAlbum.setYear(lastfmHelper.getYear(localDate));
log.info("Year metadata format: {}", lastfmAlbum.getYear());
} else {
lastfmAlbum.setYear(StringUtils.EMPTY);
Expand All @@ -142,4 +145,8 @@ public ActionResult isSomethingNew(LastfmAlbum lastfmAlbum, Metadata metadata) {
}
return ActionResult.NEW;
}

private LocalDate convertToLocalDateViaInstant(Date dateToConvert) {
return dateToConvert.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
}
}

This file was deleted.

Loading