Swift-Radio-Pro icon indicating copy to clipboard operation
Swift-Radio-Pro copied to clipboard

Recently played songs (Working)

Open mannyd209 opened this issue 6 years ago • 9 comments

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)
            """)
    }
    
}

mannyd209 avatar Apr 04 '18 04:04 mannyd209

This is what my Recently Played tableview looks like now.

img_1283

mannyd209 avatar Apr 04 '18 04:04 mannyd209

I got this working. I pushed the Current Station to my Recently Played View Controller. Then whatever station I am currently on it pulls its LongDesc link and uses that JSON link to parse my recently played tracks as shown above.

mannyd209 avatar Apr 21 '18 22:04 mannyd209

Thanks for share mannyd209!

urayoanm avatar Apr 26 '18 20:04 urayoanm

Can you please share the completed project with "recently played songs" tableviewcontroller?

rezaataiy avatar Sep 21 '18 13:09 rezaataiy

@rezaataiy are you still wanting to see to completed project code?

mannyd209 avatar Jan 30 '20 15:01 mannyd209

@urayoanm No worries bro.

mannyd209 avatar Jan 30 '20 15:01 mannyd209

@rezaataiy I put the completed code up above and this is how the data is seen in the app.

{"playHistory": {"song": [ { "title":"LET'S GO", "artist":"CALVIN HARRIS", "album":"", "cover":"https://cdnrf.securenetsystems.net/file_radio/album_art/H/1/5/51HudB3bXoL.jpg", "duration":"219", "programStartTS":"30 Jan 2020 15:50:47" } ] } }

mannyd209 avatar Jan 30 '20 15:01 mannyd209

Hi there, I'd like to know if you can share the tutorial to add it ?

Thank you !

ValentinOgier avatar Feb 22 '20 10:02 ValentinOgier

Hi,

Could you please share the completed project. I'm trying to implement this but I get nil crash.

bark1n9 avatar Jul 06 '20 22:07 bark1n9