Public/Backup-Library.ps1
<#
.SYNOPSIS Backup Library items to json file (FollowedArtists, Playlists, SavedAlbums, SavedShows, SavedTracks) .EXAMPLE PS C:\> Backup-Library -Path '.\mySpotifyBackup.json' Backup all Library items into '.\mySpotifyBackup.json' .EXAMPLE PS C:\> Backup-Library -Type FollowedArtists,SavedAlbums -Path '.\mySpotifyBackup.json' Backup Followed Artists and Saved Albums items into '.\mySpotifyBackup.json' .PARAMETER Path Path of the backup file you want to create .PARAMETER Type One or more items type to backup (All, FollowedArtists, SavedAlbums, SavedShows, SavedTracks) .PARAMETER ApplicationName Specifies the Spotify Application Name (otherwise default is used) #> function Backup-Library { param ( [Parameter(Mandatory)] [string] $Path, [ValidateSet('All', 'Playlists', 'FollowedArtists', 'SavedAlbums', 'SavedShows', 'SavedTracks')] [array] $Type = 'All', [string] $ApplicationName ) #TODO autogenerate path if not provided then inform $Backup = @{} if ($Type -contains 'Playlists' -or $Type -contains 'All') { $Playlists = [array](Get-CurrentUserPlaylists -ApplicationName $ApplicationName) $MyId = (Get-CurrentUserProfile).id # process followed playlists (owner is not me) $Backup.followed_playlists = foreach ($playlist in $Playlists.Where( { $_.owner.id -ne $MyId })) { $playlist | Select-Object id, public } # process my playlists (owner is me) $Backup.my_playlists = foreach ($playlist in $Playlists.Where( { $_.owner.id -eq $MyId })) { [PSCustomObject]@{ id = $playlist.id name = $playlist.name public = $playlist.public collaborative = $playlist.collaborative description = $playlist.description tracks = (Get-PlaylistItems -Id $playlist.id -ApplicationName $ApplicationName).track.uri images = &{ $image = ($playlist.images | Sort-Object -Property height -Descending)[0] if ($null -ne $image) { $ProgressPreference = 'SilentlyContinue' $imgBytes = (Invoke-WebRequest $image.url).Content $ProgressPreference = 'Continue' [Convert]::ToBase64String($imgBytes) } } } } } if ($Type -contains 'FollowedArtists' -or $Type -contains 'All') { $Backup.followed_artists = (Get-FollowedArtists -ApplicationName $ApplicationName | Select-Object name, id) } if ($Type -contains 'SavedAlbums' -or $Type -contains 'All') { $Backup.saved_albums = ((Get-CurrentUserSavedAlbums -ApplicationName $ApplicationName).album | Select-Object name, id) } if ($Type -contains 'SavedShows' -or $Type -contains 'All') { $Backup.saved_shows = ((Get-CurrentUserSavedShows -ApplicationName $ApplicationName).show | Select-Object name, id) } if ($Type -contains 'SavedTracks' -or $Type -contains 'All') { $Backup.saved_tracks = ((Get-CurrentUserSavedTracks -ApplicationName $ApplicationName).track | Select-Object name, id) } Set-Content -Path $Path -Value (ConvertTo-Json -InputObject $Backup) -Encoding Unicode } |