From: Ben Beltran Date: Sat, 20 May 2017 16:28:09 +0000 (-0500) Subject: Merge branch 'feature/rbdr-itunes-source' into develop X-Git-Tag: 0.2.0^2~2 X-Git-Url: https://git.r.bdr.sh/rbdr/lyricli/commitdiff_plain/27eea5168b00796ab254247a072d936195c37d31?hp=3bab02fa48a7474f4b03e4afb73e7f6842555ce4 Merge branch 'feature/rbdr-itunes-source' into develop --- diff --git a/CHANGELOG.md b/CHANGELOG.md index 029adac..57aa843 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## Unreleased +### Added +- iTunes Source Support + +### Fixed +- Lyricli freezes when no track found + ## 0.1.0 - 2017-05-20 ### Added - Documentation with Jazzy / SourceKitten diff --git a/Sources/configuration.swift b/Sources/configuration.swift index f1a1ee1..1db3695 100644 --- a/Sources/configuration.swift +++ b/Sources/configuration.swift @@ -8,7 +8,7 @@ class Configuration { // Default options, will be automatically written to the global config if // not found. private var configuration: [String: Any] = [ - "enabled_sources": ["arguments"] + "enabled_sources": ["arguments", "itunes"] ] // The shared instance of the object 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 + } + +} diff --git a/Sources/lyrics_engine.swift b/Sources/lyrics_engine.swift index 85e4735..27e0e11 100644 --- a/Sources/lyrics_engine.swift +++ b/Sources/lyrics_engine.swift @@ -36,11 +36,9 @@ class LyricsEngine { // Call the API and unlock when you're done fetchLyricsFromAPI(withURL: url, completionHandler: {lyricsResult -> Void in - if let lyricsResult = lyricsResult { - lyrics = lyricsResult - requestFinished = true - asyncLock.signal() - } + lyrics = lyricsResult + requestFinished = true + asyncLock.signal() }) while !requestFinished { diff --git a/Sources/source_manager.swift b/Sources/source_manager.swift index 5ee1305..aaac696 100644 --- a/Sources/source_manager.swift +++ b/Sources/source_manager.swift @@ -3,7 +3,8 @@ class SourceManager { // List of sources enabled for the crurent platform private var availableSources: [String: Source] = [ - "arguments": ArgumentsSource() + "arguments": ArgumentsSource(), + "itunes": ItunesSource() ] // Iterate over the sources until we find a track or run out of sources