diff --git a/Mac/Components/Browser/Album Browser/AlbumViewItem.swift b/Mac/Components/Browser/Album Browser/AlbumViewItem.swift index 6528c0e..976cb60 100644 --- a/Mac/Components/Browser/Album Browser/AlbumViewItem.swift +++ b/Mac/Components/Browser/Album Browser/AlbumViewItem.swift @@ -59,7 +59,7 @@ class AlbumViewItem: NSCollectionViewItem { guard let song = album.mpdAlbum.firstSong else { return } - let provider = MPDAlbumArtImageDataProvider( + let provider = AlbumArtImageDataProvider( songUri: song.uriString, cacheKey: album.hash ) diff --git a/Mac/Components/Browser/Album Detail/AlbumDetailView.swift b/Mac/Components/Browser/Album Detail/AlbumDetailView.swift index 1f18808..25cf964 100644 --- a/Mac/Components/Browser/Album Detail/AlbumDetailView.swift +++ b/Mac/Components/Browser/Album Detail/AlbumDetailView.swift @@ -132,7 +132,7 @@ class AlbumDetailView: NSViewController { } func getBigCoverArt(song: Song, album: Album) { - let provider = MPDAlbumArtImageDataProvider( + let provider = AlbumArtImageDataProvider( songUri: song.mpdSong.uriString, cacheKey: album.hash ) diff --git a/Mac/Components/Preferences/CoverArtPrefsController.swift b/Mac/Components/Preferences/CoverArtPrefsController.swift index 23511e5..3445b1e 100644 --- a/Mac/Components/Preferences/CoverArtPrefsController.swift +++ b/Mac/Components/Preferences/CoverArtPrefsController.swift @@ -18,6 +18,16 @@ class CoverArtPrefsController: NSViewController { } else { fetchMissingArtworkFromInternet.state = .off } + + if App.store.state.preferencesState.fetchArtworkFromCustomURL { + customArtworkURLButton.state = .on + } else { + customArtworkURLButton.state = .off + } + + if let urlString = App.store.state.preferencesState.customArtworkURL?.absoluteString { + customArtworkURLTextField.stringValue = urlString + } preferredContentSize = NSMakeSize(view.frame.size.width, view.frame.size.height) } @@ -37,6 +47,18 @@ class CoverArtPrefsController: NSViewController { ) ) } + + @IBAction func updateCustomArtworkURLToggle(_ sender: NSButton) { + App.store.dispatch( + UpdateCustomArtworkURLToggle(useCustomArtworkURL: sender.state == .on) + ) + } + + @IBAction func updateCustomArtworkURL(_ sender: NSTextField) { + App.store.dispatch( + UpdateCustomArtworkURL(customArtworkURL: sender.stringValue) + ) + } @IBAction func clearAlbumArtCache(_ sender: NSButton) { KingfisherManager.shared.cache.clearDiskCache() @@ -44,4 +66,6 @@ class CoverArtPrefsController: NSViewController { } @IBOutlet var fetchMissingArtworkFromInternet: NSButton! + @IBOutlet var customArtworkURLTextField: NSTextField! + @IBOutlet var customArtworkURLButton: NSButton! } diff --git a/Mac/Components/Queue/CurrentCoverArtView.swift b/Mac/Components/Queue/CurrentCoverArtView.swift index b91f03e..d177808 100644 --- a/Mac/Components/Queue/CurrentCoverArtView.swift +++ b/Mac/Components/Queue/CurrentCoverArtView.swift @@ -29,7 +29,7 @@ class CurrentCoverArtView: NSImageView { } func setSongImage(_ song: Song) { - let provider = MPDAlbumArtImageDataProvider( + let provider = AlbumArtImageDataProvider( songUri: song.mpdSong.uriString, cacheKey: song.album.hash ) diff --git a/Mac/Components/Queue/QueueSongCoverView.swift b/Mac/Components/Queue/QueueSongCoverView.swift index 854a090..831637a 100644 --- a/Mac/Components/Queue/QueueSongCoverView.swift +++ b/Mac/Components/Queue/QueueSongCoverView.swift @@ -64,7 +64,7 @@ class QueueSongCoverView: NSTableCellView { isPlaying = queueItem.isPlaying - let provider = MPDAlbumArtImageDataProvider( + let provider = AlbumArtImageDataProvider( songUri: song.mpdSong.uriString, cacheKey: song.album.hash ) diff --git a/Mac/Components/Shared/DraggedSongView.swift b/Mac/Components/Shared/DraggedSongView.swift index af4f414..09f849c 100644 --- a/Mac/Components/Shared/DraggedSongView.swift +++ b/Mac/Components/Shared/DraggedSongView.swift @@ -64,7 +64,7 @@ class DraggedSongView: NSViewController { func setCoverArt() { let mpdAlbum = MPDClient.MPDAlbum(title: songAlbum, artist: songAlbumArtist) - let provider = MPDAlbumArtImageDataProvider( + let provider = AlbumArtImageDataProvider( songUri: songUri, cacheKey: Album(mpdAlbum: mpdAlbum).hash ) diff --git a/Mac/Components/Shared/ImageDataProviders/CustomURLAlbumArtImageDataProvider.swift b/Mac/Components/Shared/ImageDataProviders/CustomURLAlbumArtImageDataProvider.swift new file mode 100644 index 0000000..cff0998 --- /dev/null +++ b/Mac/Components/Shared/ImageDataProviders/CustomURLAlbumArtImageDataProvider.swift @@ -0,0 +1,39 @@ +// +// CustomURLAlbumArtImageDataProvider.swift +// Persephone +// +// Created by Diego Torres on 07.11.20. +// Copyright © 2020 Dan Barber. All rights reserved. +// + +import Foundation +import Kingfisher + +public struct CustomURLAlbumArtImageDataProvider: ImageDataProvider { + let songUri: String + let baseURL: URL + + init(baseURL: URL, songUri: String, cacheKey: String) { + self.songUri = songUri + self.cacheKey = cacheKey + self.baseURL = baseURL + } + + public var cacheKey: String + + public func data(handler: @escaping (Result) -> Void) { + let task = URLSession.shared.dataTask(with: baseURL.appendingPathComponent(songUri)) { (data, response, error) in + let result = Result { + if let error = error { throw error } + guard let data = data else { throw URLError(.badServerResponse) } + return data + } + handler(result) + } + task.resume() + } + + public var contentURL: String? { + return songUri + } +} diff --git a/Mac/Components/Shared/ImageDataProviders/MPDAlbumArtImageDataProvider.swift b/Mac/Components/Shared/ImageDataProviders/MPDAlbumArtImageDataProvider.swift index 09c6ed0..58da50e 100644 --- a/Mac/Components/Shared/ImageDataProviders/MPDAlbumArtImageDataProvider.swift +++ b/Mac/Components/Shared/ImageDataProviders/MPDAlbumArtImageDataProvider.swift @@ -32,3 +32,11 @@ public struct MPDAlbumArtImageDataProvider: ImageDataProvider { return songUri } } + +public func AlbumArtImageDataProvider(songUri: String, cacheKey: String) -> ImageDataProvider { + if App.store.state.preferencesState.fetchArtworkFromCustomURL, let url = App.store.state.preferencesState.customArtworkURL { + return CustomURLAlbumArtImageDataProvider(baseURL: url, songUri: songUri, cacheKey: cacheKey) + } else { + return MPDAlbumArtImageDataProvider(songUri: songUri, cacheKey: cacheKey) + } +} diff --git a/Mac/Components/Shared/UserNotificationsController.swift b/Mac/Components/Shared/UserNotificationsController.swift index 9fb5840..bd17a9f 100644 --- a/Mac/Components/Shared/UserNotificationsController.swift +++ b/Mac/Components/Shared/UserNotificationsController.swift @@ -23,7 +23,7 @@ class UserNotificationsController { status.state == .playing else { return } - let provider = MPDAlbumArtImageDataProvider( + let provider = AlbumArtImageDataProvider( songUri: song.mpdSong.uriString, cacheKey: song.album.hash ) diff --git a/Mac/Components/Window/Base.lproj/Main.storyboard b/Mac/Components/Window/Base.lproj/Main.storyboard index ef936d1..93b8b70 100644 --- a/Mac/Components/Window/Base.lproj/Main.storyboard +++ b/Mac/Components/Window/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + @@ -536,13 +536,15 @@ - + - + + + @@ -551,7 +553,7 @@ + + + + + + + + + + + + + + + +