Fixes an issue when queueing a song (#10)

- Updates AudioExample with initial queuing of items
This commit is contained in:
Dimitris C
2020-12-07 22:12:30 +00:00
committed by GitHub
parent db8aa646da
commit 6c9ef18d4e
5 changed files with 56 additions and 25 deletions
@@ -55,7 +55,7 @@ class PlayerViewController: UIViewController {
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.delegate = self
tableView.dataSource = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "PlaylistCell")
tableView.register(PlaylistTableViewCell.self, forCellReuseIdentifier: "PlaylistCell")
let controlsController = controlsProvider()
playerControlsController = controlsController
@@ -120,6 +120,7 @@ extension PlayerViewController: UITableViewDataSource {
return cell
}
cell.textLabel?.text = item.name
cell.detailTextLabel?.text = item.queues ? "Queue item" : nil
update(status: item.status, of: cell)
return cell
}
@@ -147,3 +148,15 @@ extension PlayerViewController: UITableViewDelegate {
viewModel.playItem(at: indexPath)
}
}
final class PlaylistTableViewCell: UITableViewCell {
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
@@ -47,7 +47,7 @@ final class PlayerViewModel {
print("malformed url error")
return
}
playlistItemsService.add(item: PlaylistItem(url: url, name: urlString, status: .stopped))
playlistItemsService.add(item: PlaylistItem(url: url, name: urlString, status: .stopped, queues: false))
reloadContent?(.all)
}
@@ -57,13 +57,20 @@ final class PlayerViewModel {
func playItem(at indexPath: IndexPath) {
guard let item = item(at: indexPath) else { return }
if let index = currentPlayingItemIndex {
playlistItemsService.setStatus(for: index, status: .stopped)
reloadContent?(.item(IndexPath(row: index, section: 0)))
currentPlayingItemIndex = nil
if item.queues {
playerService.queue(url: item.url)
if currentPlayingItemIndex == nil {
currentPlayingItemIndex = indexPath.row
}
} else {
if let index = currentPlayingItemIndex {
playlistItemsService.setStatus(for: index, status: .stopped)
reloadContent?(.item(IndexPath(row: index, section: 0)))
currentPlayingItemIndex = nil
}
playerService.play(url: item.url)
currentPlayingItemIndex = indexPath.row
}
playerService.play(url: item.url)
currentPlayingItemIndex = indexPath.row
}
}
@@ -56,6 +56,11 @@ final class AudioPlayerService {
player.play(url: url)
}
func queue(url: URL) {
activateAudioSession()
player.queue(url: url)
}
func stop() {
player.stop()
deactivateAudioSession()
@@ -19,17 +19,20 @@ struct PlaylistItem: Equatable {
let url: URL
let name: String
let status: Status
let queues: Bool
init(content: AudioContent) {
init(content: AudioContent, queues: Bool) {
name = content.title
url = content.streamUrl
status = .stopped
self.queues = queues
}
init(url: URL, name: String, status: Status) {
init(url: URL, name: String, status: Status, queues: Bool) {
self.url = url
self.name = name
self.status = status
self.queues = queues
}
}
@@ -70,10 +73,14 @@ final class PlaylistItemsService {
guard let item = item(at: index) else {
return
}
items[index] = PlaylistItem(url: item.url, name: item.name, status: status)
items[index] = PlaylistItem(url: item.url, name: item.name, status: status, queues: item.queues)
}
}
func provideInitialPlaylistItems() -> [PlaylistItem] {
AudioContent.allCases.map(PlaylistItem.init(content:))
let allCases = AudioContent.allCases
let casesForQueueing: [AudioContent] = [.piano, .local, .khruangbin]
let allItems = allCases.map { PlaylistItem.init(content: $0 , queues: false) }
let casesForQueuingItems = casesForQueueing.map { PlaylistItem.init(content: $0 , queues: true) }
return allItems + casesForQueuingItems
}