From d675ac4e9f542b3c211a736d56ad2f985c39c518 Mon Sep 17 00:00:00 2001
From: Jonathan Cremin <jonathan@crem.in>
Date: Fri, 5 Dec 2014 14:32:03 +0000
Subject: [PATCH] Fix google search

---
 lib/services/googleplaymusic.js | 191 +++++++++++++++++---------------
 1 file changed, 100 insertions(+), 91 deletions(-)

diff --git a/lib/services/googleplaymusic.js b/lib/services/googleplaymusic.js
index 733f67e..bf1290f 100644
--- a/lib/services/googleplaymusic.js
+++ b/lib/services/googleplaymusic.js
@@ -11,8 +11,11 @@ if (!process.env.GOOGLE_EMAIL || !process.env.GOOGLE_PASSWORD) {
   return;
 }
 
-// It's probably ok to not wait for this to finish
-pm.init({email: process.env.GOOGLE_EMAIL, password: process.env.GOOGLE_PASSWORD}, function() {});
+var ready = Q.defer();
+
+pm.init({email: process.env.GOOGLE_EMAIL, password: process.env.GOOGLE_PASSWORD}, function() {
+  ready.resolve();
+});
 
 module.exports.match = function(url, type) {
   var parsed = parse(url);
@@ -21,115 +24,121 @@ module.exports.match = function(url, type) {
 
 module.exports.lookupId = function(id, type, next) {
   var deferred = Q.defer();
-  if (type == "album") {
-    pm.getAlbum(id, true, function(album) {
-      deferred.resolve({
-        service: "googleplaymusic",
-        type: "album",
-        id: album.albumId,
-        name: album.name,
-        streamUrl: "https://play.google.com/music/listen#/album/" + album.albumId,
-        purchaseUrl: "https://play.google.com/store/music/album?id=" + album.albumId,
-        artwork: album.albumArtRef.replace("http:", ""),
-        artist: {
-          name: album.artist
-        }
+  ready.promise.then(function() {
+    if (type == "album") {
+      pm.getAlbum(id, true, function(album) {
+        deferred.resolve({
+          service: "googleplaymusic",
+          type: "album",
+          id: album.albumId,
+          name: album.name,
+          streamUrl: "https://play.google.com/music/listen#/album/" + album.albumId,
+          purchaseUrl: "https://play.google.com/store/music/album?id=" + album.albumId,
+          artwork: album.albumArtRef.replace("http:", ""),
+          artist: {
+            name: album.artist
+          }
+        });
       });
-    });
-  } else if (type == "track") {
-    pm.getAllAccessTrack(id, function(track) {
-      deferred.resolve({
-        service: "googleplaymusic",
-        type: "track",
-        id: track.nid,
-        name: track.title,
-        streamUrl: "https://play.google.com/music/listen#/track/" + track.nid + "/" + track.albumId,
-        purchaseUrl: "https://play.google.com/store/music/album?id=" + track.albumId,
-        artwork: track.albumArtRef[0].url.replace("http:", ""),
-        album: {
-          name: track.album
-        },
-        artist: {
-          name: track.artist
-        }
+    } else if (type == "track") {
+      pm.getAllAccessTrack(id, function(track) {
+        deferred.resolve({
+          service: "googleplaymusic",
+          type: "track",
+          id: track.nid,
+          name: track.title,
+          streamUrl: "https://play.google.com/music/listen#/track/" + track.nid + "/" + track.albumId,
+          purchaseUrl: "https://play.google.com/store/music/album?id=" + track.albumId,
+          artwork: track.albumArtRef[0].url.replace("http:", ""),
+          album: {
+            name: track.album
+          },
+          artist: {
+            name: track.artist
+          }
+        });
       });
-    });
-  }
+    }
+  });
   return deferred.promise;
 }
 
 module.exports.search = function(data) {
   var deferred = Q.defer();
-  var query = "";
-  var type = data.type;
+  ready.promise.then(function() {
+    var query, album;
+    var type = data.type;
 
-  if (type == "album") {
-    query = data.artist.name + " " + data.name;
-    album = data.name;
-  } else if (type == "track") {
-    query = data.artist.name + " " + data.album.name + " " + data.name;
-    album = data.album.name;
-  }
-
-  pm.search(query, 5, function(data) {
-    if (!data.entries) {
-      deferred.resolve({service: "googleplaymusic"});
-      return;
+    if (type == "album") {
+      query = data.artist.name + " " + data.name;
+      album = data.name;
+    } else if (type == "track") {
+      query = data.artist.name + " " + data.album.name + " " + data.name;
+      album = data.album.name;
     }
-    var result = data.entries.filter(function(result) {
-      return result[type];
-    }).sort(function(a, b) { // sort by match score
-      return a.score < b.score;
-    }).shift();
 
-    if (!result) {
-      var matches = album.match(/^[^\(\[]+/);
-      if (matches[0]) {
-        var cleanedData = JSON.parse(JSON.stringify(data));
-        if (type == "album") {
-          cleanedData.name = matches[0].trim();
-        } else if (type == "track") {
-          cleanedData.album = matches[0].trim();
+    pm.search(query, 5, function(data) {
+      if (!data.entries) {
+        var matches = album.match(/^[^\(\[]+/);
+        if (matches[0]) {
+          var cleanedData = JSON.parse(JSON.stringify(data));
+          if (type == "album") {
+            cleanedData.name = matches[0].trim();
+          } else if (type == "track") {
+            cleanedData.album = matches[0].trim();
+          }
+          module.exports.search(cleanedData).then(deferred.resolve);
+        } else {
+          deferred.resolve({service: "googleplaymusic"});
         }
-        module.exports.search(cleanedData).then(deferred.resolve);
-      } else {
-        deferred.resolve({service: "googleplaymusic"});
-      }
-    } else {
-      var id;
-      if (type == "album") {
-        id = result.album.albumId;
-      } else if (type == "track") {
-        id = result.track.nid;
+        return;
       }
+      var result = data.entries.filter(function(result) {
+        return result[type];
+      }).sort(function(a, b) { // sort by match score
+        return a.score < b.score;
+      }).shift();
 
-      module.exports.lookupId(id, type).then(deferred.resolve);
-    }
+      if (!result) {
+        deferred.resolve({service: "googleplaymusic"});
+      } else {
+        var id;
+        if (type == "album") {
+          id = result.album.albumId;
+        } else if (type == "track") {
+          id = result.track.nid;
+        }
+
+        module.exports.lookupId(id, type).then(deferred.resolve);
+      }
+    });
   });
   return deferred.promise;
 }
 
 module.exports.parseUrl = function(url, next) {
   var deferred = Q.defer();
-  var parsed = parse(url.replace(/\+/g, "%20"));
-  var path = parsed.path;
-  var hash = parsed.hash;
-  if (hash) {
-    var parts = hash.split("/");
-    var type = parts[1];
-    var id = parts[2];
-    var artist = decodeURIComponent(parts[3]);
-    var album = decodeURIComponent(parts[4]);
+  ready.promise.then(function() {
+    var parsed = parse(url.replace(/\+/g, "%20"));
+    var path = parsed.path;
+    var hash = parsed.hash;
+    if (hash) {
+      var parts = hash.split("/");
+      var type = parts[1];
+      var id = parts[2];
+      var artist = decodeURIComponent(parts[3]);
+      var album = decodeURIComponent(parts[4]);
 
-    if (id.length > 0) {
-      deferred.resolve({id: id, type: type});
-    } else {
-      module.exports.search({type: type, name:album, artist: {name: artist}}).then(deferred.resolve);
+      if (id.length > 0) {
+        deferred.resolve({id: id, type: type});
+      } else {
+        module.exports.search({type: type, name:album, artist: {name: artist}}).then(deferred.resolve);
+      }
+    } else if(path) {
+      var matches = path.match(/\/music\/m\/([\w]+)/);
+      var type = matches[1][0] == "T" ? "track" : "album";
+      module.exports.lookupId(matches[1], type).then(deferred.resolve);
     }
-  } else if(path) {
-    var matches = path.match(/\/music\/m\/([\w]+)/);
-    var type = matches[1][0] == "T" ? "track" : "album";
-    module.exports.lookupId(matches[1], type).then(deferred.resolve);
-  }
+  });
   return deferred.promise;
 }