Skip to content

Commit

Permalink
Merge branch 'release/v0.6.3'
Browse files Browse the repository at this point in the history
  • Loading branch information
jammus committed Jun 12, 2011
2 parents 8a44b0a + 8ba0e3f commit 996c1ad
Show file tree
Hide file tree
Showing 12 changed files with 147 additions and 41 deletions.
6 changes: 6 additions & 0 deletions History.md
@@ -1,5 +1,11 @@
# Changelog

## 0.6.3

* Fixed bug where success/error handlers on lastfm.info and lastfm.update were being fired twice.
* Configurable user-agent string.
* LastFmUpdate can now accept any parameter. This will be passed through to Last.Fm. This allows artist/track info to be supplied without having to use the track object from RecentTrackStream.

## 0.6.2

Fixed path issue (regression)
Expand Down
5 changes: 4 additions & 1 deletion README.md
Expand Up @@ -12,7 +12,8 @@ Read and write to users recent plays on Last.fm.

var lastfm = new LastFmNode({
api_key: 'apikey', // sign-up for a key at http://www.last.fm/api
secret: 'secret'
secret: 'secret',
useragent: 'appname/vX.X MyApp' // optional. defaults to lastfm-node.
});

## Documentation
Expand Down Expand Up @@ -174,6 +175,8 @@ An authorised `LastFmSession` instance is required to make a successful update.

Options:

Accepts all parameters used by track.updateNowPlaying and user.scrobble (see Last.Fm API) as well as:

- *track*

Track for nowplaying and scrobble requests. Uses same format as returned by `RecentTracksStream` events.
Expand Down
1 change: 1 addition & 0 deletions lib/lastfm/index.js
Expand Up @@ -11,6 +11,7 @@ var LastFmNode = exports.LastFmNode = function(options) {
this.format = "json";
this.secret = options.secret;
this.api_key = options.api_key;
this.useragent = options.useragent || "lastfm-node";
};

