Advertisement
YM_Industries

Pandora Script

Jul 26th, 2017
3,008
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (function() {
  2.     var pageSize = 100;
  3.     var webname = location.pathname.split("/").pop(); // Seems to be a variation of the username, can be retrieved from the URL
  4.     var totalThumbs = parseInt(document.querySelector(".ProfileNav__count").textContent.replace(/[^0-9]/g, ""), 10);
  5.  
  6.     var allThumbs = [];
  7.  
  8.     // Step one, obtain the AuthToken and CsrfToken which will allow us to make requests to the Pandora API.
  9.     var authToken = undefined;
  10.     var csrfToken = undefined;
  11.  
  12.     var originalSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;
  13.     XMLHttpRequest.prototype.setRequestHeader = function(name, value) { // If I had more time maybe I wouldn't need to use this hook
  14.         if(name === "X-AuthToken") {
  15.             authToken = value;
  16.         }
  17.         if(name === "X-CsrfToken") {
  18.             csrfToken = value;
  19.         }
  20.         originalSetRequestHeader.apply(this, arguments);
  21.         if(authToken && csrfToken) { // We've got them both, let's get a move on
  22.             XMLHttpRequest.prototype.setRequestHeader = originalSetRequestHeader; // Deregister our hook...
  23.             fetchPage(0); // ...and get to work
  24.         }
  25.     };
  26.     window.scrollTo(0,document.body.scrollHeight); // Scroll to the bottom of the page to trigger a load so we can hook the event
  27.  
  28.     // Step two, make the necessary requests
  29.     function fetchPage(pageNumber) {
  30.         var req = new XMLHttpRequest();
  31.         req.open('POST', "/api/v1/station/getFeedback", true);
  32.         req.setRequestHeader("Content-Type", "application/json"); // Pandora API rejects requests without this content type set
  33.         req.setRequestHeader("X-AuthToken", authToken);
  34.         req.setRequestHeader("X-CsrfToken", csrfToken);
  35.         req.onreadystatechange = function() {
  36.             if(req.readyState == XMLHttpRequest.DONE && req.status == 200) {
  37.                 var data = JSON.parse(req.responseText);
  38.                 allThumbs = allThumbs.concat(data.feedback);
  39.                 console.log(allThumbs.length, "/", totalThumbs);
  40.                 if(allThumbs.length < totalThumbs && data.feedback.length > 0) {
  41.                     fetchPage(pageNumber+1);
  42.                 } else {
  43.                     finalize();
  44.                 }
  45.             }
  46.         };
  47.         req.send(JSON.stringify({
  48.             pageSize: pageSize,
  49.             startIndex: pageNumber * pageSize,
  50.             webname: webname
  51.         }));
  52.     }
  53.  
  54.     // Step three, compile the output
  55.     function finalize() {
  56.         var string = "Artist\tAlbum\tSong\tStation\tThumb Direction\tAmazon Link\tiTunes Link\tDisc Number\tTrack Number\tDuration (Seconds)";
  57.         for(var i = 0; i < allThumbs.length; i++) {
  58.             var thumb = allThumbs[i];
  59.             string += "\n" +
  60.                 thumb.artistName.replace(/\t/g, "    ").replace(/\n|\r/g, "") + "\t" +
  61.                 thumb.albumTitle.replace(/\t/g, "    ").replace(/\n|\r/g, "") + "\t" +
  62.                 thumb.songTitle.replace(/\t/g, "    ").replace(/\n|\r/g, "") + "\t" +
  63.                 thumb.stationName.replace(/\t/g, "    ").replace(/\n|\r/g, "") + "\t" +
  64.                 (thumb.isPositive ? "up" : "down") + "\t" +
  65.                 thumb.amazonUrl + "\t" +
  66.                 thumb.itunesUrl + "\t" +
  67.                 thumb.discNum + "\t" +
  68.                 thumb.trackNum + "\t" +
  69.                 thumb.trackLength;
  70.         }
  71.         console.log(string);
  72.     }
  73. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement