Advertisement
Guest User

Untitled

a guest
Jan 21st, 2020
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 14.31 KB | None | 0 0
  1. import UIKit
  2. import Firebase
  3. import FirebaseDatabase
  4. import Alamofire
  5. import os.log
  6.  
  7. class FavoritesViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate{
  8.  
  9.     @IBOutlet weak var favouriteArtistsCollectionView: UICollectionView!
  10.     @IBOutlet weak var favouriteAlbumsCollectionView: UICollectionView!
  11.     @IBOutlet weak var favouriteTracksCollectionView: UICollectionView!
  12.    
  13.     var artistURL = String()
  14.     var albumURL = String()
  15.     var trackURL = String()
  16.    
  17.     var artistName : String!
  18.     var albumName : String!
  19.     var albumID : Int!
  20.    
  21.     var favouriteArtists = [Artist]()
  22.     var favouriteAlbums = [Album]()
  23.     var favouriteTracks = [Track]()
  24.    
  25.     var artistIndex = Int()
  26.     var albumIndex = Int()
  27.     var trackIndex = Int()
  28.    
  29.     typealias JSONStandard = [String : AnyObject]
  30.     var ref: DatabaseReference!
  31.  
  32.     let db = Firestore.firestore()
  33.  
  34.    
  35.         override func viewDidLoad() {
  36.             super.viewDidLoad()
  37.            
  38.             print("teste_teste_teste_teste")
  39.        
  40.             favouriteArtistsCollectionView.delegate = self
  41.             favouriteArtistsCollectionView.dataSource = self
  42.            
  43.             favouriteAlbumsCollectionView.delegate = self
  44.             favouriteAlbumsCollectionView.dataSource = self
  45.            
  46.             favouriteTracksCollectionView.delegate = self
  47.             favouriteTracksCollectionView.dataSource = self
  48.            
  49.             ref = Database.database().reference()
  50.            
  51.             let user = Auth.auth().currentUser
  52.  
  53.             let docRef = db.collection("users").document(user!.uid)
  54.            
  55.            
  56.             db.collection("users").document(user!.uid)
  57.             .addSnapshotListener { documentSnapshot, error in
  58.                 guard let document = documentSnapshot else {
  59.                     print("Error fetching document: \(error!)")
  60.                     return
  61.                 }
  62.                 guard let data = document.data() else {
  63.                     print("Document data was empty.")
  64.                     return
  65.                 }
  66.                
  67.                 var artists = [] as! [Any]
  68.                 var albums = [] as! [Any]
  69.                 var tracks = [] as! [Any]
  70.  
  71.                 if  data["favouriteArtists"] != nil {
  72.                     artists = data["favouriteArtists"] as! [Any]
  73.                 }
  74.                 if data["favouriteAlbums"] != nil {
  75.                     albums = data["favouriteAlbums"] as! [Any]
  76.                 }
  77.                 if data["favouriteTracks"] != nil {
  78.                     tracks = data["favouriteTracks"] as! [Any]
  79.                 }
  80.  
  81.                 self.favouriteArtists = [Artist]()
  82.                 self.favouriteAlbums = [Album]()
  83.                 self.favouriteTracks = [Track]()
  84.                 self.callDeezerAPI(artists: artists, albums: albums, tracks: tracks)
  85.             }
  86.            
  87.         }
  88.        
  89.         //Number of views
  90.         func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
  91.             if collectionView == self.favouriteArtistsCollectionView {
  92.                 if (favouriteArtists.count == 0) {
  93.                     collectionView.setEmptyMessage("You still don't have favourite artists, search for one to add it to your list")
  94.                 } else {
  95.                     collectionView.restore()
  96.                 }
  97.               return favouriteArtists.count
  98.             }
  99.             if collectionView == self.favouriteAlbumsCollectionView {
  100.                 if (favouriteAlbums.count == 0) {
  101.                     collectionView.setEmptyMessage("You still don't have favourite albums, search for one to add it to your list")
  102.                 } else {
  103.                     collectionView.restore()
  104.                 }
  105.                 return favouriteAlbums.count
  106.             }
  107.             else {
  108.                 if (favouriteTracks.count == 0) {
  109.                     collectionView.setEmptyMessage("You still don't have favourite tracks, search for one to add it to your list")
  110.                 } else {
  111.                     collectionView.restore()
  112.                 }
  113.                 return favouriteTracks.count
  114.             }
  115.           }
  116.          
  117.         //Populate view
  118.           func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
  119.            
  120.             if collectionView == self.favouriteArtistsCollectionView {
  121.                 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "artistsCell", for: indexPath) as! FavouritesCollectionViewCell
  122.                 cell.favouritesImageView.layer.cornerRadius = 12
  123.                 cell.favouritesImageView.image = self.favouriteArtists[indexPath.row].image
  124.                 cell.favouritesLabel.text = self.favouriteArtists[indexPath.row].name
  125.                 return cell
  126.             }
  127.             if collectionView == self.favouriteAlbumsCollectionView {
  128.                 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "albumsCell", for: indexPath) as! FavouritesCollectionViewCell
  129.                 cell.favouritesImageView.layer.cornerRadius = 12
  130.                 cell.favouritesImageView.image = self.favouriteAlbums[indexPath.row].cover
  131.                 cell.favouritesLabel.text = self.favouriteAlbums[indexPath.row].name
  132.                 return cell
  133.             }
  134.             else {
  135.                 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "tracksCell", for: indexPath) as! FavouritesCollectionViewCell
  136.                 cell.favouritesImageView.layer.cornerRadius = 12
  137.                 cell.favouritesImageView.image = self.favouriteTracks[indexPath.row].image
  138.                 cell.favouritesLabel.text = self.favouriteTracks[indexPath.row].title
  139.                 return cell
  140.             }
  141.            
  142.           }
  143.  
  144.        
  145.         func callDeezerAPI(artists: [Any], albums: [Any], tracks: [Any]) {
  146.             if artists.isEmpty {
  147.                 self.favouriteArtistsCollectionView.reloadInputViews()
  148.                 self.favouriteArtistsCollectionView.reloadData()
  149.             } else {
  150.                 for i in artists {
  151.                     print("ID ARTISTS", i)
  152.                     artistURL = "https://api.deezer.com/artist/\(i)"
  153.                     AF.request(artistURL).responseJSON(completionHandler: {
  154.                         response in
  155.                         self.parseDataArtist(JSONData: response.data!)
  156.                     })
  157.                 }
  158.             }
  159.            
  160.             if albums.isEmpty {
  161.                 self.favouriteAlbumsCollectionView.reloadInputViews()
  162.                 self.favouriteAlbumsCollectionView.reloadData()
  163.             } else {
  164.                 for i in albums {
  165.                     albumURL = "https://api.deezer.com/album/\(i)"
  166.                     AF.request(albumURL).responseJSON(completionHandler: {
  167.                         response in
  168.                         self.parseDataAlbum(JSONData: response.data!)
  169.                     })
  170.                 }
  171.             }
  172.            
  173.             if tracks.isEmpty {
  174.                 self.favouriteTracksCollectionView.reloadInputViews()
  175.                 self.favouriteTracksCollectionView.reloadData()
  176.             } else {
  177.                 for i in tracks {
  178.                     trackURL = "https://api.deezer.com/track/\(i)"
  179.                     AF.request(trackURL).responseJSON(completionHandler: {
  180.                         response in
  181.                         self.parseDataTrack(JSONData: response.data!)
  182.                     })
  183.                 }
  184.             }
  185.         }
  186.            
  187.        func parseDataArtist(JSONData : Data) {
  188.            do {
  189.                 let readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStandard
  190.                 let idFromAPI = readableJSON["id"] as? Int
  191.                 let artistName = readableJSON["name"] as? String
  192.                 let mainImageURL =  URL(string: readableJSON["picture_xl"] as! String)
  193.                 let mainImageData = NSData(contentsOf: mainImageURL!)
  194.                 let mainImage = UIImage(data: mainImageData! as Data)
  195.                      
  196.                 addArtist((Artist.init(idFromAPI: idFromAPI!, name: artistName!, image: mainImage!))!)
  197.                 self.favouriteArtistsCollectionView.reloadInputViews()
  198.                 self.favouriteArtistsCollectionView.reloadData()
  199.                
  200.            }
  201.            catch{
  202.                print(error)
  203.            }
  204.        }
  205.        
  206.         func parseDataAlbum(JSONData : Data) {
  207.             var artistName : String?
  208.  
  209.             do {
  210.                  let readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStandard
  211.                  let idFromAPI = readableJSON["id"] as? Int
  212.                  let albumTitle = readableJSON["title"] as? String
  213.                  let mainImageURL =  URL(string: readableJSON["cover_xl"] as! String)
  214.                  let mainImageData = NSData(contentsOf: mainImageURL!)
  215.                  let mainImage = UIImage(data: mainImageData! as Data)
  216.                
  217.                 if let artist = readableJSON["artist"] as? JSONStandard {
  218.                     artistName =  artist["name"] as? String
  219.                 }
  220.                      let artista = (Artist.init(idFromAPI: idFromAPI!, name: artistName!, image: mainImage!))!
  221.                
  222.                  addAlbum((Album.init(idFromAPI: idFromAPI!, name: albumTitle!, cover: mainImage!, artist: artista))!)
  223.                  self.favouriteAlbumsCollectionView.reloadInputViews()
  224.                  self.favouriteAlbumsCollectionView.reloadData()
  225.                
  226.             }
  227.             catch{
  228.                 print(error)
  229.             }
  230.         }
  231.        
  232.         func parseDataTrack(JSONData : Data) {
  233.             var mainImageArtist : UIImage?
  234.  
  235.             do {
  236.                  let readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStandard
  237.                  let idFromAPI = readableJSON["id"] as! Int
  238.                  let trackName = readableJSON["title"] as! String
  239.                 let duration = readableJSON["duration"] as! Int
  240.                 if let artist = readableJSON["artist"] as? JSONStandard {
  241.                     artistName = artist["name"] as? String
  242.                     let mainImageURLArtist =  URL(string: artist["picture"] as! String)
  243.                     let mainImageDataArtist = NSData(contentsOf: mainImageURLArtist!)
  244.                     mainImageArtist = UIImage(data: mainImageDataArtist! as Data)!
  245.                 }
  246.                
  247.                 let artistObject = Artist(idFromAPI: idFromAPI, name: artistName, image: mainImageArtist!)
  248.                
  249.                
  250.                    
  251.                 if let album = readableJSON["album"] as? JSONStandard{
  252.                 let mainImageURL =  URL(string: album["cover_big"] as! String)
  253.                 let mainImageData = NSData(contentsOf: mainImageURL!)
  254.                 let cover = UIImage(data: mainImageData! as Data)!
  255.                
  256.                 albumName = album["title"] as? String
  257.                 albumID = album["id"] as? Int
  258.                
  259.                 let album = Album.init(idFromAPI: albumID, name: albumName, cover: cover, artist: artistObject)
  260.                
  261.                     let track = Track.init(idFromAPI: idFromAPI, title: trackName, duration: duration, image: mainImageArtist!)
  262.                 track?.album = album
  263.                 track?.artist = artistObject
  264.                     addTrack(track!)
  265.                  self.favouriteTracksCollectionView.reloadInputViews()
  266.                  self.favouriteTracksCollectionView.reloadData()
  267.                 }
  268.             }
  269.             catch{
  270.                 print(error)
  271.             }
  272.         }
  273.            
  274.         fileprivate func addArtist(_ artist: Artist) {
  275.            
  276.            favouriteArtists.append(artist)
  277.         }
  278.         fileprivate func addAlbum(_ album: Album) {
  279.             favouriteAlbums.append(album)
  280.         }
  281.         fileprivate func addTrack(_ track: Track) {
  282.             favouriteTracks.append(track)
  283.         }
  284.    
  285.     func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
  286.         if collectionView == self.favouriteArtistsCollectionView {
  287.             artistIndex = indexPath.row
  288.             self.performSegue(withIdentifier: "FavouritesToArtistSegue", sender: self)
  289.  
  290.         }
  291.         if collectionView == self.favouriteAlbumsCollectionView {
  292.             albumIndex = indexPath.row
  293.             self.performSegue(withIdentifier: "FavouritesToAlbumSegue", sender: self)
  294.         }
  295.         if collectionView == self.favouriteTracksCollectionView {
  296.             trackIndex = indexPath.row
  297.             self.performSegue(withIdentifier: "FavouritesToTrackSegue", sender: self)
  298.         }
  299.     }
  300.    
  301.     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  302.                if(segue.identifier == "FavouritesToArtistSegue") {
  303.                    let vc = segue.destination as! ArtistDetailsViewController
  304.                    vc.artist = favouriteArtists[artistIndex]
  305.                }
  306.                if(segue.identifier == "FavouritesToAlbumSegue") {
  307.                    let vc = segue.destination as! AlbumDetailsViewController
  308.                    vc.album = favouriteAlbums[albumIndex]
  309.                }
  310.                if(segue.identifier == "FavouritesToTrackSegue") {
  311.                    let vc = segue.destination as! TrackDetailsViewController
  312.                    vc.track = favouriteTracks[trackIndex]
  313.                }
  314.                
  315.            }
  316.        
  317.        
  318.     }
  319.  
  320.     extension UICollectionView {
  321.  
  322.         func setEmptyMessage(_ message: String) {
  323.             let messageLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.bounds.size.width, height: self.bounds.size.height))
  324.             messageLabel.text = message
  325.             messageLabel.textColor = .white
  326.             messageLabel.numberOfLines = 0;
  327.             messageLabel.textAlignment = .center;
  328.             messageLabel.font = UIFont(name: "TrebuchetMS", size: 15)
  329.             messageLabel.sizeToFit()
  330.  
  331.             self.backgroundView = messageLabel;
  332.         }
  333.  
  334.         func restore() {
  335.             self.backgroundView = nil
  336.         }
  337.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement