diff --git a/app.js b/app.js index 9616b75..e542c5d 100644 --- a/app.js +++ b/app.js @@ -9,7 +9,9 @@ var cookieParser = require('cookie-parser'); var flash = require('connect-flash'); var bodyParser = require('body-parser'); -var routes = require('./routes/index'); +var search = require('./routes/search'); +var share = require('./routes/share'); +var itunesProxy = require('./routes/itunes-proxy'); var app = express(); @@ -41,7 +43,13 @@ app.get('*', function(req,res,next) { } }); -app.use('/', routes); +app.get('/', function(req, res) { + res.render('index', { error: req.flash('search-error') }); +}); + +app.post('/search', search); +app.get('/:service/:type/:id', share); +app.get('/itunes/*', itunesProxy); // catch 404 and forward to error handler app.use(function(req, res, next) { diff --git a/lib/services/itunes.js b/lib/services/itunes.js index a586339..be1e2bc 100644 --- a/lib/services/itunes.js +++ b/lib/services/itunes.js @@ -31,7 +31,7 @@ module.exports.lookupId = function(id, type) { name: result.trackName ? result.trackName : result.collectionName, streamUrl: null, purchaseUrl: result.collectionViewUrl, - artwork: result.artworkUrl100.replace("100x100", "200x200").replace("http:", ""), + artwork: "/itunes/" + result.artworkUrl100.replace("100x100", "200x200").replace("http://", ""), artist: { name: result.artistName } @@ -79,7 +79,7 @@ module.exports.search = function(data) { name: result.trackName ? result.trackName : result.collectionName, streamUrl: null, purchaseUrl: result.collectionViewUrl, - artwork: result.artworkUrl100.replace("100x100", "200x200").replace("http:", ""), + artwork: "/itunes/" + result.artworkUrl100.replace("100x100", "200x200").replace("http://", ""), artist: { name: result.artistName } diff --git a/routes/index.js b/routes/index.js deleted file mode 100644 index 7d7c89b..0000000 --- a/routes/index.js +++ /dev/null @@ -1,86 +0,0 @@ -"use strict"; -var parse = require('url').parse; -var path = require('path'); -var express = require('express'); -var router = express.Router(); -var Q = require('q'); - -var services = {}; - -require("fs").readdirSync(path.join(__dirname, "..", "lib", "services")).forEach(function(file) { - var service = require("../lib/services/" + file); - if (service.search) { - services[service.id] = service; - } -}); - -var cache = {googleplaymusic:{}, spotify:{},rdio:{}}; - -router.get('/:service/:type/:id', function(req, res) { - var serviceId = req.params.service; - var type = req.params.type; - var itemId = req.params.id; - var promises = []; - - services[serviceId].lookupId(itemId, type).then(function(item) { - for (var id in services) { - if (id != serviceId) { - promises.push(services[id].search(item)); - } - } - - Q.allSettled(promises).then(function(results) { - var items = results.map(function(result) { - if (result.state == "fulfilled") { - return result.value; - } - }); - - items.sort(function(a, b) { - return !a.id || !b.id; - }).sort(function(a, b) { - return !a.streamUrl || b.streamUrl; - }); - - - - items.unshift(item); - - res.render(type, {items: items}); - }); - }); -}); - -router.post('/search', function(req, res) { - var url = parse(req.body.url); - - if (!url.host) { - req.flash('search-error', 'Please paste a link below to find matches'); - res.redirect('/'); - return; - } - - for (var id in services) { - var matched = services[id].match(req.body.url); - if (matched) { - services[id].parseUrl(req.body.url).then(function(result) { - if (!result.id) { - req.flash('search-error', 'No match found for this link'); - res.redirect('/'); - } - res.redirect("/" + id + "/" + result.type + "/" + result.id); - }) - return; - } - } - - req.flash('search-error', 'No match found for this link'); - res.redirect('/'); -}); - -/* GET home page. */ -router.get('/', function(req, res) { - res.render('index', { error: req.flash('search-error') }); -}); - -module.exports = router; diff --git a/routes/itunes-proxy.js b/routes/itunes-proxy.js new file mode 100644 index 0000000..7073b4b --- /dev/null +++ b/routes/itunes-proxy.js @@ -0,0 +1,14 @@ +"use strict"; +var parse = require('url').parse; +var request = require('superagent'); + +module.exports = function(req, res) { + var url = "http://" + req.url.substr(8); + var parsed = parse(url); + if (parsed.host.match(/mzstatic\.com/)) { + request.get(url, function(response){ + res.set(response.headers); + res.send(response.body); + }); + } +}; diff --git a/routes/search.js b/routes/search.js new file mode 100644 index 0000000..f875359 --- /dev/null +++ b/routes/search.js @@ -0,0 +1,40 @@ +"use strict"; +var parse = require('url').parse; +var path = require('path'); +var Q = require('q'); + +var services = {}; + +require("fs").readdirSync(path.join(__dirname, "..", "lib", "services")).forEach(function(file) { + var service = require("../lib/services/" + file); + if (service.search) { + services[service.id] = service; + } +}); + +module.exports = function(req, res) { + var url = parse(req.body.url); + + if (!url.host) { + req.flash('search-error', 'Please paste a link below to find matches'); + res.redirect('/'); + return; + } + + for (var id in services) { + var matched = services[id].match(req.body.url); + if (matched) { + services[id].parseUrl(req.body.url).then(function(result) { + if (!result.id) { + req.flash('search-error', 'No match found for this link'); + res.redirect('/'); + } + res.redirect("/" + id + "/" + result.type + "/" + result.id); + }) + return; + } + } + + req.flash('search-error', 'No match found for this link'); + res.redirect('/'); +}; diff --git a/routes/share.js b/routes/share.js new file mode 100644 index 0000000..57c157c --- /dev/null +++ b/routes/share.js @@ -0,0 +1,45 @@ +"use strict"; +var path = require('path'); +var Q = require('q'); + +var services = {}; + +require("fs").readdirSync(path.join(__dirname, "..", "lib", "services")).forEach(function(file) { + var service = require("../lib/services/" + file); + if (service.search) { + services[service.id] = service; + } +}); + +module.exports = function(req, res) { + var serviceId = req.params.service; + var type = req.params.type; + var itemId = req.params.id; + var promises = []; + + services[serviceId].lookupId(itemId, type).then(function(item) { + for (var id in services) { + if (id != serviceId) { + promises.push(services[id].search(item)); + } + } + + Q.allSettled(promises).then(function(results) { + var items = results.map(function(result) { + if (result.state == "fulfilled") { + return result.value; + } + }); + + items.sort(function(a, b) { + return !a.id || !b.id; + }).sort(function(a, b) { + return !a.streamUrl || b.streamUrl; + }); + + items.unshift(item); + + res.render(type, {items: items}); + }); + }); +};