Skip to content

Recently played songs (Working) #96

Description

@mannyd209

So I added a recently played icon button on the now playing page, I linked it to a tableview and got it working. I inputed the JSON recently played link in the station long description. Here is my code for the recently played tableviewcontroller:

import UIKit

//----------
//MARK: JSON
//----------

//The Initial Response From The JSON
struct Response: Codable {
    
    var playHistory: Album
    
}

//The Album Received Which Is An Array Of Song Data
struct Album: Codable {
    var song: [SongData]
    
}

//The SongData From The PlayHistory Album
struct SongData: Codable{
    
    var album: String
    var artist: String
    var cover: String
    var duration: String
    var programStartTS: String
    var title: String
}


class TableViewController: UITableViewController {
    
    //1. Create An Array To Store The SongData
    var songs = [SongData]()
    var currentStation: RadioStation!
    var downloadTask: URLSessionDownloadTask?
    
    override func viewDidLoad() { super.viewDidLoad()
        
        
        self.tableView.delegate = self
        self.tableView.dataSource = self
        
        //2. Load The JSON From The Main Bundle
        guard let urlText = URL (string: currentStation.longDesc)
            else { return }
        
        do{
            //a. Get The Data From The From The File
            let data = try Data(contentsOf: urlText)
            
            //b. Decode The Data To Our Structs
            let albumData = try JSONDecoder().decode(Response.self, from: data)
            
            //c. Append The Songs Array With The PlayHistory
            albumData.playHistory.song.forEach { songs.append($0) }
            
            //d. Test Some Data
            print("""
                **The First Album Details**
                Album = \(songs[0].album)
                Artist = \(songs[0].artist)
                Cover = \(songs[0].cover)
                Duration = \(songs[0].duration)
                Start = \(songs[0].programStartTS)
                Title = \(songs[0].title)
                """)
            
            //3. Load The Data
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }catch{
            
            print(error)
        }
        
    }
    
    //-----------------
    //MARK: UITableView
    //-----------------
    
    
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return songs.count
    }
    
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       
        
        //1. Create A Cell
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
        
        //2. Set It's Text
        cell.songTitle.text = songs[indexPath.row].title
        cell.artistLabel.text = songs[indexPath.row].artist
        
        //3. Get The Image
        //Start with placeholder image so it shows until image download completes
        cell.songCover.image = UIImage(named: "WhiteLogo.png")
        
        //Continue with your logic, no change really but could be shortened to:
        if let imageURL = URL(string: songs[indexPath.row].cover) {
            let request = URLSession.shared.dataTask(with: imageURL) { (imageData, response, error) in
                guard let imageData = imageData
                    else {
                        return
                }
                
                DispatchQueue.main.async {
                    cell.songCover.image = UIImage(data: imageData)
                }
            }
            
            request.resume()
        }
        return cell
        
    }
    
    
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        
        print("""
            **Album \(indexPath.row) Selected**
            Album = \(songs[indexPath.row].album)
            Artist = \(songs[indexPath.row].artist)
            Cover = \(songs[indexPath.row].cover)
            Duration = \(songs[indexPath.row].duration)
            Start = \(songs[indexPath.row].programStartTS)
            Title = \(songs[indexPath.row].title)
            """)
    }
    
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions