Skip to content

Commit

Permalink
Add support for fetching user library albums and songs
Browse files Browse the repository at this point in the history
  • Loading branch information
stevesoltys committed Dec 1, 2024
1 parent 389e214 commit 52674d7
Show file tree
Hide file tree
Showing 23 changed files with 249 additions and 16 deletions.
52 changes: 51 additions & 1 deletion src/main/kotlin/com/stevesoltys/applemusic/AppleMusic.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ import com.stevesoltys.applemusic.model.artist.ArtistResponse
import com.stevesoltys.applemusic.model.chart.ChartResponse
import com.stevesoltys.applemusic.model.chart.ChartResultType
import com.stevesoltys.applemusic.model.chart.ChartType
import com.stevesoltys.applemusic.model.libraryartist.LibraryArtistResponse
import com.stevesoltys.applemusic.model.album.library.LibraryAlbumResponse
import com.stevesoltys.applemusic.model.artist.library.LibraryArtistResponse
import com.stevesoltys.applemusic.model.search.SearchResponse
import com.stevesoltys.applemusic.model.search.SearchResultType
import com.stevesoltys.applemusic.model.track.song.library.LibrarySongResponse
import com.stevesoltys.applemusic.net.AppleMusicHttpException
import com.stevesoltys.applemusic.net.AppleMusicRetrofitBuilder
import com.stevesoltys.applemusic.net.AppleMusicService
Expand Down Expand Up @@ -213,6 +215,54 @@ class AppleMusic(
)
}

/**
* Get all albums from a user's library.
*/
fun getLibraryAlbums(
userToken: String,
include: Set<String>? = null,
localization: String? = null,
limit: Int? = null,
offset: String? = null,
extend: Set<String>? = null
): LibraryAlbumResponse {

return call(
appleMusicService.getLibraryAlbums(
userToken = userToken,
include = include?.toTypedArray(),
localization = localization,
limit = limit,
offset = offset,
extend = extend?.toTypedArray()
)
)
}

/**
* Get all songs from a user's library.
*/
fun getLibrarySongs(
userToken: String,
include: Set<String>? = null,
localization: String? = null,
limit: Int? = null,
offset: String? = null,
extend: Set<String>? = null
): LibrarySongResponse {

return call(
appleMusicService.getLibrarySongs(
userToken = userToken,
include = include?.toTypedArray(),
localization = localization,
limit = limit,
offset = offset,
extend = extend?.toTypedArray()
)
)
}

