Migration von Topfield nach VDR

Computer, Software und der Topf
cms
Topfversteher
Topfversteher
Beiträge: 373
Registriert: Mi 14. Dez 2005, 17:12
Receivertyp: VDR, 5000MP
Receiverfirmware: 5.13.62 20070808
Wohnort: Rhein-Main

Migration von Topfield nach VDR

#1

Beitrag von cms » Di 4. Feb 2014, 08:37

Für die Nachwelt, falls noch jemand vor dem gleichen Problem steht, Aufnahmen vom Topfield für den VDR zu migrieren:

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
---- 3 ----

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;
}
Zuletzt geändert von cms am Di 4. Feb 2014, 08:42, insgesamt 1-mal geändert.
ACL 3.16, 3PG 1.29, FastSkip
Panasonic TH-37PV71, Denon AVR-2307, Denon DVD-1730, Logitech Harmony 885, yaVDR 0.3

Zurück zu „Computer und Topfield“