Fixes an issue when queueing a song (#10)
- Updates AudioExample with initial queuing of items
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user