107 lines
3.8 KiB
Swift
107 lines
3.8 KiB
Swift
//
|
|
// Artwork.swift
|
|
// Tag for iTunes
|
|
//
|
|
// Created by Kim Wittenburg on 30.05.15.
|
|
// Copyright (c) 2015 Kim Wittenburg. All rights reserved.
|
|
//
|
|
|
|
import Cocoa
|
|
|
|
/// Represents an Artwork from the
|
|
/// [Search API](https://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html).
|
|
public class Artwork: iTunesType {
|
|
|
|
// MARK: Properties
|
|
|
|
/// The URL for the artwork, sized to 60x60 pixels.
|
|
public let url60: NSURL
|
|
|
|
/// The URL for the artwork, sized to 100x100 pixels.
|
|
public let url100: NSURL
|
|
|
|
/// The URL for the artwork with full resolution.
|
|
///
|
|
/// - note: This URL is aquired by using an unofficial hack. If Apple changes
|
|
/// the way the full resolution artworks are stored this URL may be
|
|
/// `nil`.
|
|
public let hiResURL: NSURL!
|
|
|
|
// MARK: Initializers
|
|
|
|
public required init(data: [iTunesAPI.Field: AnyObject]) {
|
|
url60 = NSURL(string: data[.ArtworkUrl60] as! String)!
|
|
url100 = NSURL(string: data[.ArtworkUrl100] as! String)!
|
|
var hiResURLString = (data[.ArtworkUrl100] as! String)
|
|
let hotSpotRange = hiResURLString.rangeOfString("100x100", options: .BackwardsSearch, range: nil, locale: nil)!
|
|
hiResURLString.replaceRange(hotSpotRange, with: "1500x1500")
|
|
hiResURL = NSURL(string: hiResURLString)
|
|
}
|
|
|
|
public static var requiredFields: [iTunesAPI.Field] {
|
|
return [.ArtworkUrl60, .ArtworkUrl100]
|
|
}
|
|
|
|
// MARK: Methods
|
|
|
|
/// Saves the high resolution artwork to the specified URL. If there is
|
|
/// alread a file at the specified URL it will be overwritten.
|
|
///
|
|
/// - parameters:
|
|
/// - url: The URL of the directory the artwork is going to be saved to.
|
|
/// This must be a valid file URL.
|
|
/// - filename: The filename to be used (without the file extension).
|
|
public func saveToURL(url: NSURL, filename: String) throws {
|
|
let directory = url.filePathURL!.path!
|
|
let filePath = directory.stringByAppendingString("/\(filename).tiff")
|
|
|
|
try NSFileManager.defaultManager().createDirectoryAtPath(directory, withIntermediateDirectories: true, attributes: nil)
|
|
let _ = NSFileManager.defaultManager().createFileAtPath(filePath, contents: hiResImage?.TIFFRepresentation, attributes: nil)
|
|
}
|
|
|
|
// MARK: Calculated Properties
|
|
|
|
private var cachedImage60: NSImage?
|
|
|
|
/// Returns an `NSImage` instance of the image located at `url60`.
|
|
///
|
|
/// - attention: The first time this method is called the current thread will
|
|
/// be blocked until the image is loaded.
|
|
public var image60: NSImage? {
|
|
if cachedImage60 == nil {
|
|
cachedImage60 = NSImage(byReferencingURL: url60)
|
|
}
|
|
return cachedImage60
|
|
}
|
|
|
|
private var cachedImage100: NSImage?
|
|
|
|
/// Returns an `NSImage` instance of the image located at `url100`.
|
|
///
|
|
/// - attention: The first time this method is called the current thread will
|
|
/// be blocked until the image is loaded.
|
|
public var image100: NSImage? {
|
|
if cachedImage100 == nil {
|
|
cachedImage100 = NSImage(byReferencingURL: url100)
|
|
}
|
|
return cachedImage100
|
|
}
|
|
|
|
private var cachedHiResImage: NSImage?
|
|
|
|
/// Returns an `NSImage` instance of the image located at `hiResURL`.
|
|
///
|
|
/// - attention: The first time this method is called the current thread will
|
|
/// be blocked until the image is loaded.
|
|
public var hiResImage: NSImage? {
|
|
if hiResURL == nil {
|
|
return nil
|
|
}
|
|
if cachedHiResImage == nil {
|
|
cachedHiResImage = NSImage(byReferencingURL: hiResURL)
|
|
}
|
|
return cachedHiResImage
|
|
}
|
|
|
|
}
|