48 lines
1.6 KiB
Dart
48 lines
1.6 KiB
Dart
import 'dart:io';
|
|
|
|
/// Gemeinsame Utility: Validiert Magic Bytes von Audiodateien.
|
|
/// Prüft MP3 (ID3v2 + MPEG-Frames), M4A/AAC, FLAC, WAV, OGG.
|
|
///
|
|
/// Prüft die Magic Bytes einer Audiodatei.
|
|
/// MP3: ID3-Tag (49 44 33) oder MPEG-Frame (FF FB, FF FA, FF F3, FF F2)
|
|
/// M4A/AAC: ftyp-Box (66 74 79 70)
|
|
/// FLAC: fLaC (66 4C 61 43)
|
|
/// WAV: RIFF (52 49 46 46)
|
|
/// OGG: OggS (4F 67 67 53)
|
|
bool hatValideMagicBytes(File file) {
|
|
try {
|
|
if (!file.existsSync()) return false;
|
|
final bytes = file.readAsBytesSync().take(16).toList();
|
|
if (bytes.length < 4) return false;
|
|
|
|
// ID3v2 Tag (MP3 mit Metadaten) — Bytes: 49 44 33
|
|
if (bytes[0] == 0x49 && bytes[1] == 0x44 && bytes[2] == 0x33) return true;
|
|
|
|
// MP3 ohne ID3: MPEG Audio Frame Sync (FF FB, FF FA, FF F3, FF F2)
|
|
if (bytes[0] == 0xFF && (bytes[1] & 0xFE) == 0xFA) return true; // MPEG v1
|
|
if (bytes[0] == 0xFF && bytes[1] == 0xF3) return true; // MPEG v2 / v2.5
|
|
if (bytes[0] == 0xFF && bytes[1] == 0xF2) return true; // MPEG v2 / v2.5
|
|
|
|
// M4A/AAC: ftyp-Box
|
|
if (bytes.length >= 8 &&
|
|
bytes[4] == 0x66 && bytes[5] == 0x74 &&
|
|
bytes[6] == 0x79 && bytes[7] == 0x70) return true;
|
|
|
|
// FLAC: fLaC
|
|
if (bytes[0] == 0x66 && bytes[1] == 0x4C &&
|
|
bytes[2] == 0x61 && bytes[3] == 0x43) { return true; }
|
|
|
|
// WAV: RIFF
|
|
if (bytes[0] == 0x52 && bytes[1] == 0x49 &&
|
|
bytes[2] == 0x46 && bytes[3] == 0x46) { return true; }
|
|
|
|
// OGG: OggS
|
|
if (bytes[0] == 0x4F && bytes[1] == 0x67 &&
|
|
bytes[2] == 0x67 && bytes[3] == 0x53) { return true; }
|
|
|
|
return false;
|
|
} catch (_) {
|
|
return false;
|
|
}
|
|
}
|