Skip to content

Commit

Permalink
Allow import playlist from Spotify
Browse files Browse the repository at this point in the history
  • Loading branch information
loafofpiecrust committed Nov 13, 2018
1 parent 164f989 commit 17d1035
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.loafofpiecrust.turntable.repository.remote.Spotify
import com.loafofpiecrust.turntable.model.song.Song
import com.loafofpiecrust.turntable.model.song.SongId
import com.loafofpiecrust.turntable.model.sync.User
import com.loafofpiecrust.turntable.sync.Sync
import com.loafofpiecrust.turntable.util.replayOne
import com.loafofpiecrust.turntable.util.serialize
import com.loafofpiecrust.turntable.util.toObject
Expand Down Expand Up @@ -261,29 +262,23 @@ class CollaborativePlaylist (
// }


suspend fun fromSpotifyPlaylist(userId: String, id: String): Result<CollaborativePlaylist, Exception> {
val playlist = try {
Spotify.getPlaylist(userId, id)
suspend fun fromSpotifyPlaylist(userId: String, id: String): Result<SongPlaylist, Exception> {
try {
val playlist = Spotify.getPlaylist(userId, id)
return Result.Ok(SongPlaylist(
PlaylistId(
playlist.name,
Sync.selfUser,
UUID.nameUUIDFromBytes(id.toByteArray())
)
).apply {
for (item in playlist.items) {
add(item.track, 0)
}
})
} catch (e: Exception) {
return Result.Error(e)
}

return Result.Ok(CollaborativePlaylist(
PlaylistId(
playlist.name,
User("", "", playlist.ownerName),
UUID.nameUUIDFromBytes(id.toByteArray())
),
null
).apply {
operations puts playlist.items.map {
val track = it.track
Operation.Add(
track,
it.addedAt.time
)
}
})
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,27 @@ import android.support.v7.graphics.Palette
import android.support.v7.widget.LinearLayoutManager
import android.view.*
import android.widget.EditText
import com.github.daemontus.Result
import com.github.daemontus.isOk
import com.github.daemontus.unwrap
import com.loafofpiecrust.turntable.R
import com.loafofpiecrust.turntable.appends
import com.github.daemontus.unwrapError
import com.loafofpiecrust.turntable.*
import com.loafofpiecrust.turntable.browse.RecentMixTapesFragment
import com.loafofpiecrust.turntable.model.playlist.*
import com.loafofpiecrust.turntable.prefs.UserPrefs
import com.loafofpiecrust.turntable.putsMapped
import com.loafofpiecrust.turntable.shifted
import com.loafofpiecrust.turntable.sync.Sync
import com.loafofpiecrust.turntable.model.sync.User
import com.loafofpiecrust.turntable.ui.*
import com.loafofpiecrust.turntable.ui.universal.createFragment
import com.loafofpiecrust.turntable.util.*
import com.loafofpiecrust.turntable.views.RecyclerBroadcastAdapter
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.ReceiveChannel
import kotlinx.coroutines.launch
import org.jetbrains.anko.*
import org.jetbrains.anko.recyclerview.v7.recyclerView
import org.jetbrains.anko.support.v4.alert
import org.jetbrains.anko.support.v4.toast
import java.lang.Exception
import kotlin.coroutines.CoroutineContext


Expand All @@ -51,33 +51,50 @@ class PlaylistsFragment: BaseFragment() {
AddPlaylistDialog().show(requireContext(), fullscreen = true)
}

menu.menuItem("From Spotify").onClick {
menu.menuItem("Import from Spotify").onClick {
alert {
title = "Playlist From Spotify"
title = "Import from Spotify"

lateinit var userEdit: EditText
lateinit var idEdit: EditText
lateinit var urlEdit: EditText
customView {
verticalLayout {
userEdit = editText {
hint = "User ID"
}
idEdit = editText {
hint = "Playlist ID"
frameLayout {
horizontalPadding = dimen(R.dimen.text_content_margin)
urlEdit = editText {
hint = "Spotify Playlist URL"
}
}
}

positiveButton("Load") {
launch(Dispatchers.IO) {
UserPrefs.playlists appends CollaborativePlaylist.fromSpotifyPlaylist(userEdit.text.toString(), idEdit.text.toString()).unwrap()
}
loadSpotifyPlaylist(urlEdit.text)
}
cancelButton {}
}.show()
}
}

private fun loadSpotifyPlaylist(urlText: CharSequence) {
val pattern = Regex("^https://open.spotify.com/user/(\\d+)/playlist/([^?]+)")
val url = pattern.find(urlText)
if (url != null) {
val userId = url.groupValues[1]
val playlistId = url.groupValues[2]
info { "Loading spotify playlist $playlistId by $userId" }
launch(Dispatchers.IO) {
val pl = CollaborativePlaylist.fromSpotifyPlaylist(userId, playlistId)
if (pl is Result.Ok) {
info { "Loaded playlist ${pl.ok.tracks}" }
UserPrefs.playlists appends pl.ok
} else launch(Dispatchers.Main) {
error("Failed to load Spotify playlist", pl.unwrapError())
toast("Failed to load Spotify playlist")
}
}
} else {
toast("Invalid Spotify playlist url")
}
}

override fun ViewManager.createView() = recyclerView {
layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -424,14 +424,14 @@ object Spotify: Repository {
)
)
}
val finalTracks = if (items.size == 100) {
items + getPlaylist(userId, playlistId, page + 1).items
} else items
// val finalTracks = if (items.size >= 100) {
// items + getPlaylist(userId, playlistId, page + 1).items
// } else items

return Playlist(
name = res["name"].string,
ownerName = res["owner"]["display_name"].string,
items = finalTracks
items = items
)
}

Expand Down

0 comments on commit 17d1035

Please sign in to comment.