analogcode / Swift-Radio-Pro

Professional Radio Station App for iOS!

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Recently played songs (Working)

mannyd209 opened this issue · 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)
            """)
    }
    
}

This is what my Recently Played tableview looks like now.

img_1283

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.

Thanks for share mannyd209!

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

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

@urayoanm No worries bro.

@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"
}
]
}
}

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

Thank you !

Hi,

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