LastFmNode.prototype.request = function(method, params) {
Expand Down
42 changes: 24 additions & 18 deletions lib/lastfm/lastfm-info.js
Expand Up @@ -21,29 +21,34 @@ var LastFmInfo = function(lastfm, type, options) {
return;
}

var enhancedParams = {
track: function() {
var params = { };
var params = filterOptions(options);
var method = type + ".getinfo";
var request = lastfm.request(method, params);

request.on("success", success);

request.on("error", error);

function filterOptions(options) {
var params = { };
if (type == "track") {
if (typeof(options.track) == "object") {
params.artist = options.track.artist["#text"];
params.track = options.track.name;
params.mbid = options.track.mbid;
}
return params;
}
};

var params = enhancedParams[type] ? enhancedParams[type]() : {};
Object.keys(options).forEach(function(name) {
if (name != "error" && name != "success" && name != "handlers" && !params[name]) {
params[name] = options[name];
}
});

Object.keys(options).forEach(function(name) {
if (name != "error" && name != "success" && !params[name]) {
params[name] = options[name];
}
});
var method = type + ".getinfo";
return params;
}

var request = lastfm.request(method, params);
request.on("success", function(data) {
function success(data) {
try {
var response = JSON.parse(data);
}
Expand All @@ -55,18 +60,19 @@ var LastFmInfo = function(lastfm, type, options) {
if (response[type]) {
that.emit("success", response[type]);
return;
};
}

if (response.error) {
that.emit("error", new Error(response.message));
return;
}

that.emit("error", new Error("Unexpected error"));
});
request.on("error", function(error) {
}

function error(error) {
that.emit("error", error);
});
}
};

LastFmInfo.prototype = Object.create(EventEmitter.prototype);
Expand Down
6 changes: 3 additions & 3 deletions lib/lastfm/lastfm-request.js
Expand Up @@ -38,7 +38,7 @@ var LastFmRequest = module.exports = function(lastfm, method, params) {
if (httpVerb == "GET") {
url += "?" + data;
}
var headers = generateRequestHeaders(httpVerb, host, data);
var headers = requestHeaders(httpVerb, host, data);
var request = connection.request(httpVerb, url, headers);
if (httpVerb == "POST") {
request.write(data);
Expand Down Expand Up @@ -78,11 +78,11 @@ var LastFmRequest = module.exports = function(lastfm, method, params) {
return method && _(writeMethods).include(method.toLowerCase());
}

function generateRequestHeaders(httpVerb, host, data) {
function requestHeaders(httpVerb, host, data) {
var headers = {
host: host
};

headers["User-Agent"] = lastfm.useragent;
if (httpVerb == "POST") {
headers["Content-Length"] = data.length;
headers["Content-Type"] = "application/x-www-form-urlencoded";
Expand Down
43 changes: 25 additions & 18 deletions lib/lastfm/lastfm-update.js
@@ -1,5 +1,6 @@
var EventEmitter = require("events").EventEmitter;
var utils = require("./utils");
var _ = require("underscore");

var LastFmUpdate = function(lastfm, method, session, options) {
EventEmitter.call(this);
Expand All @@ -22,37 +23,26 @@ var LastFmUpdate = function(lastfm, method, session, options) {
if (!options) options = {};

if (method == "nowplaying") {
nowPlaying(options.track, options);
nowPlaying(options);
}
if (method == "scrobble") {
scrobble(options.track, options);
scrobble(options);
}

function nowPlaying(track, options) {
var params = {
artist: track.artist["#text"],
track: track.name, sk: session.key
};
if (options.duration) {
params.duration = options.duration;
}
function nowPlaying(options) {
var params = filterOptions(options);
var request = lastfm.request("track.updateNowPlaying", params);
request.on("success", handleResponse);
request.on("error", bubbleError);
}

function scrobble(track, options) {
function scrobble(options) {
if (!options.timestamp) {
that.emit("error", new Error("Timestamp is required for scrobbling"));
return;
}

var request = lastfm.request("track.scrobble", {
artist: track.artist["#text"],
track: track.name,
sk: session.key,
timestamp: options.timestamp
});
var params = filterOptions(options);
var request = lastfm.request("track.scrobble", params);
request.on("success", handleResponse);
request.on("error", bubbleError);
}
Expand All @@ -70,6 +60,23 @@ var LastFmUpdate = function(lastfm, method, session, options) {
function bubbleError(error) {
that.emit("error", error);
}

function filterOptions(options) {
var params = {
sk: session.key
};
_(Object.keys(options)).each(function(key) {
if (key == "track" && typeof(options.track) == "object") {
params.artist = options.track.artist["#text"];
params.track = options.track.name;
return;
}
if (key != "handlers" && key != "success" && key != "error" && options[key]) {
params[key] = options[key];
}
});
return params;
}
}

LastFmUpdate.prototype = Object.create(EventEmitter.prototype);
Expand Down
2 changes: 1 addition & 1 deletion package.json
@@ -1,7 +1,7 @@
{
"name": "lastfm",
"description": "Read and write to Last.fm",
"version": "0.6.2",
"version": "0.6.3",
"author": "James Scott <jammus@gmail.com>",
"contributors": [
"Garrett Wilkin <garrett.wilkin@gmail.com> (http://geethink.com)"
Expand Down
3 changes: 3 additions & 0 deletions tests/common.js
Expand Up @@ -11,3 +11,6 @@ global.after = ntest.after;
global.LastFmNode = require("lastfm").LastFmNode;
global.FakeData = require("./TestData.js").FakeData;
global.FakeTracks = require("./TestData.js").FakeTracks;
if (process.setMaxListeners) {
process.setMaxListeners(900);
}
1 change: 1 addition & 0 deletions tests/lastfm-info-test.js
Expand Up @@ -71,6 +71,7 @@ describe("a new info instance")
gently.expect(lastfm, "request", function(method, params) {
assert.ok(!params.error);
assert.ok(!params.success);
assert.ok(!params.handlers);
return new fakes.LastFmRequest();
});
new LastFmInfo(lastfm, "user", { handlers: { error: function() {}, success: function() {} } });
Expand Down
18 changes: 18 additions & 0 deletions tests/lastfm-request-test.js
Expand Up @@ -64,6 +64,24 @@ var fakes = require("./fakes");
});
connection.emit("error", new Error(message));
});

it("defaults user agent to lastfm-node", function() {
gently.expect(connection, "request", function(method, url, options) {
assert.equal("lastfm-node", options["User-Agent"]);
return request;
});
var lastFmRequest = new LastFmRequest(lastfm, "any.method");
});

it("can specify user agent in lastfm options", function() {
var useragent = "custom-user-agent";
gently.expect(connection, "request", function(method, url, options) {
assert.equal(useragent, options["User-Agent"]);
return request;
});
var lastfm = new LastFmNode({ useragent: useragent });
var lastFmRequest = new LastFmRequest(lastfm, "any.method");
});
})();

(function() {
Expand Down
57 changes: 57 additions & 0 deletions tests/lastfm-update-test.js
Expand Up @@ -165,6 +165,19 @@ var fakes = require("./fakes");
duration: 232000
});
});

it("can have artist and track string parameters supplied", function() {
gently.expect(lastfm, "request", function(method, params) {
assert.equal("The Mae Shi", params.artist);
assert.equal("Run To Your Grave", params.track);
assert.equal("key", params.sk);
return request;
});
new LastFmUpdate(lastfm, "nowplaying", authorisedSession, {
track: "Run To Your Grave",
artist: "The Mae Shi"
});
});

it("bubbles up errors", function() {
var errorMessage = "Bubbled error";
Expand Down Expand Up @@ -244,4 +257,48 @@ var fakes = require("./fakes");
});
expectError(errorMessage);
});

it("can have artist and track string parameters supplied", function() {
gently.expect(lastfm, "request", function(method, params) {
assert.equal("The Mae Shi", params.artist);
assert.equal("Run To Your Grave", params.track);
assert.equal("key", params.sk);
return request;
});
new LastFmUpdate(lastfm, "scrobble", authorisedSession, {
track: "Run To Your Grave",
artist: "The Mae Shi",
timestamp: 12345678
});
});

it("can have arbitrary parameters supplied", function() {
gently.expect(lastfm, "request", function(method, params) {
assert.equal("somevalue", params.arbitrary);
return request;
});
new LastFmUpdate(lastfm, "scrobble", authorisedSession, {
track: "Run To Your Grave",
artist: "The Mae Shi",
timestamp: 12345678,
arbitrary: "somevalue"
});
});

it("does not include handler parameters", function() {
gently.expect(lastfm, "request", function(method, params) {
assert.equal(undefined, params.handlers);
assert.equal(undefined, params.error);
assert.equal(undefined, params.success);
return request;
});
new LastFmUpdate(lastfm, "scrobble", authorisedSession, {
track: "Run To Your Grave",
artist: "The Mae Shi",
timestamp: 12345678,
handlers: { success: function() { } },
success: function() { },
error: function() { }
});
});
})();
4 changes: 4 additions & 0 deletions tests/tests.sh
Expand Up @@ -8,3 +8,7 @@ nvm use v0.4.0
node ./index.js
nvm use v0.4.3
node ./index.js
nvm use v0.4.7
node ./index.js
nvm use v0.4.8
node ./index.js

0 comments on commit 996c1ad

Please sign in to comment.