1) Die Verzeichnisstruktur ist umzubauen.
2) Indexdatei erstellen.
3) Aus dem Topfield Recording Header eine Info-Datei erstellen.
---- 1+2 ----
Hier wurde stark vereinfacht, normalerweise könnten alle Daten, wie sie für den Verzeichnisnamen nötig sind, auch aus dem Header kommen, war mir aber viel zu aufwändig.
Code: Alles auswählen
for d in $*
do
echo "Dirctory: " $d
for i in $d/*.rec
do
n=`basename "$i" .rec`
n=${n// /_}
echo $n
statname=`stat -c %y "$i"`
statdate=`stat -c %y "$i" | awk '{printf $1}'`
stattime=`stat -c %y "$i" | awk '{printf $2}'`
stattime=${stattime:0:5}
stattime=${stattime//:/.}.51-0.rec
dirname=$n/$statdate.$stattime
echo $d/$dirname
mkdir -p ../$d/$dirname
mv "$i" "../$d/$dirname"
mv "../$d/$dirname/${i##*/}" "../$d/$dirname/00001.ts"
vdr --genindex=/srv/vdr/video.00/Topfield/$d/$dirname
done
done
Code: Alles auswählen
for i in `find /srv/vdr/video.00/Topfield -name 00001.ts`
do
./n $i > `dirname $i`/info
done
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
typedef unsigned char byte;
typedef unsigned short word;
typedef unsigned int dword;
typedef int bool;
#define ENDIAN 1
/*
* Convert Modified Julian Day to calendar date.
* - Assumes Gregorian calendar.
* - Adapted from Fliegel/van Flandern ACM 11/#10 p 657 Oct 1968.
*/
unsigned char * asc2utf8(unsigned char *src, int size)
{
int dp = 0, i;
char *result;
result = malloc(2*size+2);
for (i=0; i<=size; i++) {
if (src[i] > 127) { // Two byte
result[dp++] = (src[i] >> 6) & 0x3 | (128+64);
result[dp++] = (src[i] & (1+2+4+8+16+32)) | 128;
} else { // One byte
switch (src[i]) {
case '\n':
result[dp++] = ' ';
break;
case 0x05:
break;
default:
result[dp++] = src[i];
break;
}
}
}
return result;
}
word getWord(void *buffer, bool NeedsByteSwapping)
{
word w;
byte *p;
p = (byte*)buffer;
if(NeedsByteSwapping)
w = (p[1] | (p[0] << 8));
else
w = (p[0] | (p[1] << 8));
return w;
}
dword getDword(void *buffer, bool NeedsByteSwapping)
{
dword d;
byte *p;
p = (byte*)buffer;
if(NeedsByteSwapping)
d = (p[3] | (p[2] << 8) | (p[1] << 16) | (p[0] << 24));
else
d = (p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24));
return d;
}
void
MjdToDate (long Mjd, long *Year, long *Month, long *Day)
{
long J, C, Y, M;
J = Mjd + 2400001 + 68569;
C = 4 * J / 146097;
J = J - (146097 * C + 3) / 4;
Y = 4000 * (J + 1) / 1461001;
J = J - 1461 * Y / 4 + 31;
M = 80 * J / 2447;
*Day = J - 2447 * M / 80;
J = M / 11;
*Month = M + 2 - (12 * J);
*Year = 100 * (C - 49) + Y + J;
}
#define SZ 2048
int main(int ac, char *av[])
{
int fd;
long d, m, y;
unsigned char b[SZ];
unsigned char *EventText, *ExtEventText, *EventDesc;
dword p;
byte EventTextLength, hour, minute;
word ExtEventTextLength, EventStartTime;
if (ac > 1) {
fd = open(av[1], O_RDONLY);
} else {
exit(1);
}
if (fd < 0) {
fprintf(stderr, "%s - ", av[1]); perror("Open");
exit(1);
}
if (read(fd, &b, SZ) != SZ) {
fprintf(stderr, "%s - ", av[1]); fprintf(stderr, "%s - ", av[1]); perror("Read");
exit(2);
}
p = 0x0044;
EventStartTime = getWord(&b[p + 0x8], ENDIAN);
hour = b[p + 0xa];
minute = b[p + 0xb];
MjdToDate(EventStartTime, &y, &m, &d);
// printf("%04ld-%02ld-%02ld.%02d.%02d.%01d-0.rec\n", y, m, d, hour, minute, 51);
EventTextLength = b[p + 0x11];
// printf("EventTextLength %d\n", EventTextLength);
EventText = malloc(EventTextLength+1);
strncpy(EventText, &b[p + 0x13], EventTextLength);
EventText[EventTextLength] = '\0';
EventText = asc2utf8(EventText, EventTextLength);
printf("T %s\n", EventText);
EventDesc = malloc(257 - EventTextLength + 1);
strncpy(EventDesc, &b[p + 0x13 + EventTextLength], 257 - EventTextLength);
EventDesc[257 - EventTextLength] = '\0';
EventDesc = asc2utf8(EventDesc, 257 - EventTextLength);
if (strlen(EventDesc) > 0) {
printf("G %s\n", EventDesc);
}
p = 0x0168;
ExtEventTextLength = getWord(&b[p + 0x2], ENDIAN);
//printf("ExtEventTextLength %d\n", ExtEventTextLength);
ExtEventText = malloc(ExtEventTextLength + 1);
strncpy(ExtEventText, &b[p + 0x8], ExtEventTextLength);
ExtEventText[ExtEventTextLength] = '\0';
ExtEventText = asc2utf8(ExtEventText, ExtEventTextLength);
printf("D %s\n", ExtEventText);
return 0;
}