Hallo,
ich habe mich durch dieses HowTo inspierieren lassen (vielen Dank dafür!), ein Perl-Script gebaut und das Import-JS erweitert um dieses Problem hier...
welche Möglichkeit gibt es die External Urls mittels eines Skripts in die Datenbank einzutragen? Bei mehreren Tausend Sendern ist das leider ganz schön mühlseelig.
oder wäre das sogar mit einer .js Datei möglich?
... zu lösen.
Also, zunächst ein Mal ein Perl-Skript (create_mt_channels.pl):
#!/usr/bin/perl
use strict;
#
# Custimize the following lines
#
my $ip = "192.168.178.2"; # IP-Address of the VDR - not MediaTomb!
my $port = "3000"; # port number of VDR-StreamdevServer
my $input_file = "/etc/vdr/channels.conf"; # path to channels.conf
my $out_dir = "/var/lib/mediatomb/channels"; # directory observed by MediaTomb
my $stream = "ts"; # Stream type (TS, PES, ...)
#
# Script starts here
#
# first clean up
if (-d $out_dir) {
system("rm -rf $out_dir" + '/*') or die $!;
} else {
mkdir($out_dir) or die $!;
}
my $i = 0;
my $sub_dir = "";
open IN_FILE, "<$input_file" or die $!;
while (<IN_FILE>) {
my $in_line = $_;
chomp($in_line);
print "IN: $in_line\n";
my @array=split(/:/, $in_line);
my $chan = $array[0];
if ($chan) {
# channel found
my @chan = split(/;/, $chan);
$chan = $chan[0];
@chan = split(/,/, $chan);
$chan = trim($chan[0]);
my $p1 = $array[3];
my $p2 = $array[10];
my $p3 = $array[11];
my $p4 = $array[9];
$i++;
$i = sprintf("d", $i);
my $out_file = "$i $chan\@$ip\@$port\@$p1-$p2-$p3-$p4.$stream.channel";
$out_file =~ s/ /\_/igo;
$out_file =~ s/\//_/igo;
print "OUT_FILE: $out_file\n";
open OUT_FILE, ">$out_dir/$sub_dir/$out_file" or die $!;
print OUT_FILE "$in_line\n";
close OUT_FILE;
} else {
# separator found
$i = 0;
$sub_dir = $array[1];
if (substr($sub_dir, 0, 1) eq '@') {
$sub_dir = substr($sub_dir, index($sub_dir, ' '));
}
$sub_dir = trim($sub_dir);
$sub_dir =~ s/ /\_/igo;
$sub_dir =~ s/\//_/igo;
print "SUB_DIR: $sub_dir\n";
mkdir("$out_dir/$sub_dir");
}
}
close IN_FILE;
sub trim($) {
my $string = shift;
$string =~ s/^\s+//;
$string =~ s/\s+$//;
return $string;
}
Display More
Bitte irgendwo ablegen, die ersten Paar Zeilen anpassen, ausführbar machen und ausführen
Funktionsweise: dieses Script erzeugt für jedes Kanal aus der channels.conf eine Datei nach einem bestimmten Strickmuster
im out_dir. Pro Kanalgruppe wird automatisch ein Unterverzeichnis angelegt. Damit die Reihenfolge erhalten bleibt werden
die Kanäle automatisch durchnummeriert.
Die Dateinamen folgen einer Namenskonvention und werden dann von MediaTomb wie alle anderen Medien importiert,
d.h. man muss das Verzeichnis out_dir in MediaTomb importieren.
Damit die richtigen Objekte erzeugt werden muss das Import-Skript angepasst werden.
Als Grundlage habe ich dieses Skript genommen: https://github.com/igorette/Mediatomb-VDR-Import
und an 2. Stellen erweitert.
Erste Änderung "main script part" - am besten komplett ersetzen:
// main script part
if (getPlaylistType(orig.mimetype) == '')
{
var arr = orig.mimetype.split('/');
var mime = arr[0];
// var obj = copyObject(orig);
var obj = orig;
obj.refID = orig.id;
if (mime == 'audio')
{
if (obj.onlineservice == ONLINE_SERVICE_WEBORAMA)
addWeborama(obj);
else
addAudio(obj);
}
// BEGIN OF CHANGES BY REO
if (/\.vdr$/.test(obj.title) || /\.ts$/.test(obj.title))
{
addVdrVideo(obj);
}
else if (mime == 'video')
{
if (obj.onlineservice == ONLINE_SERVICE_YOUTUBE)
addYouTube(obj);
else if (obj.onlineservice == ONLINE_SERVICE_APPLE_TRAILERS)
addTrailer(obj);
else
addVideo(obj);
}
if (/\.channel$/.test(obj.title))
{
addVdrChannel(obj);
}
// END OF CHANGES
if (mime == 'image')
{
addImage(obj);
}
if (orig.mimetype == 'application/ogg')
{
if (orig.theora == 1)
addVideo(obj);
else
addAudio(obj);
}
}
Display More
... und die 2. Änderung ist eine neue Funktion, diese am besten komplett vor der Funktion "function addWeborama(obj)"
einfügen:
/* **********************************************************
* Add items from VDR's channels.conf
* **********************************************************/
function addVdrChannel(obj)
{
var fullpath = obj.location;
var filename = fullpath.substring(fullpath.lastIndexOf('/') + 1, fullpath.length); // file name
var filepath = fullpath.substring(0, fullpath.lastIndexOf('/')); // full path of the file without filename and without last '/'
var sub_dir = filepath.substring(filepath.lastIndexOf('/') + 1, filepath.length);
var segments = filename.split(/\@/g);
var chan = segments[0];
chan = chan.replace(/_/g, ' ');
var ip = segments[1];
var port = segments[2];
var stream = segments[3];
stream = stream.replace(/.channel/g, '');
var url = 'http://' + ip + ':' + port + '/' + stream;
print(url);
var exturl = new Object();
exturl.mimetype = 'video/mpeg';
exturl.title = chan;
exturl.objectType = OBJECT_TYPE_ITEM_EXTERNAL_URL;
exturl.upnpclass = UPNP_CLASS_ITEM_VIDEO;
exturl.location = url;
exturl.protocol = 'http-get';
var chain = new Array('Live TV');
if (sub_dir != 'channels')
{
sub_dir = sub_dir.replace(/_/g, ' ');
chain[1] = sub_dir;
}
addCdsObject(exturl, createContainerChain(chain));
}
Display More
Die Änderung in /etc/mediatomb/config.xml nicht vergessen:
<virtual-layout type="js">
<import-script>/usr/share/mediatomb/js/import-vdr.js</import-script>
<dvd-script>/usr/share/mediatomb/js/import-dvd.js</dvd-script>
</virtual-layout>
Achtung: Skript-Name muss passen!
... ausserdem ist folgendes Mapping in der o.g. config.xml (unterhalb von <extension-mimetype>) hilfreich:
... und danach MediaTomb durchstarten. Das sollte's gewesen sein.
Ich hoffe, irgendjemand findet's nützlich
LG aus Kassel,
Monni