Archived
1

Added 'Tags' preferences with saving behaviors for each tag

This commit is contained in:
Kim Wittenburg
2015-09-04 17:23:45 +02:00
parent b851b70ddb
commit 45f664cb10
6 changed files with 453 additions and 81 deletions

View File

@@ -12,6 +12,46 @@ import Cocoa
/// [Search API](https://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html).
public class Track: iTunesType {
// MARK: Types
public enum Tag: String {
case Name = "name", Artist = "artist", Year = "year", TrackNumber = "trackNumber", TrackCount = "trackCount", DiscNumber = "discNumber", DiscCount = "discCount", Genre = "genre", AlbumName = "album", AlbumArtist = "albumArtist"
case SortName = "sortName", SortArtist = "sortArtist", SortAlbumName = "sortAlbum", SortAlbumArtist = "sortAlbumArtist", Composer = "composer", SortComposer = "sortComposer", Comment = "comment"
/// Returns `true` for tags that are returned from the
/// [Search API](https://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html).
public var isReturnedBySearchAPI: Bool {
switch self {
case .Name, .Artist, .Year, .TrackNumber, .TrackCount, .DiscNumber, .DiscCount, .Genre, .AlbumName, .AlbumArtist:
return true
default:
return false
}
}
/// Returns a string identifying the respective tag that can be displayed
/// to the user.
public var localizedName: String {
return NSLocalizedString(self.rawValue, comment: "")
}
/// Returns the object that should be saved to *clear* the tag.
public var clearedValue: AnyObject? {
switch self {
case .Year, .TrackNumber, .TrackCount, .DiscNumber, .DiscCount:
return ""
default:
return ""
}
}
/// Returns an array of all tags.
public static var allTags: [Tag] {
return [.Name, .Artist, .Year, .TrackNumber, .TrackCount, .DiscNumber, .DiscCount, .Genre, .AlbumName, .AlbumArtist, .SortName, .SortArtist, .SortAlbumName, .SortAlbumArtist, .Composer, .SortComposer, .Comment]
}
}
// MARK: Properties
public let id: iTunesId
@@ -82,24 +122,42 @@ public class Track: iTunesType {
/// This method respects the user's preferences (See `Preferences` class).
public func saveToTrack(track: iTunesTrack) {
let components = NSCalendar.currentCalendar().components(.Year, fromDate: releaseDate)
track.name = name
track.artist = artistName
track.year = components.year
track.trackNumber = trackNumber
track.trackCount = trackCount
track.discNumber = discNumber
track.discCount = discCount
track.genre = genre
track.album = album?.name
track.albumArtist = album?.artistName
track.sortName = ""
track.sortAlbum = ""
track.sortAlbumArtist = ""
track.sortArtist = ""
track.composer = ""
track.sortComposer = ""
track.comment = ""
track.artworks().removeAllObjects()
let trackName = Preferences.sharedPreferences.useCensoredNames ? censoredName : name
saveTag(.Name, toTrack: track, value: trackName)
saveTag(.Artist, toTrack: track, value: artistName)
saveTag(.Year, toTrack: track, value: components.year)
saveTag(.TrackNumber, toTrack: track, value: trackNumber)
saveTag(.TrackCount, toTrack: track, value: trackCount)
saveTag(.DiscNumber, toTrack: track, value: discNumber)
saveTag(.DiscCount, toTrack: track, value: discCount)
saveTag(.Genre, toTrack: track, value: genre)
let albumName = Preferences.sharedPreferences.useCensoredNames ? album.censoredName : album.name
saveTag(.AlbumName, toTrack: track, value: albumName)
saveTag(.AlbumArtist, toTrack: track, value: album.artistName)
saveTag(.SortName, toTrack: track, value: nil)
saveTag(.SortArtist, toTrack: track, value: nil)
saveTag(.SortAlbumName, toTrack: track, value: nil)
saveTag(.SortAlbumArtist, toTrack: track, value: nil)
saveTag(.Composer, toTrack: track, value: nil)
saveTag(.SortComposer, toTrack: track, value: nil)
saveTag(.Comment, toTrack: track, value: nil)
// TODO: Deal with artworks
// if Preferences.sharedPreferences.clearArtworks {
// track.artworks().removeAllObjects()
// }
}
private func saveTag(tag: Tag, toTrack track: iTunesTrack, value: AnyObject?) {
switch Preferences.sharedPreferences.tagSavingBehaviors[tag]! {
case .Save:
track.setValue(value, forKey: tag.rawValue)
case .Clear:
track.setValue(tag.clearedValue, forKey: tag.rawValue)
case .Ignore:
break
}
track.setValue(value, forKey: tag.rawValue)
}
/// Returns `true` if all `associatedTrack`s contain the same values as the