/// <summary>
        /// Duplicate a playlist in the other libraries
        /// </summary>
        /// <param name="playlistToDuplicate"></param>
        public static void DuplicatePlaylist(Playlist playlistToDuplicate)
        {
            // Duplicate the playlist in all libraries except the one it is in
            foreach (Library library in Libraries.LibraryCollection)
            {
                if (library.Id != playlistToDuplicate.LibraryId)
                {
                    // If a playlist with the same name already exists then delete it. This is being deleted rather than being reused just in case it
                    // is the wrong type of playlist
                    Playlist existingPlaylist = Playlists.PlaylistCollection
                                                .Where(playlist => (playlist.Name == playlistToDuplicate.Name) && (playlist.LibraryId == library.Id)).SingleOrDefault();

                    if (existingPlaylist != null)
                    {
                        Playlists.DeletePlaylist(existingPlaylist);
                    }

                    if (playlistToDuplicate is SongPlaylist playlist)
                    {
                        DuplicateSongPlaylistAsync(playlist, library.Id);
                    }
                    else
                    {
                        DuplicateAlbumPlaylistAsync(( AlbumPlaylist )playlistToDuplicate, library.Id);
                    }
                }
            }
        }
        /// <summary>
        /// Delete the specified playlist and its contents
        /// </summary>
        /// <param name="thePlaylist"></param>
        public static void DeletePlaylist(Playlist thePlaylist)
        {
            // Delete the playlist and then refresh the data held by the model
            Playlists.DeletePlaylist(thePlaylist);

            // Refresh the playlists held by the model and report the change
            StorageDataAvailable();
        }
        /// <summary>
        /// Clear the contents of the specified library
        /// </summary>
        /// <param name="libraryToClear"></param>
        /// <returns></returns>
        public static void ClearLibrary(Library libraryToClear)
        {
            int libId = libraryToClear.Id;

            // Delete all the artists in the library and their associated ArtistAlbum entries
            List <Artist> artists = Artists.ArtistCollection.Where(art => art.LibraryId == libId).ToList();

            Artists.DeleteArtists(artists);

            ArtistAlbums.DeleteArtistAlbums(
                ArtistAlbums.ArtistAlbumCollection.Where(artAlb => artists.Any(art => art.Id == artAlb.ArtistId)).Distinct().ToList());

            // Delete all the albums in the library and any tags associated with them
            List <Album> albums = Albums.AlbumCollection.Where(alb => alb.LibraryId == libId).ToList();

            Albums.DeleteAlbums(albums);

            // We can use the FilterManagementController to carry out the Tag deletions.
            new AlbumsDeletedMessage()
            {
                DeletedAlbumIds = albums.Select(alb => alb.Id).ToList()
            }.Send();

            // Delete all the user playlists and thier contents
            Playlists.GetPlaylistsForLibrary(libId).ForEach(play => Playlists.DeletePlaylist(play));

            // Delete the contents of the NowPlayingList but keep the playlist itself
            Playlist nowPlaying = Playlists.GetNowPlayingPlaylist(libId);

            nowPlaying.Clear();
            nowPlaying.SongIndex = -1;

            // Delete all the songs in each of the sources associated with the library
            List <Source> sources = Sources.GetSourcesForLibrary(libId);

            foreach (Source source in sources)
            {
                Songs.DeleteSongs(Songs.GetSourceSongs(source.Id));
                source.Songs = null;
            }
        }