ubuntuusers.de

Mata-File auslesen

Status: Ungelöst | Ubuntu-Version: Ubuntu MATE 18.10 (Cosmic Cuttlefish)
Antworten |

jochenv

Anmeldungsdatum:
23. April 2016

Beiträge: 675

Wohnort: Kurhessen

Hallo Gemeinde und ein besonderes Hallo an die C-Spezialisten,

kurz zur Geschichte : ich habe hier zwei SAT-HDD-Receiver stehen auf dem regelmäßig aufgenommen wird. Von Zeit zu Zeit sammeln sich dort Filme, die gern auslagen möchte. Es sind beides die gleichen Receiver, nur die Software ist leicht unterschiedlich und erzeugen auch ein anderes Mata-File. Für den Receiver1 wurde mir mal geholfen und da funktioniert auch die Ausgabe in eine Datei (siehe Muster). Das auslesen der Datei META.DAT übernimmt ein C-Programm und wird von einer bash aufgerufen und aufbereitet.

hier ein Muster

=========================================================================================================================
Lft#   Verzeichnis Sender                       Film                                  Aufnahme zeit und Datum
=========================================================================================================================
   1   REC_0007    SAT.1                        Harry Potter und die Heiligt�me       date: 2018-12-09  time: 14:04 (UTC)
   2   REC_0102    ProSieben                    Galileo                               date: 2019-01-30  time: 18:00 (UTC)
   3   REC_0035    ProSieben                    NEWSTIME                              date: 2019-02-13  time: 16:55 (UTC)

für Receiver2 bekommen ich das ich Datum und Zeit nicht hin. Als I-Tüpfelchen wäre noch die Spielzeit (Filmlänge). Wenn das jemand hin bekommt.

hier das kleine C-Programm

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>

bool
read_null_string(FILE *fp, char *target, size_t sz)
{
    int read;
    size_t i;

    for (i = 0; (read = fgetc(fp)) != EOF && read != 0; i++)
    {
        if (i == sz - 1)
        {
            fprintf(stderr, "read_null_string: Exceeded buffer\n");
            return false;
        }

        target[i] = read;
    }

    i++;
    target[i] = 0;
    return true;
}

int
main(int argc, char **argv)
{
    FILE *fp;
    char station[512] = "", title[512] = "";
    uint16_t year;
    uint8_t month, day;
    uint8_t utc_hour, minute;

    if (argc != 2)
    {
        fprintf(stderr, "Usage: %s <meta.dat>\n", argv[0]);
        return 1;
    }

    fp = fopen(argv[1], "r");
    if (!fp)
    {
        fprintf(stderr, "Cannot open file '%s': ", argv[1]);
        perror(NULL);
        return 1;
    }

    /* Read station */
    if (fseek(fp, 13, SEEK_SET) == -1)
    {
        perror("Cannot seek to station");
        fclose(fp);
        return 1;
    }

    if (!read_null_string(fp, station, sizeof station))
    {
        fclose(fp);
        return 1;
    }

    /* Read movie title */
    if (fseek(fp, 0x95, SEEK_SET) == -1)
    {
        perror("Cannot seek to title");
        fclose(fp);
        return 1;
    }

    if (!read_null_string(fp, title, sizeof title))
    {
        fclose(fp);
        return 1;
    }

    /* Read date */
    if (fseek(fp, 0xD8, SEEK_SET) == -1)
    {
        perror("Cannot seek to year");
        fclose(fp);
        return 1;
    }

    if (fread(&year, 2, 1, fp) != 1)
    {
        perror("Cannot read year");
        fclose(fp);
        return 1;
    }
    if (fread(&month, 1, 1, fp) != 1)
    {
        perror("Cannot read month");
        fclose(fp);
        return 1;
    }
    if (fread(&day, 1, 1, fp) != 1)
    {
        perror("Cannot read day");
        fclose(fp);
        return 1;
    }

    /* Read time (UTC) */
    if (fseek(fp, 0xD4, SEEK_SET) == -1)
    {
        perror("Cannot seek to hour");
        fclose(fp);
        return 1;
    }

    if (fread(&utc_hour, 1, 1, fp) != 1)
    {
        perror("Cannot read hour");
        fclose(fp);
        return 1;
    }

    if (fread(&minute, 1, 1, fp) != 1)
    {
        perror("Cannot read minute");
        fclose(fp);
        return 1;
    }

    /* Dump all information */
    printf("%-29s", station);
    printf("%-38s", title);
    printf("date: %04d-%02d-%02d  ", year, month, day);
    printf("time: %02d:%02d (UTC)\n", utc_hour, minute);

    fclose(fp);
    return 0;
}

von Receiver1 der hexdump

heike@heike-Satellite-C660D:~$ hexdump -C /media/heike/RECEIVER2/PVR/REC_0007/META.DAT
00000000  05 00 72 6a 02 00 00 00  00 00 00 00 0a 53 41 54  |..rj.........SAT|
00000010  2e 31 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |.1..............|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 5c 44  |..............\D|
00000030  f9 07 ff 00 02 00 00 00  00 00 00 00 02 00 00 00  |................|
00000040  00 01 00 00 72 65 67 02  03 21 00 00 72 65 67 02  |....reg..!..reg.|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000080  20 00 00 00 01 00 00 00  01 00 00 00 06 00 0f 00  | ...............|
00000090  00 04 00 00 0a 48 61 72  72 79 20 50 6f 74 74 65  |.....Harry Potte|
000000a0  72 20 75 6e 64 20 64 69  65 20 48 65 69 6c 69 67  |r und die Heilig|
000000b0  74 fc 6d 65 00 00 00 00  00 00 00 00 00 00 00 00  |t.me............|
000000c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000000d0  00 00 00 00 0e 04 00 00  e2 07 0c 09 07 00 00 00  |................|
000000e0  d0 bf 00 00 02 1e 23 00  01 00 00 00 d2 07 00 00  |......#.........|
000000f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000110  00 00 00 00 01 00 00 00  72 02 05 00              |........r...|
0000011c
heike@heike-Satellite-C660D:~$ 

