JJ_MKVMaker/lib/ui/license_texts.dart

116 lines
5.6 KiB
Dart

import 'dart:io';
import 'package:flutter/foundation.dart' show LicenseEntryWithLineBreaks, LicenseRegistry;
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
import '../core/ai_catalog.dart';
import '../l10n/tr.dart';
import 'theme.dart';
import 'jj_title_bar.dart';
/// 62 · 63 · 64: 라이선스 원문 (assets/licenses - Windows 는 실행 파일 옆에도 같은 파일)
/// 64: 고지 문서는 플랫폼마다 (Android 에는 Windows 파일 이름 · 경로를 보이지 않게)
String get licenseNoticesAsset =>
Platform.isAndroid ? 'assets/licenses/THIRD_PARTY_NOTICES_ANDROID.txt' : 'assets/licenses/THIRD_PARTY_NOTICES.txt';
/// 앱 안 라이선스 화면 (showLicensePage) 에 넣을 것: (구성 요소들, 원문 asset). 화면을 열 때마다 모으므로 이름은 지금 화면 언어로
List<(List<String>, String)> get _licenseAssets => [
(['JJ_MKVMaker - THIRD_PARTY_NOTICES'], licenseNoticesAsset),
(
[
'FFmpeg (Windows ffmpeg.exe 9.0.2 · Android FFmpegKit n8.1.2)',
tr('yt-dlp (실행 파일 yt-dlp.exe)'),
'rsync',
'FFmpegKit (ffmpeg_kit_flutter_new_min_gpl)',
'youtubedl-android',
'H2Orestart 0.7.14',
tr('Tor (tor 실행 파일 - GPL 을 켠 빌드)'),
],
'assets/licenses/GPL-3.0.txt'
),
(['aria2'], 'assets/licenses/GPL-2.0.txt'),
(['libmpv (media_kit, LGPL-2.1+)'], 'assets/licenses/LGPL-2.1.txt'),
([tr('yt-dlp (실행 파일에 묶인 구성 요소)')], 'assets/licenses/YT-DLP_THIRD_PARTY_LICENSES.txt'),
(['rsync'], 'assets/licenses/RSYNC_COPYING.txt'),
// 86: 7-Zip 25.01 (7z · RAR 풀기 - RAR 은 풀기만, unRAR 라이선스 제한). LGPL 2.1+ · BSD 3-clause · BSD 2-clause
(['7-Zip 25.01 (7z.exe · 7z.dll)'], 'assets/licenses/7ZIP_LICENSE.txt'),
(['7-Zip 25.01 (GNU LGPL 2.1+)'], 'assets/licenses/LGPL-2.1.txt'),
(['PDFium'], 'assets/licenses/PDFIUM_LICENSES.txt'),
// 88: Android SMB - smbj (Apache-2.0) · asn-one · Bouncy Castle · SLF4J · MBassador
(['smbj 0.15.0 · asn-one · Bouncy Castle · SLF4J · MBassador (Android SMB)'], 'assets/licenses/SMBJ_LICENSES.txt'),
// X-plore 비교 5-2: 시스템 폴더 보기 (Shizuku API, MIT) - Android 판에만
if (Platform.isAndroid) (['Shizuku API 13.1.5'], 'assets/licenses/SHIZUKU_LICENSE.txt'),
// Tor 브라우저: tor 와 함께 묶인 Libevent · OpenSSL · zlib · zstd (공식 번들의 docs)
(['Tor 0.4.9.13 (Libevent · OpenSSL · zlib · Zstandard)'], 'assets/licenses/TOR_LICENSES.txt'),
// 관리자 지시 (10/20): Android 의 HWP · HWPX 보기 (libjj_rhwp.so - rhwp MIT 와 함께 묶인 Rust crate 들)
if (Platform.isAndroid) (['rhwp 0.8.7 (HWP · HWPX → PDF)'], 'assets/licenses/RHWP_LICENSES.txt'),
// 175: 함께 빌드한 네이티브 라이브러리 (Dart 쪽 패키지 라이선스와 따로)
([tr('whisper.cpp · ggml (whisper_ggml 안)')], 'assets/licenses/WHISPER_CPP_LICENSE.txt'),
(['ONNX Runtime 1.15.1 (Microsoft)'], 'assets/licenses/ONNXRUNTIME_LICENSES.txt'),
([tr('Whisper 모델 (OpenAI)')], 'assets/licenses/WHISPER_MODEL_LICENSE.txt'),
([tr('NLLB-200 번역 모델 (CC BY-NC 4.0 · 비상업적 이용만)')], nllbLicenseAsset),
];
/// main 에서 한 번: 위 원문과 AI 구성 요소 · 모델 (OpenRAIL-M 용도 제한 포함) 을 라이선스 화면에
void registerAppLicenses() {
LicenseRegistry.addLicense(() async* {
for (final (name, text, asset) in aiLicenseTexts()) {
var full = text;
if (asset != null) {
try {
full = '$text\n\n${await rootBundle.loadString(asset)}';
} catch (_) {}
}
yield LicenseEntryWithLineBreaks([name], full);
}
for (final (names, asset) in _licenseAssets) {
try {
yield LicenseEntryWithLineBreaks(names, await rootBundle.loadString(asset));
} catch (_) {}
}
});
}
/// [고지 문서]: THIRD_PARTY_NOTICES 를 앱 안에서 (Windows · Android 같은 화면)
Future<void> showNoticesDocument(BuildContext context) => showLicenseDocument(context, tr('고지 문서'), licenseNoticesAsset);
/// 라이선스 원문 한 편을 앱 안에서 (175: AI 받기 화면의 [원문])
Future<void> showLicenseDocument(BuildContext context, String title, String asset) async {
String text;
try {
text = await rootBundle.loadString(asset);
} catch (e) {
text = '$e';
}
if (!context.mounted) return;
await Navigator.of(context).push(MaterialPageRoute<void>(
builder: (ctx) => Scaffold(
appBar: jjTitleBar(ctx, title: title),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: SelectableText(text, style: const TextStyle(fontFamily: 'monospace', fontSize: 12, height: 1.4)),
),
),
));
}
/// NLLB-200 번역 모델 (처음 쓸 때 받음) 의 라이선스 원문 - CC BY-NC 4.0
const nllbLicenseAsset = 'assets/licenses/NLLB_CC_BY_NC_4.0.txt';
/// 175: NLLB 를 받는 곳 (AI 자막 · 번역 · 화면 언어 더하기) 에 "비상업적 이용만 허용" 과 [원문]
class NllbLicenseNote extends StatelessWidget {
const NllbLicenseNote({super.key});
@override
Widget build(BuildContext context) => Wrap(crossAxisAlignment: WrapCrossAlignment.center, children: [
Text(tr('번역 모델 라이선스: CC BY-NC 4.0 (비상업적 이용만 허용)'),
style: TextStyle(fontSize: 11, color: JjColors.textDim)),
TextButton(
style: TextButton.styleFrom(visualDensity: VisualDensity.compact, padding: const EdgeInsets.symmetric(horizontal: 6)),
onPressed: () => showLicenseDocument(context, 'CC BY-NC 4.0', nllbLicenseAsset),
child: Text(tr('원문')),
),
]);
}