private fun <T> call(call: Call<T>): T {
val response = call.execute()

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.stevesoltys.applemusic.model

/**
* @author Steve Soltys
*/
data class PlayParameters(
val id: String,
val kind: String
)
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package com.stevesoltys.applemusic.model
* @author Steve Soltys
*/
open class Relationship {
val href: String? = null

var href: String? = null
val next: String? = null
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.stevesoltys.applemusic.model.album.library

import com.stevesoltys.applemusic.model.Resource

/**
* @author Steve Soltys
*/
data class LibraryAlbum(
val attributes: LibraryAlbumAttributes? = null,
val relationships: LibraryAlbumRelationships? = null
) : Resource()
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.stevesoltys.applemusic.model.album.library

import com.stevesoltys.applemusic.model.Relationship
import com.stevesoltys.applemusic.model.artist.library.LibraryArtist

data class LibraryAlbumArtistsRelationship(
val data: List<LibraryArtist>
) : Relationship()
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.stevesoltys.applemusic.model.album.library

import com.stevesoltys.applemusic.model.Artwork
import com.stevesoltys.applemusic.model.PlayParameters

/**
* @author Steve Soltys
*/
data class LibraryAlbumAttributes(
val artistName: String,
val artwork: Artwork,
val contentRating: String? = null,
val dateAdded: String? = null,
val name: String,
val playParams: PlayParameters? = null,
val releaseDate: String? = null,
val trackCount: Int,
val genreNames: List<String>
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.stevesoltys.applemusic.model.album.library

import com.stevesoltys.applemusic.model.Relationship
import com.stevesoltys.applemusic.model.album.Album

data class LibraryAlbumCatalogRelationship(
val data: List<Album>
) : Relationship()
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.stevesoltys.applemusic.model.album.library

import com.stevesoltys.applemusic.model.Relationship

/**
* @author Steve Soltys
*/
data class LibraryAlbumRelationships(
val artists: LibraryAlbumArtistsRelationship? = null,
val catalog: LibraryAlbumCatalogRelationship? = null
) : Relationship()
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.stevesoltys.applemusic.model.album.library

import com.stevesoltys.applemusic.model.ResponseRoot

/**
* @author Steve Soltys
*/
data class LibraryAlbumResponse(
val data: List<LibraryAlbum>
) : ResponseRoot()
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.stevesoltys.applemusic.model.libraryartist
package com.stevesoltys.applemusic.model.artist.library

import com.stevesoltys.applemusic.model.Resource

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.stevesoltys.applemusic.model.libraryartist
package com.stevesoltys.applemusic.model.artist.library

/**
* @author Steve Soltys
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.stevesoltys.applemusic.model.libraryartist
package com.stevesoltys.applemusic.model.artist.library

import com.stevesoltys.applemusic.model.Resource
import com.stevesoltys.applemusic.model.artist.Artist

data class LibraryArtistsCatalogRelationship(
data class LibraryArtistCatalogRelationship(
val data: List<Artist>
) : Resource()
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.stevesoltys.applemusic.model.artist.library

import com.stevesoltys.applemusic.model.Relationship

/**
* @author Steve Soltys
*/
data class LibraryArtistRelationships(
val catalog: LibraryArtistCatalogRelationship? = null
) : Relationship()
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.stevesoltys.applemusic.model.libraryartist
package com.stevesoltys.applemusic.model.artist.library

import com.stevesoltys.applemusic.model.ResponseRoot

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.stevesoltys.applemusic.model.track.song.library

import com.stevesoltys.applemusic.model.Resource

/**
* @author Steve Soltys
*/
data class LibrarySong(
val attributes: LibrarySongAttributes? = null,
val relationships: LibrarySongRelationships? = null
) : Resource()
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.stevesoltys.applemusic.model.track.song.library

import com.stevesoltys.applemusic.model.Relationship
import com.stevesoltys.applemusic.model.album.library.LibraryAlbum
import com.stevesoltys.applemusic.model.artist.library.LibraryArtist

data class LibrarySongAlbumsRelationship(
val data: List<LibraryAlbum>
) : Relationship()
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.stevesoltys.applemusic.model.track.song.library

import com.stevesoltys.applemusic.model.Relationship
import com.stevesoltys.applemusic.model.artist.library.LibraryArtist

data class LibrarySongArtistsRelationship(
val data: List<LibraryArtist>
) : Relationship()
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.stevesoltys.applemusic.model.track.song.library

import com.stevesoltys.applemusic.model.Artwork
import com.stevesoltys.applemusic.model.PlayParameters

/**
* @author Steve Soltys
*/
data class LibrarySongAttributes(
val albumName: String? = null,
val artistName: String,
val artwork: Artwork,
val contentRating: String? = null,
val discNumber: Int? = null,
val durationInMillis: Int,
val genreNames: List<String>,
val hasLyrics: Boolean,
val name: String,
val playParams: PlayParameters? = null,
val releaseDate: String? = null,
val trackNumber: Int? = null
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.stevesoltys.applemusic.model.track.song.library

import com.stevesoltys.applemusic.model.Relationship
import com.stevesoltys.applemusic.model.Resource
import com.stevesoltys.applemusic.model.album.Album
import com.stevesoltys.applemusic.model.track.song.Song

data class LibrarySongCatalogRelationship(
val data: List<Song>
) : Relationship()
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.stevesoltys.applemusic.model.track.song.library

import com.stevesoltys.applemusic.model.Relationship

/**
* @author Steve Soltys
*/
data class LibrarySongRelationships(
val albums: LibrarySongAlbumsRelationship? = null,
val artists: LibrarySongArtistsRelationship? = null,
val catalog: LibrarySongCatalogRelationship? = null
) : Relationship()
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.stevesoltys.applemusic.model.track.song.library

import com.stevesoltys.applemusic.model.ResponseRoot

/**
* @author Steve Soltys
*/
data class LibrarySongResponse(
val data: List<LibrarySong>
) : ResponseRoot()
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ package com.stevesoltys.applemusic.net
import com.stevesoltys.applemusic.model.album.AlbumResponse
import com.stevesoltys.applemusic.model.artist.ArtistResponse
import com.stevesoltys.applemusic.model.chart.ChartResponse
import com.stevesoltys.applemusic.model.libraryartist.LibraryArtistResponse
import com.stevesoltys.applemusic.model.album.library.LibraryAlbumResponse
import com.stevesoltys.applemusic.model.artist.library.LibraryArtistResponse
import com.stevesoltys.applemusic.model.search.SearchResponse
import com.stevesoltys.applemusic.model.track.song.library.LibrarySongResponse
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Header
Expand Down Expand Up @@ -80,4 +82,24 @@ interface AppleMusicService {
@Query("offset") offset: String? = null,
@Query("extend") extend: Array<String>? = null
): Call<LibraryArtistResponse>

@GET("me/library/albums")
fun getLibraryAlbums(
@Header("Music-User-Token") userToken: String,
@Query("include") include: Array<String>? = null,
@Query("l") localization: String? = null,
@Query("limit") limit: Int? = null,
@Query("offset") offset: String? = null,
@Query("extend") extend: Array<String>? = null
): Call<LibraryAlbumResponse>

@GET("me/library/songs")
fun getLibrarySongs(
@Header("Music-User-Token") userToken: String,
@Query("include") include: Array<String>? = null,
@Query("l") localization: String? = null,
@Query("limit") limit: Int? = null,
@Query("offset") offset: String? = null,
@Query("extend") extend: Array<String>? = null
): Call<LibrarySongResponse>
}

0 comments on commit 52674d7

Please sign in to comment.