2014-02-08 5 views
1

Я хотел бы показать изображение обложки звуковой дорожки, с которой у меня есть URL-адрес трека.Есть ли ссылка на url-схему, похожую на facebook api?

Я знаю, что когда я извлекаю ключ/id трека из URL-адреса, я могу запросить URL-адрес обложки через свой API, а затем вставить полученный URL-адрес в тег изображения.

Что я хотел бы знать, если это возможно, чтобы использовать какую-либо схему URL-адресов, чтобы сделать soundcloud forward browsers подходящим URL-адресами, такими как его возможно с изображениями профиля facebook.

Например:

Все Zuckerbergs текущее изображение профиля имеет URL http://profile.ak.fbcdn.net/hprofile-ak-prn2/t5/202896_4_1782288297_q.jpg

То некоторые загадочные вещи, потому что его принимал на CDN. URL-адреса для оформления Soundcloud выглядят довольно загадочными.

Теперь, когда я знаю, что метки facebook идентификатор/ключ («Zuck»), я могу просто открыть его изображение профиля как так:

http://graph.facebook.com/zuck/picture

Этот URL автоматически перенаправлены на URL профиля изображения с помощью API facebook.

Используя эту схему URL-адреса, вы абстрагируете не только причину добавления дополнительного запроса API, но также и безопасное время обработки на их стороне.

Есть ли какая-то функциональность, подобная этой для звуковых дорожек?

ответ

0

Я написал экспресс приложения, которое перенаправляет наибольшее доступное изображение на их CDN, учитывая artwork_url.

https://gist.github.com/gaearon/717ed6d6c7771f95d50d

Он использует свою схему именования и перебирает размерами от одного за другим, пока некоторые изображения не возвращается Статус 200.

Источник:

'use strict'; 

var express = require('express'), 
    app = express(); 

require('./config/development')(app, express); 
require('./config/production')(app, express); 

var redis = require('redis'), 
    request = require('request'), 
    Promise = require('bluebird'); 

Promise.promisifyAll(redis.RedisClient.prototype); 

var redisSettings = app.set('redis'), 
    redisClient = redis.createClient(redisSettings.port, redisSettings.host, redisSettings.options); 

app.configure(function() { 
    app.use(express.bodyParser()); 
    app.use(app.router); 
}); 

function sendError(res, status, error) { 
    if (!(error instanceof Error)) { 
    error = new Error(JSON.stringify(error)); 
    } 

    return res 
    .status(status || 500) 
    .end(error && error.message || 'Internal Server Error'); 
} 

function generateCacheHeaders() { 
    var maxAge = 3600 * 24 * 365; 

    return { 
    'Cache-Control': 'public,max-age=' + maxAge, 
    'Expires': new Date(Date.now() + (maxAge * 1000)).toUTCString() 
    }; 
} 

function getCacheKey(url) { 
    return 'soundcloud-thumbnail-proxy:' + url; 
} 

app.get('/*', function (req, res) { 
    var originalUrl = req.params[0], 
     cacheKey = getCacheKey(originalUrl), 
     urls; 

    // https://developers.soundcloud.com/docs/api/reference#artwork_url 
    // This is a ridiculous naming scheme, by the way. 

    urls = [ 
    originalUrl, 
    originalUrl.replace('-large', '-t500x500'), 
    originalUrl.replace('-large', '-crop'), // 400x400 
    originalUrl.replace('-large', '-t300x300'), 
    originalUrl.replace('-large', '-large') // 100x100 
    ]; 

    return redisClient.getAsync(cacheKey).then(function (cachedUrl) { 
    if (cachedUrl) { 
     return cachedUrl; 
    } 

    return Promise.reduce(urls, function (resolvedUrl, url) { 
     if (resolvedUrl) { 
     return resolvedUrl; 
     } 

     return new Promise(function (resolve) { 
     request.head(url, function (err, response) { 
      if (!err && response.statusCode === 200) { 
      resolve(url); 
      } else { 
      resolve(null); 
      } 
     }); 
     }); 
    }, null); 
    }).then(function (url) { 
    if (!url) { 
     throw new Error('File not found'); 
    } 

    var headers = generateCacheHeaders(); 
    for (var key in headers) { 
     if (headers.hasOwnProperty(key)) { 
     res.setHeader(key, headers[key]); 
     } 
    } 

    res.redirect(url); 
    redisClient.set(cacheKey, url); 
    redisClient.expire(cacheKey, 60 * 60 * 24 * 30); 

    }).catch(function (err) { 
    sendError(res, 404, err); 
    }); 

}); 

app.get('/crossdomain.xml', function (req, res) { 
    req.setEncoding('utf8'); 
    res.writeHead(200, { 'Content-Type': 'text/xml' }); 
    res.end('<?xml version="1.0" ?><cross-domain-policy><allow-access-from domain="*" /></cross-domain-policy>'); 
}); 

redisClient.on('ready', function() { 
    app.listen(app.set('port')); 
}); 

redisClient.on('error', function() { 
    throw new Error('Could not connect to Redis'); 
}); 

module.exports = app; 
Смежные вопросы