Поддержи Openmeetings

среда, 30 сентября 2009 г.

Встраиваемый музыкальный проигрыватель на Javascript

Нами была закончена разработка методических рекомендаций по разработке информационной системы на основе свободного программного обеспечения для компании Орион Экспресс. Популярные рекомендации по разработке модулей для Joomla и SugarCRM опубликованы в блоге компании.

Теперь мы запускаем проект по созданию виджета на основе javascript для размещения музыкального проигрывателя в блогах и на веб-сайтах. Это — первый шаг в создании технологии асинхронного видеообщения.

Проигрыватель исполняет композиции из Youtube, требования к первому этапу следующие:

  • виджет проигрывает народную музыку грустных детей Африки;
  • треки выбираются по популярности и ключевым словам;
  • после окончания проигрывания одного трека начинает проигрываться следующий трек;
  • виджет размещается под свободной лицензией Apache на Google Code и может быть вставлен командой <script>;
  • виджет интегрирован в этот блог.

Задача очень инновационная — на YouTube лежит большое количество старой хорошей музыки, а проигрывателя нормального нет. В стандартном проигрывателе нужно после каждого трека нажимать кнопку, чтобы YouTube продолжил играть дальше. Как и всегда Google API, для создания инновационного решения достаточно всего странички кода помноженного на большое трудолюбие, чтобы эта страничка заработала. Интернет-радио на основе полностью бесплатных технологий — почему бы этому свободному проекту не превратиться в популярный, а его создателю — не проснуться знаменитым?

Библиотека может загрузить YouTube API, например, с помощью getScript() и создать тэг, содержащий Flash-проигрыватель. Далее запросить парочку случайных видео по ключевым словам, выбрать то, которое окажется популярнее и запустить проигрывание. По завершении проигрывания повторить. После того, как это заработает, можно придумать ещё много чего интересного:

  • оформление в виде плагина jquery;
  • возможность выбора музыки из нескольких категорий;
  • отключение видеопотока ролика;
  • использование бескнопочного (chromeless) проигрывателя;
  • подкачка следующего потока во время проигрывания;
  • добавление рекламного трека Датаведа после заданного количества проигранных композиций;
  • кнопка-возможность пропустить текущий трек;
  • кнопка-like с сайта YouTube;
  • возможность указания стартового трека в параметре GET страницы для того, чтобы при нажатии на кнопки like, tweet и g+ посылалась ссылка на страницу Датаведа с параметром, соответствующим проигрываемой записи;
  • ещё Ваши идеи в комментариях к этой заметке или среди интересных примеров.

Ждём от исполнителя желания работать с API Google, оценку по времени для первого этапа, по деньгам и электронный адрес. На данной задаче работы не заканчиваются — в перспективе было бы интересно интегрировать на сайт Машу для того, чтобы улучшить качество материалов на сайте и вики.

1 комментарий :

Мария Федотова комментирует...

Сделать зеркалирование сайта на javascript (wget –m)

Есть вот такой скрипт на Google Apps Script, который позволяет зеркалировать закрывающиеся сайты, например, knol.google.com – переносить их на wiki.dataved.ru. Есть желание сохранять с полезных сайтов материалы, даже если их коммерческие владельцы не могут более за это платить.

var util = {
FETCH_LABEL: 'datavedFetchPage',

encodeName: function(url) {
var schemeRe = /^https?:\/\//;
return url.replace(schemeRe, '').replace(/\W+/g, '_');
},

getHost: function(url) {
return url.replace(/^(https?:\/\/[^\/]*).*/, $1);
},

getLocalPath: function(url) {
return url.replace(/[^\/]*$/);
}
}

var scheduler = {

site: SitesApp.getActiveSite(),

add: function(url) {
var page;
var name = util.encodeName(url);

try {
page = this.site.getChildByName(name);
} catch (e) {
page = this.site.createWebPage(url, name, util.FETCH_LABEL);
}
}
}

function doGet(e) {
var app = UiApp.createApplication();

var num = ScriptProperties.getProperty('fetchedPages');
if (!num) num = 0;

var infoLabel = app.createLabel('Fetched ' + num + ' pages').setStyleAttribute('fontSize', '16px');
app.add(infoLabel);

return app;
}

function testFetch() {
scheduler.add('http://knol.google.com');
}

var wGet = {
FETCH_MAX: 10,

site: SitesApp.getActiveSite(),

process: function() {
var pages = this.site.search(util.FETCH_LABEL, { max: this.FETCH_MAX });
var page;

while (page = pages.shift()) {
processPage(page);
}
},

processPage: function(page) {
var url = page.getTitle();
var host = getHost(url);
var localPath = getLocalPath(url);
var response = UrlFetchApp.fetch(url);

var content = response.getContentText();
var hrefRe = /(<\s*a[^>]\s+href\s*=\s*(['"]))([^'">]+)(\2[^>]*>)/;
content = content.replace(hrefRe, function(tag, p1, p2, url, p4) {
if (url.test(/^\//)) {
url = host + url;
} else if (!url.test(/^https?:\/\//)) {
url = localPath + url;
}
scheduler.scheduleFetch(url);

return p1 + util.encode(url) + p4;
});
page.setHtmlContent(content);
}
}


function processSiteLinks() {
wGet.process();
}

Скрипт несколько недоотлажен, есть у него и ещё одна проблема. Выкачивать странички долго, и Google ограничивает общее время работы облачного скрипта. Поэтому большой сайт будет выкачиваться годами. Идея – перенести часть работы на клиента. На каждую страничку вики можно вставлять не только скрипты Google Apps, но и обычные клиентские скрипты, которые могут делать часть работы краудсорсингом копьютеров тех, кто эту вики читает.

Что-то сделать не получится, например, кросс-доменные вызовы. С другой стороны, даже функциональность кросс-доменных вызовов реализуется в custom search, когда мы запрашиваем предпросмотр страницы. Тут мы упираемся в другое ограничение – бесплатная версия custom search ограничена 100 вызовами в день. Это даст нам, скажем, 5000 страниц, если каждым вызовом загрузить по 50 страниц. Кто-то типа Yahoo дарит кросс-домэйн прокси с какими-то другими ограничениями. Что лучше?

Возможно постановка задачи поменяется по ходу исследования API. Не получится сделать - было бы интересно по результатам получить хотя бы статью нам на сайт. С анонсом в блоге компании на Хабре.

Отправить комментарий