From 0b8cc2fb5de60c29516e5608a6b2744b0c672d70 Mon Sep 17 00:00:00 2001 From: AndreasVolkmann Date: Mon, 21 May 2018 09:54:57 +0200 Subject: [PATCH] make flairsToExclude dynamic, separate SubmissionParser from RedditService --- build.gradle | 4 +- example_config.yml | 12 +++ settings.gradle | 2 +- .../reddit/playlist/config/Configuration.kt | 8 -- .../reddit/playlist => spottit}/Main.kt | 8 +- .../playlist => spottit}/config/Arguments.kt | 2 +- .../playlist => spottit}/config/Dependency.kt | 26 ++++--- .../controller/DynamicPlaylistController.kt | 31 ++++---- .../me/avo/spottit/model/Configuration.kt | 7 ++ .../playlist => spottit}/model/Playlist.kt | 2 +- .../playlist => spottit}/model/PostFilter.kt | 2 +- .../me/avo/spottit/model/RedditCredentials.kt | 7 ++ .../playlist => spottit}/model/RedditTrack.kt | 2 +- .../playlist => spottit}/server/Exceptions.kt | 2 +- .../playlist => spottit}/server/Routing.kt | 4 +- .../playlist => spottit}/server/Server.kt | 9 ++- .../playlist => spottit}/server/Templates.kt | 2 +- .../service/RedditService.kt | 4 +- .../service/RedditServiceImpl.kt | 74 ++++++------------- .../service/SpotifyAuthService.kt | 2 +- .../service/SpotifyService.kt | 4 +- .../service/SpotifyServiceImpl.kt | 4 +- .../playlist => spottit}/util/Client.kt | 2 +- .../me/avo/spottit/util/SubmissionParser.kt | 40 ++++++++++ .../reddit/playlist => spottit}/util/Util.kt | 2 +- .../util/YamlConfigReader.kt | 9 ++- src/main/resources/templates/test.ftl | 52 +++---------- .../config/DependencyTest.kt | 3 +- .../server/TemplatesTest.kt | 36 +++++---- .../avo/spottit/util/SubmissionParserTest.kt | 46 ++++++++++++ .../util/YamlConfigReaderTest.kt | 10 +-- src/test/resources/config.yml | 3 + 32 files changed, 246 insertions(+), 175 deletions(-) delete mode 100644 src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/config/Configuration.kt rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/Main.kt (54%) rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/config/Arguments.kt (92%) rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/config/Dependency.kt (60%) rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/controller/DynamicPlaylistController.kt (62%) create mode 100644 src/main/kotlin/me/avo/spottit/model/Configuration.kt rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/model/Playlist.kt (82%) rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/model/PostFilter.kt (77%) create mode 100644 src/main/kotlin/me/avo/spottit/model/RedditCredentials.kt rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/model/RedditTrack.kt (74%) rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/server/Exceptions.kt (70%) rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/server/Routing.kt (87%) rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/server/Server.kt (91%) rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/server/Templates.kt (70%) rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/service/RedditService.kt (52%) rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/service/RedditServiceImpl.kt (55%) rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/service/SpotifyAuthService.kt (96%) rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/service/SpotifyService.kt (66%) rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/service/SpotifyServiceImpl.kt (96%) rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/util/Client.kt (93%) create mode 100644 src/main/kotlin/me/avo/spottit/util/SubmissionParser.kt rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/util/Util.kt (69%) rename src/main/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/util/YamlConfigReader.kt (81%) rename src/test/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/config/DependencyTest.kt (74%) rename src/test/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/server/TemplatesTest.kt (56%) create mode 100644 src/test/kotlin/me/avo/spottit/util/SubmissionParserTest.kt rename src/test/kotlin/me/avo/{spotify/dynamic/reddit/playlist => spottit}/util/YamlConfigReaderTest.kt (81%) diff --git a/build.gradle b/build.gradle index a1f4931..4bc4be8 100644 --- a/build.gradle +++ b/build.gradle @@ -21,9 +21,9 @@ apply plugin: 'kotlin' task fatJar(type: Jar) { manifest { - attributes 'Compile-Title': 'spotify-dynamic-reddit-playlist', + attributes 'Compile-Title': 'spottit', 'Compile-Version': version, - 'Main-Class': 'me.avo.spotify.dynamic.reddit.playlist.MainKt' + 'Main-Class': 'me.avo.spottit.MainKt' } baseName = project.name from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } diff --git a/example_config.yml b/example_config.yml index 3bb0eb2..d1f81eb 100644 --- a/example_config.yml +++ b/example_config.yml @@ -25,3 +25,15 @@ playlists: subreddit: trance sort: TOP timePeriod: ALL + +# When a reddit post has any of the following flairs, it will be excluded +flairsToExclude: + - Mix + - Liveset + - Radio + - Show + - Album + - Upcoming + - AMA + - Concluded + - RIP diff --git a/settings.gradle b/settings.gradle index 6dc684a..ca37e4f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ -rootProject.name = 'spotify-dynamic-reddit-playlist' +rootProject.name = 'spottit' diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/config/Configuration.kt b/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/config/Configuration.kt deleted file mode 100644 index 307f21a..0000000 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/config/Configuration.kt +++ /dev/null @@ -1,8 +0,0 @@ -package me.avo.spotify.dynamic.reddit.playlist.config - -import me.avo.spotify.dynamic.reddit.playlist.model.Playlist - -data class Configuration( - val userId: String, - val playlists: List -) \ No newline at end of file diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/Main.kt b/src/main/kotlin/me/avo/spottit/Main.kt similarity index 54% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/Main.kt rename to src/main/kotlin/me/avo/spottit/Main.kt index 52c5948..e07c878 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/Main.kt +++ b/src/main/kotlin/me/avo/spottit/Main.kt @@ -1,9 +1,9 @@ -package me.avo.spotify.dynamic.reddit.playlist +package me.avo.spottit import com.github.salomonbrys.kodein.instance -import me.avo.spotify.dynamic.reddit.playlist.config.Arguments -import me.avo.spotify.dynamic.reddit.playlist.config.kodein -import me.avo.spotify.dynamic.reddit.playlist.controller.DynamicPlaylistController +import me.avo.spottit.config.Arguments +import me.avo.spottit.config.kodein +import me.avo.spottit.controller.DynamicPlaylistController fun main(args: Array) { val arguments = Arguments(args) diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/config/Arguments.kt b/src/main/kotlin/me/avo/spottit/config/Arguments.kt similarity index 92% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/config/Arguments.kt rename to src/main/kotlin/me/avo/spottit/config/Arguments.kt index 867837c..6a7a4d5 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/config/Arguments.kt +++ b/src/main/kotlin/me/avo/spottit/config/Arguments.kt @@ -1,4 +1,4 @@ -package me.avo.spotify.dynamic.reddit.playlist.config +package me.avo.spottit.config import com.beust.jcommander.JCommander import com.beust.jcommander.Parameter diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/config/Dependency.kt b/src/main/kotlin/me/avo/spottit/config/Dependency.kt similarity index 60% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/config/Dependency.kt rename to src/main/kotlin/me/avo/spottit/config/Dependency.kt index 1aff332..74d5d1e 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/config/Dependency.kt +++ b/src/main/kotlin/me/avo/spottit/config/Dependency.kt @@ -1,9 +1,14 @@ -package me.avo.spotify.dynamic.reddit.playlist.config - -import com.github.salomonbrys.kodein.* -import me.avo.spotify.dynamic.reddit.playlist.controller.DynamicPlaylistController -import me.avo.spotify.dynamic.reddit.playlist.model.Playlist -import me.avo.spotify.dynamic.reddit.playlist.service.* +package me.avo.spottit.config + +import com.github.salomonbrys.kodein.Kodein +import com.github.salomonbrys.kodein.bind +import com.github.salomonbrys.kodein.instance +import com.github.salomonbrys.kodein.singleton +import me.avo.spottit.controller.DynamicPlaylistController +import me.avo.spottit.model.RedditCredentials +import me.avo.spottit.service.SpotifyAuthService +import me.avo.spottit.service.SpotifyService +import me.avo.spottit.service.SpotifyServiceImpl import java.util.* val kodein = Kodein { @@ -17,7 +22,7 @@ val kodein = Kodein { DynamicPlaylistController( spotifyAuthService = instance(), spotifyService = instance(), - redditServiceFactory = factory() + redditCredentials = instance() ) } @@ -33,12 +38,11 @@ val kodein = Kodein { ) } - bind() with factory { playlist: Playlist -> - RedditServiceImpl( + bind() with singleton { + RedditCredentials( clientId = getProperty("reddit-clientId"), clientSecret = getProperty("reddit-clientSecret"), - deviceName = getProperty("deviceName"), - playlist = playlist + deviceName = getProperty("deviceName") ) } diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/controller/DynamicPlaylistController.kt b/src/main/kotlin/me/avo/spottit/controller/DynamicPlaylistController.kt similarity index 62% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/controller/DynamicPlaylistController.kt rename to src/main/kotlin/me/avo/spottit/controller/DynamicPlaylistController.kt index 9320ae4..e58c479 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/controller/DynamicPlaylistController.kt +++ b/src/main/kotlin/me/avo/spottit/controller/DynamicPlaylistController.kt @@ -1,15 +1,16 @@ -package me.avo.spotify.dynamic.reddit.playlist.controller +package me.avo.spottit.controller import com.wrapper.spotify.model_objects.specification.Track -import me.avo.spotify.dynamic.reddit.playlist.config.kodein -import me.avo.spotify.dynamic.reddit.playlist.model.Playlist -import me.avo.spotify.dynamic.reddit.playlist.server.prepareServer -import me.avo.spotify.dynamic.reddit.playlist.service.RedditService -import me.avo.spotify.dynamic.reddit.playlist.service.SpotifyAuthService -import me.avo.spotify.dynamic.reddit.playlist.service.SpotifyService -import me.avo.spotify.dynamic.reddit.playlist.service.SpotifyServiceImpl -import me.avo.spotify.dynamic.reddit.playlist.util.YamlConfigReader -import me.avo.spotify.dynamic.reddit.playlist.util.openUrlInBrowser +import me.avo.spottit.config.kodein +import me.avo.spottit.model.Configuration +import me.avo.spottit.model.Playlist +import me.avo.spottit.model.RedditCredentials +import me.avo.spottit.server.prepareServer +import me.avo.spottit.service.RedditServiceImpl +import me.avo.spottit.service.SpotifyAuthService +import me.avo.spottit.service.SpotifyService +import me.avo.spottit.util.YamlConfigReader +import me.avo.spottit.util.openUrlInBrowser import org.slf4j.LoggerFactory import java.io.File import java.util.concurrent.TimeUnit @@ -17,7 +18,7 @@ import java.util.concurrent.TimeUnit class DynamicPlaylistController( private val spotifyAuthService: SpotifyAuthService, private val spotifyService: SpotifyService, - private val redditServiceFactory: (Playlist) -> RedditService + private val redditCredentials: RedditCredentials ) { fun updatePlaylists(configPath: String) { @@ -36,13 +37,15 @@ class DynamicPlaylistController( server.stop(timeout, timeout, TimeUnit.SECONDS) } - configuration.playlists.forEach(::processPlaylist) + configuration.playlists.forEach { + processPlaylist(configuration, it) + } } - private fun processPlaylist(playlist: Playlist) { + private fun processPlaylist(configuration: Configuration, playlist: Playlist) { logger.info("Processing playlist ${playlist.id}") //val postFilter = playlist.postFilters.first() - val redditService = redditServiceFactory(playlist) + val redditService = RedditServiceImpl(playlist, configuration.flairsToExclude, redditCredentials) val foundTracks = mutableListOf() diff --git a/src/main/kotlin/me/avo/spottit/model/Configuration.kt b/src/main/kotlin/me/avo/spottit/model/Configuration.kt new file mode 100644 index 0000000..665be2d --- /dev/null +++ b/src/main/kotlin/me/avo/spottit/model/Configuration.kt @@ -0,0 +1,7 @@ +package me.avo.spottit.model + +data class Configuration( + val userId: String, + val playlists: List, + val flairsToExclude: List +) \ No newline at end of file diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/model/Playlist.kt b/src/main/kotlin/me/avo/spottit/model/Playlist.kt similarity index 82% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/model/Playlist.kt rename to src/main/kotlin/me/avo/spottit/model/Playlist.kt index a75ce1b..8f8b243 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/model/Playlist.kt +++ b/src/main/kotlin/me/avo/spottit/model/Playlist.kt @@ -1,4 +1,4 @@ -package me.avo.spotify.dynamic.reddit.playlist.model +package me.avo.spottit.model import net.dean.jraw.models.SubredditSort import net.dean.jraw.models.TimePeriod diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/model/PostFilter.kt b/src/main/kotlin/me/avo/spottit/model/PostFilter.kt similarity index 77% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/model/PostFilter.kt rename to src/main/kotlin/me/avo/spottit/model/PostFilter.kt index d784e11..ef4e40e 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/model/PostFilter.kt +++ b/src/main/kotlin/me/avo/spottit/model/PostFilter.kt @@ -1,4 +1,4 @@ -package me.avo.spotify.dynamic.reddit.playlist.model +package me.avo.spottit.model import net.dean.jraw.models.SubredditSort import net.dean.jraw.models.TimePeriod diff --git a/src/main/kotlin/me/avo/spottit/model/RedditCredentials.kt b/src/main/kotlin/me/avo/spottit/model/RedditCredentials.kt new file mode 100644 index 0000000..96a11a6 --- /dev/null +++ b/src/main/kotlin/me/avo/spottit/model/RedditCredentials.kt @@ -0,0 +1,7 @@ +package me.avo.spottit.model + +data class RedditCredentials( + val clientId: String, + val clientSecret: String, + val deviceName: String +) \ No newline at end of file diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/model/RedditTrack.kt b/src/main/kotlin/me/avo/spottit/model/RedditTrack.kt similarity index 74% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/model/RedditTrack.kt rename to src/main/kotlin/me/avo/spottit/model/RedditTrack.kt index 8041297..f009045 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/model/RedditTrack.kt +++ b/src/main/kotlin/me/avo/spottit/model/RedditTrack.kt @@ -1,4 +1,4 @@ -package me.avo.spotify.dynamic.reddit.playlist.model +package me.avo.spottit.model data class RedditTrack( val artist: String, diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/server/Exceptions.kt b/src/main/kotlin/me/avo/spottit/server/Exceptions.kt similarity index 70% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/server/Exceptions.kt rename to src/main/kotlin/me/avo/spottit/server/Exceptions.kt index fd5e44c..b05c379 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/server/Exceptions.kt +++ b/src/main/kotlin/me/avo/spottit/server/Exceptions.kt @@ -1,4 +1,4 @@ -package me.avo.spotify.dynamic.reddit.playlist.server +package me.avo.spottit.server import io.ktor.http.HttpStatusCode diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/server/Routing.kt b/src/main/kotlin/me/avo/spottit/server/Routing.kt similarity index 87% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/server/Routing.kt rename to src/main/kotlin/me/avo/spottit/server/Routing.kt index 6789459..2439377 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/server/Routing.kt +++ b/src/main/kotlin/me/avo/spottit/server/Routing.kt @@ -1,4 +1,4 @@ -package me.avo.spotify.dynamic.reddit.playlist.server +package me.avo.spottit.server import com.github.salomonbrys.kodein.Kodein import com.github.salomonbrys.kodein.instance @@ -8,7 +8,7 @@ import io.ktor.response.respond import io.ktor.routing.Routing import io.ktor.routing.get import io.ktor.routing.route -import me.avo.spotify.dynamic.reddit.playlist.service.SpotifyAuthService +import me.avo.spottit.service.SpotifyAuthService fun Routing.setup(kodein: Kodein) { diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/server/Server.kt b/src/main/kotlin/me/avo/spottit/server/Server.kt similarity index 91% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/server/Server.kt rename to src/main/kotlin/me/avo/spottit/server/Server.kt index a390e1c..db0488c 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/server/Server.kt +++ b/src/main/kotlin/me/avo/spottit/server/Server.kt @@ -1,4 +1,4 @@ -package me.avo.spotify.dynamic.reddit.playlist.server +package me.avo.spottit.server import com.github.salomonbrys.kodein.Kodein import freemarker.cache.ClassTemplateLoader @@ -16,10 +16,13 @@ import io.ktor.server.engine.ApplicationEngine import io.ktor.server.engine.ShutDownUrl import io.ktor.server.engine.embeddedServer import io.ktor.server.netty.Netty -import me.avo.spotify.dynamic.reddit.playlist.config.Dependency +import me.avo.spottit.config.Dependency import org.slf4j.event.Level -fun prepareServer(kodein: Kodein): ApplicationEngine = embeddedServer(Netty, 5000, module = main(kodein)) +fun prepareServer(kodein: Kodein): ApplicationEngine = embeddedServer(Netty, 5000, module = main( + kodein +) +) fun main(kodein: Kodein): Application.() -> Unit = { install(Routing) { diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/server/Templates.kt b/src/main/kotlin/me/avo/spottit/server/Templates.kt similarity index 70% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/server/Templates.kt rename to src/main/kotlin/me/avo/spottit/server/Templates.kt index 3e9da82..39f5e8a 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/server/Templates.kt +++ b/src/main/kotlin/me/avo/spottit/server/Templates.kt @@ -1,4 +1,4 @@ -package me.avo.spotify.dynamic.reddit.playlist.server +package me.avo.spottit.server import io.ktor.freemarker.FreeMarkerContent diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/service/RedditService.kt b/src/main/kotlin/me/avo/spottit/service/RedditService.kt similarity index 52% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/service/RedditService.kt rename to src/main/kotlin/me/avo/spottit/service/RedditService.kt index 0dff692..69ac11c 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/service/RedditService.kt +++ b/src/main/kotlin/me/avo/spottit/service/RedditService.kt @@ -1,6 +1,6 @@ -package me.avo.spotify.dynamic.reddit.playlist.service +package me.avo.spottit.service -import me.avo.spotify.dynamic.reddit.playlist.model.RedditTrack +import me.avo.spottit.model.RedditTrack interface RedditService { diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/service/RedditServiceImpl.kt b/src/main/kotlin/me/avo/spottit/service/RedditServiceImpl.kt similarity index 55% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/service/RedditServiceImpl.kt rename to src/main/kotlin/me/avo/spottit/service/RedditServiceImpl.kt index 06244a3..1bed0b7 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/service/RedditServiceImpl.kt +++ b/src/main/kotlin/me/avo/spottit/service/RedditServiceImpl.kt @@ -1,7 +1,9 @@ -package me.avo.spotify.dynamic.reddit.playlist.service +package me.avo.spottit.service -import me.avo.spotify.dynamic.reddit.playlist.model.Playlist -import me.avo.spotify.dynamic.reddit.playlist.model.RedditTrack +import me.avo.spottit.model.Playlist +import me.avo.spottit.model.RedditCredentials +import me.avo.spottit.model.RedditTrack +import me.avo.spottit.util.SubmissionParser import net.dean.jraw.http.OkHttpNetworkAdapter import net.dean.jraw.http.UserAgent import net.dean.jraw.models.Submission @@ -15,23 +17,19 @@ import org.slf4j.LoggerFactory import java.util.* class RedditServiceImpl( - clientId: String, - clientSecret: String, - deviceName: String, - private val playlist: Playlist + private val playlist: Playlist, + private val flairsToExclude: List, + redditCredentials: RedditCredentials ) : RedditService { private val reddit by lazy { - val userAgent = UserAgent("bot", "me.avo.spotify.dynamic.reddit.playlist", "v0.1", "idajuul") + val (clientId, clientSecret, deviceName) = redditCredentials + val userAgent = UserAgent("bot", "me.avo.spottit", "v0.2", "idajuul") val adapter = OkHttpNetworkAdapter(userAgent) val credentials = Credentials.userless(clientId, clientSecret, UUID.fromString(deviceName)) OAuthHelper.automatic(adapter, credentials) } - private lateinit var paginator: Paginator - - private var currentSize = 0 - override var isDone = false private set @@ -49,7 +47,7 @@ class RedditServiceImpl( } page .filterNot { it.isSelfPost } - .filterNot { it.linkFlairText in flairsToExclude } // TODO make dynamic + .filterNot { it.linkFlairText in flairsToExclude } .mapTo(validPosts) { it } } @@ -57,33 +55,23 @@ class RedditServiceImpl( stop() } - return validPosts.map(::submissionToRedditTrack) + return validPosts.map(::parse) } - private fun submissionToRedditTrack(submission: Submission): RedditTrack { - val fixedTitle = submission.title.fixChars() - val extraInformation = fixedTitle.getExtraInformation() - val mix = fixedTitle.getMix() - val fullTitle = (extraInformation + mix).fold(fixedTitle) { acc, s -> acc.replace(s, "").trim() } - return RedditTrack( - artist = fullTitle.substringBefore("-").trim(), - title = fullTitle.substringAfter("-").trim(), - mix = mix.firstOrNull()?.removePrefixSuffix(), - extraInformation = (extraInformation + mix.drop(1)).map { it.removePrefixSuffix() }, - flair = submission.linkFlairText - ) + override fun update(amountTaken: Int) { + logger.info("Adding $amountTaken tracks") + currentSize += amountTaken } + private lateinit var paginator: Paginator + + private var currentSize = 0 + private fun stop() { logger.info("Reddit pagination done") isDone = true } - override fun update(amountTaken: Int) { - logger.info("Adding $amountTaken tracks") - currentSize += amountTaken - } - private fun initializePaginator() { if (!::paginator.isInitialized) { val subreddit = reddit.subreddit(playlist.subreddit) @@ -98,27 +86,9 @@ class RedditServiceImpl( private val maxPage = 20 - private val flairsToExclude = listOf("Mix", "Liveset", "Radio Show", "Album", "Upcoming AMA", "Concluded", "RIP") - - private fun String.fixChars() = replace("&", "&") - - private fun String.getMix() = getEnclosedText("(", ")") - - private fun String.getExtraInformation(): List = getEnclosedText("[", "]") - - private fun String.getEnclosedText(start: String, end: String) = Regex("\\$start.*?\\$end") - .findAll(this) - .map(MatchResult::value) - .toList() - - private val prefixSuffixChars = listOf( - "(" to ")", - "[" to "]" - ) - - private fun String.removePrefixSuffix(): String = - prefixSuffixChars.fold(this) { acc, (prefix, suffix) -> acc.removeSurrounding(prefix, suffix) } - private val logger = LoggerFactory.getLogger(this::class.java) + private fun parse(submission: Submission): RedditTrack = + SubmissionParser.parse(submission.title, submission.linkFlairText) + } \ No newline at end of file diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/service/SpotifyAuthService.kt b/src/main/kotlin/me/avo/spottit/service/SpotifyAuthService.kt similarity index 96% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/service/SpotifyAuthService.kt rename to src/main/kotlin/me/avo/spottit/service/SpotifyAuthService.kt index 68ef032..9d2e685 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/service/SpotifyAuthService.kt +++ b/src/main/kotlin/me/avo/spottit/service/SpotifyAuthService.kt @@ -1,4 +1,4 @@ -package me.avo.spotify.dynamic.reddit.playlist.service +package me.avo.spottit.service import com.wrapper.spotify.SpotifyApi import com.wrapper.spotify.SpotifyHttpManager diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/service/SpotifyService.kt b/src/main/kotlin/me/avo/spottit/service/SpotifyService.kt similarity index 66% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/service/SpotifyService.kt rename to src/main/kotlin/me/avo/spottit/service/SpotifyService.kt index 0c9a8fd..acb9cf9 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/service/SpotifyService.kt +++ b/src/main/kotlin/me/avo/spottit/service/SpotifyService.kt @@ -1,7 +1,7 @@ -package me.avo.spotify.dynamic.reddit.playlist.service +package me.avo.spottit.service import com.wrapper.spotify.model_objects.specification.Track -import me.avo.spotify.dynamic.reddit.playlist.model.RedditTrack +import me.avo.spottit.model.RedditTrack interface SpotifyService { diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/service/SpotifyServiceImpl.kt b/src/main/kotlin/me/avo/spottit/service/SpotifyServiceImpl.kt similarity index 96% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/service/SpotifyServiceImpl.kt rename to src/main/kotlin/me/avo/spottit/service/SpotifyServiceImpl.kt index 3e01730..bfdc22b 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/service/SpotifyServiceImpl.kt +++ b/src/main/kotlin/me/avo/spottit/service/SpotifyServiceImpl.kt @@ -1,10 +1,10 @@ -package me.avo.spotify.dynamic.reddit.playlist.service +package me.avo.spottit.service import com.github.salomonbrys.kotson.jsonObject import com.github.salomonbrys.kotson.toJsonArray import com.wrapper.spotify.SpotifyApi import com.wrapper.spotify.model_objects.specification.Track -import me.avo.spotify.dynamic.reddit.playlist.model.RedditTrack +import me.avo.spottit.model.RedditTrack import org.slf4j.LoggerFactory class SpotifyServiceImpl( diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/util/Client.kt b/src/main/kotlin/me/avo/spottit/util/Client.kt similarity index 93% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/util/Client.kt rename to src/main/kotlin/me/avo/spottit/util/Client.kt index 28f6036..6cb6deb 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/util/Client.kt +++ b/src/main/kotlin/me/avo/spottit/util/Client.kt @@ -1,4 +1,4 @@ -package me.avo.spotify.dynamic.reddit.playlist.util +package me.avo.spottit.util import io.ktor.client.HttpClient import io.ktor.client.call.call diff --git a/src/main/kotlin/me/avo/spottit/util/SubmissionParser.kt b/src/main/kotlin/me/avo/spottit/util/SubmissionParser.kt new file mode 100644 index 0000000..9d705f7 --- /dev/null +++ b/src/main/kotlin/me/avo/spottit/util/SubmissionParser.kt @@ -0,0 +1,40 @@ +package me.avo.spottit.util + +import me.avo.spottit.model.RedditTrack + +object SubmissionParser { + + fun parse(title: String, flairText: String?): RedditTrack { + val fixedTitle = title.fixChars() + val extraInformation = fixedTitle.getExtraInformation() + val mix = fixedTitle.getMix() + val fullTitle = (extraInformation + mix).fold(fixedTitle) { acc, s -> acc.replace(s, "").trim() } + return RedditTrack( + artist = fullTitle.substringBefore("-").trim(), + title = fullTitle.substringAfter("-").trim(), + mix = mix.firstOrNull()?.removePrefixSuffix(), + extraInformation = (extraInformation + mix.drop(1)).map { it.removePrefixSuffix() }, + flair = flairText + ) + } + + private fun String.fixChars() = replace("&", "&") + + private fun String.getMix() = getEnclosedText("(", ")") + + private fun String.getExtraInformation(): List = getEnclosedText("[", "]") + + private fun String.getEnclosedText(start: String, end: String) = Regex("\\$start.*?\\$end") + .findAll(this) + .map(MatchResult::value) + .toList() + + private val prefixSuffixChars = listOf( + "(" to ")", + "[" to "]" + ) + + private fun String.removePrefixSuffix(): String = + prefixSuffixChars.fold(this) { acc, (prefix, suffix) -> acc.removeSurrounding(prefix, suffix) } + +} \ No newline at end of file diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/util/Util.kt b/src/main/kotlin/me/avo/spottit/util/Util.kt similarity index 69% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/util/Util.kt rename to src/main/kotlin/me/avo/spottit/util/Util.kt index afe0ef0..06af057 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/util/Util.kt +++ b/src/main/kotlin/me/avo/spottit/util/Util.kt @@ -1,4 +1,4 @@ -package me.avo.spotify.dynamic.reddit.playlist.util +package me.avo.spottit.util import java.awt.Desktop import java.net.URI diff --git a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/util/YamlConfigReader.kt b/src/main/kotlin/me/avo/spottit/util/YamlConfigReader.kt similarity index 81% rename from src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/util/YamlConfigReader.kt rename to src/main/kotlin/me/avo/spottit/util/YamlConfigReader.kt index 0ee77e1..23c2ed5 100644 --- a/src/main/kotlin/me/avo/spotify/dynamic/reddit/playlist/util/YamlConfigReader.kt +++ b/src/main/kotlin/me/avo/spottit/util/YamlConfigReader.kt @@ -1,7 +1,7 @@ -package me.avo.spotify.dynamic.reddit.playlist.util +package me.avo.spottit.util -import me.avo.spotify.dynamic.reddit.playlist.config.Configuration -import me.avo.spotify.dynamic.reddit.playlist.model.Playlist +import me.avo.spottit.model.Configuration +import me.avo.spottit.model.Playlist import net.dean.jraw.models.SubredditSort import net.dean.jraw.models.TimePeriod import org.yaml.snakeyaml.Yaml @@ -26,7 +26,8 @@ object YamlConfigReader { sort = SubredditSort.valueOf(it["sort"].toString()), timePeriod = TimePeriod.valueOf(it["timePeriod"].toString()) ) - } + }, + flairsToExclude = data["flairsToExclude"] as? List ?: listOf() ) } diff --git a/src/main/resources/templates/test.ftl b/src/main/resources/templates/test.ftl index e5be977..ef75bb9 100644 --- a/src/main/resources/templates/test.ftl +++ b/src/main/resources/templates/test.ftl @@ -3,49 +3,21 @@
-
-
-