des Verzeichnis vor Receiver1

heike@heike-Satellite-C660D:~$ ls --full-time --time-style=+"am %d.%m.%y um %H:%M:%S Uhr" /media/heike/RECEIVER2/PVR/REC_0007
insgesamt 4615872
-rw-r--r-- 1 heike heike        284 am 07.02.19 um 23:01:38 Uhr META.DAT
-rw-r--r-- 1 heike heike 2147471360 am 09.12.18 um 18:23:04 Uhr REC.01
-rw-r--r-- 1 heike heike  431611904 am 09.12.18 um 18:34:36 Uhr REC.02
-rw-r--r-- 1 heike heike          4 am 07.02.19 um 23:01:38 Uhr REC.BM
-rw-r--r-- 1 heike heike          0 am 07.02.19 um 23:01:38 Uhr REC.CP
-rw-r--r-- 1 heike heike 2147471360 am 09.12.18 um 18:34:36 Uhr REC.TS
heike@heike-Satellite-C660D:~$ 

und hier die angaben zu Receiver2

hexdump -C REC_0107/META.DAT
00000000  05 00 72 6a 02 00 00 00  02 00 00 00 00 00 01 00  |..rj............|
00000010  00 00 00 00 02 44 61 73  20 45 72 73 74 65 00 00  |.....Das Erste..|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 02 41  52 44 00 00 00 00 00 00  |.......ARD......|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  ca 6d 00 00 cb 00 01 00  |.........m......|
00000060  65 00 02 01 00 00 00 00  03 00 00 00 66 00 00 00  |e...........f...|
00000070  72 65 67 01 02 00 00 00  67 00 00 00 73 69 6d 01  |reg.....g...sim.|
00000080  04 00 00 00 6a 20 00 00  72 65 67 01 11 52 00 00  |....j ..reg..R..|
00000090  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000000c0  00 00 00 00 00 00 00 00  00 00 00 00 68 20 00 00  |............h ..|
000000d0  01 00 00 00 01 00 00 00  01 00 0f 00 00 00 01 00  |................|
000000e0  0a 44 69 65 20 44 72 65  69 20 76 6f 6e 20 64 65  |.Die Drei von de|
000000f0  72 20 4d fc 6c 6c 61 62  66 75 68 72 20 2d 20 44  |r M.llabfuhr - D|
00000100  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000120  13 10 05 00 e3 07 03 1d  05 00 00 00 90 11 01 00  |................|
00000130  01 22 35 00 01 00 00 00  ff ff ff ff 00 00 00 00  |."5.............|
00000140  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000160  01 00 00 00 c8 00 05 00                           |........|
00000168

Liste:

 102   REC_0107    Das Erste                    Die Drei von der M�llabfuhr - D       date: 0000-00-00  time: 01:00 (UTC)

Verzeichnis:

ls --full-time --time-style=+"am %d.%m.%y um %H:%M:%S Uhr"
insgesamt 6583104
-rw-r--r-- 1 jochen jochen        360 am 29.03.19 um 22:51:00 Uhr META.DAT
-rw-r--r-- 1 jochen jochen 2147471360 am 29.03.19 um 22:16:34 Uhr REC.01
-rw-r--r-- 1 jochen jochen 2147471360 am 29.03.19 um 22:46:48 Uhr REC.02
-rw-r--r-- 1 jochen jochen  298586112 am 29.03.19 um 22:51:00 Uhr REC.03
-rw-r--r-- 1 jochen jochen 2147471360 am 29.03.19 um 22:51:00 Uhr REC.TS

Laut Anzeige der Receiver : 29.01. 20:26 vermute das Zeit der Dateiliste die Zeit ist beim Ende des Schreibvorganges.

Dauer 01:34:54 (am Reveiver abgelesen wird mir am Rechner amer nicht angezeigt) diese ist noch nicht mit eingearbeitet, aber jemand diese findet.

Hoffe hier kann noch mal jemand helfen.

Danke und Gruß Jochen

woko1754

Anmeldungsdatum:
12. November 2008

Beiträge: 801

Wohnort: Lübeck

Der Offset für Datum und Uhrzeit ist unterschiedlich. In der ersten Datei liegt das Datum bei 0xD8: 0xE2 0x07 also Hex 0x07E2 = 2018 dezimal.

In der zweiten Datei scheint er bei 0x124 zu liegen: 0xE3 0x07 also 0x07E3 = 2019 dezimal. Die Uhrzeit steht wohl immer vier Byte davor.

Du musst also nur den Offset entsprechend anpassen:

/* Read date */ if (fseek(fp, 0x124, SEEK_SET) == -1)

/* Read time (UTC) */ if (fseek(fp, 0x120, SEEK_SET) == -1)

Gruß Wolfram

jochenv

(Themenstarter)

Anmeldungsdatum:
23. April 2016

Beiträge: 675

Wohnort: Kurhessen

Hallo Wolfram,

woko1754 schrieb:

Der Offset für Datum und Uhrzeit ist unterschiedlich. ... Du musst also nur den Offset entsprechend anpassen:

/* Read date */ if (fseek(fp, 0x124, SEEK_SET) == -1)

/* Read time (UTC) */ if (fseek(fp, 0x120, SEEK_SET) == -1)

das sieht richtig gut aus ... morgen schauen ich mal ob evtl. die Filmlänge bei 0x130 liegt ....

Vielen Danke Gruß Jochen

Antworten |