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; }