2010-11-26 17:35:01 +01:00
|
|
|
var ltx = require('ltx');
|
|
|
|
var http = require('http');
|
|
|
|
var fs = require('fs');
|
|
|
|
var url = require('url');
|
|
|
|
|
|
|
|
|
|
|
|
var running = 0, queue = [];
|
|
|
|
|
|
|
|
function resolveSizes(urls, cb) {
|
|
|
|
if (running > 0) {
|
|
|
|
queue.push(function() {
|
|
|
|
resolveSizes(urls, cb);
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
running++;
|
|
|
|
|
|
|
|
urls = urls.map(url.parse);
|
|
|
|
var cl = http.createClient(urls[0].port || 80, urls[0].hostname);
|
|
|
|
|
|
|
|
var pending = 0, results = [],
|
|
|
|
done = function() {
|
|
|
|
if (pending < 1) {
|
|
|
|
cb(results);
|
|
|
|
|
|
|
|
running--;
|
|
|
|
var f = queue.shift();
|
|
|
|
f && f();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
urls.forEach(function(u) {
|
|
|
|
var req = cl.request('HEAD', u.pathname, { Host: u.host });
|
|
|
|
req.end();
|
|
|
|
req.on('response', function(res) {
|
|
|
|
if (res.statusCode === 200)
|
|
|
|
results.push({ url: url.format(u),
|
|
|
|
size: res.headers['content-length'] });
|
|
|
|
pending--;
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
pending++;
|
|
|
|
});
|
|
|
|
done();
|
|
|
|
}
|
|
|
|
|
|
|
|
function mimeByExt(url) {
|
|
|
|
var ext = url.split('.').pop();
|
2011-10-24 14:35:56 +02:00
|
|
|
var type = ({ avi: 'video/avi',
|
|
|
|
mp4: 'video/mp4',
|
2010-11-26 17:35:01 +01:00
|
|
|
webm: 'video/webm',
|
|
|
|
ogv: 'video/ogg',
|
|
|
|
flv: 'video/x-flv' })[ext];
|
|
|
|
return type || 'application/octet-stream';
|
|
|
|
}
|
|
|
|
|
2011-10-27 04:08:52 +02:00
|
|
|
function processEvent(event) {
|
2011-10-28 20:33:07 +02:00
|
|
|
var base = 'http://ftp.c3d2.de/datenspuren/2011/ds11_' + event.id + '_' + event.slug + '.';
|
2011-10-27 04:08:52 +02:00
|
|
|
var urls = ['avi', 'mp4', 'webm', 'ogv', 'flv'].map(function(fmt) {
|
|
|
|
return base + fmt;
|
|
|
|
});
|
|
|
|
resolveSizes(urls, function(infos) {
|
|
|
|
infos = infos.filter(function(i) {
|
|
|
|
return i.size !== undefined;
|
|
|
|
});
|
|
|
|
|
|
|
|
if (infos.length < 1) {
|
|
|
|
console.warn("<!-- No resources for " + event.id + ": " + event.title + " -->");
|
|
|
|
return;
|
|
|
|
}
|
2011-10-28 23:03:46 +02:00
|
|
|
var resAttrs = {
|
|
|
|
title: event.title,
|
|
|
|
size: infos[0].size,
|
|
|
|
type: mimeByExt(infos[0].url),
|
|
|
|
url: infos[0].url,
|
|
|
|
preview: base + "gif",
|
|
|
|
poster: base + "jpg"
|
|
|
|
};
|
|
|
|
if (event.id != "0000") {
|
|
|
|
resAttrs['details-link'] = "fahrplan/events/" +
|
|
|
|
event.id + ".de.html";
|
|
|
|
resAttrs['feedback-link'] = "https://cccv.pentabarf.org/feedback/DS2011/event/" +
|
|
|
|
event.id + ".de.html";
|
|
|
|
}
|
|
|
|
var res = new ltx.Element('resource', resAttrs);
|
2011-10-27 04:08:52 +02:00
|
|
|
infos.slice(1).forEach(function(info) {
|
|
|
|
res.c('alternative', { size: info.size,
|
|
|
|
type: mimeByExt(info.url),
|
|
|
|
url: info.url });
|
|
|
|
});
|
|
|
|
console.info(res.toString());
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2011-10-28 20:33:07 +02:00
|
|
|
processEvent({ id: '0000',
|
|
|
|
title: "Eröffnung/Abschluß",
|
|
|
|
slug: "eroeffnung_abschluss"
|
|
|
|
});
|
2011-10-27 04:08:52 +02:00
|
|
|
|
2011-10-23 00:49:58 +02:00
|
|
|
var scheduleFile = fs.readFileSync('content/static/datenspuren/2011/fahrplan/schedule.de.xml');
|
2010-11-26 17:35:01 +01:00
|
|
|
var schedule = ltx.parse(scheduleFile);
|
|
|
|
schedule.getChildren('day').forEach(function(dayEl) {
|
2011-10-28 22:51:32 +02:00
|
|
|
var dayEvents = [];
|
2011-10-29 00:28:50 +02:00
|
|
|
var roomIdx = 0;
|
2010-11-26 17:35:01 +01:00
|
|
|
dayEl.getChildren('room').forEach(function(roomEl) {
|
|
|
|
roomEl.getChildren('event').forEach(function(eventEl) {
|
2011-10-28 22:51:32 +02:00
|
|
|
dayEvents.push({ id: eventEl.attrs.id,
|
|
|
|
time: eventEl.getChildText('start'),
|
2011-10-29 00:28:50 +02:00
|
|
|
room: roomIdx,
|
2011-10-28 22:51:32 +02:00
|
|
|
title: eventEl.getChildText('title'),
|
|
|
|
slug: eventEl.getChildText('slug')
|
|
|
|
});
|
2010-11-26 17:35:01 +01:00
|
|
|
});
|
2011-10-29 00:28:50 +02:00
|
|
|
roomIdx++;
|
2010-11-26 17:35:01 +01:00
|
|
|
});
|
2011-10-28 22:51:32 +02:00
|
|
|
dayEvents = dayEvents.sort(function(e1, e2) {
|
|
|
|
return (e1.time < e2.time) ? -1 :
|
2011-10-29 00:28:50 +02:00
|
|
|
((e1.time > e2.time) ? 1 : e1.room - e2.room);
|
2011-10-28 22:51:32 +02:00
|
|
|
});
|
|
|
|
dayEvents.forEach(processEvent);
|
2010-11-26 17:35:01 +01:00
|
|
|
});
|
|
|
|
|