news/ds13-videomitschnitte-teil1

This commit is contained in:
Astro 2013-09-14 00:12:42 +02:00
parent efa1e0eef1
commit 833a4a900f
3 changed files with 220 additions and 1 deletions

View File

@ -74,7 +74,8 @@ DS_PAGES:=$(patsubst content/datenspuren/%.xml, build/datenspuren/$(DS_YEAR)/%.h
DS_FEEDS:= \
build/datenspuren/2010/mitschnitte-rss.xml \
build/datenspuren/2011/mitschnitte-rss.xml \
build/datenspuren/2012/mitschnitte-rss.xml
build/datenspuren/2012/mitschnitte-rss.xml \
build/datenspuren/2013/mitschnitte-rss.xml
# Quellen
NEWSITEMS:=$(wildcard content/news/*.xml)
@ -251,6 +252,8 @@ build/datenspuren/2011/mitschnitte-rss.xml: content/news/ds11-mitschnitte-online
$(call xml_process)
build/datenspuren/2012/mitschnitte-rss.xml: content/news/ds12-videomitschnitte-komplett.xml $(STYLE)
$(call xml_process)
build/datenspuren/2013/mitschnitte-rss.xml: content/news/ds13-videomitschnitte-teil1.xml $(STYLE)
$(call xml_process)
xhtml5-validate: $(patsubst build/%.html, build/%.html.xhtml5-validate, $(CONTENT))

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE item SYSTEM "http://www.c3d2.de/dtd/c3d2web.dtd">
<?xml-stylesheet type="text/xsl" href="../../xsl/html.xsl" ?>
<item title="Datenspuren 2013 - Videomitschnitte online (Teil 1)"
date="2013-09-13T21:30:00"
author="Astro">
<image title="Datenspuren 2013">../cfp-flyer-ds13_logo.png</image>
<p>
Videoengel <em>COeins</em> hat sich ins Zeug gelegt und somit
können wir bereits nach weniger als einer Woche eine Vorschau auf
die ersten fünf Videomitschnitte geben. Insbesondere die
Podiumsdiskussion kann euch zur Bundestagswahl in einer Woche zu
einer besser informierten Entscheidung verhelfen.
</p>
<resource title="Podiumsdiskussion" size="449551691" type="video/mp4" url="http://ftp.c3d2.de/datenspuren/2013/5225_podiumsdiskussion.mp4" preview="http://ftp.c3d2.de/datenspuren/2013/5225_podiumsdiskussion.gif" poster="http://ftp.c3d2.de/datenspuren/2013/5225_podiumsdiskussion.jpg" details-link="http://datenspuren.de/2013/fahrplan/events/5225.html" feedback-link="https://frab.cccv.de/en/DS2013/public/events/5225/feedback/new"><alternative size="473410271" type="video/webm" url="http://ftp.c3d2.de/datenspuren/2013/5225_podiumsdiskussion.webm"/></resource>
<addendum>
<resource title="Lightning Talks" size="330490175" type="video/mp4" url="http://ftp.c3d2.de/datenspuren/2013/5170_lightning_talks.mp4" preview="http://ftp.c3d2.de/datenspuren/2013/5170_lightning_talks.gif" poster="http://ftp.c3d2.de/datenspuren/2013/5170_lightning_talks.jpg" details-link="http://datenspuren.de/2013/fahrplan/events/5170.html" feedback-link="https://frab.cccv.de/en/DS2013/public/events/5170/feedback/new"><alternative size="355349199" type="video/webm" url="http://ftp.c3d2.de/datenspuren/2013/5170_lightning_talks.webm"/></resource>
<resource title="WebRTC" size="186187362" type="video/mp4" url="http://ftp.c3d2.de/datenspuren/2013/5172_webrtc.mp4" preview="http://ftp.c3d2.de/datenspuren/2013/5172_webrtc.gif" poster="http://ftp.c3d2.de/datenspuren/2013/5172_webrtc.jpg" details-link="http://datenspuren.de/2013/fahrplan/events/5172.html" feedback-link="https://frab.cccv.de/en/DS2013/public/events/5172/feedback/new"><alternative size="204542876" type="video/webm" url="http://ftp.c3d2.de/datenspuren/2013/5172_webrtc.webm"/></resource>
<resource title="ddmesh" size="93264692" type="video/mp4" url="http://ftp.c3d2.de/datenspuren/2013/5175_ddmesh.mp4" preview="http://ftp.c3d2.de/datenspuren/2013/5175_ddmesh.gif" poster="http://ftp.c3d2.de/datenspuren/2013/5175_ddmesh.jpg" details-link="http://datenspuren.de/2013/fahrplan/events/5175.html" feedback-link="https://frab.cccv.de/en/DS2013/public/events/5175/feedback/new"><alternative size="99262406" type="video/webm" url="http://ftp.c3d2.de/datenspuren/2013/5175_ddmesh.webm"/></resource>
<resource title="PRISM / TEMPORA" size="185348730" type="video/mp4" url="http://ftp.c3d2.de/datenspuren/2013/5257_prism_tempora.mp4" preview="http://ftp.c3d2.de/datenspuren/2013/5257_prism_tempora.gif" poster="http://ftp.c3d2.de/datenspuren/2013/5257_prism_tempora.jpg" details-link="http://datenspuren.de/2013/fahrplan/events/5257.html" feedback-link="https://frab.cccv.de/en/DS2013/public/events/5257/feedback/new"><alternative size="204864087" type="video/webm" url="http://ftp.c3d2.de/datenspuren/2013/5257_prism_tempora.webm"/></resource>
<p>
Die Mitschnitte der übrigen Vorträge folgen in den nächsten
Wochen.
</p>
</addendum>
</item>

186
scripts/ds2013-resources.js Normal file
View File

@ -0,0 +1,186 @@
var ltx = require('ltx');
var http = require('http');
var fs = require('fs');
var url = require('url');
var running = 0, queue = [];
var SUFFIXES = ["_hq.mp4", ".mp4", ".webm"];
var WEB_SUFFIXES = [".mp4", ".webm"];
function resolveSizes(urls, cb) {
if (running > 0) {
queue.push(function() {
resolveSizes(urls, cb);
});
return;
}
running++;
urls = urls.map(url.parse);
var pending = 0, results = [],
done = function() {
if (pending < 1) {
results = results.sort(function(a, b) {
if (a.url < b.url)
return -1;
else if (a.url > b.url)
return 1;
else
return 0;
});
cb(results);
running--;
var f = queue.shift();
f && f();
}
};
urls.forEach(function(u) {
var req = http.request({ method: 'HEAD',
path: u.pathname,
hostname: u.host });
req.end();
req.on('response', function(res) {
if (res.statusCode === 200) {
results.push({ url: url.format(u),
size: res.headers['content-length'] });
} else {
console.error("HTTP " + res.statusCode + " " + u.pathname);
}
pending--;
done();
});
pending++;
});
done();
}
function mimeByExt(url) {
var ext = url.split('.').pop();
var type = ({ avi: 'video/avi',
mp4: 'video/mp4',
webm: 'video/webm',
ogv: 'video/ogg',
flv: 'video/x-flv' })[ext];
return type || 'application/octet-stream';
}
function processEvent(event) {
var base = 'http://ftp.c3d2.de/datenspuren/2013/' + event.outputName;
var urls = WEB_SUFFIXES.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;
}
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'] = "http://datenspuren.de/2013/fahrplan/events/" +
event.id + ".html";
resAttrs['feedback-link'] = "https://frab.cccv.de/en/DS2013/public/events/" +
event.id + "/feedback/new";
}
var res = new ltx.Element('resource', resAttrs);
infos.slice(1).forEach(function(info) {
res.c('alternative', { size: info.size,
type: mimeByExt(info.url),
url: info.url });
});
console.info(res.toString());
});
}
function printMetadata(event) {
var metaparameters = "";
function addMeta(k, v) {
metaparameters +=
" -metadata " + k + "=\"" +
v.replace(/"/g, '\\"') + "\"";
}
addMeta('title', event.title);
addMeta('subtitle', event.subtitle);
addMeta('album', "Datenspuren 2012");
addMeta('artist', "Datenspuren");
addMeta('author', "Datenspuren");
addMeta('language', "deu");
addMeta('year', "2012");
addMeta('composer', event.persons.join(", "));
addMeta('description', event.abstract || event.description);
SUFFIXES.forEach(function(suffix) {
console.log("avconv -i " + event.inputName + suffix + " -codec copy" + metaparameters + " -y " + event.outputName + suffix);
});
}
function slugify(title) {
return title.toLowerCase().
replace(/\s*[\-\:].*/, "").
replace(/[\.!\?\/]/g, "").
replace(/Ä/g, "Ae").
replace(/Ö/g, "Oe").
replace(/Ü/g, "Ue").
replace(/ä/g, "ae").
replace(/ö/g, "oe").
replace(/ü/g, "ue").
replace(/ß/g, "ss").
replace(/ẞ/g, "SS").
replace(/\s+/g, "_");
}
function makeEvent(event) {
event.inputName = event.id;
event.outputName = event.id + "_" + slugify(event.title);
return event;
}
var scheduleFile = fs.readFileSync('../content/static/datenspuren/2013/fahrplan/schedule.xml');
var schedule = ltx.parse(scheduleFile);
schedule.getChildren('day').forEach(function(dayEl) {
var dayEvents = [];
var roomIdx = 0;
dayEl.getChildren('room').forEach(function(roomEl) {
roomEl.getChildren('event').forEach(function(eventEl) {
var persons = [];
eventEl.getChildren('persons').forEach(function(personsEl) {
personsEl.getChildren('person').forEach(function(personEl) {
persons.push(personEl.getText());
});
});
dayEvents.push(makeEvent(
{ id: eventEl.attrs.id,
time: eventEl.getChildText('start'),
room: roomIdx,
title: eventEl.getChildText('title'),
subtitle: eventEl.getChildText('subtitle'),
slug: eventEl.getChildText('slug'),
abstract: eventEl.getChildText('abstract'),
description: eventEl.getChildText('description'),
persons: persons
}));
});
roomIdx++;
});
dayEvents = dayEvents.sort(function(e1, e2) {
return (e1.time < e2.time) ? -1 :
((e1.time > e2.time) ? 1 : e1.room - e2.room);
});
dayEvents.forEach(printMetadata);
dayEvents.forEach(processEvent);
});