${playlist.subreddit} Playlist

-

Time Period: ${playlist.timePeriod}

-

Sort: ${playlist.sort}

-

Max size: ${playlist.maxSize}

-
-
-

...tiles

-

Bottom tile

-
-
-
-
-

Middle tile

-

With an image

-
- -
-
-
-
-
-
-

Wide tile

-

Aligned with the right tile

-
- + <#list playlists as pl> +
+
+

${pl.subreddit} Playlist

+

Time Period: ${pl.timePeriod}

+

Sort: ${pl.sort}

+

Max size: ${pl.maxSize}

+
-
+ <#else> +

No Playlists

+ +
-
-
-
-

Tall tile

-

With even more content

-
- -
-
-
-
diff --git a/src/test/kotlin/me/avo/spotify/dynamic/reddit/playlist/config/DependencyTest.kt b/src/test/kotlin/me/avo/spottit/config/DependencyTest.kt similarity index 74% rename from src/test/kotlin/me/avo/spotify/dynamic/reddit/playlist/config/DependencyTest.kt rename to src/test/kotlin/me/avo/spottit/config/DependencyTest.kt index 3968e3b..d30baa6 100644 --- a/src/test/kotlin/me/avo/spotify/dynamic/reddit/playlist/config/DependencyTest.kt +++ b/src/test/kotlin/me/avo/spottit/config/DependencyTest.kt @@ -1,5 +1,6 @@ -package me.avo.spotify.dynamic.reddit.playlist.config +package me.avo.spottit.config +import me.avo.spottit.config.kodein import org.junit.jupiter.api.Test internal class DependencyTest { diff --git a/src/test/kotlin/me/avo/spotify/dynamic/reddit/playlist/server/TemplatesTest.kt b/src/test/kotlin/me/avo/spottit/server/TemplatesTest.kt similarity index 56% rename from src/test/kotlin/me/avo/spotify/dynamic/reddit/playlist/server/TemplatesTest.kt rename to src/test/kotlin/me/avo/spottit/server/TemplatesTest.kt index c257084..39df8b7 100644 --- a/src/test/kotlin/me/avo/spotify/dynamic/reddit/playlist/server/TemplatesTest.kt +++ b/src/test/kotlin/me/avo/spottit/server/TemplatesTest.kt @@ -1,4 +1,4 @@ -package me.avo.spotify.dynamic.reddit.playlist.server +package me.avo.spottit.server import io.ktor.application.call import io.ktor.application.install @@ -9,8 +9,10 @@ import io.ktor.routing.Routing import io.ktor.routing.get import io.ktor.server.engine.embeddedServer import io.ktor.server.netty.Netty -import me.avo.spotify.dynamic.reddit.playlist.model.Playlist -import me.avo.spotify.dynamic.reddit.playlist.util.openUrlInBrowser +import me.avo.spottit.model.Playlist +import me.avo.spottit.server.Templates +import me.avo.spottit.server.setupFreemarker +import me.avo.spottit.util.openUrlInBrowser import net.dean.jraw.models.SubredditSort import net.dean.jraw.models.TimePeriod import org.junit.jupiter.api.Test @@ -41,17 +43,25 @@ internal class TemplatesTest { } @Test fun test() { - class User(val name: String, val email: String) - val user = User("user name", "user@example.com") - val playlist = Playlist( - id = "93tu39t3903tj", - userId = "h378r3hr38", - subreddit = "trance", - timePeriod = TimePeriod.ALL, - sort = SubredditSort.TOP, - maxSize = 20 + val playlists = listOf( + Playlist( + id = "93tu39t3903tj", + userId = "h378r3hr38", + subreddit = "trance", + timePeriod = TimePeriod.ALL, + sort = SubredditSort.TOP, + maxSize = 20 + ), + Playlist( + id = "hjfh373hf29", + userId = "h378r3hr38", + subreddit = "trance", + timePeriod = TimePeriod.WEEK, + sort = SubredditSort.TOP, + maxSize = 10 + ) ) - render(FreeMarkerContent("test.ftl", mapOf("playlist" to playlist), "e")) + render(FreeMarkerContent("test.ftl", mapOf("playlists" to playlists), "e")) } } \ No newline at end of file diff --git a/src/test/kotlin/me/avo/spottit/util/SubmissionParserTest.kt b/src/test/kotlin/me/avo/spottit/util/SubmissionParserTest.kt new file mode 100644 index 0000000..acba00e --- /dev/null +++ b/src/test/kotlin/me/avo/spottit/util/SubmissionParserTest.kt @@ -0,0 +1,46 @@ +package me.avo.spottit.util + +import me.avo.spottit.model.RedditTrack +import org.amshove.kluent.shouldEqual +import org.junit.jupiter.api.DynamicTest +import org.junit.jupiter.api.TestFactory + +internal class SubmissionParserTest { + + private val pairs = listOf( + "Arty & Andrew Bayer - Follow The Light" to track("Arty & Andrew Bayer", "Follow The Light"), + "Sasha - Wavy Gravy (Paul Van Dyk Remix) [Unreleased]" to track( + "Sasha", + "Wavy Gravy", + "Paul Van Dyk Remix", + listOf("Unreleased") + ), + "The Dark Pheenix - Lost & Found (Original Extended Mix) [2018]" to track( + "The Dark Pheenix", + "Lost & Found", + "Original Extended Mix", + listOf("2018") + ), + "Signalrunners & Julie Thompson - These Shoulders (Oliver Smith Remix) [Anjunabeats] (2008)" to track( + "Signalrunners & Julie Thompson", + "These Shoulders", + "Oliver Smith Remix", + listOf("Anjunabeats", "2008") + ) + ) + + @TestFactory fun parse() = pairs.map { (raw, expected) -> + DynamicTest.dynamicTest(expected.artist) { + SubmissionParser.parse(raw, null) shouldEqual expected + } + } + + private fun track( + artist: String, + title: String, + mix: String? = null, + extraInformation: List = listOf(), + flair: String? = null + ) = RedditTrack(artist, title, mix, extraInformation, flair) + +} \ No newline at end of file diff --git a/src/test/kotlin/me/avo/spotify/dynamic/reddit/playlist/util/YamlConfigReaderTest.kt b/src/test/kotlin/me/avo/spottit/util/YamlConfigReaderTest.kt similarity index 81% rename from src/test/kotlin/me/avo/spotify/dynamic/reddit/playlist/util/YamlConfigReaderTest.kt rename to src/test/kotlin/me/avo/spottit/util/YamlConfigReaderTest.kt index 1d7992e..228006c 100644 --- a/src/test/kotlin/me/avo/spotify/dynamic/reddit/playlist/util/YamlConfigReaderTest.kt +++ b/src/test/kotlin/me/avo/spottit/util/YamlConfigReaderTest.kt @@ -1,8 +1,7 @@ -package me.avo.spotify.dynamic.reddit.playlist.util +package me.avo.spottit.util -import me.avo.spotify.dynamic.reddit.playlist.config.Configuration -import me.avo.spotify.dynamic.reddit.playlist.model.Playlist -import me.avo.spotify.dynamic.reddit.playlist.model.PostFilter +import me.avo.spottit.model.Configuration +import me.avo.spottit.model.Playlist import net.dean.jraw.models.SubredditSort import net.dean.jraw.models.TimePeriod import org.amshove.kluent.shouldEqual @@ -34,7 +33,8 @@ internal class YamlConfigReaderTest { sort = SubredditSort.TOP, timePeriod = TimePeriod.ALL ) - ) + ), + flairsToExclude = listOf("one", "Discussion") ) val actual = YamlConfigReader.read(yaml) diff --git a/src/test/resources/config.yml b/src/test/resources/config.yml index 3bea5b1..41480d2 100644 --- a/src/test/resources/config.yml +++ b/src/test/resources/config.yml @@ -12,3 +12,6 @@ playlists: sort: TOP timePeriod: ALL +flairsToExclude: + - one + - Discussion \ No newline at end of file