]> git.r.bdr.sh - rbdr/lyricli/commitdiff
Merge branch 'feature/rbdr-itunes-source' into develop
authorBen Beltran <redacted>
Sat, 20 May 2017 16:28:09 +0000 (11:28 -0500)
committerBen Beltran <redacted>
Sat, 20 May 2017 16:28:09 +0000 (11:28 -0500)
CHANGELOG.md
Sources/configuration.swift
Sources/itunes_source.swift [new file with mode: 0644]
Sources/lyrics_engine.swift
Sources/source_manager.swift

index 029adac42c190111a5616c180715398c1b7476f4..57aa84361d5411b62036dff117a88aa6f35c2e51 100644 (file)
@@ -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
index f1a1ee1203ac04c5e129d80ff69ab98b96be220a..1db36959f2367a38e218ac3521049924e3308686 100644 (file)
@@ -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 (file)
index 0000000..449dd8a
--- /dev/null
@@ -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
+    }
+
+}
index 85e4735eaa00a5027f795285a65b46061d89bcf2..27e0e11f111b0eb86f75192a08824eed585027ef 100644 (file)
@@ -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 {
index 5ee1305c9927cb8968ba2aba05b074c19a3c5b17..aaac6963dfacef66482e3a1f7f054eb0138b5010 100644 (file)
@@ -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