// // ImportedTrack.swift // TagTunes // // Created by Kim Wittenburg on 17.03.16. // Copyright © 2016 Kim Wittenburg. All rights reserved. // import SearchAPI public class ImportedTrack: TagTunesTrack { /// The `iTunesTrack` represented by this instance. private var track: iTunesTrack public override func readTrackID() throws -> SearchAPIID { guard let fileTrack = self.track as? iTunesFileTrack, fileURL = fileTrack.location where fileURL.checkResourceIsReachableAndReturnError(nil) else { throw TagTunesTrackErrors.FileNotFound } let fileHandle = try? NSFileHandle(forReadingFromURL: fileTrack.location) // Read the first 1024 bytes from the file. The file's ID seems to always // be at around 600-700 bytes so we don't need to read more than that. guard let data = fileHandle?.readDataOfLength(1024) else { throw TagTunesTrackErrors.FileNotReadable } let dataToFind = "song".dataUsingEncoding(NSASCIIStringEncoding)! let dataRange = data.rangeOfData(dataToFind, options: [], range: NSRange(location: 0, length: data.length)) guard dataRange.location != NSNotFound else { throw TagTunesTrackErrors.NoIDFound } var rawID: UInt32 = 0 data.getBytes(&rawID, range: NSRange(location: NSMaxRange(dataRange), length: 4)) return SearchAPIID(UInt32(bigEndian: rawID)) } /// Initializes the track with the specified `iTunesTrack`. public init(track: iTunesTrack) { self.track = track super.init() } public required init?(coder aDecoder: NSCoder) { if let track = aDecoder.decodeObjectOfClass(iTunesTrack.self, forKey: "track") { self.track = track super.init() } else { track = iTunesTrack() super.init() return nil } } public override func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(track, forKey: "track") } public override func valueForTag(tag: Tag) -> AnyObject! { return track.valueForKey(tag.rawValue) } public override func reveal() { track.reveal() iTunes.activate() } public override var supportsBatchSaving: Bool { return false } public override func saveValue(value: AnyObject?, forTag tag: Tag) throws { if tag == .Artwork { track.artworks().removeAllObjects() if let artwork = value as? NSImage { track.artworks().objectAtIndex(0).propertyWithCode(AEKeyword("pPCT")).setTo(artwork) } } else if let theValue = value { track.propertyWithCode(tag.code).setTo(theValue) } else { track.propertyWithCode(tag.code).setTo("") } } public override var hashValue: Int { return track.id() } } public func ==(lhs: ImportedTrack, rhs: ImportedTrack) -> Bool { return lhs.track.id() == rhs.track.id() }