diff --git a/.gitignore b/.gitignore index 744289d..b1c0fc8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ # Project exclude paths -/target/ \ No newline at end of file +/target/ +.idea/ +compile.bat \ No newline at end of file diff --git a/pom.xml b/pom.xml index f3f5e33..aeed268 100644 --- a/pom.xml +++ b/pom.xml @@ -56,11 +56,6 @@ javalin 5.3.1 - - me.tongfei - progressbar - 0.9.5 - \ No newline at end of file diff --git a/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/LastFMToSpotify.java b/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/LastFMToSpotify.java index 113c598..47b087d 100644 --- a/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/LastFMToSpotify.java +++ b/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/LastFMToSpotify.java @@ -3,81 +3,71 @@ package de.b00tload.tools.lastfmtospotifyplaylist; import de.b00tload.tools.lastfmtospotifyplaylist.arguments.ArgumentHandler; import de.b00tload.tools.lastfmtospotifyplaylist.arguments.Arguments; +import de.b00tload.tools.lastfmtospotifyplaylist.util.PeriodHelper; import de.umass.lastfm.Caller; -import de.umass.lastfm.Period; +import de.umass.lastfm.Track; import de.umass.lastfm.User; -import me.tongfei.progressbar.ProgressBar; -import org.apache.hc.core5.http.ParseException; -import se.michaelthelin.spotify.SpotifyApi; -import se.michaelthelin.spotify.exceptions.SpotifyWebApiException; -import java.io.IOException; -import java.net.URI; +import java.util.Collection; import java.util.HashMap; +import static de.b00tload.tools.lastfmtospotifyplaylist.util.Logger.logLn; + public class LastFMToSpotify { public static final String LINE_SEPERATOR = System.getProperty("line.separator"); public static HashMap configuration; public static void main(String[] args) { - configuration.put("requests.useragent", "LastFMToSpotify/1.0-Snapshot (" + System.getProperty("os.name") + "; " + System.getProperty("os.arch") + ") Java/"+System.getProperty("java.version")); - for(int a = 0; a(); + configuration.put("requests.useragent", "LastFMToSpotify/1.0-Snapshot (" + System.getProperty("os.name") + "; " + System.getProperty("os.arch") + ") Java/" + System.getProperty("java.version")); + // parse arguments + for (int a = 0; a < args.length; a++) { Arguments arg; - if(args[a].startsWith("--")){ + if (args[a].startsWith("--")) { arg = Arguments.getByName(args[a].substring(2)); - } else if(args[a].startsWith("-")){ + } else if (args[a].startsWith("-")) { arg = Arguments.getByAlias(args[a].substring(1)); } else { - break; + continue; } - if(arg==null) { + if (arg == null) { ArgumentHandler.handle(Arguments.HELP); return; } - if(args.length-a==1){ + if (args.length - a == 1) { ArgumentHandler.handle(arg); - } else if(args[a+1].startsWith("--") || args[a+1].startsWith("-")){ + } else if (args[a + 1].startsWith("--") || args[a + 1].startsWith("-")) { ArgumentHandler.handle(arg); } else { - ArgumentHandler.handle(arg, args[a+1]); + ArgumentHandler.handle(arg, args[a + 1]); } } - // Start Progress Bar - try (ProgressBar pb = new ProgressBar("LastFM -> Spotify Playlist", 4)) { - for (int progress = 1; progress<=5; progress++) { - pb.step(); // step by 1 - switch (progress) { - case 1: - pb.setExtraMessage("Authenticating with Spotify..."); - break; - case 2: - pb.setExtraMessage("Authenticating with LastFM..."); - Caller.getInstance().setUserAgent(configuration.get("requests.useragent")); - User.getInfo(configuration.get("lastfm.user"), configuration.get("lastfm.apikey")).getName(); - break; - case 3: - pb.setExtraMessage("Reading from LastFM..."); - User.getTopTracks(configuration.get("lastfm.user"), Period.ONE_MONTH, configuration.get("lastfm.apikey")); - break; - case 4: - pb.setExtraMessage("Creating Playlist..."); - SpotifyApi.Builder build = SpotifyApi.builder(); - build.setClientId(configuration.get("spotify.clientid")); - build.setClientSecret(configuration.get("spotify.secret")); - build.setRedirectUri(URI.create("http://localhost:9876/callback/spotify/")); - SpotifyApi api = build.build(); - api.setAccessToken(configuration.get("spotify.access")); - api.createPlaylist(api.getCurrentUsersProfile().build().execute().getId(), configuration.get("playlist.name")).setHeader("User-Agent", configuration.get("requests.useragent")); - break; - case 5: - pb.setExtraMessage("Done."); - break; - } + // Start Progress Bar + try { + logLn("Authenticating with Spotify...", 1); + logLn("Authenticating with LastFM...", 1); + Caller.getInstance().setUserAgent(configuration.get("requests.useragent")); + logLn(User.getInfo(configuration.get("lastfm.user"), configuration.get("lastfm.apikey")).getName(), 1); + logLn("Reading from LastFM...", 1); + Collection tracks = User.getTopTracks(configuration.get("lastfm.user"), PeriodHelper.getPeriodByString(configuration.get("lastfm.period")), configuration.get("lastfm.apikey")); + for (Track track : tracks) { + logLn(track.getName() + " by " + track.getArtist(), 3); } - } catch (IOException | ParseException | SpotifyWebApiException e) { + logLn("Creating Playlist...", 1); + //SpotifyApi.Builder build = SpotifyApi.builder(); + //build.setClientId(configuration.get("spotify.clientid")); + //build.setClientSecret(configuration.get("spotify.secret")); + //build.setRedirectUri(URI.create("http://localhost:9876/callback/spotify/")); + //SpotifyApi api = build.build(); + //api.setAccessToken(configuration.get("spotify.access")); + //api.createPlaylist(api.getCurrentUsersProfile().build().execute().getId(), configuration.get("playlist.name")).setHeader("User-Agent", configuration.get("requests.useragent")); + logLn("Done.", 1); +// } catch (IOException | ParseException | SpotifyWebApiException e) { + } catch (Exception e) { throw new RuntimeException(e); } //TODO: Implement diff --git a/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/arguments/ArgumentHandler.java b/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/arguments/ArgumentHandler.java index 21cc314..aa8ef72 100644 --- a/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/arguments/ArgumentHandler.java +++ b/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/arguments/ArgumentHandler.java @@ -1,6 +1,6 @@ package de.b00tload.tools.lastfmtospotifyplaylist.arguments; -import de.b00tload.tools.lastfmtospotifyplaylist.util.Logger; +import de.umass.lastfm.Period; import org.jetbrains.annotations.Nullable; import static de.b00tload.tools.lastfmtospotifyplaylist.LastFMToSpotify.LINE_SEPERATOR; @@ -8,10 +8,19 @@ import static de.b00tload.tools.lastfmtospotifyplaylist.LastFMToSpotify.configur public class ArgumentHandler { - public static void handle(Arguments argument, @Nullable String value){ - switch (argument){ + public static void handle(Arguments argument, @Nullable String value) { + switch (argument) { case HELP -> help(value); case VERBOSE -> verbose(value); + case SECRET -> secret(value); + case CLIENT -> client(value); + case TOKEN -> token(value); + case USER -> user(value); + case WEEKLY -> period(Period.WEEK); + case MONTHLY -> period(Period.ONE_MONTH); + case QUARTERLY -> period(Period.THREE_MONTHS); + case BIANNUALLY -> period(Period.SIX_MONTHS); + case YEARLY -> period(Period.TWELVE_MONTHS); } } @@ -19,10 +28,10 @@ public class ArgumentHandler { handle(argument, null); } - private static void help(String value){ - if(value == null){ + private static void help(String value) { + if (value == null) { System.out.println("This is a list of all available commands. For more specific help on the argument run --help ."); - for(Arguments arg : Arguments.values()) { + for (Arguments arg : Arguments.values()) { String name = arg.getName(); String description = arg.getDescription(); System.out.println("____________________"); @@ -32,7 +41,7 @@ public class ArgumentHandler { System.exit(200); } Arguments arg = Arguments.resolveByNameOrAlias(value); - if(arg == null) { + if (arg == null) { System.out.println("This argument is unknown. Use --help to get a list of all arguments"); System.exit(200); } @@ -44,7 +53,7 @@ public class ArgumentHandler { System.out.println(" DESCRIPTION" + LINE_SEPERATOR + description); System.out.println(" USAGE: " + usage); StringBuilder aliasString = new StringBuilder(); - for(String alias : aliases){ + for (String alias : aliases) { aliasString.append(", -").append(alias); } System.out.println(" ALIASES:" + aliasString.substring(1)); @@ -52,8 +61,54 @@ public class ArgumentHandler { System.exit(200); } - private static void verbose(String value){ - //wenn value != int - System.out.println("LogLevel must be a numeric value."); + private static void verbose(String value) { + if (value == null) { + System.out.println("--loglevel must be provided with a numeric log level. Check usage: " + Arguments.VERBOSE.getUsage()); + System.exit(500); + } + try { + int loglevel = Integer.parseInt(value); + configuration.put("logging.level", String.valueOf(loglevel)); + } catch (NumberFormatException e) { + System.out.println("LogLevel must be a numeric value."); + System.exit(500); + } + + } + + private static void token(String value) { + if (value == null || value.equalsIgnoreCase("")) { + System.out.println("--lastfmtoken must be provided with an api token from LastFM. Check usage: " + Arguments.TOKEN.getUsage()); + System.exit(500); + } + configuration.put("lastfm.apikey", value); + } + + private static void user(String value) { + if (value == null || value.equalsIgnoreCase("")) { + System.out.println("--lastfmuser must be provided with a LastFM username. Check usage: " + Arguments.USER.getUsage()); + System.exit(500); + } + configuration.put("lastfm.user", value); + } + + private static void client(String value) { + if (value == null || value.equalsIgnoreCase("")) { + System.out.println("--spotifyclient must be provided with a client id from Spotify. Check usage: " + Arguments.CLIENT.getUsage()); + System.exit(500); + } + configuration.put("spotify.clientid", value); + } + + private static void secret(String value) { + if (value == null || value.equalsIgnoreCase("")) { + System.out.println("--spotifysecret must be provided with a client secret from Spotify. Check usage: " + Arguments.SECRET.getUsage()); + System.exit(500); + } + configuration.put("spotify.secret", value); + } + + private static void period(Period value) { + configuration.put("lastfm.period", value.getString()); } } diff --git a/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/arguments/Arguments.java b/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/arguments/Arguments.java index f535f66..c8fcd00 100644 --- a/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/arguments/Arguments.java +++ b/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/arguments/Arguments.java @@ -16,7 +16,24 @@ public enum Arguments { + " - 2: Verbose Will echo current step being worked on" + LINE_SEPERATOR + " - 3: Debug Will give specific information on what excactly the tool is doing", "--loglevel ", "log", "l"), - SECRET("spotifysecret", "[]", "--spotifysecret ", "sS", "sSecret"); + SECRET("spotifysecret", "[Required]" + LINE_SEPERATOR + + "Sets the spotify client secret.", "--spotifysecret ", "sS", "sSecret"), + CLIENT("spotifyclient", "[Required]" + LINE_SEPERATOR + + "Sets the spotify cliend id.", "--spotifyclient ", "sC", "sClient"), + TOKEN("lastfmtoken", "[Required]" + LINE_SEPERATOR + + "Sets the LastFM API token.", "--lastfmtoken ", "lT", "lToken"), + USER("lastfmuser", "[Required]" + LINE_SEPERATOR + + "Sets the LastFM API token.", "--lastfmuser ", "lU", "lUser"), + WEEKLY("weekly", "[Optional]" + LINE_SEPERATOR + + "Creates a playlist from your top tracks from last week.", "--weekly", "W"), + MONTHLY("monthly", "[Optional, Default]" + LINE_SEPERATOR + + "Creates a playlist from your top tracks from last month.", "--monthly", "M"), + QUARTERLY("quarterly", "[Optional]" + LINE_SEPERATOR + + "Creates a playlist from your top tracks from last quarter.", "--quarterly", "Q"), + BIANNUALLY("biannually", "[Optional]" + LINE_SEPERATOR + + "Creates a playlist from your top tracks from last half-year.", "--biannualy", "B"), + YEARLY("yearly", "[Optional]" + LINE_SEPERATOR + + "Creates a playlist from your top tracks from last year.", "--anually", "A");; private final String name; private final String description; diff --git a/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/util/Logger.java b/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/util/Logger.java index eb38e8d..cad03cc 100644 --- a/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/util/Logger.java +++ b/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/util/Logger.java @@ -5,7 +5,9 @@ import static de.b00tload.tools.lastfmtospotifyplaylist.LastFMToSpotify.configur public class Logger { public static void logLn(String string, int priority){ - if(Integer.parseInt(configuration.get("verbose.level"))) + if(Integer.parseInt(configuration.get("logging.level"))>=priority){ + System.out.println(string); + } } } diff --git a/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/util/PeriodHelper.java b/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/util/PeriodHelper.java new file mode 100644 index 0000000..2c68faf --- /dev/null +++ b/src/main/java/de/b00tload/tools/lastfmtospotifyplaylist/util/PeriodHelper.java @@ -0,0 +1,14 @@ +package de.b00tload.tools.lastfmtospotifyplaylist.util; + +import de.umass.lastfm.Period; + +public class PeriodHelper { + + public static Period getPeriodByString(String string){ + for(Period p : Period.values()){ + if(p.getString().equalsIgnoreCase(string)) return p; + } + return Period.ONE_MONTH; + } + +}