From: Ben Beltran Date: Sat, 20 May 2017 16:19:57 +0000 (-0500) Subject: Add iTunes source manager X-Git-Tag: 0.2.0^2~2^2~3 X-Git-Url: https://git.r.bdr.sh/rbdr/lyricli/commitdiff_plain/893a0a9b70b5c436802afccfd9639523676b39a6?hp=d0705bff97871fc62a9d7737dadbe4fdb39b2f79 Add iTunes source manager It includes support for internet streams (tested with soma.fm) and regular songs --- diff --git a/Sources/itunes_source.swift b/Sources/itunes_source.swift new file mode 100644 index 0000000..449dd8a --- /dev/null +++ b/Sources/itunes_source.swift @@ -0,0 +1,57 @@ +import ScriptingBridge + +// Protocol to obtain the track from iTunes +@objc protocol iTunesTrack { + @objc optional var name: String {get} + @objc optional var artist: String {get} +} + +// Protocol to interact with iTunes +@objc protocol iTunesApplication { + @objc optional var currentTrack: iTunesTrack? {get} + @objc optional var currentStreamTitle: String? {get} +} + +extension SBApplication : iTunesApplication {} + +// Source that reads track artist and name from current itunes track +class ItunesSource: Source { + + // Calls the spotify API and returns the current track + var currentTrack: Track? { + + if let iTunes: iTunesApplication = SBApplication(bundleIdentifier: "com.apple.iTunes") { + + // Attempt to fetch the title from a stream + if let currentStreamTitle = iTunes.currentStreamTitle { + if let track = currentStreamTitle { + + let trackComponents = track.characters.split(separator: "-").map(String.init) + + if trackComponents.count == 2 { + let artist = trackComponents[0].trimmingCharacters(in: .whitespaces) + let name = trackComponents[1].trimmingCharacters(in: .whitespaces) + + return Track(withName: name, andArtist: artist) + } + + } + } + + // Attempt to fetch the title from a song + if let currentTrack = iTunes.currentTrack { + if let track = currentTrack { + if let name = track.name { + if let artist = track.artist { + + return Track(withName: name, andArtist: artist) + } + } + } + } + } + + return nil + } + +}