Showing preview only (2,092K chars total). Download the full file or copy to clipboard to get everything.
Repository: Predidit/Kazumi
Branch: main
Commit: 177e3c9894ea
Files: 339
Total size: 1.9 MB
Directory structure:
gitextract_7r81mo3e/
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug.yml
│ │ └── other.yml
│ └── workflows/
│ ├── pr.yaml
│ └── release.yaml
├── .gitignore
├── .gitmodules
├── .metadata
├── .vscode/
│ └── settings.json
├── LICENSE
├── README.md
├── analysis_options.yaml
├── android/
│ ├── .gitignore
│ ├── app/
│ │ ├── build.gradle
│ │ └── src/
│ │ ├── debug/
│ │ │ └── AndroidManifest.xml
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin/
│ │ │ │ └── com/
│ │ │ │ └── example/
│ │ │ │ └── kazumi/
│ │ │ │ └── MainActivity.kt
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ └── launch_background.xml
│ │ │ ├── drawable-v21/
│ │ │ │ └── launch_background.xml
│ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ └── ic_launcher.xml
│ │ │ ├── values/
│ │ │ │ ├── colors.xml
│ │ │ │ └── styles.xml
│ │ │ └── values-night/
│ │ │ └── styles.xml
│ │ └── profile/
│ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle/
│ │ └── wrapper/
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ └── settings.gradle
├── assets/
│ ├── bbcode/
│ │ └── BBCode.g4
│ ├── linux/
│ │ ├── DEBIAN/
│ │ │ ├── postinst
│ │ │ └── postrm
│ │ └── io.github.Predidit.Kazumi.desktop
│ ├── plugins/
│ │ ├── 7sefun.json
│ │ ├── AGE.json
│ │ └── DM84.json
│ ├── shaders/
│ │ ├── Anime4K_AutoDownscalePre_x2.glsl
│ │ ├── Anime4K_AutoDownscalePre_x4.glsl
│ │ ├── Anime4K_Clamp_Highlights.glsl
│ │ ├── Anime4K_Restore_CNN_M.glsl
│ │ ├── Anime4K_Restore_CNN_S.glsl
│ │ ├── Anime4K_Restore_CNN_VL.glsl
│ │ ├── Anime4K_Upscale_CNN_x2_M.glsl
│ │ ├── Anime4K_Upscale_CNN_x2_S.glsl
│ │ ├── Anime4K_Upscale_CNN_x2_VL.glsl
│ │ └── LICENSE
│ └── statements/
│ └── statements.txt
├── devtools_options.yaml
├── fastlane/
│ └── metadata/
│ └── android/
│ ├── en-US/
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ └── zh-CN/
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
├── ios/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── AppFrameworkInfo.plist
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── Podfile
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── LaunchBackground.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── LaunchImage.imageset/
│ │ │ ├── Contents.json
│ │ │ └── README.md
│ │ ├── Base.lproj/
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ └── Runner-Bridging-Header.h
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ ├── Runner.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── WorkspaceSettings.xcsettings
│ └── RunnerTests/
│ └── RunnerTests.swift
├── lib/
│ ├── app_module.dart
│ ├── app_widget.dart
│ ├── bbcode/
│ │ ├── README.md
│ │ ├── bbcode_base_listener.dart
│ │ ├── bbcode_elements.dart
│ │ ├── bbcode_widget.dart
│ │ └── generated/
│ │ ├── BBCode.tokens
│ │ ├── BBCodeLexer.dart
│ │ ├── BBCodeListener.dart
│ │ └── BBCodeParser.dart
│ ├── bean/
│ │ ├── appbar/
│ │ │ ├── drag_to_move_bar.dart
│ │ │ ├── safe_mediaquery_warpper.dart
│ │ │ └── sys_app_bar.dart
│ │ ├── card/
│ │ │ ├── bangumi_card.dart
│ │ │ ├── bangumi_history_card.dart
│ │ │ ├── bangumi_info_card.dart
│ │ │ ├── bangumi_timeline_card.dart
│ │ │ ├── character_card.dart
│ │ │ ├── character_comments_card.dart
│ │ │ ├── comments_card.dart
│ │ │ ├── episode_comments_card.dart
│ │ │ ├── network_img_layer.dart
│ │ │ ├── palette_card.dart
│ │ │ └── staff_card.dart
│ │ ├── dialog/
│ │ │ └── dialog_helper.dart
│ │ ├── settings/
│ │ │ ├── color_type.dart
│ │ │ └── theme_provider.dart
│ │ └── widget/
│ │ ├── collect_button.dart
│ │ ├── custom_dropdown_menu.dart
│ │ ├── embedded_native_control_area.dart
│ │ ├── error_widget.dart
│ │ └── scrollable_wrapper.dart
│ ├── hive_registrar.g.dart
│ ├── main.dart
│ ├── modules/
│ │ ├── bangumi/
│ │ │ ├── bangumi_item.dart
│ │ │ ├── bangumi_item.g.dart
│ │ │ ├── bangumi_tag.dart
│ │ │ ├── bangumi_tag.g.dart
│ │ │ ├── episode_item.dart
│ │ │ └── weekday_item.dart
│ │ ├── character/
│ │ │ └── character_full_item.dart
│ │ ├── characters/
│ │ │ ├── actor_item.dart
│ │ │ ├── character_item.dart
│ │ │ └── characters_response.dart
│ │ ├── collect/
│ │ │ ├── collect_change_module.dart
│ │ │ ├── collect_change_module.g.dart
│ │ │ ├── collect_module.dart
│ │ │ ├── collect_module.g.dart
│ │ │ └── collect_type.dart
│ │ ├── comments/
│ │ │ ├── comment_item.dart
│ │ │ └── comment_response.dart
│ │ ├── danmaku/
│ │ │ ├── danmaku_episode_response.dart
│ │ │ ├── danmaku_module.dart
│ │ │ └── danmaku_search_response.dart
│ │ ├── download/
│ │ │ ├── download_module.dart
│ │ │ └── download_module.g.dart
│ │ ├── history/
│ │ │ ├── history_module.dart
│ │ │ └── history_module.g.dart
│ │ ├── plugin/
│ │ │ └── plugin_http_module.dart
│ │ ├── roads/
│ │ │ └── road_module.dart
│ │ ├── search/
│ │ │ ├── plugin_search_module.dart
│ │ │ ├── search_history_module.dart
│ │ │ └── search_history_module.g.dart
│ │ └── staff/
│ │ ├── staff_item.dart
│ │ └── staff_response.dart
│ ├── pages/
│ │ ├── about/
│ │ │ ├── about_module.dart
│ │ │ └── about_page.dart
│ │ ├── collect/
│ │ │ ├── collect_controller.dart
│ │ │ ├── collect_controller.g.dart
│ │ │ ├── collect_module.dart
│ │ │ └── collect_page.dart
│ │ ├── download/
│ │ │ ├── download_controller.dart
│ │ │ ├── download_controller.g.dart
│ │ │ ├── download_episode_sheet.dart
│ │ │ ├── download_page.dart
│ │ │ └── download_page_module.dart
│ │ ├── error/
│ │ │ └── storage_error_page.dart
│ │ ├── history/
│ │ │ ├── history_controller.dart
│ │ │ ├── history_controller.g.dart
│ │ │ ├── history_module.dart
│ │ │ └── history_page.dart
│ │ ├── index_module.dart
│ │ ├── index_page.dart
│ │ ├── info/
│ │ │ ├── character_page.dart
│ │ │ ├── info_controller.dart
│ │ │ ├── info_controller.g.dart
│ │ │ ├── info_module.dart
│ │ │ ├── info_page.dart
│ │ │ ├── info_tabview.dart
│ │ │ └── source_sheet.dart
│ │ ├── init_page.dart
│ │ ├── logs/
│ │ │ └── logs_page.dart
│ │ ├── menu/
│ │ │ └── menu.dart
│ │ ├── my/
│ │ │ ├── my_controller.dart
│ │ │ ├── my_controller.g.dart
│ │ │ ├── my_module.dart
│ │ │ └── my_page.dart
│ │ ├── player/
│ │ │ ├── episode_comments_sheet.dart
│ │ │ ├── player_controller.dart
│ │ │ ├── player_controller.g.dart
│ │ │ ├── player_item.dart
│ │ │ ├── player_item_panel.dart
│ │ │ ├── player_item_surface.dart
│ │ │ └── smallest_player_item_panel.dart
│ │ ├── plugin_editor/
│ │ │ ├── plugin_editor_page.dart
│ │ │ ├── plugin_module.dart
│ │ │ ├── plugin_shop_page.dart
│ │ │ ├── plugin_test_page.dart
│ │ │ └── plugin_view_page.dart
│ │ ├── popular/
│ │ │ ├── popular_controller.dart
│ │ │ ├── popular_controller.g.dart
│ │ │ ├── popular_module.dart
│ │ │ └── popular_page.dart
│ │ ├── router.dart
│ │ ├── search/
│ │ │ ├── search_controller.dart
│ │ │ ├── search_controller.g.dart
│ │ │ ├── search_module.dart
│ │ │ └── search_page.dart
│ │ ├── settings/
│ │ │ ├── danmaku/
│ │ │ │ ├── danmaku_module.dart
│ │ │ │ ├── danmaku_settings.dart
│ │ │ │ ├── danmaku_settings_sheet.dart
│ │ │ │ └── danmaku_shield_settings.dart
│ │ │ ├── decoder_settings.dart
│ │ │ ├── displaymode_settings.dart
│ │ │ ├── download_settings.dart
│ │ │ ├── interface_settings.dart
│ │ │ ├── keyboard_settings.dart
│ │ │ ├── player_settings.dart
│ │ │ ├── proxy/
│ │ │ │ ├── proxy_editor_page.dart
│ │ │ │ ├── proxy_module.dart
│ │ │ │ └── proxy_settings_page.dart
│ │ │ ├── renderer_settings.dart
│ │ │ ├── settings_module.dart
│ │ │ ├── super_resolution_settings.dart
│ │ │ └── theme_settings_page.dart
│ │ ├── timeline/
│ │ │ ├── timeline_controller.dart
│ │ │ ├── timeline_controller.g.dart
│ │ │ ├── timeline_module.dart
│ │ │ └── timeline_page.dart
│ │ ├── video/
│ │ │ ├── video_controller.dart
│ │ │ ├── video_controller.g.dart
│ │ │ ├── video_module.dart
│ │ │ └── video_page.dart
│ │ └── webdav_editor/
│ │ ├── webdav_editor_page.dart
│ │ ├── webdav_module.dart
│ │ └── webdav_setting.dart
│ ├── plugins/
│ │ ├── anti_crawler_config.dart
│ │ ├── plugin_cookie_manager.dart
│ │ ├── plugin_install_time_tracker.dart
│ │ ├── plugin_validity_tracker.dart
│ │ ├── plugins.dart
│ │ ├── plugins_controller.dart
│ │ └── plugins_controller.g.dart
│ ├── providers/
│ │ ├── captcha/
│ │ │ └── captcha_provider.dart
│ │ └── video/
│ │ ├── providers.dart
│ │ ├── video_source_provider.dart
│ │ └── webview_video_source_provider.dart
│ ├── repositories/
│ │ ├── collect_crud_repository.dart
│ │ ├── collect_repository.dart
│ │ ├── download_repository.dart
│ │ ├── history_repository.dart
│ │ └── search_history_repository.dart
│ ├── request/
│ │ ├── api.dart
│ │ ├── bangumi.dart
│ │ ├── damaku.dart
│ │ ├── interceptor.dart
│ │ ├── plugin.dart
│ │ ├── query_manager.dart
│ │ └── request.dart
│ ├── shaders/
│ │ ├── shaders_controller.dart
│ │ └── shaders_controller.g.dart
│ ├── utils/
│ │ ├── anime_season.dart
│ │ ├── auto_updater.dart
│ │ ├── background_download_service.dart
│ │ ├── constants.dart
│ │ ├── download_manager.dart
│ │ ├── extension.dart
│ │ ├── external_player.dart
│ │ ├── format_utils.dart
│ │ ├── logger.dart
│ │ ├── m3u8_ad_filter.dart
│ │ ├── m3u8_parser.dart
│ │ ├── mortis.dart
│ │ ├── proxy_manager.dart
│ │ ├── proxy_utils.dart
│ │ ├── remote.dart
│ │ ├── search_parser.dart
│ │ ├── storage.dart
│ │ ├── string_match.dart
│ │ ├── syncplay.dart
│ │ ├── syncplay_endpoint.dart
│ │ ├── timed_shutdown_service.dart
│ │ ├── utils.dart
│ │ └── webdav.dart
│ └── webview/
│ ├── captcha/
│ │ ├── captcha_webview_controller.dart
│ │ └── impl/
│ │ ├── captcha_webview_inappwebview_impl.dart
│ │ ├── captcha_webview_linux_impl.dart
│ │ └── captcha_webview_windows_impl.dart
│ └── video/
│ ├── impl/
│ │ ├── video_webview_android_impl.dart
│ │ ├── video_webview_apple_impl.dart
│ │ ├── video_webview_impl.dart
│ │ ├── video_webview_linux_impl.dart
│ │ └── video_webview_windows_impl.dart
│ └── video_webview_controller.dart
├── linux/
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── flutter/
│ │ ├── CMakeLists.txt
│ │ ├── generated_plugin_registrant.cc
│ │ ├── generated_plugin_registrant.h
│ │ └── generated_plugins.cmake
│ ├── main.cc
│ ├── my_application.cc
│ └── my_application.h
├── macos/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── Flutter-Debug.xcconfig
│ │ ├── Flutter-Release.xcconfig
│ │ └── GeneratedPluginRegistrant.swift
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ └── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── MainMenu.xib
│ │ ├── Configs/
│ │ │ ├── AppInfo.xcconfig
│ │ │ ├── Debug.xcconfig
│ │ │ ├── Release.xcconfig
│ │ │ └── Warnings.xcconfig
│ │ ├── DebugProfile.entitlements
│ │ ├── Info.plist
│ │ ├── MainFlutterWindow.swift
│ │ ├── Release.entitlements
│ │ ├── en-GB.lproj/
│ │ │ └── MainMenu.strings
│ │ ├── en.lproj/
│ │ │ └── MainMenu.strings
│ │ └── zh-Hans.lproj/
│ │ └── MainMenu.strings
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ ├── Runner.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── RunnerTests/
│ └── RunnerTests.swift
├── pubspec.yaml
├── test/
│ ├── m3u8_parser_test.dart
│ └── widget_test.dart
├── web/
│ ├── index.html
│ └── manifest.json
└── windows/
├── .gitignore
├── CMakeLists.txt
├── flutter/
│ ├── CMakeLists.txt
│ ├── generated_plugin_registrant.cc
│ ├── generated_plugin_registrant.h
│ └── generated_plugins.cmake
└── runner/
├── CMakeLists.txt
├── Runner.rc
├── external_player_utils.cpp
├── external_player_utils.h
├── flutter_window.cpp
├── flutter_window.h
├── fullscreen_utils.cpp
├── fullscreen_utils.h
├── main.cpp
├── resource.h
├── runner.exe.manifest
├── utils.cpp
├── utils.h
├── win32_window.cpp
└── win32_window.h
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
# Set default behavior to automatically normalize line endings
* text=auto
# Explicitly declare text files you want to always be normalized and converted to native line endings on checkout
*.dart text eol=lf
*.yaml text eol=lf
*.yml text eol=lf
*.json text eol=lf
*.xml text eol=lf
*.html text eol=lf
*.css text eol=lf
*.js text eol=lf
*.md text eol=lf
*.txt text eol=lf
*.sh text eol=lf
*.gradle text eol=lf
*.properties text eol=lf
# Source code files (C/C++/Objective-C/Swift)
*.c text eol=lf
*.cc text eol=lf
*.cpp text eol=lf
*.h text eol=lf
*.hpp text eol=lf
*.m text eol=lf
*.mm text eol=lf
*.swift text eol=lf
# CMake files
*.cmake text eol=lf
CMakeLists.txt text eol=lf
# Generated files should always use LF (Flutter generates these)
**/generated_plugin_registrant.* text eol=lf
**/generated_plugins.cmake text eol=lf
**/GeneratedPluginRegistrant.* text eol=lf
# Windows-specific files use CRLF
*.bat text eol=crlf
*.cmd text eol=crlf
*.ps1 text eol=crlf
# Visual Studio files
*.sln text eol=crlf
*.vcxproj text eol=crlf
*.vcxproj.filters text eol=crlf
# Denote all files that are truly binary and should not be modified
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.ico binary
*.ttf binary
*.otf binary
*.eot binary
*.woff binary
*.woff2 binary
*.so binary
*.dylib binary
*.dll binary
*.exe binary
*.jar binary
*.aar binary
*.apk binary
*.aab binary
*.zip binary
*.tar binary
*.gz binary
================================================
FILE: .github/ISSUE_TEMPLATE/bug.yml
================================================
name: Bug 反馈
description: 提交一个 Bug 反馈。
title: "[Bug]: "
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
请详细填写以下内容~
- type: textarea
id: buginfo
attributes:
label: 在使用的时候发生了什么 Bug ?
description: 并且,还请写出您是如何触发这个 Bug 的。
validations:
required: true
- type: dropdown
id: os
attributes:
label: 您在使用哪个操作系统?
multiple: false
options:
- Android
- Windows
- macOS / iOS
- Linux
validations:
required: true
- type: textarea
id: osver
attributes:
label: 请具体提供设备、版本号等信息。
description: 例如,“Redmi K40S,Android 13”、“Windows 10 22H2” 等。
validations:
required: true
- type: textarea
id: hardware
attributes:
label: (选填)一些与 Bug 相关的硬件信息。
description: (选填)例如,有视频播放问题,可以填写“显卡型号”、“显卡驱动版本”等。
- type: textarea
id: logs
attributes:
label: 日志信息
description: 请在 “我的 - 关于 - 错误日志” 界面复制错误日志,并粘贴在这里。
value: |
<details open><summary>Log</summary>
```shell
[在此处粘贴你的日志]
```
</details>
validations:
required: true
- type: checkboxes
id: terms
attributes:
label: 提交前确认
description: 在提交前,请确认以下内容
options:
- label: issue 列表中,没有我发现的这个 Bug
required: true
- label: 我正在使用最新版本的 Kazumi
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/other.yml
================================================
name: 其他 issue
description: 新功能需求、问题询问等
body:
- type: markdown
attributes:
value: |
请详细填写以下内容~
- type: textarea
id: buginfo
attributes:
label: issue 内容
description: 请填写您的 issue 内容。要添加附件,请点击输入框后,直接将附件拖进输入框。
validations:
required: true
- type: checkboxes
id: terms
attributes:
label: 提交前确认
description: 在提交前,请确认以下内容
options:
- label: issue 列表中,没有我的新功能需求 / 问题
required: true
================================================
FILE: .github/workflows/pr.yaml
================================================
---
name: "PR workflow"
on:
pull_request:
types:
- opened
- synchronize
- reopened
- ready_for_review
paths-ignore:
- 'static/**'
- '**.md'
- '.gitignore'
- '.github/ISSUE_TEMPLATE/**'
- 'fastlane/**'
workflow_dispatch:
inputs:
logLevel:
description: 'Log level'
required: true
default: 'warning'
signpath_sign:
description: 'sign binary by signpath'
required: false
default: false
type: boolean
run_android:
description: 'manually run android build'
required: false
default: false
type: boolean
run_windows:
description: 'manually run windows build'
required: false
default: false
type: boolean
run_ios:
description: 'manually run ios build'
required: false
default: false
type: boolean
run_macos:
description: 'manually run macos build'
required: false
default: false
type: boolean
run_linux:
description: 'manually run linux build'
required: false
default: false
type: boolean
jobs:
changes:
if: ${{ ! github.event.pull_request.draft }}
runs-on: "ubuntu-latest"
permissions:
pull-requests: read
outputs:
android: ${{ steps.filter.outputs.android }}
windows: ${{ steps.filter.outputs.windows }}
ios: ${{ steps.filter.outputs.ios }}
macos: ${{ steps.filter.outputs.macos }}
linux: ${{ steps.filter.outputs.linux }}
all: ${{ steps.filter.outputs.all }}
steps:
- uses: actions/checkout@v4
- uses: dorny/paths-filter@v3
id: filter
with:
predicate-quantifier: 'every'
filters: |
android:
- 'android/**'
windows:
- 'windows/**'
ios:
- 'ios/**'
macos:
- 'macos/**'
linux:
- 'linux/**'
all:
- '!android/**'
- '!windows/**'
- '!ios/**'
- '!macos/**'
- '!linux/**'
flutter-build-android:
needs: changes
if: ${{ github.event.inputs.run_android || (! github.event.pull_request.draft && (needs.changes.outputs.android || needs.changes.outputs.all)) }}
name: "Release for android"
runs-on: "ubuntu-latest"
permissions: write-all
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y clang cmake libgtk-3-dev ninja-build libayatana-appindicator3-dev libasound2-dev
shell: bash
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Set up Flutter
uses: subosito/flutter-action@v2.16.0
with:
channel: stable
flutter-version-file: pubspec.yaml
- name: Get Flutter dependencies
run: flutter pub get
shell: bash
- name: Print Flutter version
run: flutter doctor -v
shell: bash
- name: Build Flutter for Android
run: flutter build apk --split-per-abi
shell: bash
- name: Package android build output
run: cp build/app/outputs/flutter-apk/app-arm64-v8a-release.apk Kazumi_android_canary.apk
shell: bash
- name: Upload android outputs
uses: actions/upload-artifact@v4
with:
name: android_outputs
path: Kazumi_android_*.apk
flutter-build-windows:
needs: changes
if: ${{ github.event.inputs.run_windows || (! github.event.pull_request.draft && (needs.changes.outputs.windows || needs.changes.outputs.all)) }}
name: "Release for windows"
runs-on: "windows-latest"
permissions: write-all
steps:
- name: Clone repository
uses: actions/checkout@v4
- run: choco install yq
- name: Enable Git longpaths
run: git config --system core.longpaths true
- name: Set up Flutter
uses: subosito/flutter-action@v2.16.0
with:
channel: stable
flutter-version-file: pubspec.yaml
- name: Set up Java
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '18'
- run: flutter pub get
- run: flutter build windows
- run: Compress-Archive build/windows/x64/runner/Release/* Kazumi_windows_canary.zip
- name: Upload windows outputs
id: unsigned-windows-packet-artifacts
uses: actions/upload-artifact@v4
with:
name: windows_outputs
path: |
Kazumi_windows_*.zip
# - name: Build unsigned msix
# run: dart run msix:create
# - name: Upload windows msix ouputs
# uses: actions/upload-artifact@v4
# id: unsigned-windows-msix-artifacts
# with:
# name: windows_msix_outputs
# path: |
# build/windows/x64/runner/Release/kazumi.msix
# - run: New-Item -Path "build/windows/msix_signed_output" -ItemType Directory
# - name: sign windows msix
# if: ${{ github.event.inputs.signpath_sign == 'true'}}
# uses: signpath/github-action-submit-signing-request@v1
# with:
# api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
# organization-id: 'fa047255-4772-4be1-b14f-5cfa62635877'
# project-slug: 'Kazumi'
# signing-policy-slug: 'test-signing'
# artifact-configuration-slug: 'MSIX'
# github-artifact-id: '${{ steps.unsigned-windows-msix-artifacts.outputs.artifact-id }}'
# wait-for-completion: true
# output-artifact-directory: 'build/windows/msix_signed_output'
# - name: Upload windows msix signed ouputs
# if: ${{ github.event.inputs.signpath_sign == 'true'}}
# uses: actions/upload-artifact@v4
# id: signed-windows-msix-artifacts
# with:
# name: windows_msix_signed_outputs
# path: build/windows/msix_signed_output/*.msix
flutter-build-ios:
needs: changes
if: ${{ github.event.inputs.run_ios || (! github.event.pull_request.draft && (needs.changes.outputs.ios || needs.changes.outputs.all)) }}
name: "Release for iOS"
runs-on: "macos-latest"
permissions: write-all
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Set up Flutter
uses: subosito/flutter-action@v2.16.0
with:
channel: stable
flutter-version-file: pubspec.yaml
- run: flutter pub get
- name: Build IPA
run: |
flutter build ios --release --no-codesign
- name: Create IPA
run: |
mkdir Payload
cp -R build/ios/iphoneos/Runner.app Payload/Runner.app
find Payload/Runner.app/Frameworks -type d -name "*.framework" -exec codesign --force --sign - --preserve-metadata=identifier,entitlements {} \;
zip -q -r Kazumi_ios_canary_no_sign.ipa Payload
- name: Upload iOS build
uses: actions/upload-artifact@v4
with:
name: ios_outputs
path: Kazumi_ios_*.ipa
flutter-build-macos:
needs: changes
if: ${{ github.event.inputs.run_macos || (! github.event.pull_request.draft && (needs.changes.outputs.macos || needs.changes.outputs.all)) }}
name: "Release for Macos"
runs-on: "macos-latest"
permissions: write-all
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Set up Flutter
uses: subosito/flutter-action@v2.16.0
with:
channel: stable
flutter-version-file: pubspec.yaml
- run: flutter pub get
- run: flutter build macos --release
- name: Create DMG
run: |
npm install --global create-dmg
create-dmg build/macos/Build/Products/Release/Kazumi.app
continue-on-error: true
- name: Rename DMG
run: mv Kazumi*.dmg Kazumi_macos_canary.dmg
- name: Upload MacOS build
uses: actions/upload-artifact@v4
with:
name: macos_outputs
path: Kazumi_macos_*.dmg
flutter-build-linux:
needs: changes
if: ${{ github.event.inputs.run_linux || (! github.event.pull_request.draft && (needs.changes.outputs.linux || needs.changes.outputs.all)) }}
name: "Release for Linux"
runs-on: "ubuntu-latest"
permissions: write-all
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y clang cmake libgtk-3-dev ninja-build libayatana-appindicator3-dev unzip webkit2gtk-4.1 libasound2-dev
sudo apt-get install -y gcc g++ autoconf automake debhelper glslang-dev ladspa-sdk xutils-dev libasound2-dev \
libarchive-dev libbluray-dev libbs2b-dev libcaca-dev libcdio-paranoia-dev libdrm-dev \
libdav1d-dev libdvdnav-dev libegl1-mesa-dev libepoxy-dev libfontconfig-dev libfreetype6-dev \
libfribidi-dev libgl1-mesa-dev libgbm-dev libgme-dev libgsm1-dev libharfbuzz-dev libjpeg-dev \
libbrotli-dev liblcms2-dev libmodplug-dev libmp3lame-dev libopenal-dev \
libopus-dev libopencore-amrnb-dev libopencore-amrwb-dev libpulse-dev librtmp-dev \
libsdl2-dev libsixel-dev libssh-dev libsoxr-dev libspeex-dev libtool \
libv4l-dev libva-dev libvdpau-dev libvorbis-dev libvo-amrwbenc-dev \
libunwind-dev libvpx-dev libwayland-dev libx11-dev libxext-dev \
libxkbcommon-dev libxrandr-dev libxss-dev libxv-dev libxvidcore-dev \
linux-libc-dev nasm ninja-build pkg-config python3 python3-docutils wayland-protocols \
x11proto-core-dev zlib1g-dev libfdk-aac-dev libtheora-dev libwebp-dev \
unixodbc-dev libpq-dev libxxhash-dev libaom-dev
shell: bash
- name: Set up Flutter
uses: subosito/flutter-action@v2.16.0
with:
channel: stable
flutter-version-file: pubspec.yaml
- name: Get Flutter dependencies
run: flutter pub get
shell: bash
- name: Build Flutter for Linux
run: flutter build linux
shell: bash
# - name: Download FFmpeg Assets
# uses: dsaltares/fetch-gh-release-asset@master
# with:
# repo: 'Predidit/avbuild'
# version: 'tags/1.1.0'
# file: 'ffmpeg_linux_amd64.zip'
# token: ${{ secrets.GITHUB_TOKEN }}
# - run: rm -f build/linux/x64/release/bundle/lib/libffmpeg.so.7
# - run: unzip ffmpeg_linux_amd64.zip -d build/linux/x64/release/bundle/lib
- name: Package linux build output
run: |
# Tarball package
tar -zcvf Kazumi_linux_canary.tar.gz -C build/linux/x64/release/bundle .
# Debian package
mkdir Kazumi_linux_canary_amd64
cd Kazumi_linux_canary_amd64
mkdir -p opt/Kazumi
mkdir -p usr/share/applications
mkdir -p usr/share/icons/hicolor/512x512/apps
cp -r ../build/linux/x64/release/bundle/* opt/Kazumi
cp -r ../assets/linux/DEBIAN .
chmod 0755 DEBIAN/postinst
chmod 0755 DEBIAN/postrm
cat>DEBIAN/control<<EOF
Maintainer: madoka773 <valigarmanda55@gmail.com>
Package: Kazumi
Version: 0.0.1
Section: x11
Priority: optional
Architecture: amd64
Essential: no
Installed-Size: 34648
Description: Watch Animes online with danmaku support.
Homepage: https://github.com/Predidit/Kazumi
Depends: libayatana-appindicator3-1,
gir1.2-ayatanaappindicator3-0.1,
libwebkit2gtk-4.1-0
EOF
cp ../assets/linux/io.github.Predidit.Kazumi.desktop usr/share/applications
cp ../assets/images/logo/logo_linux.png usr/share/icons/hicolor/512x512/apps/io.github.Predidit.Kazumi.png
cd ..
dpkg-deb --build --root-owner-group Kazumi_linux_canary_amd64
shell: bash
- name: Upload linux outputs
uses: actions/upload-artifact@v4
with:
name: linux_outputs
path: |
Kazumi_linux_*.tar.gz
Kazumi_linux_*.deb
================================================
FILE: .github/workflows/release.yaml
================================================
---
name: "release"
on:
push:
tags:
- "*"
workflow_dispatch:
inputs:
logLevel:
description: 'Log level'
required: true
default: 'warning'
jobs:
flutter-build-android:
name: "Release for android"
runs-on: "ubuntu-latest"
permissions: write-all
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Extract tag name
run: echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
shell: bash
- name: Echo build progress
run: echo "Kazumi_android_${{ env.tag }}.apk build progress"
shell: bash
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y clang cmake libgtk-3-dev ninja-build libayatana-appindicator3-dev libasound2-dev
shell: bash
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Set up Flutter
uses: subosito/flutter-action@v2.16.0
with:
channel: stable
flutter-version-file: pubspec.yaml
- name: Get Flutter dependencies
run: flutter pub get
shell: bash
- name: Inject DanDan API Credentials
run: |
sed -i "s/kvpx7qkqjh/${{ secrets.DANDANAPI_APPID }}/g" lib/utils/mortis.dart
sed -i "s/rABUaBLqdz7aCSi3fe88ZDj2gwga9Vax/${{ secrets.DANDANAPI_KEY }}/g" lib/utils/mortis.dart
- name: Build Flutter for Android
run: flutter build apk --split-per-abi
shell: bash
- name: Package android build output
run: cp build/app/outputs/flutter-apk/app-arm64-v8a-release.apk Kazumi_android_${env:tag}.apk
shell: bash
- name: Upload android outputs
uses: actions/upload-artifact@v4
with:
name: android_outputs
path: Kazumi_android_*.apk
flutter-build-windows:
name: "Release for windows"
runs-on: "windows-latest"
needs: [flutter-build-android, flutter-build-ios, flutter-build-linux, flutter-build-macos]
permissions: write-all
steps:
- name: Clone repository
uses: actions/checkout@v4
- run: |
$tag = "${{ github.ref }}".Replace('refs/tags/', '')
echo "tag=$(echo $tag)" >> $env:GITHUB_ENV
- run: echo "Kazumi_windows_${env:tag}.zip build progress"
- run: choco install yq
- name: Enable Git longpaths
run: git config --system core.longpaths true
- name: Set up Flutter
uses: subosito/flutter-action@v2.16.0
with:
channel: stable
flutter-version-file: pubspec.yaml
- name: Set up Java
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '18'
- run: flutter pub get
- name: Inject DanDan API Credentials
env:
DANDANAPI_APPID: ${{ secrets.DANDANAPI_APPID }}
DANDANAPI_KEY: ${{ secrets.DANDANAPI_KEY }}
run: |
(Get-Content -Path 'lib/utils/mortis.dart') -replace "kvpx7qkqjh", "$env:DANDANAPI_APPID" | Set-Content -Path 'lib/utils/mortis.dart'
(Get-Content -Path 'lib/utils/mortis.dart') -replace "rABUaBLqdz7aCSi3fe88ZDj2gwga9Vax", "$env:DANDANAPI_KEY" | Set-Content -Path 'lib/utils/mortis.dart'
- run: flutter build windows
- run: Compress-Archive build/windows/x64/runner/Release/* Kazumi_windows_${env:tag}.zip
- name: Upload windows outputs
uses: actions/upload-artifact@v4
id: unsigned-windows-zip-artifacts
with:
name: windows_outputs
path: |
Kazumi_windows_*.zip
# Sign Zip
- run: New-Item -Path "build/windows/zip_signed_output" -ItemType Directory
- name: sign windows zip
uses: signpath/github-action-submit-signing-request@v1.1
with:
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
organization-id: 'fa047255-4772-4be1-b14f-5cfa62635877'
project-slug: 'Kazumi'
signing-policy-slug: 'release-signing'
artifact-configuration-slug: 'Packet'
github-artifact-id: '${{ steps.unsigned-windows-zip-artifacts.outputs.artifact-id }}'
wait-for-completion: true
output-artifact-directory: 'build/windows/zip_signed_output'
- name: Upload windows zip signed ouputs
uses: actions/upload-artifact@v4
id: signed-windows-zip-artifacts
with:
name: windows_zip_signed_outputs
path: build/windows/zip_signed_output/*.zip
# Replace Unpacked Artifact with Signed Artifact
- name: Replace Unpacked Artifact with Signed Artifact
run: Expand-Archive -Path "build/windows/zip_signed_output/Kazumi_windows_${env:tag}.zip" -DestinationPath "build/windows/x64/runner/Release" -Force
# Build Unsigned MSIX
- name: Build unsigned msix
run: dart run msix:create
- name: Upload windows msix ouputs
uses: actions/upload-artifact@v4
id: unsigned-windows-msix-artifacts
with:
name: windows_msix_outputs
path: |
build/windows/x64/runner/Release/kazumi.msix
# Sign MSIX
- run: New-Item -Path "build/windows/msix_signed_output" -ItemType Directory
- name: sign windows msix
uses: signpath/github-action-submit-signing-request@v1.1
with:
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
organization-id: 'fa047255-4772-4be1-b14f-5cfa62635877'
project-slug: 'Kazumi'
signing-policy-slug: 'release-signing'
artifact-configuration-slug: 'MSIX'
github-artifact-id: '${{ steps.unsigned-windows-msix-artifacts.outputs.artifact-id }}'
wait-for-completion: true
output-artifact-directory: 'build/windows/msix_signed_output'
- name: Upload windows msix signed ouputs
uses: actions/upload-artifact@v4
id: signed-windows-msix-artifacts
with:
name: windows_msix_signed_outputs
path: build/windows/msix_signed_output/*.msix
flutter-build-linux:
name: "Release for Linux"
runs-on: "ubuntu-latest"
permissions: write-all
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Extract tag name
run: echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
shell: bash
- name: Echo build progress
run: echo "Kazumi_linux_${{ env.tag }}.tar.gz build progress"
shell: bash
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y clang cmake libgtk-3-dev ninja-build libayatana-appindicator3-dev unzip webkit2gtk-4.1 libasound2-dev
sudo apt-get install -y gcc g++ autoconf automake debhelper glslang-dev ladspa-sdk xutils-dev libasound2-dev \
libarchive-dev libbluray-dev libbs2b-dev libcaca-dev libcdio-paranoia-dev libdrm-dev \
libdav1d-dev libdvdnav-dev libegl1-mesa-dev libepoxy-dev libfontconfig-dev libfreetype6-dev \
libfribidi-dev libgl1-mesa-dev libgbm-dev libgme-dev libgsm1-dev libharfbuzz-dev libjpeg-dev \
libbrotli-dev liblcms2-dev libmodplug-dev libmp3lame-dev libopenal-dev \
libopus-dev libopencore-amrnb-dev libopencore-amrwb-dev libpulse-dev librtmp-dev \
libsdl2-dev libsixel-dev libssh-dev libsoxr-dev libspeex-dev libtool \
libv4l-dev libva-dev libvdpau-dev libvorbis-dev libvo-amrwbenc-dev \
libunwind-dev libvpx-dev libwayland-dev libx11-dev libxext-dev \
libxkbcommon-dev libxrandr-dev libxss-dev libxv-dev libxvidcore-dev \
linux-libc-dev nasm ninja-build pkg-config python3 python3-docutils wayland-protocols \
x11proto-core-dev zlib1g-dev libfdk-aac-dev libtheora-dev libwebp-dev \
unixodbc-dev libpq-dev libxxhash-dev libaom-dev
shell: bash
- name: Set up Flutter
uses: subosito/flutter-action@v2.16.0
with:
channel: stable
flutter-version-file: pubspec.yaml
- name: Get Flutter dependencies
run: flutter pub get
shell: bash
- name: Inject DanDan API Credentials
run: |
sed -i "s/kvpx7qkqjh/${{ secrets.DANDANAPI_APPID }}/g" lib/utils/mortis.dart
sed -i "s/rABUaBLqdz7aCSi3fe88ZDj2gwga9Vax/${{ secrets.DANDANAPI_KEY }}/g" lib/utils/mortis.dart
- name: Build Flutter for Linux
run: flutter build linux
shell: bash
# - name: Download FFmpeg Assets
# uses: dsaltares/fetch-gh-release-asset@master
# with:
# repo: 'Predidit/avbuild'
# version: 'tags/1.1.0'
# file: 'ffmpeg_linux_amd64.zip'
# token: ${{ secrets.GITHUB_TOKEN }}
# - run: rm -f build/linux/x64/release/bundle/lib/libffmpeg.so.7
# - run: unzip ffmpeg_linux_amd64.zip -d build/linux/x64/release/bundle/lib
- name: Package linux build output
run: |
# Tarball package
tar -zcvf Kazumi_linux_${{ env.tag }}_amd64.tar.gz -C build/linux/x64/release/bundle .
# Debian package
mkdir Kazumi_linux_${{ env.tag }}_amd64
cd Kazumi_linux_${{ env.tag }}_amd64
mkdir -p opt/Kazumi
mkdir -p usr/share/applications
mkdir -p usr/share/icons/hicolor/512x512/apps
cp -r ../build/linux/x64/release/bundle/* opt/Kazumi
cp -r ../assets/linux/DEBIAN .
chmod 0755 DEBIAN/postinst
chmod 0755 DEBIAN/postrm
cat>DEBIAN/control<<EOF
Maintainer: madoka773 <valigarmanda55@gmail.com>
Package: Kazumi
Version: ${{ env.tag }}
Section: x11
Priority: optional
Architecture: amd64
Essential: no
Installed-Size: 34648
Description: Watch Animes online with danmaku support.
Homepage: https://github.com/Predidit/Kazumi
Depends: libayatana-appindicator3-1,
gir1.2-ayatanaappindicator3-0.1,
libwebkit2gtk-4.1-0
EOF
cp ../assets/linux/io.github.Predidit.Kazumi.desktop usr/share/applications
cp ../assets/images/logo/logo_linux.png usr/share/icons/hicolor/512x512/apps/io.github.Predidit.Kazumi.png
cd ..
dpkg-deb --build --root-owner-group Kazumi_linux_${{ env.tag }}_amd64
shell: bash
- name: Upload linux outputs
uses: actions/upload-artifact@v4
with:
name: linux_outputs
path: |
Kazumi_linux_*.tar.gz
Kazumi_linux_*.deb
flutter-build-ios:
name: "Release for iOS"
runs-on: "macos-latest"
permissions: write-all
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Extract tag name
run: echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
- name: Echo build progress
run: echo "Kazumi_ios_${{ env.tag }}.ipa build progress"
- name: Set up Flutter
uses: subosito/flutter-action@v2.16.0
with:
channel: stable
flutter-version-file: pubspec.yaml
- run: flutter pub get
- name: Inject DanDan API Credentials
run: |
sed -i '' "s/kvpx7qkqjh/${{ secrets.DANDANAPI_APPID }}/g" lib/utils/mortis.dart
sed -i '' "s/rABUaBLqdz7aCSi3fe88ZDj2gwga9Vax/${{ secrets.DANDANAPI_KEY }}/g" lib/utils/mortis.dart
- name: Build IPA
run: |
flutter build ios --release --no-codesign
- name: Create IPA
run: |
mkdir Payload
cp -R build/ios/iphoneos/Runner.app Payload/Runner.app
find Payload/Runner.app/Frameworks -type d -name "*.framework" -exec codesign --force --sign - --preserve-metadata=identifier,entitlements {} \;
zip -q -r Kazumi_ios_${{ env.tag }}_no_sign.ipa Payload
- name: Upload iOS build
uses: actions/upload-artifact@v4
with:
name: ios_outputs
path: Kazumi_ios_*.ipa
flutter-build-macos:
name: "Release for Macos"
runs-on: "macos-latest"
permissions: write-all
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Extract tag name
run: echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
- name: Echo build progress
run: echo "Kazumi_macos_${{ env.tag }}.dmg build progress"
- name: Set up Flutter
uses: subosito/flutter-action@v2.16.0
with:
channel: stable
flutter-version-file: pubspec.yaml
- run: flutter pub get
- name: Inject DanDan API Credentials
run: |
sed -i '' "s/kvpx7qkqjh/${{ secrets.DANDANAPI_APPID }}/g" lib/utils/mortis.dart
sed -i '' "s/rABUaBLqdz7aCSi3fe88ZDj2gwga9Vax/${{ secrets.DANDANAPI_KEY }}/g" lib/utils/mortis.dart
- run: flutter build macos --release
- name: Create DMG
run: |
npm install --global create-dmg
create-dmg build/macos/Build/Products/Release/Kazumi.app
continue-on-error: true
- name: Rename DMG
run: mv Kazumi*.dmg Kazumi_macos_${{ env.tag }}.dmg
- name: Upload MacOS build
uses: actions/upload-artifact@v4
with:
name: macos_outputs
path: Kazumi_macos_*.dmg
release:
name: "Release"
runs-on: "ubuntu-latest"
needs: [flutter-build-windows]
permissions: write-all
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Extract tag name
run: echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
shell: bash
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Setup Android build tools
run: sdkmanager "build-tools;34.0.0"
- name: Download windows zip build file
uses: actions/download-artifact@v4
with:
name: windows_zip_signed_outputs
path: windows_zip_signed_outputs
- name: List files in windows_outputs directory
run: ls -l windows_zip_signed_outputs
- name: Copy windows build file to root
run: cp windows_zip_signed_outputs/* Kazumi_windows_${{ env.tag }}.zip
- name: Download windows msix build file
uses: actions/download-artifact@v4
with:
name: windows_msix_signed_outputs
path: windows_msix_signed_outputs
- name: List files in windows_msix_signed_outputs directory
run: ls -l windows_msix_signed_outputs
- name: Copy windows build file to root
run: cp windows_msix_signed_outputs/* Kazumi_windows_${{ env.tag }}.msix
- name: Download android build file
uses: actions/download-artifact@v4
with:
name: android_outputs
path: android_outputs
- name: List files in android_outputs directory
run: ls -l android_outputs
- name: Copy android build file to unsigned floder
run: |
mkdir build
mkdir build/unsigned
mkdir build/signed
cp android_outputs/* build/unsigned/Kazumi_android_${{ env.tag }}.apk
- name: Download iOS build file
uses: actions/download-artifact@v4
with:
name: ios_outputs
path: ios_outputs
- name: List files in ios_outputs directory
run: ls -l ios_outputs
- name: Copy ios build file to root
run: cp ios_outputs/* Kazumi_ios_${{ env.tag }}_no_sign.ipa
- name: Download macos build file
uses: actions/download-artifact@v4
with:
name: macos_outputs
path: macos_outputs
- name: List files in macos_outputs directory
run: ls -l macos_outputs
- name: Copy macos build file to root
run: cp macos_outputs/* Kazumi_macos_${{ env.tag }}.dmg
- name: Download linux build file
uses: actions/download-artifact@v4
with:
name: linux_outputs
path: linux_outputs
- name: List files in linux_outputs directory
run: ls -l linux_outputs
- name: Copy linux build file to root
run: cp linux_outputs/* .
- name: Sign APK
id: sign_app
uses: filippoLeporati93/android-release-signer@v1
with:
releaseDirectory: build/unsigned
signingKeyBase64: ${{ secrets.SIGNING_KEY_BASE64 }}
alias: ${{ secrets.KEY_ALIAS }}
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
env:
BUILD_TOOLS_VERSION: "34.0.0"
- name: Copy Signed android build file
run: cp ${{steps.sign_app.outputs.signedReleaseFile}} build/signed/Kazumi_android_${{ env.tag }}.apk
- name: Create release
uses: softprops/action-gh-release@v2
with:
files: |
build/signed/*.apk
Kazumi_windows_*.zip
Kazumi_windows_*.msix
Kazumi_macos_*.dmg
Kazumi_ios_*.ipa
Kazumi_linux_*.tar.gz
Kazumi_linux_*.deb
================================================
FILE: .gitignore
================================================
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.build/
.buildlog/
.history
.svn/
.swiftpm/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.pub-cache/
.pub/
/build/
# Symbolication related
app.*.symbols
# Obfuscation related
app.*.map.json
# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release
# Added after flutter 3.29
/android/app/.cxx/
android/build/reports/problems/
# CocoaPods - iOS/macOS dependencies
# Podfile.lock is auto-generated by Flutter, no need to commit
**/ios/Pods/
**/macos/Pods/
**/ios/Podfile.lock
**/macos/Podfile.lock
================================================
FILE: .gitmodules
================================================
[submodule "fastlane/.flutter"]
path = fastlane/.flutter
url = https://github.com/flutter/flutter.git
branch = stable
[submodule "fastlane/.libmpv-android-video-build"]
path = fastlane/.libmpv-android-video-build
url = https://github.com/Predidit/libmpv-android-video-build.git
================================================
FILE: .metadata
================================================
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: "54e66469a933b60ddf175f858f82eaeb97e48c8d"
channel: "stable"
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 54e66469a933b60ddf175f858f82eaeb97e48c8d
base_revision: 54e66469a933b60ddf175f858f82eaeb97e48c8d
- platform: android
create_revision: 54e66469a933b60ddf175f858f82eaeb97e48c8d
base_revision: 54e66469a933b60ddf175f858f82eaeb97e48c8d
- platform: ios
create_revision: 54e66469a933b60ddf175f858f82eaeb97e48c8d
base_revision: 54e66469a933b60ddf175f858f82eaeb97e48c8d
- platform: linux
create_revision: 54e66469a933b60ddf175f858f82eaeb97e48c8d
base_revision: 54e66469a933b60ddf175f858f82eaeb97e48c8d
- platform: macos
create_revision: 54e66469a933b60ddf175f858f82eaeb97e48c8d
base_revision: 54e66469a933b60ddf175f858f82eaeb97e48c8d
- platform: web
create_revision: 54e66469a933b60ddf175f858f82eaeb97e48c8d
base_revision: 54e66469a933b60ddf175f858f82eaeb97e48c8d
- platform: windows
create_revision: 54e66469a933b60ddf175f858f82eaeb97e48c8d
base_revision: 54e66469a933b60ddf175f858f82eaeb97e48c8d
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'
================================================
FILE: .vscode/settings.json
================================================
{
"cmake.ignoreCMakeListsMissing": true,
"search.exclude": {
"**/fastlane": true
},
"dart.analysisExcludedFolders": [
"**/fastlane/**"
],
"files.associations": {
"xiosbase": "cpp",
"utility": "cpp",
"xstring": "cpp",
"xtree": "cpp",
"algorithm": "cpp",
"any": "cpp",
"array": "cpp",
"atomic": "cpp",
"bit": "cpp",
"cctype": "cpp",
"charconv": "cpp",
"chrono": "cpp",
"cinttypes": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"codecvt": "cpp",
"compare": "cpp",
"concepts": "cpp",
"condition_variable": "cpp",
"coroutine": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"exception": "cpp",
"filesystem": "cpp",
"format": "cpp",
"forward_list": "cpp",
"functional": "cpp",
"future": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"ios": "cpp",
"iosfwd": "cpp",
"iostream": "cpp",
"istream": "cpp",
"iterator": "cpp",
"limits": "cpp",
"list": "cpp",
"locale": "cpp",
"map": "cpp",
"memory": "cpp",
"mutex": "cpp",
"new": "cpp",
"optional": "cpp",
"ostream": "cpp",
"ratio": "cpp",
"set": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"stop_token": "cpp",
"streambuf": "cpp",
"string": "cpp",
"system_error": "cpp",
"thread": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"typeinfo": "cpp",
"unordered_map": "cpp",
"variant": "cpp",
"vector": "cpp",
"xfacet": "cpp",
"xhash": "cpp",
"xlocale": "cpp",
"xlocbuf": "cpp",
"xlocinfo": "cpp",
"xlocmes": "cpp",
"xlocmon": "cpp",
"xlocnum": "cpp",
"xloctime": "cpp",
"xmemory": "cpp",
"xtr1common": "cpp",
"xutility": "cpp"
}
}
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
# Kazumi
使用 Flutter 开发的基于自定义规则的番剧采集与在线观看程序。使用最多五行基于 `Xpath` 语法的选择器构建自己的规则。支持规则导入与规则分享。支持基于 `Anime4K` 的实时超分辨率。绝赞开发中 (~ ̄▽ ̄)~
## 支持平台
- Android 10 及以上
- Windows 10 及以上
- MacOS 10.15 及以上
- Linux (实验性)
- iOS 13 及以上 (需要[自签名](https://kazumi.app/docs/misc/how-to-install-in-ios.html))
- HarmonyOS 5.0 及以上 (位于[分支仓库](https://github.com/ErBWs/Kazumi/releases/latest),需要[侧载](https://kazumi.app/docs/misc/how-to-install-in-ohos.html))
## 屏幕截图
<table>
<tr>
<td><img alt="" src="static/screenshot/img_1.png"></td>
<td><img alt="" src="static/screenshot/img_2.png"></td>
<td><img alt="" src="static/screenshot/img_3.png"></td>
<tr>
<tr>
<td><img alt="" src="static/screenshot/img_4.png"></td>
<td><img alt="" src="static/screenshot/img_5.png"></td>
<td><img alt="" src="static/screenshot/img_6.png"></td>
<tr>
</table>
## 功能 / 开发计划
- [x] 规则编辑器
- [x] 番剧目录
- [x] 番剧搜索
- [x] 番剧时间表
- [x] 番剧字幕
- [x] 分集播放
- [x] 视频播放器
- [x] 多视频源支持
- [x] 规则分享
- [x] 硬件加速
- [x] 高刷适配
- [x] 追番列表
- [x] 番剧弹幕
- [x] 在线更新
- [x] 历史记录
- [x] 倍速播放
- [x] 配色方案
- [x] 跨设备同步
- [x] 无线投屏 (DLNA)
- [x] 外部播放器播放
- [x] 超分辨率
- [x] 一起看
- [ ] 番剧下载
- [ ] 番剧更新提醒
- [ ] 还有更多 (/・ω・\)
## 下载
通过本页面 [releases](https://github.com/Predidit/Kazumi/releases) 选项卡下载:
<a href="https://github.com/Predidit/Kazumi/releases">
<img src="static/svg/get_it_on_github.svg" alt="Get it on Github" width="200"/>
</a>
### Android
<a href="https://f-droid.org/packages/com.predidit.kazumi">
<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on-en-us.svg"
alt="Get it on F-Droid" width="200">
</a>
### GNU/Linux
<a href="https://flathub.org/apps/io.github.Predidit.Kazumi">
<img src="https://flathub.org/api/badge?svg&locale=en" alt="Get it on Flathub" width="175"/>
</a>
#### Arch Linux
可以从 [AUR](http://aur.archlinux.org) 或 [archlinuxcn](https://github.com/archlinuxcn/repo) 安装。
##### AUR
```bash
[yay/paru] -S kazumi # 从源码构建
[yay/paru] -S kazumi-bin # 二进制包
```
##### archlinuxcn
```bash
sudo pacman -S kazumi
```
## 贡献
欢迎向我们的 [规则仓库](https://github.com/Predidit/KazumiRules) 提交您的自定义规则。您可以自由选择是否在规则中留下您的ID
## Q&A
<details>
<summary>使用者 Q&A</summary>
#### Q: 为什么少数番剧中有广告?
A: 本项目未插入任何广告。广告来自视频源, 请不要相信广告中的任何内容, 并尽量选择没有广告的视频源观看。
#### Q: 为什么我启用超分辨率功能后播放卡顿?
A: 超分辨率功能对 GPU 性能要求较高, 如果没有在高性能独立显卡上运行 Kazumi, 尽量选择效率档而非质量档。对低分辨率视频源而非高分辨率视频源使用超分也可以降低性能消耗。
#### Q: 为什么播放视频时内存占用较高?
A: 本程序在视频播放时, 会尽可能多地缓存视频到内存, 以提供较好的观看体验。如果您的内存较为紧张, 可以在播放设置选项卡启用低内存模式, 这将限制缓存。
#### Q: 为什么少数番剧无法通过外部播放器观看?
A: 部分视频源的番剧使用了反盗链措施, 这可以被 Kazumi 解决, 但无法被外部播放器解决。
#### Q: 为什么下载的 Linux 版本缺少图标和托盘功能?
A: 使用 .deb 版本进行安装, tar.gz 版本仅为方便二次打包, 这一格式先天缺乏图标和托盘功能支持。
</details>
<details>
<summary>规则编写者 Q&A</summary>
#### Q: 为什么我的自定义规则无法实现检索?
A: 目前我们对 `Xpath` 语法的支持并不完整, 我们目前只支持以 `//` 开头的选择器。建议参照我们给出的示例规则构建自定义规则。
#### Q: 为什么我的自定义规则可以实现检索, 但不能实现观看?
A: 尝试关闭自定义规则的使用内置播放器选项, 这将尝试使用 `webview` 进行播放, 提高兼容性。但在内置播放器可用时, 建议启用内置播放器, 以获得更加流畅并带有弹幕的观看体验。
</details>
<details>
<summary>开发者 Q&A</summary>
#### Q: 我在尝试自行编译该项目, 但编译没有成功。
A: 本项目编译需要良好的网络环境, 除了由 Google 托管的 Flutter 相关依赖外, 本项目同样依赖托管在 MavenCentral/Github/SourceForge 上的资源。如果您位于中国大陆, 可能需要设置恰当的镜像地址。
</details>
## 美术资源
本项目图标来自 [Yuquanaaa](https://www.pixiv.net/users/66219277) 发表在 [Pixiv](https://www.pixiv.net/artworks/116666979) 上的作品。
此图标由其原作者 [Yuquanaaa](https://www.pixiv.net/users/66219277) 拥有版权。我们已获得原作者的授权和许可, 可以在本项目中使用这一图标。这一图标不是自由使用的, 未经原作者明确授权, 任何人不得擅自使用、复制、修改或分发这一图标。
本项目内嵌字体为 [Mi Sans](https://hyperos.mi.com/font/en/details/sc/) 字体, 由 [Xiaomi](https://www.mi.com/) 开发和拥有版权。
## 免责声明
本项目基于 GNU 通用公共许可证第 3 版(GPL-3.0)授权。我们不对其适用性、可靠性或准确性作出任何明示或暗示的保证。在法律允许的最大范围内, 作者和贡献者不承担任何因使用本软件而产生的直接、间接、偶然、特殊或后果性的损害赔偿责任。
使用本项目需遵守所在地法律法规, 不得进行任何侵犯第三方知识产权的行为。因使用本项目而产生的数据和缓存应在24小时内清除, 超出 24 小时的使用需获得相关权利人的授权。
## 隐私政策 (Privacy policy)
我们不收集任何用户数据, 不使用任何遥测组件。
## 代码签名策略 (Code signing policy)
提交者: [Contributors](https://github.com/Predidit/Kazumi/graphs/contributors)
审阅者: [Owner](https://github.com/Predidit)
## 赞助 (Sponsors)
|  | Free code signing on Windows provided by [SignPath.io](https://about.signpath.io/), certficate by [SignPath Foundation](https://signpath.org/) |
|------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------|
## 致谢
特别感谢 [XpathSelector](https://github.com/simonkimi/xpath_selector) 这个优秀的项目是本项目的基石。
特别感谢 [DandanPlayer](https://www.dandanplay.com/) 本项目使用了 dandanplayer 开放 API 以提供弹幕交互。
特别感谢 [Bangumi](https://bangumi.tv/) 本项目使用了 Bangumi 开放 API 以提供番剧元数据。
特别感谢 [Anime4K](https://github.com/bloc97/Anime4K) 本项目使用 Anime4K 进行实时超分。
特别感谢 [SyncPlay](https://github.com/Syncplay/syncplay) 本项目使用 SyncPlay 协议并通过 SyncPlay 公共服务器实现一起看功能。
感谢 [media-kit](https://github.com/media-kit/media-kit) 本项目跨平台媒体播放能力来自 media-kit。
感谢 [avbuild](https://github.com/wang-bin/avbuild) 本项目使用了来自 avbuild 的树外补丁实现非标准视频流播放。
感谢 [hive](https://github.com/isar/hive) 本项目持久化储存能力来自 hive。
================================================
FILE: analysis_options.yaml
================================================
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at https://dart.dev/lints.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
================================================
FILE: android/.gitignore
================================================
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties
**/*.keystore
**/*.jks
================================================
FILE: android/app/build.gradle
================================================
plugins {
id "com.android.application"
id "kotlin-android"
id "dev.flutter.flutter-gradle-plugin"
}
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
android {
namespace "com.example.kazumi"
compileSdk flutter.compileSdkVersion
// Pin ndk version to 21.3.6528147 to fix android build warning
// The build warning throws by gradle plugin, when the ndk is older than gradle plugin required version
ndkVersion "27.2.12479018"
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '17'
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.predidit.kazumi"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion flutter.minSdkVersion
targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
}
flutter {
source '../..'
}
dependencies {}
// F-droid splits APKs by ABI, and requires different versionCode for each ABI.
// For flutter version X.Y.Z, version code is X0Y0ZA, where A is the ABI code.
// See:
// * https://developer.android.com/build/gradle-tips
// * https://developer.android.com/studio/build/configure-apk-splits
// * https://gitlab.com/fdroid/fdroiddata/-/blob/master/metadata/im.nfc.nfsee.yml
ext.abiCodes = ["armeabi-v7a": 1, "arm64-v8a": 2, "x86_64": 4]
import com.android.build.OutputFile
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def abiVersionCode = project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))
if (abiVersionCode != null) {
output.versionCodeOverride = variant.versionCode * 10 + abiVersionCode
}
}
}
================================================
FILE: android/app/src/debug/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
================================================
FILE: android/app/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:label="Kazumi"
android:name="${applicationName}"
android:usesCleartextTraffic="true"
android:icon="@mipmap/ic_launcher"
android:extractNativeLibs="true">
<meta-data
android:name="io.flutter.embedding.android.EnableImpeller"
android:value="false"
/>
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<!-- flutter_foreground_task service -->
<service
android:name="com.pravera.flutter_foreground_task.service.ForegroundService"
android:foregroundServiceType="dataSync"
android:exported="false" />
</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility?hl=en and
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
<queries>
<intent>
<action android:name="android.intent.action.PROCESS_TEXT"/>
<data android:mimeType="text/plain"/>
</intent>
</queries>
</manifest>
================================================
FILE: android/app/src/main/kotlin/com/example/kazumi/MainActivity.kt
================================================
package com.example.kazumi
import android.content.Intent
import android.os.Build
import android.os.StatFs
import android.net.Uri
import android.os.Bundle
import androidx.annotation.NonNull
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
private val CHANNEL = "com.predidit.kazumi/intent"
private val STORAGE_CHANNEL = "com.predidit.kazumi/storage"
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
if (call.method == "openWithMime") {
val url = call.argument<String>("url")
val mimeType = call.argument<String>("mimeType")
if (url != null && mimeType != null) {
openWithMime(url, mimeType)
result.success(null)
} else {
result.error("INVALID_ARGUMENT", "URL and MIME type required", null)
}
} else if (call.method == "checkIfInMultiWindowMode") {
val isInMultiWindow = checkIfInMultiWindowMode()
result.success(isInMultiWindow)
} else if (call.method == "getAndroidSdkVersion") {
val sdkVersion = getAndroidSdkVersion()
result.success(sdkVersion)
} else {
result.notImplemented()
}
}
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, STORAGE_CHANNEL).setMethodCallHandler { call, result ->
if (call.method == "getAvailableStorage") {
val path = call.argument<String>("path") ?: filesDir.absolutePath
val availableBytes = getAvailableStorage(path)
result.success(availableBytes)
} else {
result.notImplemented()
}
}
}
private fun openWithMime(url: String, mimeType: String) {
val intent = Intent()
intent.action = Intent.ACTION_VIEW
intent.setDataAndType(Uri.parse(url), mimeType)
startActivity(intent)
}
private fun checkIfInMultiWindowMode(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
this.isInMultiWindowMode
} else {
false
}
}
private fun getAndroidSdkVersion(): Int {
return Build.VERSION.SDK_INT
}
private fun getAvailableStorage(path: String): Long {
return try {
val stat = StatFs(path)
stat.availableBlocksLong * stat.blockSizeLong
} catch (e: Exception) {
-1L
}
}
}
================================================
FILE: android/app/src/main/res/drawable/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
================================================
FILE: android/app/src/main/res/drawable-v21/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
================================================
FILE: android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
================================================
FILE: android/app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#ffffff</color>
</resources>
================================================
FILE: android/app/src/main/res/values/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:defaultFocusHighlightEnabled">false</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
<item name="android:windowLayoutInDisplayCutoutMode" tools:targetApi="o_mr1">shortEdges</item>
<item name="android:defaultFocusHighlightEnabled">false</item>
</style>
</resources>
================================================
FILE: android/app/src/main/res/values-night/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:defaultFocusHighlightEnabled">false</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
<item name="android:windowLayoutInDisplayCutoutMode" tools:targetApi="o_mr1">shortEdges</item>
<item name="android:defaultFocusHighlightEnabled">false</item>
</style>
</resources>
================================================
FILE: android/app/src/profile/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
================================================
FILE: android/build.gradle
================================================
allprojects {
repositories {
google()
mavenCentral()
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
tasks.register("clean", Delete) {
delete rootProject.buildDir
}
================================================
FILE: android/gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip
================================================
FILE: android/gradle.properties
================================================
org.gradle.jvmargs=-Xmx4G
android.useAndroidX=true
android.enableJetifier=true
================================================
FILE: android/settings.gradle
================================================
pluginManagement {
def flutterSdkPath = {
def properties = new Properties()
file("local.properties").withInputStream { properties.load(it) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
return flutterSdkPath
}
settings.ext.flutterSdkPath = flutterSdkPath()
includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle")
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "8.7.0" apply false
id "org.jetbrains.kotlin.android" version "2.1.0" apply false
}
include ":app"
================================================
FILE: assets/bbcode/BBCode.g4
================================================
grammar BBCode;
options { language=Dart; }
document
: element* EOF
;
element
: tag
| plain
| bgm
| sticker
;
tag
: '[' tagName=STRING ('=' attr=STRING)? ']' content=element* '[/' STRING ']'
;
plain
: (STRING | '=' | '/' | '[' | ']' | '(' | ')')+
// workaround unless these will break tag reconginze
| '[来自Bangumi for android]'
| '[来自Bangumi for iOS]'
;
bgm
: ('(bgm' | '(BGM') id=STRING ')'
;
sticker
: '(=A=)'
| '(=w=)'
| '(-w=)'
| '(S_S)'
| '(=v=)'
| '(@_@)'
| '(=W=)'
| '(TAT)'
| '(T_T)'
| '(=\'=)'
| '(=3=)'
| '(= =\')'
| '(=///=)'
| '(=.,=)'
| '(:P)'
| '(LOL)';
STRING : ~[=[\]()]+;
================================================
FILE: assets/linux/DEBIAN/postinst
================================================
#!/usr/bin/env sh
ln -sf /opt/Kazumi/kazumi /usr/bin/kazumi
chmod +x /usr/bin/kazumi
update-mime-database /usr/share/mime || true
update-desktop-database /usr/share/applications || true
exit 0
================================================
FILE: assets/linux/DEBIAN/postrm
================================================
#!/usr/bin/env sh
rm /usr/bin/kazumi
update-mime-database /usr/share/mime || true
update-desktop-database /usr/share/applications || true
exit 0
================================================
FILE: assets/linux/io.github.Predidit.Kazumi.desktop
================================================
[Desktop Entry]
Name=Kazumi
Comment=Watch Animes online with danmaku support.
Comment[zh_CN]=一款好用的追番软件
Exec=kazumi
StartupWMClass=kazumi
Icon=io.github.Predidit.Kazumi
Terminal=false
Type=Application
Categories=AudioVideo;Audio;Video;
================================================
FILE: assets/plugins/7sefun.json
================================================
{
"api": "4",
"type": "anime",
"name": "7sefun",
"version": "1.2",
"muliSources": true,
"useWebview": true,
"useNativePlayer": true,
"userAgent": "",
"baseURL": "https://www.7sefun.top/",
"searchURL": "https://www.7sefun.top/vodsearch/-------------.html?wd=@keyword",
"searchList": "//div[2]/div[2]/div[2]/div[2]/div",
"searchName": "//div[2]/text()",
"searchResult": "//a",
"chapterRoads": "//div[2]/div[2]/div[2]/div/div[2]/div[1]/div[2]",
"chapterResult": "//a"
}
================================================
FILE: assets/plugins/AGE.json
================================================
{
"api": "1",
"type": "anime",
"name": "AGE",
"version": "1.5",
"muliSources": true,
"useWebview": true,
"useNativePlayer": true,
"userAgent": "",
"baseURL": "https://www.agedm.io/",
"searchURL": "https://www.agedm.io/search?query=@keyword",
"searchList": "//div[2]/div/section/div/div/div/div",
"searchName": "//div/div[2]/h5/a",
"searchResult": "//div/div[2]/h5/a",
"chapterRoads": "//div[2]/div/section/div/div[2]/div[2]/div[2]/div",
"chapterResult": "//ul/li/a"
}
================================================
FILE: assets/plugins/DM84.json
================================================
{
"api": "5",
"type": "anime",
"name": "DM84",
"version": "1.4",
"muliSources": true,
"useWebview": true,
"useNativePlayer": true,
"userAgent": "",
"adBlocker": true,
"baseURL": "https://dmbus.cc/",
"searchURL":"https://dmbus.cc/s----------.html?wd=@keyword",
"searchList": "//div/div[3]/ul/li",
"searchName": "//div/a[2]",
"searchResult": "//div/a[2]",
"chapterRoads": "//div/div[4]/div/ul",
"chapterResult": "//li/a"
}
================================================
FILE: assets/shaders/Anime4K_AutoDownscalePre_x2.glsl
================================================
// This is free and unencumbered software released into the public domain.
// Anyone is free to copy, modify, publish, use, compile, sell, or
// distribute this software, either in source code form or as a compiled
// binary, for any purpose, commercial or non-commercial, and by any
// means.
// In jurisdictions that recognize copyright laws, the author or authors
// of this software dedicate any and all copyright interest in the
// software to the public domain. We make this dedication for the benefit
// of the public at large and to the detriment of our heirs and
// successors. We intend this dedication to be an overt act of
// relinquishment in perpetuity of all present and future rights to this
// software under copyright law.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
// For more information, please refer to <https://unlicense.org>
//!DESC Anime4K-v4.0-AutoDownscalePre-x2
//!HOOK MAIN
//!BIND HOOKED
//!BIND NATIVE
//!WHEN OUTPUT.w NATIVE.w / 2.0 < OUTPUT.h NATIVE.h / 2.0 < * OUTPUT.w NATIVE.w / 1.2 > OUTPUT.h NATIVE.h / 1.2 > * *
//!WIDTH OUTPUT.w
//!HEIGHT OUTPUT.h
vec4 hook() {
return HOOKED_tex(HOOKED_pos);
}
================================================
FILE: assets/shaders/Anime4K_AutoDownscalePre_x4.glsl
================================================
// This is free and unencumbered software released into the public domain.
// Anyone is free to copy, modify, publish, use, compile, sell, or
// distribute this software, either in source code form or as a compiled
// binary, for any purpose, commercial or non-commercial, and by any
// means.
// In jurisdictions that recognize copyright laws, the author or authors
// of this software dedicate any and all copyright interest in the
// software to the public domain. We make this dedication for the benefit
// of the public at large and to the detriment of our heirs and
// successors. We intend this dedication to be an overt act of
// relinquishment in perpetuity of all present and future rights to this
// software under copyright law.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
// For more information, please refer to <https://unlicense.org>
//!DESC Anime4K-v3.2-AutoDownscalePre-x4
//!HOOK MAIN
//!BIND HOOKED
//!BIND NATIVE
//!WHEN OUTPUT.w NATIVE.w / 4.0 < OUTPUT.h NATIVE.h / 4.0 < * OUTPUT.w NATIVE.w / 2.4 > OUTPUT.h NATIVE.h / 2.4 > * *
//!WIDTH OUTPUT.w 2 /
//!HEIGHT OUTPUT.h 2 /
vec4 hook() {
return HOOKED_tex(HOOKED_pos);
}
================================================
FILE: assets/shaders/Anime4K_Clamp_Highlights.glsl
================================================
// MIT License
// Copyright (c) 2019-2021 bloc97
// All rights reserved.
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//!DESC Anime4K-v4.0-De-Ring-Compute-Statistics
//!HOOK MAIN
//!BIND HOOKED
//!SAVE STATSMAX
//!COMPONENTS 1
#define KERNELSIZE 5 //Kernel size, must be an positive odd integer.
#define KERNELHALFSIZE 2 //Half of the kernel size without remainder. Must be equal to trunc(KERNELSIZE/2).
float get_luma(vec4 rgba) {
return dot(vec4(0.299, 0.587, 0.114, 0.0), rgba);
}
vec4 hook() {
float gmax = 0.0;
for (int i=0; i<KERNELSIZE; i++) {
float g = get_luma(MAIN_texOff(vec2(i - KERNELHALFSIZE, 0)));
gmax = max(g, gmax);
}
return vec4(gmax, 0.0, 0.0, 0.0);
}
//!DESC Anime4K-v4.0-De-Ring-Compute-Statistics
//!HOOK MAIN
//!BIND HOOKED
//!BIND STATSMAX
//!SAVE STATSMAX
//!COMPONENTS 1
#define KERNELSIZE 5 //Kernel size, must be an positive odd integer.
#define KERNELHALFSIZE 2 //Half of the kernel size without remainder. Must be equal to trunc(KERNELSIZE/2).
vec4 hook() {
float gmax = 0.0;
for (int i=0; i<KERNELSIZE; i++) {
float g = STATSMAX_texOff(vec2(0, i - KERNELHALFSIZE)).x;
gmax = max(g, gmax);
}
return vec4(gmax, 0.0, 0.0, 0.0);
}
//!DESC Anime4K-v4.0-De-Ring-Clamp
//!HOOK PREKERNEL
//!BIND HOOKED
//!BIND STATSMAX
float get_luma(vec4 rgba) {
return dot(vec4(0.299, 0.587, 0.114, 0.0), rgba);
}
vec4 hook() {
float current_luma = get_luma(HOOKED_tex(HOOKED_pos));
float new_luma = min(current_luma, STATSMAX_tex(HOOKED_pos).x);
//This trick is only possible if the inverse Y->RGB matrix has 1 for every row... (which is the case for BT.709)
//Otherwise we would need to convert RGB to YUV, modify Y then convert back to RGB.
return HOOKED_tex(HOOKED_pos) - (current_luma - new_luma);
}
================================================
FILE: assets/shaders/Anime4K_Restore_CNN_M.glsl
================================================
// MIT License
// Copyright (c) 2019-2021 bloc97
// All rights reserved.
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//!DESC Anime4K-v4.0-Restore-CNN-(M)-Conv-4x3x3x3
//!HOOK MAIN
//!BIND MAIN
//!SAVE conv2d_tf
//!WIDTH MAIN.w
//!HEIGHT MAIN.h
//!COMPONENTS 4
#define go_0(x_off, y_off) (MAIN_texOff(vec2(x_off, y_off)))
vec4 hook() {
vec4 result = mat4(-0.09991986, 0.13782342, -0.031251684, -0.06356843, -0.3437488, 0.05450952, 0.34347802, 0.46335372, 0.08607224, 0.044988394, 0.137179, 0.17976908, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, -1.0);
result += mat4(-0.024212424, -0.09278509, -0.00040907756, 0.34552294, -0.13254678, 0.113105185, 0.005667946, -0.00036919137, -0.06375679, 0.009184115, 0.115518734, -0.115506776, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 0.0);
result += mat4(-0.14101827, 0.023523493, 0.044094566, -0.019271746, -0.44348842, -0.08818877, -0.4026149, -0.21995795, -0.15880394, -0.013732858, -0.020751135, 0.012719151, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 1.0);
result += mat4(0.013001821, -0.34503505, 0.39219138, 0.18792126, 0.24760444, -0.016173402, 0.10154511, 0.15453082, -0.058132876, 0.016784398, -0.05808539, -0.11039915, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, -1.0);
result += mat4(0.37024534, 0.041440863, -0.3374568, -0.44994286, 0.19555596, 0.20855539, -0.27974075, -0.5372628, 0.21228147, -0.0295346, -0.56700057, 0.030042822, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 0.0);
result += mat4(-0.12940632, 0.057526, 0.090682045, -0.06985033, -0.13704006, -0.047685407, 0.44615674, -0.48056605, -0.06166251, -0.01883519, 0.2032237, -0.113287605, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 1.0);
result += mat4(0.010856669, -0.35820737, 0.16757219, 0.082619876, -0.03967303, 0.038705572, 0.32652855, -0.012030017, 0.015120559, -0.15314877, 0.23442009, 0.09767922, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, -1.0);
result += mat4(-0.046272673, -0.17752305, 0.082018286, -0.2512824, 0.58619463, -0.060903464, -0.022793597, 0.077803515, -0.17025311, 0.05136993, 0.029383298, -0.15475409, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 0.0);
result += mat4(-0.11212024, 0.13378005, -0.2027488, 0.08056421, -0.11176219, -0.048429377, -0.08396386, 0.10507829, 0.13326839, 0.0430627, 0.051362377, 0.06482755, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 1.0);
result += vec4(-0.061233472, 0.39222646, 0.029704979, 0.02586828);
return result;
}
//!DESC Anime4K-v4.0-Restore-CNN-(M)-Conv-4x3x3x8
//!HOOK MAIN
//!BIND conv2d_tf
//!SAVE conv2d_1_tf
//!WIDTH conv2d_tf.w
//!HEIGHT conv2d_tf.h
//!COMPONENTS 4
#define go_0(x_off, y_off) (max((conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_1(x_off, y_off) (max(-(conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))
vec4 hook() {
vec4 result = mat4(-0.16410656, -0.40521824, 0.13121907, -0.02314597, 0.105412476, -0.060401272, -0.043063477, -0.13933973, 0.12558138, -0.020861467, 0.030370515, 0.13178016, -0.14220351, 0.20736893, 0.003321564, -0.29241714) * go_0(-1.0, -1.0);
result += mat4(0.18517321, 0.29162985, -0.26783395, 0.039760686, 0.025527012, -0.067319244, 0.055004176, 0.048916563, 0.12750523, -0.091435954, 0.13818842, 0.36704224, 0.0839921, 0.10186618, -0.17237376, 0.13282418) * go_0(-1.0, 0.0);
result += mat4(-0.1657887, 0.0131325135, -0.17222486, 0.091398895, -0.12756164, -0.08437298, -0.29052997, 0.3269337, 0.15870757, -0.013529402, -0.0581753, 0.11802371, 0.07099966, -0.024063632, 0.31834844, -0.11183859) * go_0(-1.0, 1.0);
result += mat4(0.46036887, -0.07654623, 0.22923063, 0.17463821, 0.10555414, -0.117430426, 0.12406777, -0.011399492, 0.028316498, 0.13684341, 0.009664087, 0.2022659, 0.04953974, -0.31342217, -0.6103131, -0.13605757) * go_0(0.0, -1.0);
result += mat4(0.03406955, -0.39819366, 0.61176, -0.46809456, -0.029321073, 0.46619493, 0.36700186, 0.02288561, 0.11464085, -0.10931452, -0.09154022, 0.07334147, -0.5609916, 0.31826234, -0.011012659, -0.46719545) * go_0(0.0, 0.0);
result += mat4(-0.056855045, 0.27037027, -0.09269696, -0.563572, -0.06816116, -0.22986612, 0.08693167, -0.16246101, 0.09954046, -0.05374176, 0.0071916827, -0.1788692, 0.3825241, -0.1609887, 0.055204768, 0.10213068) * go_0(0.0, 1.0);
result += mat4(0.0646626, 0.102358796, -0.45055822, 0.20557903, -0.23337309, 0.12633002, -0.19299199, -0.15085731, -0.13473304, 0.053790465, -0.10061193, -0.13393497, -0.04264752, -0.029740738, -0.07865285, 0.20883279) * go_0(1.0, -1.0);
result += mat4(0.010471527, -0.033218473, -0.46157447, 0.004866583, 0.23226471, -0.059343327, -0.1439596, 0.13619648, 0.013839963, 0.15930325, 0.043742355, 0.17467323, 0.33772305, 0.40261495, -0.08351293, 0.18129359) * go_0(1.0, 0.0);
result += mat4(-0.12493434, -0.1875134, -0.074943796, -0.0031701606, -0.037142616, 0.1667002, 0.16665547, -0.011248127, 0.0071619414, 0.0034872112, 0.120318964, -0.09625579, 0.14917047, -0.16310586, 0.07231737, 0.30447328) * go_0(1.0, 1.0);
result += mat4(0.093798615, 0.17074613, -0.08780678, -0.012520207, 0.118534856, 0.027508778, -0.2778478, -0.19509242, -0.34137097, 0.32000312, -0.22027159, 0.337515, 0.16220862, 0.108993016, 0.14070526, 0.12784284) * go_1(-1.0, -1.0);
result += mat4(-0.14325632, -0.1467453, -0.27502358, 0.09370837, 0.11821083, -0.012266484, -0.2100548, 0.4707502, -0.06766648, 0.58165014, -0.2512279, -0.33783755, 0.1318925, -0.04346277, 0.15454485, 0.044500057) * go_1(-1.0, 0.0);
result += mat4(-0.05683207, 0.0051946463, -0.108000524, 0.10133204, -0.50763863, 0.007308442, 0.8542404, 0.28387356, 0.022709515, 0.294523, -0.3822472, 0.66166407, 0.01404485, 0.031282708, -0.26756814, -0.123147786) * go_1(-1.0, 1.0);
result += mat4(-0.36455178, 0.3470555, -0.045303088, -0.03170764, -0.15802494, -0.0019141496, -0.25939587, -0.23875342, 0.130428, 0.03954273, -0.17985536, 0.105145946, 0.15804817, 0.12551713, 0.28371975, -0.085748516) * go_1(0.0, -1.0);
result += mat4(0.0060625463, 0.2443924, -0.017692259, -0.20214005, -0.09584515, -0.012805372, -0.13942227, 0.16143198, 0.12942013, 0.41785547, 0.046071563, 0.7030026, 0.10499644, -0.20566013, -0.031321276, 0.27830327) * go_1(0.0, 0.0);
result += mat4(-0.081274964, -0.14562319, 0.27200526, -0.20491314, 0.012910989, 0.024201397, 0.04816258, 0.21297328, -0.22015952, -0.44160756, -0.056035373, 0.33824417, -0.31645304, 0.15469243, 0.053187452, -0.20989445) * go_1(0.0, 1.0);
result += mat4(-0.046550367, 0.033185404, 0.33337244, 0.12853645, 0.23520172, -0.05909214, 0.0861368, 0.10706329, -0.07058717, -0.11759937, -0.18594047, 0.080006264, -0.055425353, -0.12506317, 0.15729053, -0.0915004) * go_1(1.0, -1.0);
result += mat4(0.042516407, 0.14844789, 0.16533111, 0.13502933, -0.0655417, -0.057256397, 0.076713726, -0.23448966, 0.12855926, 0.014219275, 0.051761385, 0.053433083, -0.2446715, -0.4008074, 0.19603717, -0.1796951) * go_1(1.0, 0.0);
result += mat4(0.14777803, 0.15524907, 0.043158617, -0.06996876, 0.19210646, -0.2144364, -0.47020787, -0.4207906, -0.18074386, -0.2163903, 0.0030754965, 0.36799973, -0.3837698, -0.0022661497, -0.37276733, -0.28934997) * go_1(1.0, 1.0);
result += vec4(-0.018297346, -0.080951825, -0.062163066, -0.08050014);
return result;
}
//!DESC Anime4K-v4.0-Restore-CNN-(M)-Conv-4x3x3x8
//!HOOK MAIN
//!BIND conv2d_1_tf
//!SAVE conv2d_2_tf
//!WIDTH conv2d_1_tf.w
//!HEIGHT conv2d_1_tf.h
//!COMPONENTS 4
#define go_0(x_off, y_off) (max((conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_1(x_off, y_off) (max(-(conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))
vec4 hook() {
vec4 result = mat4(0.31543177, 0.23095237, -0.06692611, -0.5867763, 0.003622504, 0.17948842, -0.14627707, 0.1745016, -0.052964583, -0.15551159, 0.05644786, -0.012665164, 0.13107763, 0.11369179, -0.09452995, -0.11973403) * go_0(-1.0, -1.0);
result += mat4(-0.2694661, -0.115382135, 0.3073268, -0.067228466, -0.25511482, -0.13922207, 0.36758214, -0.18821828, -0.022617863, 0.20333402, -0.11125889, 0.3552245, -0.013346653, -0.099095374, -0.25100616, 0.35521755) * go_0(-1.0, 0.0);
result += mat4(0.011012409, -0.13675085, 0.25642, -0.34851208, -0.23184675, 0.18012202, 0.57654136, 0.103173524, -0.16461405, 0.038177088, 0.1234096, 0.013202029, -0.19033363, 0.07469178, -0.017948546, 0.15287702) * go_0(-1.0, 1.0);
result += mat4(-0.05340533, 0.23797482, 0.20351392, -0.05333351, -0.12181174, -0.23363493, -0.20696607, 0.109941036, -0.11519453, 0.13842066, -0.10687832, 0.29040006, 0.022218632, 0.031238724, 0.2685182, 0.15300068) * go_0(0.0, -1.0);
result += mat4(0.22985318, -0.3103802, -0.22916415, 0.25238806, -0.11690287, -0.1947488, 0.118020535, 0.07814263, -0.06335474, -0.007870727, 0.076106325, 0.094677486, -0.16776285, -0.006570437, -0.29589584, 0.41413507) * go_0(0.0, 0.0);
result += mat4(0.43607962, -0.36456433, -0.123776875, -0.16634953, -0.091190875, 0.13035081, 0.28627968, 0.27249968, 0.12356344, -0.008616177, 0.09599816, -0.006144557, -0.23490307, 0.3013123, 0.14153156, 0.21837278) * go_0(0.0, 1.0);
result += mat4(0.060364585, 0.37860224, 0.039182413, -0.22805426, -0.089910224, -0.06817697, -0.2684275, -0.12528503, 0.036934495, -0.07826616, 0.06559976, -0.08253646, 0.13489649, 0.06237663, 0.126376, 0.21194184) * go_0(1.0, -1.0);
result += mat4(-0.12534817, 0.21225189, -0.27818045, -0.3070443, -0.006957577, -0.025105853, 0.12100924, -0.06916452, 0.23081483, 0.1802756, -0.18995638, 0.16603014, -0.2904096, -0.25292823, -0.21834068, 0.13719653) * go_0(1.0, 0.0);
result += mat4(0.017209655, 0.10757137, 0.21414296, -0.30885983, 0.10467716, -0.2184891, 0.100061476, -0.1527528, 0.2100472, -0.25768545, -0.22329919, -0.29153427, -0.06983842, -0.103854865, -0.051384352, 0.14629121) * go_0(1.0, 1.0);
result += mat4(0.0059623295, -0.26060802, 0.32115817, 0.021025505, 0.09783085, -0.15865178, 0.1473021, -0.24977303, -0.033508282, 0.17480391, -0.091310136, 0.09870876, 0.10504043, -0.06105686, 0.013493489, -0.11278855) * go_1(-1.0, -1.0);
result += mat4(0.14875248, -0.14859414, 0.19377062, -0.17456068, 0.101288855, -0.1113682, -0.48944646, 0.1018565, -0.037392337, 0.08539691, 0.1751306, -0.15428723, -0.059375558, 0.027663672, 0.051804014, -0.049813222) * go_1(-1.0, 0.0);
result += mat4(0.118846565, -0.19869871, -0.037388258, 0.08456728, -0.11662527, -0.43818352, -0.093285345, 0.038507205, -0.051991668, 0.21008292, 0.10792365, 0.2020924, 0.057021596, 0.09460527, 0.0016551288, -0.0015957063) * go_1(-1.0, 1.0);
result += mat4(0.11062174, -0.2639232, -0.060295466, -0.3217331, -0.050545212, 0.30989558, 0.30906132, 0.030323273, 0.028986752, 0.037429404, 0.20855664, -0.19848943, 0.034687653, -0.09599135, -0.06250494, -0.13215867) * go_1(0.0, -1.0);
result += mat4(-0.010391146, 0.07657845, 0.44491258, 0.0435906, 0.0075931503, 0.42632654, 0.47022533, 0.34737435, -0.15452717, -0.14613411, -0.45231065, 0.12094409, 0.0067911847, 0.057501152, 0.09876979, 0.044946447) * go_1(0.0, 0.0);
result += mat4(-0.15607435, 0.2293058, -0.09520331, 0.012836732, -0.15282455, 0.26437718, -0.1685477, -0.13211122, -0.055801593, -0.016778728, -0.34478986, -0.23228309, 0.12300962, -0.13235827, -0.13987203, -0.16550972) * go_1(0.0, 1.0);
result += mat4(0.13161735, -0.09039346, -0.033475474, -0.23686698, 0.1514885, 0.20977421, 0.031431954, -0.0049226107, 0.090661936, 0.15288061, -0.03316583, 0.09646573, -0.32651708, 0.18825398, -0.15777239, 0.17572704) * go_1(1.0, -1.0);
result += mat4(0.112157226, -0.08712878, 0.23453182, 0.1043877, -0.14686783, 0.28682423, -0.086443506, 0.059457052, -0.31530112, -0.2700583, -0.06028952, -0.070416875, 0.18053482, 0.16653341, 0.25215197, 0.061915852) * go_1(1.0, 0.0);
result += mat4(-0.20122242, 0.076313145, -0.0988483, 0.094337784, -0.35436687, 0.3762327, -0.07809558, 0.3055848, 0.10425242, -0.17087407, 0.030301496, -0.13911743, 0.01630275, 0.24247427, -0.006474477, 0.03842641) * go_1(1.0, 1.0);
result += vec4(-0.008952847, -0.0058945753, -0.08097229, 0.020968592);
return result;
}
//!DESC Anime4K-v4.0-Restore-CNN-(M)-Conv-4x3x3x8
//!HOOK MAIN
//!BIND conv2d_2_tf
//!SAVE conv2d_3_tf
//!WIDTH conv2d_2_tf.w
//!HEIGHT conv2d_2_tf.h
//!COMPONENTS 4
#define go_0(x_off, y_off) (max((conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_1(x_off, y_off) (max(-(conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))
vec4 hook() {
vec4 result = mat4(-0.2237721, -0.0064096362, -0.31808427, 0.73477733, 0.015353088, 0.23983319, 0.14967978, -0.34920225, -0.07456269, 0.093151815, -0.14331086, -0.24586205, -0.14183366, 0.06401045, -0.22044073, 0.29932275) * go_0(-1.0, -1.0);
result += mat4(-0.07968509, -0.3349146, 0.16529128, 0.08443499, 0.4095855, -0.17120704, 0.17425705, 0.15298946, 0.2981273, 0.2212369, 0.10392389, -0.28775454, -0.065247655, -0.15255849, 0.13094437, 0.18685219) * go_0(-1.0, 0.0);
result += mat4(0.015706737, -0.17755036, 0.2622526, 0.112057306, -0.15876788, -0.38466996, -0.33700845, -0.031711742, -0.023320962, -0.3145249, -0.21223734, -0.1314596, -0.1888095, -0.046370104, 0.09000896, -0.0046378844) * go_0(-1.0, 1.0);
result += mat4(-0.31127506, 0.31304324, -0.03965752, 0.03649018, -0.029851055, 0.05801377, 0.00040150844, -0.04422069, 0.18019931, 0.14415511, -0.09845236, 0.21895434, -0.013932474, -0.046454947, -0.3403935, -0.006705289) * go_0(0.0, -1.0);
result += mat4(-0.34878647, -0.5129283, 0.060250953, -0.16354133, 0.20644619, 0.08732273, -0.24118888, 0.24455065, 0.24449423, 0.44103387, 0.22455928, 0.25738943, -0.26914698, -0.21309987, 0.08386486, 0.021484816) * go_0(0.0, 0.0);
result += mat4(-0.057454903, -0.4121922, 0.022661546, 0.37178272, 0.03331408, 0.05044008, 0.04324371, 0.20727943, 0.2432641, 0.076906696, -0.20858039, 0.012439015, -0.19335061, 0.09217451, 0.1968369, -0.19435833) * go_0(0.0, 1.0);
result += mat4(-0.16960496, 0.24616167, 0.37977478, 0.14324574, -0.011531225, -0.11312143, -0.18141079, -0.23843932, 0.0086012175, -0.3564491, -0.12639481, 0.009799298, -0.29120612, 0.23756824, 0.18035695, -0.087133996) * go_0(1.0, -1.0);
result += mat4(-0.10081239, 0.29191494, 0.10434693, 0.08970636, 0.008997759, 0.104756236, 0.039641086, 0.02323888, -0.11627765, 0.023693223, -0.30801758, -0.120208986, 0.05086147, 0.18498175, 0.15595439, -0.09877306) * go_0(1.0, 0.0);
result += mat4(0.101321675, -0.2929976, 0.38810417, 0.5605376, -0.04073937, 0.030110704, -0.18147062, -0.09833952, 0.01927733, 0.15335669, -0.15384074, -0.110595055, -0.054297395, -0.077522054, 0.07918369, -0.068480626) * go_0(1.0, 1.0);
result += mat4(0.23263514, -0.11719232, 0.2903209, -0.007503795, -0.020222448, -0.17790157, -0.15600762, -0.08741775, 0.12529704, 0.25548857, -0.04585447, -0.10255033, 0.18350503, -0.29593533, 0.0868933, 0.027004737) * go_1(-1.0, -1.0);
result += mat4(-0.14958654, -0.006238835, -0.2928948, 0.1988557, -0.17057803, 0.12524141, 0.13978264, -0.019280292, 0.05967142, -0.07790818, -0.5893818, -0.022845713, -0.08596779, 0.07875358, -0.03316667, -0.4369282) * go_1(-1.0, 0.0);
result += mat4(0.19195688, -0.060883682, -0.25897828, 0.07063324, 0.090833396, 0.003422883, 0.109534174, 0.031180874, -0.05017118, 0.022862168, -0.270113, -0.057831235, 0.53920543, -0.10252776, -0.091807485, 0.004294343) * go_1(-1.0, 1.0);
result += mat4(-0.18494242, -0.119284816, 0.3821897, 0.07777979, 0.15568028, -0.2854859, -0.22441281, -0.049155876, -0.15292497, 0.21895619, -0.095677756, 0.15210424, 0.001643022, -0.026176987, 0.048463076, -0.4824009) * go_1(0.0, -1.0);
result += mat4(0.007215129, 0.17074333, 0.053930074, -0.027014816, -0.17180431, -0.15163863, -0.0012122132, -0.18934256, -0.08294297, -0.24580221, -0.46552867, -0.27923223, 0.4092668, 0.06288688, -0.1602188, -0.0030876845) * go_1(0.0, 0.0);
result += mat4(0.111870885, 0.03317145, 0.14155298, 0.20328505, -0.05104131, 0.13979794, 0.018966835, -0.07238511, 0.05493792, -0.14975783, -0.10293237, -0.21985306, 0.49054706, 0.18288186, -0.26925826, 0.35845932) * go_1(0.0, 1.0);
result += mat4(0.3747799, -0.096748486, -0.17139742, 0.25289854, -0.17421168, -0.018461818, 0.09747162, 0.01660535, -0.20580359, 0.56189656, 0.17151354, -0.26347768, 0.28350568, -0.21486014, -0.44330928, -0.008981037) * go_1(1.0, -1.0);
result += mat4(0.10169985, -0.18244018, 0.04760736, 0.41017643, -0.09468786, -0.024218475, 0.103733875, -0.22540338, 0.10630112, 0.3677178, -0.104170956, 0.057317447, 0.21764882, 0.0789158, -0.22041337, 0.15065216) * go_1(1.0, 0.0);
result += mat4(0.11633995, -0.008195114, -0.14501533, 0.07168025, 0.058413275, 0.055995367, 0.09362145, -0.13827963, 0.13760869, 0.040319785, 0.038895044, 0.2675253, -0.087339684, 0.1412073, -0.17166458, -0.2312994) * go_1(1.0, 1.0);
result += vec4(-0.059377354, -0.02055341, 0.07234869, -0.015452986);
return result;
}
//!DESC Anime4K-v4.0-Restore-CNN-(M)-Conv-4x3x3x8
//!HOOK MAIN
//!BIND conv2d_3_tf
//!SAVE conv2d_4_tf
//!WIDTH conv2d_3_tf.w
//!HEIGHT conv2d_3_tf.h
//!COMPONENTS 4
#define go_0(x_off, y_off) (max((conv2d_3_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_1(x_off, y_off) (max(-(conv2d_3_tf_texOff(vec2(x_off, y_off))), 0.0))
vec4 hook() {
vec4 result = mat4(-0.29012984, -0.13150147, 0.31015614, 0.05992291, -0.050289866, 0.14845313, -0.09608898, 0.27913308, 0.060307387, -0.04160452, 0.035932682, -0.08137563, -0.07999419, 0.11818284, -0.27512288, 0.21948813) * go_0(-1.0, -1.0);
result += mat4(0.12916058, -0.21759962, -0.33868533, 0.021636661, 0.053470243, 0.1412425, 0.043395396, -0.26751056, -0.01689101, -0.2623835, 0.010809152, 0.062962815, -0.20692012, -0.1677863, -0.23313859, -0.17402615) * go_0(-1.0, 0.0);
result += mat4(-0.08204112, -0.23672083, -0.0064437394, -0.13200696, -0.056692924, -0.02708657, 0.12536962, 0.004428919, 0.14137582, 0.15404348, -0.105753876, 0.047957454, 0.15734316, 0.16562423, -0.010160829, -0.06602983) * go_0(-1.0, 1.0);
result += mat4(0.025653997, -0.10877775, -0.31258908, 0.18841636, -0.36005193, 0.1816357, -0.34537643, -0.0741087, 0.4663994, 0.0065186517, 0.08109033, 0.2976773, -0.35774228, -0.041366056, -0.37852773, 0.050565656) * go_0(0.0, -1.0);
result += mat4(0.04392313, 0.11316681, -0.14421389, 0.17985669, -0.1651274, -0.5656209, -0.124100484, 0.42774054, -0.1153939, 0.16829851, 0.2025612, 0.054007456, -0.06868256, -0.56935954, -0.12227961, 0.17688861) * go_0(0.0, 0.0);
result += mat4(0.34041, 0.499, 0.15234196, 0.21353458, -0.2732667, -0.049950935, 0.03550811, -0.21051687, 0.2609023, 0.016438454, -0.29874632, 0.37994128, 0.049288407, -0.31126305, 0.029235512, -0.012256015) * go_0(0.0, 1.0);
result += mat4(-0.0046853204, 0.15391374, -0.040689662, 0.20186873, -0.08137621, 0.35905558, 0.23733845, 0.21794793, -0.066420384, 0.029600656, -0.31421044, -0.050773863, -0.06260773, 0.04634221, -0.10948491, -0.045498934) * go_0(1.0, -1.0);
result += mat4(-0.082953, -0.025837064, -0.09928303, -0.14300232, 0.275064, 0.07793617, 0.22240888, 0.06637834, -0.4382666, -0.2932182, -0.27243167, -0.14221182, 0.5695728, 0.20719238, 0.5575927, 0.40816882) * go_0(1.0, 0.0);
result += mat4(-0.18510929, -0.15052167, 0.25277212, 0.06804461, 0.016387, 0.20310035, 0.2903229, -0.0615877, -0.28987274, -0.11942605, 0.013498961, 0.3184152, 0.29543474, -0.042830903, -0.018111207, -0.13263674) * go_0(1.0, 1.0);
result += mat4(0.25749087, 0.0053866603, -0.09391162, -0.06129529, -0.094091184, -0.07419633, 0.0013858611, 0.012000353, -0.062903, -0.0204224, -0.12113313, 0.017942557, -0.073379934, 0.052201986, 0.35864577, 0.023564404) * go_1(-1.0, -1.0);
result += mat4(0.100115694, 0.19451359, 0.23252094, 0.19506809, -0.12470779, 0.0027281935, -0.17488572, -0.018721964, -0.15159339, 0.18457152, 0.057712987, -0.08191495, 0.19735703, 0.07326743, -0.28563106, 0.01642815) * go_1(-1.0, 0.0);
result += mat4(0.068062514, 0.28356665, 0.07377898, 0.42776972, 0.28725025, -0.13045293, -0.17525704, -0.05885591, -0.16676305, -0.2555945, -0.10078422, -0.053032875, 0.084470876, 0.06460686, 0.13824362, -0.05231353) * go_1(-1.0, 1.0);
result += mat4(0.22637829, -0.028969254, 0.1968254, -0.13331996, 0.038017053, -0.008854481, -0.2031639, 0.09237089, -0.3821112, 0.1108527, -0.11029933, -0.24542028, 0.22416145, -0.031492114, -0.19144306, -0.0996271) * go_1(0.0, -1.0);
result += mat4(0.10776744, 0.16363445, 0.14656505, -0.3737814, -0.06642015, 0.5616549, -0.008412252, -0.37266847, 0.12506576, -0.15329036, 0.037538245, -0.10810259, 0.01706349, 0.1813702, 0.035651788, -0.012786579) * go_1(0.0, 0.0);
result += mat4(-0.4023338, -0.2098614, -0.18285121, -0.02727653, 0.26107362, 0.041306913, -0.036515504, -0.045217298, -0.39958602, -0.21229339, -0.021053292, -0.13427502, 0.36178818, 0.20934913, 0.1500852, 0.2634554) * go_1(0.0, 1.0);
result += mat4(0.07794611, -0.25937587, -0.06822529, -0.056336135, 0.094220124, 0.21588847, -0.0455218, -0.10968329, -0.08068449, -0.31366697, 0.07799637, 0.24252681, 0.23963861, 0.13715535, 0.010329345, 0.09094301) * go_1(1.0, -1.0);
result += mat4(-0.20975718, -0.12550138, 0.14453574, -0.0020878632, -0.07153068, 0.3249998, -0.056577377, 0.18166828, 0.37204072, 0.17018336, 0.3752895, 0.32178587, 0.2571982, -0.27258632, -0.25971004, -0.40536007) * go_1(1.0, 0.0);
result += mat4(-0.3243907, -0.06300621, -0.09398436, -0.19549188, 0.14906861, 0.061537784, -0.055284478, 0.11281728, 0.12964857, 0.09979093, -0.1810159, -0.4104283, 0.05807971, -0.056371246, 0.08072554, 0.18479007) * go_1(1.0, 1.0);
result += vec4(-0.048888464, -0.0561434, 0.030690912, -0.030496685);
return result;
}
//!DESC Anime4K-v4.0-Restore-CNN-(M)-Conv-4x3x3x8
//!HOOK MAIN
//!BIND conv2d_4_tf
//!SAVE conv2d_5_tf
//!WIDTH conv2d_4_tf.w
//!HEIGHT conv2d_4_tf.h
//!COMPONENTS 4
#define go_0(x_off, y_off) (max((conv2d_4_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_1(x_off, y_off) (max(-(conv2d_4_tf_texOff(vec2(x_off, y_off))), 0.0))
vec4 hook() {
vec4 result = mat4(0.15332128, 0.027258258, 0.14900503, -0.15982795, 0.17021236, -0.51046044, -0.15287271, -0.058167327, 0.51826185, -0.34817994, 0.004513167, 0.05395769, 0.1990321, -0.049979225, 0.11391989, -0.16062729) * go_0(-1.0, -1.0);
result += mat4(0.033682905, 0.019728886, 0.19931756, 0.17381927, 0.2585768, -0.2124572, -0.014632459, 0.39779893, -0.1146207, -0.2396625, 0.08960277, 0.38345298, 0.25497693, 0.11692859, -0.14207517, 0.12667973) * go_0(-1.0, 0.0);
result += mat4(-0.14911255, 0.08910706, 0.16136818, 0.03914566, 0.24204038, -0.03607149, -0.4571109, 0.10802461, -0.0021356856, 0.00885878, 0.22297303, 0.2367231, 0.045177583, 0.11120606, -0.009971904, -0.059262395) * go_0(-1.0, 1.0);
result += mat4(0.24565999, -0.2261384, 0.47373205, 0.024613412, -0.10923052, 0.039027315, -0.42707404, -0.3783373, 0.3544573, -0.5468578, -0.27599156, -0.09455918, 0.18760219, -0.19082001, 0.030565469, 0.20589156) * go_0(0.0, -1.0);
result += mat4(0.1973198, -0.03433863, 0.059960485, 0.045642868, 0.1819595, -0.14460869, 0.1286175, 0.2067575, -0.042632047, -0.11842967, -0.11224446, -0.18764776, -0.19563004, 0.027425969, 0.24056377, 0.5949649) * go_0(0.0, 0.0);
result += mat4(0.055027682, 0.16331595, -0.2608588, 0.12545955, 0.4588985, 0.03642909, 0.22187738, 0.45190734, -0.001210133, -0.057651415, -0.061199043, 0.11935476, -0.049561135, 0.27509886, 0.13778673, -0.124914035) * go_0(0.0, 1.0);
result += mat4(-0.02257459, 0.27705106, 0.044165276, -0.26521233, 0.05982374, -0.2824302, 0.3171142, 0.08430561, -0.10155528, 0.16182268, -0.09183147, -0.19447176, 0.3295707, -0.50616395, -0.036964044, 0.23166709) * go_0(1.0, -1.0);
result += mat4(-0.0232342, 0.07299799, -0.18038079, -0.13672702, -0.108305976, 0.15024792, -0.19531927, 0.0870979, -0.26488534, 0.19481428, 0.10737945, -0.14573483, -0.33094683, 0.24155116, -0.09850332, 0.2797003) * go_0(1.0, 0.0);
result += mat4(-0.24089853, 0.19506595, 0.4799156, -0.058313113, 0.36212957, -0.44844806, 0.23864488, 0.15477742, -0.07795971, -0.0033861927, -0.11216164, 0.033454563, -0.25893036, 0.23793478, -0.15769425, -0.00033481256) * go_0(1.0, 1.0);
result += mat4(0.05772507, -0.1640253, -0.13499664, -0.20460358, -0.024399966, 0.14966168, -0.090857334, -0.039677754, 0.00036956606, -0.24236615, -0.053542696, -0.0049544116, 0.026651502, 0.39019194, -0.2742246, -0.061242323) * go_1(-1.0, -1.0);
result += mat4(-0.016323274, -0.036179908, 0.029965919, 0.11151491, -0.00016685206, -0.29573023, 0.17996423, -0.20145437, 0.1324275, -0.18442132, -0.24618152, 0.061780427, -0.02770517, 0.28452995, 0.39804098, -0.1174389) * go_1(-1.0, 0.0);
result += mat4(-0.025068847, -0.053328387, -0.27053785, 0.26866457, -0.09866204, 0.057677213, 0.01850112, -0.18014707, -0.13319959, -0.14411181, -0.26355243, -0.022209354, -0.05062645, -0.036771543, 0.13294417, -0.18458557) * go_1(-1.0, 1.0);
result += mat4(-0.046194963, 0.038230438, -0.08993043, -0.07236354, 0.11031123, -0.16504908, -0.09517036, -0.16459833, -0.5279925, 0.12686682, -0.05726125, 0.055361677, 0.31593755, 0.027328093, 0.001839602, 0.30581662) * go_1(0.0, -1.0);
result += mat4(0.08608678, 0.03168437, 0.007713377, -0.26140293, -0.1268983, 0.13395861, -0.069848835, -0.24080403, 0.018839337, -0.049821075, -0.21461345, -0.14168301, -0.0872339, 0.47096667, 0.022512507, 0.14860632) * go_1(0.0, 0.0);
result += mat4(0.06293673, 0.22462969, 0.045494985, 0.021673543, 0.18227446, -0.2956555, 0.08010543, -0.01919729, -0.012190269, 0.241983, -0.046537094, -0.40094566, -0.3853647, 0.1081711, -0.16926058, 0.16138376) * go_1(0.0, 1.0);
result += mat4(-0.14854589, -0.17625804, -0.10849075, 0.221543, 0.099971965, 0.13901573, 0.29464146, 0.020068526, 0.054358527, -0.10351705, -0.0062914286, 0.24127026, -0.16914125, 0.12729423, -0.18377453, -0.6452375) * go_1(1.0, -1.0);
result += mat4(0.12603393, -0.10986093, 0.2314103, 0.16915044, -0.13619255, -0.09349073, 0.20594226, -0.34507084, 0.19077192, 0.052500796, 0.07185645, 0.029082738, -0.015576321, 0.08254907, -0.5501743, -0.38495848) * go_1(1.0, 0.0);
result += mat4(0.09300796, -0.079218306, 0.46825135, -0.08735625, 0.06321122, 0.16234867, 0.042932414, -0.013057422, 0.09697148, 0.23457524, 0.19417483, -0.16804664, 0.18379296, 0.17770062, -0.050235, -0.059676602) * go_1(1.0, 1.0);
result += vec4(0.011169491, 0.032399546, 0.138099, 0.023857072);
return result;
}
//!DESC Anime4K-v4.0-Restore-CNN-(M)-Conv-4x3x3x8
//!HOOK MAIN
//!BIND conv2d_5_tf
//!SAVE conv2d_6_tf
//!WIDTH conv2d_5_tf.w
//!HEIGHT conv2d_5_tf.h
//!COMPONENTS 4
#define go_0(x_off, y_off) (max((conv2d_5_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_1(x_off, y_off) (max(-(conv2d_5_tf_texOff(vec2(x_off, y_off))), 0.0))
vec4 hook() {
vec4 result = mat4(-0.22753362, -0.08612073, 0.33140692, 0.08699529, -0.18788953, -0.056579117, -0.12905197, -0.06694621, 0.054559365, 0.15031597, -0.13430363, 0.021646025, 0.14884405, -0.0694291, 0.26149413, 0.11270503) * go_0(-1.0, -1.0);
result += mat4(0.17876762, -0.09637848, 0.11285323, 0.2004893, 0.1317187, -0.036162686, 0.17958368, -0.069625, 0.28760737, -0.12505141, 0.12760694, 0.047717955, -0.16811855, -0.16340709, 0.13278298, -0.08403954) * go_0(-1.0, 0.0);
result += mat4(-0.21917523, 0.079711854, -0.28642535, 0.2822416, 0.03001489, -0.014772918, -0.3487396, 0.10597145, -0.013841082, 0.17034237, 0.10810282, -0.08089695, -0.22184245, -0.59067357, 0.44113398, 0.13045649) * go_0(-1.0, 1.0);
result += mat4(-0.29906932, 0.013923749, 0.2031124, -0.11846688, -0.13953634, 0.08003455, -0.10164494, -0.21218559, 0.10563715, 0.31033117, -0.075903505, 0.047310907, -0.37824214, -0.14506383, 0.11866701, -0.21384487) * go_0(0.0, -1.0);
result += mat4(-0.1353849, 0.19258606, 0.063908584, -0.2043788, 0.27244982, 0.1665306, -0.29357895, -0.22441709, 0.18514316, -0.17840464, 0.20986097, 0.14351055, -0.057732623, 0.42166704, -0.23182064, -0.4957248) * go_0(0.0, 0.0);
result += mat4(-0.34830126, 0.109066755, -0.28285867, -0.048280068, -0.12290918, 0.04291651, -0.047484186, -0.03702595, 0.23047262, 0.09398974, 0.022467108, 0.08271034, 0.3066665, -0.54077, 0.057771873, 0.23194093) * go_0(0.0, 1.0);
result += mat4(-0.17731948, -0.3175927, 0.1452728, 0.09396786, -0.16433562, -0.01833653, -0.22345604, -0.04161193, -0.14827462, 0.18544114, -0.15544125, -0.06179007, 0.16989979, -0.20985202, 0.16391534, -0.09447268) * go_0(1.0, -1.0);
result += mat4(-0.053878862, -0.21034616, 0.023831524, 0.19772215, 0.31647214, 0.0126534775, -0.19130844, -0.049282108, -0.21446131, 0.067189045, 0.09117449, -0.25548774, 0.12109098, 0.22009392, -0.3924665, -0.13340388) * go_0(1.0, 0.0);
result += mat4(-0.16096684, -0.18495405, 0.10410178, 0.0015673033, -0.00183498, -0.044303037, -0.062745355, -0.090802394, 0.043269135, 0.06924481, -0.21367405, -0.14619029, 0.11555763, -0.20292862, 0.5799557, 0.14739846) * go_0(1.0, 1.0);
result += mat4(-0.21030277, -0.09578802, 0.013482288, -0.21484336, 0.12995781, 0.40431052, -0.3347856, -0.18183486, 0.15550353, -0.04402301, 0.4603779, 0.14874357, -0.07694621, -0.053523075, -0.19607326, -0.10850742) * go_1(-1.0, -1.0);
result += mat4(-0.2347211, 0.2697403, -0.0634794, -0.17925987, 0.17231455, 0.24999185, -0.5208536, -0.10491828, -0.233575, 0.52950364, 0.0038063182, -0.1380038, 0.022935199, 0.19369157, 0.14586553, 0.1938704) * go_1(-1.0, 0.0);
result += mat4(-0.10245223, 0.34150192, 0.25862157, -0.20165509, 0.5597771, 0.114510864, -0.122526556, -0.04010975, 0.1704679, -0.23335956, -0.16771887, -0.03783455, -0.056995615, 0.24153493, -0.08082429, -0.24210933) * go_1(-1.0, 1.0);
result += mat4(-0.103466526, 0.15278348, -0.30526164, -0.080755696, 0.103505425, 0.15862796, 0.14696524, -0.008358076, -0.09180311, -0.12505089, 0.28052542, -0.13551563, 0.07528779, -0.09636086, -0.10369617, 0.23656134) * go_1(0.0, -1.0);
result += mat4(-0.25752836, 0.099439755, -0.30716348, 0.035077725, 0.023509016, 0.23106368, 0.05277125, 0.34910464, 0.088015385, 0.26995596, 0.1390645, -0.40671825, 0.18096298, -0.100688554, 0.5492049, 0.2482101) * go_1(0.0, 0.0);
result += mat4(0.41411775, -0.107200556, -0.13813478, 0.13768874, 0.27137747, 0.06313619, -0.08522967, 0.03218302, -0.03166121, -0.3415683, -0.52242, -0.1741813, -0.36956537, 0.179129, -0.09742935, -0.11696616) * go_1(0.0, 1.0);
result += mat4(-0.07975504, 0.17964838, 0.37122533, 0.16064765, 0.14309953, 0.29473078, 0.0926391, -0.22333665, 0.34612748, -0.3387473, 0.0077308523, -0.07239449, 0.18522519, -0.21297298, 0.11493978, 0.16117814) * go_1(1.0, -1.0);
result += mat4(-0.17402779, 0.10023144, 0.11712206, 0.031971734, 0.18713303, 0.08736295, 0.013007052, -0.06943139, -0.20102951, -0.010721135, -0.2562522, 0.34877458, -0.13732676, -0.40258047, 0.25824392, 0.15720639) * go_1(1.0, 0.0);
result += mat4(0.044494305, 0.3296108, 0.0017603852, 0.09362289, 0.38839245, 0.40015858, -0.13395199, -0.044521853, -0.56266373, 0.251378, 0.5005789, -0.13106057, -0.18491416, -0.046887, 0.067797676, -0.14694957) * go_1(1.0, 1.0);
result += vec4(0.013687534, -0.08185164, -0.04755438, 0.290178);
return result;
}
//!DESC Anime4K-v4.0-Restore-CNN-(M)-Conv-3x1x1x56
//!HOOK MAIN
//!BIND MAIN
//!BIND conv2d_tf
//!BIND conv2d_1_tf
//!BIND conv2d_2_tf
//!BIND conv2d_3_tf
//!BIND conv2d_4_tf
//!BIND conv2d_5_tf
//!BIND conv2d_6_tf
//!SAVE MAIN
//!WIDTH conv2d_tf.w
//!HEIGHT conv2d_tf.h
#define g_0 (max((conv2d_tf_tex(conv2d_tf_pos)), 0.0))
#define g_1 (max(-(conv2d_tf_tex(conv2d_tf_pos)), 0.0))
#define g_2 (max((conv2d_1_tf_tex(conv2d_1_tf_pos)), 0.0))
#define g_3 (max(-(conv2d_1_tf_tex(conv2d_1_tf_pos)), 0.0))
#define g_4 (max((conv2d_2_tf_tex(conv2d_2_tf_pos)), 0.0))
#define g_5 (max(-(conv2d_2_tf_tex(conv2d_2_tf_pos)), 0.0))
#define g_6 (max((conv2d_3_tf_tex(conv2d_3_tf_pos)), 0.0))
#define g_7 (max(-(conv2d_3_tf_tex(conv2d_3_tf_pos)), 0.0))
#define g_8 (max((conv2d_4_tf_tex(conv2d_4_tf_pos)), 0.0))
#define g_9 (max(-(conv2d_4_tf_tex(conv2d_4_tf_pos)), 0.0))
#define g_10 (max((conv2d_5_tf_tex(conv2d_5_tf_pos)), 0.0))
#define g_11 (max(-(conv2d_5_tf_tex(conv2d_5_tf_pos)), 0.0))
#define g_12 (max((conv2d_6_tf_tex(conv2d_6_tf_pos)), 0.0))
#define g_13 (max(-(conv2d_6_tf_tex(conv2d_6_tf_pos)), 0.0))
vec4 hook() {
vec4 result = mat4(-0.08837163, -0.065234736, -0.034704313, 0.0, 0.021405501, 0.013663729, 0.019249594, 0.0, 0.05328863, 0.03580334, 0.046457592, 0.0, -0.12216048, 0.022547891, 0.016400825, 0.0) * g_0;
result += mat4(0.061996464, 0.05631466, 0.06808407, 0.0, -0.005013109, -0.0044589997, -0.032367796, 0.0, 0.016481603, 0.13721058, 0.14924648, 0.0, 0.020035887, -0.07250003, -0.08034037, 0.0) * g_1;
result += mat4(0.24078514, 0.081361525, 0.053420708, 0.0, -0.009353794, -0.051077116, -0.058007747, 0.0, -0.14071098, 0.01035966, 0.005308949, 0.0, -0.1489842, -0.06711817, -0.05552926, 0.0) * g_2;
result += mat4(-0.13002375, 0.012733757, 0.017821986, 0.0, 0.17767483, 0.20204604, 0.1751779, 0.0, 0.12804912, 0.07381453, 0.05655911, 0.0, 0.17044514, 0.07301451, 0.06523978, 0.0) * g_3;
result += mat4(-0.1170986, -0.05130371, -0.027939914, 0.0, -0.16645707, -0.121526904, -0.09471366, 0.0, -0.04143118, 0.026693767, 0.034615446, 0.0, -0.084318705, -0.064990036, -0.054324172, 0.0) * g_4;
result += mat4(0.12094524, 0.09518409, 0.07387219, 0.0, 0.062216382, 0.053228356, 0.031372335, 0.0, 0.072797105, 0.026258165, 0.009804673, 0.0, 0.120719045, 0.073281154, 0.056623302, 0.0) * g_5;
result += mat4(-0.11141495, -0.11566289, -0.10398725, 0.0, -0.0651895, -0.06820691, -0.054204144, 0.0, -0.032746475, -0.008849683, -0.007610222, 0.0, -0.024655705, -0.048778858, -0.041144755, 0.0) * g_6;
result += mat4(0.058090195, 0.07538767, 0.059722915, 0.0, 0.044788487, 0.04212742, 0.027502589, 0.0, 0.04892866, 0.015416752, 0.008312418, 0.0, -0.011864114, -0.0074752793, -0.0060824654, 0.0) * g_7;
result += mat4(0.043446552, 0.061971307, 0.05758086, 0.0, -0.06379154, -0.053758245, -0.047204215, 0.0, 0.016307736, 0.03423424, 0.030179083, 0.0, 0.041445345, 0.03843772, 0.033059113, 0.0) * g_8;
result += mat4(-0.003803544, 0.0008906116, -0.00059585314, 0.0, 0.102071285, 0.11485224, 0.10007254, 0.0, -0.074306004, -0.08803551, -0.07972321, 0.0, -0.030704215, -0.021514274, -0.009049376, 0.0) * g_9;
result += mat4(0.0066058086, 0.0011408008, 0.0016199006, 0.0, -0.03916473, -0.042929266, -0.04018418, 0.0, -0.03153446, -0.039413508, -0.034767237, 0.0, 0.113516055, 0.12577052, 0.113335624, 0.0) * g_10;
result += mat4(0.02655948, 0.041905303, 0.03861737, 0.0, 0.048471425, 0.049788587, 0.050447535, 0.0, 0.12092813, 0.13564217, 0.12613249, 0.0, -0.0023508538, 0.0012828974, 0.0028730957, 0.0) * g_11;
result += mat4(0.0084758485, 0.008800083, 0.008206044, 0.0, -0.056123603, -0.06610845, -0.060320783, 0.0, -0.081793964, -0.101638645, -0.096699014, 0.0, -0.04402356, -0.04177539, -0.03829645, 0.0) * g_12;
result += mat4(0.10676299, 0.118409514, 0.10618478, 0.0, -0.05880252, -0.06488367, -0.06432695, 0.0, 0.019221924, 0.017602798, 0.017413978, 0.0, -0.07512528, -0.080483615, -0.066218294, 0.0) * g_13;
result += vec4(-0.010478934, -0.008364784, -0.010246552, 0.0);
return result + MAIN_tex(MAIN_pos);
}
================================================
FILE: assets/shaders/Anime4K_Restore_CNN_S.glsl
================================================
// MIT License
// Copyright (c) 2019-2021 bloc97
// All rights reserved.
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//!DESC Anime4K-v4.0-Restore-CNN-(S)-Conv-4x3x3x3
//!HOOK MAIN
//!BIND MAIN
//!SAVE conv2d_tf
//!WIDTH MAIN.w
//!HEIGHT MAIN.h
//!COMPONENTS 4
#define go_0(x_off, y_off) (MAIN_texOff(vec2(x_off, y_off)))
vec4 hook() {
vec4 result = mat4(-0.19288683, -0.21397883, 0.111997396, -0.04791413, -0.26682988, -0.06144587, -0.03601853, -0.16693151, 0.038494494, -0.16651472, 0.147657, -0.083003886, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, -1.0);
result += mat4(-0.14286195, 0.08746566, -0.40107322, 0.12390977, -0.33392772, -0.18703035, -0.21326795, 0.04780781, -0.15155545, -0.0010025925, -0.1554875, -0.10676251, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 0.0);
result += mat4(0.28095165, 0.022872915, -0.21342312, -0.29982176, 0.025937587, -0.055012174, -0.33779636, 0.0015666655, 0.076416336, 0.06656033, -0.1557806, 0.1078894, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 1.0);
result += mat4(-0.31584853, 0.07527119, 0.30713862, -0.34014285, -0.50103146, -0.07217874, 0.512807, -0.09597398, -0.32097813, -0.051580857, -0.022466356, 0.01148551, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, -1.0);
result += mat4(-0.026032459, -0.04193211, 0.37703893, -0.031916667, -0.27421117, 1.0906446, -0.049654085, -0.19814016, 0.07819544, 0.06003738, 0.1405805, -0.0064135445, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 0.0);
result += mat4(0.041450135, 0.11319654, -0.23237701, 0.08443178, 0.53344345, 0.30857387, -0.057264958, -0.1575803, 0.2325609, -0.027797326, -0.04544767, -0.18720597, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 1.0);
result += mat4(0.2531829, -0.074966915, -0.27800754, -0.3146097, 0.20126024, -0.5380133, -0.15082566, -0.19021043, 0.29951036, 0.17123336, -0.01681872, -0.12574998, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, -1.0);
result += mat4(0.25203633, 0.19882993, 0.14906439, 0.13593598, 0.40712556, 0.084902965, 0.42969635, 0.2961132, -0.057267334, -0.030388135, 8.8084314e-05, 0.0210724, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 0.0);
result += mat4(-0.13459359, -0.12199573, 0.12591946, 0.24736497, 0.2033463, -0.09388599, -0.094370656, 0.1071285, -0.18479438, -0.066625565, 0.08279283, 0.20130983, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 1.0);
result += vec4(-0.011108127, -0.07481861, 0.07640154, 0.4964964);
return result;
}
//!DESC Anime4K-v4.0-Restore-CNN-(S)-Conv-4x3x3x8
//!HOOK MAIN
//!BIND conv2d_tf
//!SAVE conv2d_1_tf
//!WIDTH conv2d_tf.w
//!HEIGHT conv2d_tf.h
//!COMPONENTS 4
#define go_0(x_off, y_off) (max((conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_1(x_off, y_off) (max(-(conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))
vec4 hook() {
vec4 result = mat4(-0.056432575, 0.0028165397, -0.026325442, -0.14802271, 0.16885762, -0.062179096, -0.2332292, 0.17513658, -0.08011296, 0.02947316, 0.014771492, -0.17946689, 0.026012989, -0.09823925, 0.036625937, -0.06924322) * go_0(-1.0, -1.0);
result += mat4(-0.13571467, 0.09831142, 0.12911566, 0.06305893, -0.07188695, -0.20161287, 0.3858435, -0.21069056, -0.12294444, -0.1404628, -0.022659872, 0.23008968, 0.10969853, 0.17640765, 0.39796907, 0.20413099) * go_0(-1.0, 0.0);
result += mat4(-0.0061665224, 0.055102807, -0.0059629944, -0.021429887, 0.061626043, 0.16898955, -0.21215646, 0.16510476, 0.2238265, 0.19429931, 0.09874656, 0.06828208, -0.122404456, -0.00026717107, -0.28203064, -0.29979932) * go_0(-1.0, 1.0);
result += mat4(-0.22735378, 0.14538136, 0.11549746, 0.194148, -0.09841722, -0.0661309, 0.348576, -0.017375294, -0.044078812, 0.1298332, 0.04793373, -0.30687734, 0.08353025, 0.083519086, 0.10766399, 0.31796935) * go_0(0.0, -1.0);
result += mat4(0.048365135, -0.17566709, -0.33212858, -0.052667376, -0.26443407, -0.010216014, 0.1573303, 0.05725314, 0.08140953, -0.09664591, 0.076109104, -0.026773714, 0.07732627, 0.10188082, -0.28266954, -0.16230233) * go_0(0.0, 0.0);
result += mat4(0.29931107, 0.117944, -0.10414009, 0.12795551, 0.12576093, 0.17082554, -0.15803693, 0.13430743, -0.025801308, -0.10797019, 0.0721032, 0.2825884, -0.11025257, 0.12798019, 0.081827976, -0.050441865) * go_0(0.0, 1.0);
result += mat4(-0.11827391, 0.08306765, -0.3430314, 0.07898041, -0.023839617, -0.019507334, 0.23176382, -0.40992323, 0.09411734, 0.38415068, -0.25845516, -0.29984522, 0.1470966, -0.0684779, -0.07071314, -0.026773235) * go_0(1.0, -1.0);
result += mat4(0.19091596, 0.082110435, -0.5266589, -0.1744098, -0.015838385, -0.046316292, 0.023171103, -0.03731331, 0.2642396, 0.31824252, -0.041754793, -0.09525519, -0.14696182, 0.052168854, 0.039857205, -0.027555354) * go_0(1.0, 0.0);
result += mat4(0.15207373, 0.09845733, 0.0142631065, 0.096375965, 0.06089903, 0.17902578, -0.42391995, 0.22475442, 0.016356342, -0.06277531, -0.12173141, -0.18635495, -0.0013459618, 0.15725887, 0.019310836, 0.20293565) * go_0(1.0, 1.0);
result += mat4(-0.18395247, 0.30672902, 0.09034339, 0.1821889, -0.0419004, -0.2169228, -0.14052129, 0.11006559, 0.1709272, 0.51062274, 0.13758625, -0.2242552, -0.030382963, 0.3357568, -0.26491287, 0.02501938) * go_1(-1.0, -1.0);
result += mat4(0.040511727, 0.12523083, -0.27318433, 0.08388512, 0.25354835, 0.3404216, -0.2632471, -0.17784123, 0.2732347, 0.4468553, 0.084667034, -0.1856242, 0.034099877, -0.00954992, -0.32751867, -0.062207516) * go_1(-1.0, 0.0);
result += mat4(0.17564747, 0.11645554, -0.16362113, 0.105654195, -0.2762563, -0.1413764, 0.23264363, -0.14000498, 0.095402054, 0.0715738, -0.19346157, -0.028285999, 0.009799127, 0.04059529, 0.19688335, 0.1282381) * go_1(-1.0, 1.0);
result += mat4(0.23575781, -0.11446148, -0.20504695, 0.035568226, 0.36890212, -0.85968876, -0.18545328, 0.33796397, -0.30916876, -0.10445518, -0.3046253, 0.33271998, -0.06263589, -0.2160114, -0.16383372, -0.31173357) * go_1(0.0, -1.0);
result += mat4(0.20469664, 0.4039374, -0.070057206, 0.030353077, 0.39843914, -0.15490077, -0.24476516, 0.38238233, -0.21809858, 0.23496576, -0.051794037, 0.033664484, -0.14411364, -0.2515329, 0.124655396, -0.05818785) * go_1(0.0, 0.0);
result += mat4(-0.09065731, -0.16787091, 0.013269188, 0.23687351, -0.41504318, -0.048163068, 0.31760025, -0.33648986, 0.29752317, 0.2926866, 0.14408836, -0.33382463, -0.15873958, -0.121961035, 0.11797893, 0.09000567) * go_1(0.0, 1.0);
result += mat4(0.13356976, 0.013763947, 0.012169505, -0.109594524, 0.03417223, 0.7031121, 0.65146804, 0.5250268, -0.50132495, -0.419648, 0.2940041, 0.83051753, -0.17595838, 0.1633008, -0.018587278, 0.079596795) * go_1(1.0, -1.0);
result += mat4(0.07570128, -0.1581438, 0.03904949, 0.14890033, -0.054611947, 0.17469402, -0.44252598, 0.036181703, -0.4981031, -0.37507218, -0.18466389, 0.2645845, 0.25189674, -0.025896115, 0.034307647, -0.020462232) * go_1(1.0, 0.0);
result += mat4(-0.11645865, 0.02296537, 0.040909223, 0.015069485, 0.062284566, -0.22526766, 0.09241534, -0.32623053, 0.18208642, 0.3954284, 0.2884468, -0.25137675, -0.037232924, -0.10185309, -0.17956531, 0.018966453) * go_1(1.0, 1.0);
result += vec4(-0.16371979, -0.024620198, -0.035754893, 0.04176776);
return result;
}
//!DESC Anime4K-v4.0-Restore-CNN-(S)-Conv-4x3x3x8
//!HOOK MAIN
//!BIND conv2d_1_tf
//!SAVE conv2d_2_tf
//!WIDTH conv2d_1_tf.w
//!HEIGHT conv2d_1_tf.h
//!COMPONENTS 4
#define go_0(x_off, y_off) (max((conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_1(x_off, y_off) (max(-(conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))
vec4 hook() {
vec4 result = mat4(0.01921286, -0.26684764, -0.12663573, 0.31641877, -0.25313398, 0.12264074, 0.58750325, -0.14084283, 0.5837018, -0.042300556, -0.20435576, -0.009954825, 0.060783498, 0.05540401, 0.2205112, -0.06578902) * go_0(-1.0, -1.0);
result += mat4(-0.21930243, -0.03774968, 0.22615197, 0.18338196, 0.011201461, -0.271034, 0.00573116, -0.12248194, 0.47990513, 0.2982416, -0.1087603, -0.050099242, -0.07620939, -0.07148229, 0.03691984, -0.16796488) * go_0(-1.0, 0.0);
result += mat4(-0.14962853, -0.053769328, 0.02387081, 0.22002189, 0.052237745, -0.26160842, -0.08603077, 0.012542448, 0.08119985, 0.075785555, -0.33437458, -0.43373227, -0.13206963, -0.08759176, -0.03288923, -0.09799959) * go_0(-1.0, 1.0);
result += mat4(-0.1305593, -0.5974288, 0.06058367, 0.08406488, 0.013692483, 0.06646377, 0.16469325, 0.08990975, 0.42217395, -0.11289523, -0.06165009, 0.48556912, -0.15702641, -0.19922857, -0.0035429662, -0.0022089656) * go_0(0.0, -1.0);
result += mat4(-0.1964807, 0.038099788, 0.21587034, 0.039734077, -0.07063389, 0.11604167, -0.24558097, -0.08900199, -0.7684516, -0.1037487, -0.09380674, 0.33144563, -0.16653742, 0.0028585843, -0.33774406, -0.0528696) * go_0(0.0, 0.0);
result += mat4(-0.27298656, -0.05665099, 0.09661685, 0.19780266, 0.1025106, -0.22055034, -0.21218458, -0.040628925, 0.0095010325, 0.13118382, -0.42582452, -0.22197723, 0.21006055, -0.06189587, -0.15285942, -0.09526762) * go_0(0.0, 1.0);
result += mat4(-0.14494462, -0.046788953, 0.065877035, 0.09911713, 0.35096622, 0.16682479, 0.028363144, 0.36037162, 0.29413632, 0.28212717, -0.025364442, -0.3406269, 0.047262143, -0.11892685, -0.008032766, 0.29743317) * go_0(1.0, -1.0);
result += mat4(-0.15191558, -0.36980554, 0.14555687, 0.0043930537, -0.012661432, 0.15737776, -0.115250416, 0.10324491, 0.24491951, -0.15575431, -0.27802598, 0.21959937, 0.18063772, 0.4455559, -0.09693302, 0.33382267) * go_0(1.0, 0.0);
result += mat4(0.2717801, 0.13452889, 0.14105384, 0.16324317, -0.40111846, 0.1154301, -0.0076733204, -0.09697362, 0.44306824, -0.02831414, -0.2153124, -0.12075326, 0.060776163, 0.30347148, -0.0036976219, -0.12070682) * go_0(1.0, 1.0);
result += mat4(-0.39780128, -0.29875937, -0.12952097, 0.080333896, 0.07520163, 0.021689568, -0.23121156, -0.038140096, -0.1593877, 0.017156163, -0.06038025, 0.009244022, -0.13917233, 0.30957314, 0.243109, -0.104947075) * go_1(-1.0, -1.0);
result += mat4(-0.07965157, 0.06776501, -0.13288979, 0.005851189, -0.08768168, -0.03689969, 0.12034646, 0.22441491, 0.14453568, -0.17648841, -0.3378289, -0.018329712, 0.11722939, -0.34161824, 0.08424494, -0.01400687) * go_1(-1.0, 0.0);
result += mat4(0.08153887, 0.07222914, -0.14663404, -0.038526025, -0.07385973, 0.18440577, 0.35890242, 0.17084727, 0.26345527, 0.15280858, -0.007446105, -0.024403179, -0.30336383, -0.22978698, 0.11612946, -0.23614909) * go_1(-1.0, 1.0);
result += mat4(-0.07447396, 0.09023449, -0.13798, -0.086943336, -0.30787337, 0.15087669, 0.14418626, -0.03371195, 0.048989657, -0.13075387, -0.13458036, -0.059836224, 0.06495196, 0.269715, 0.3674355, 0.38956037) * go_1(0.0, -1.0);
result += mat4(0.34981915, -0.048779126, 0.31717536, 0.38080826, -0.20149232, -0.82969636, -0.10167862, 0.6382858, 0.25976858, 0.4370118, -0.04724865, -0.10014156, 0.19380626, -0.080370255, 0.09578106, -0.035166856) * go_1(0.0, 0.0);
result += mat4(-0.026443917, 0.4132611, 0.01822534, 0.12742202, -0.26652107, -0.2996705, 0.30905882, 0.07989903, 0.38249823, 0.21486135, 0.025314959, -0.14717339, -0.13344015, -0.32088286, -0.2833883, -0.30973712) * go_1(0.0, 1.0);
result += mat4(0.021517841, 0.006556378, 0.2025686, -0.12044382, -0.38583103, -0.0027515136, -0.06556736, -0.097090125, 0.04676486, -0.11954886, -0.051612873, 0.07831412, -0.18823163, -0.16542958, 0.04245155, 0.6437998) * go_1(1.0, -1.0);
result += mat4(-0.39475346, -0.2936861, 0.26768062, -0.28151843, 0.21935691, 0.2101108, -0.15455097, 0.19548604, 0.09188909, -0.020147726, 0.103328265, -0.12574542, -0.34167948, 0.07523185, -0.17669058, 0.62446547) * go_1(1.0, 0.0);
result += mat4(-0.37661025, -0.29630858, 0.05451026, 0.1611643, 0.14079669, -0.2170294, -0.038716137, 0.13514164, -0.21235192, -0.07860726, -0.005749412, 0.025625167, -0.13297133, 0.33012658, -0.27434957, -0.18416783) * go_1(1.0, 1.0);
result += vec4(-0.0036821906, -0.050239526, -0.01355402, 0.00048220603);
return result;
}
//!DESC Anime4K-v4.0-Restore-CNN-(S)-Conv-3x3x3x8
//!HOOK MAIN
//!BIND MAIN
//!BIND conv2d_2_tf
//!SAVE MAIN
//!WIDTH conv2d_2_tf.w
//!HEIGHT conv2d_2_tf.h
#define go_0(x_off, y_off) (max((conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_1(x_off, y_off) (max(-(conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))
vec4 hook() {
vec4 result = mat4(0.15873, 0.17989138, 0.14648493, 0.0, -0.017379675, -0.017363746, -0.019855022, 0.0, 0.009670625, 0.0070157526, 0.0075994316, 0.0, 0.025388412, 0.027231036, 0.024052646, 0.0) * go_0(-1.0, -1.0);
result += mat4(0.048195973, 0.041760173, 0.037366055, 0.0, -0.115950756, -0.12887983, -0.12535639, 0.0, 0.032125086, 0.03397254, 0.032950625, 0.0, 0.01223746, 0.020822672, 0.0161561, 0.0) * go_0(-1.0, 0.0);
result += mat4(0.0890567, 0.094453335, 0.09014035, 0.0, 0.016081346, 0.017434116, 0.020783134, 0.0, -0.011775135, -0.010094134, -0.018522855, 0.0, 0.072103254, 0.07940666, 0.065876864, 0.0) * go_0(-1.0, 1.0);
result += mat4(-0.04841196, -0.06963968, -0.056574684, 0.0, 0.10912542, 0.11813441, 0.10643838, 0.0, -0.013013885, -0.01562045, -0.013802797, 0.0, 0.037505716, 0.04352026, 0.04645123, 0.0) * go_0(0.0, -1.0);
result += mat4(-0.3472869, -0.36243078, -0.33530185, 0.0, 0.23654196, 0.2305048, 0.22150646, 0.0, -0.045226905, -0.041799217, -0.042511635, 0.0, -0.10267792, -0.1123385, -0.10845448, 0.0) * go_0(0.0, 0.0);
result += mat4(0.011987401, 0.012285043, 0.007813165, 0.0, -0.15911353, -0.17523928, -0.1535267, 0.0, 0.15675929, 0.16531634, 0.15948962, 0.0, -0.09240023, -0.09513292, -0.084187366, 0.0) * go_0(0.0, 1.0);
result += mat4(0.069052905, 0.07278333, 0.0756627, 0.0, -0.012180326, -0.018794727, -0.031050753, 0.0, -0.044663202, -0.04362803, -0.038904265, 0.0, -0.008540197, -0.011201734, -0.01556625, 0.0) * go_0(1.0, -1.0);
result += mat4(-0.08261173, -0.09042543, -0.07589266, 0.0, 0.043515377, 0.045066774, 0.04037769, 0.0, -0.06262993, -0.07469342, -0.058593787, 0.0, 0.026696987, 0.028740842, 0.037405368, 0.0) * go_0(1.0, 0.0);
result += mat4(0.07975598, 0.09597654, 0.08997132, 0.0, -0.07844719, -0.07880916, -0.06835411, 0.0, 0.05668995, 0.050163813, 0.053357534, 0.0, -0.020040333, -0.019867316, -0.01907621, 0.0) * go_0(1.0, 1.0);
result += mat4(-0.017078733, -0.017393313, -0.008266595, 0.0, -0.0033478448, -0.0027439648, -0.0042334674, 0.0, -0.06354017, -0.062058125, -0.04652064, 0.0, -0.010787706, -0.0062706997, -0.007573461, 0.0) * go_1(-1.0, -1.0);
result += mat4(-0.019895451, -0.016341688, -0.008712399, 0.0, 0.026231976, 0.023955572, 0.0216376, 0.0, -0.061950512, -0.05481285, -0.05261985, 0.0, -0.018804235, -0.016235247, -0.0131616965, 0.0) * go_1(-1.0, 0.0);
result += mat4(-0.055628926, -0.063315354, -0.057192408, 0.0, -0.0256364, -0.028660972, -0.02937357, 0.0, -0.017604912, -0.020851422, -0.016070362, 0.0, -0.0870202, -0.0832279, -0.07525406, 0.0) * go_1(-1.0, 1.0);
result += mat4(0.062738225, 0.07106593, 0.061644047, 0.0, -0.06068257, -0.06983662, -0.066070385, 0.0, 0.024919355, 0.03227179, 0.028569462, 0.0, -0.07866227, -0.098967604, -0.092128105, 0.0) * go_1(0.0, -1.0);
result += mat4(0.040397774, 0.047241107, 0.03962998, 0.0, -0.09112752, -0.10057507, -0.09301817, 0.0, 0.10833967, 0.101835825, 0.10027467, 0.0, 0.27189335, 0.27433604, 0.26781923, 0.0) * go_1(0.0, 0.0);
result += mat4(-0.044211388, -0.042373534, -0.03658007, 0.0, 0.113148406, 0.12423258, 0.107804194, 0.0, -0.17081551, -0.18562958, -0.17475435, 0.0, 0.09636739, 0.10763415, 0.093332425, 0.0) * go_1(0.0, 1.0);
result += mat4(-0.03798545, -0.047811143, -0.050768293, 0.0, 0.018775463, 0.026812987, 0.03452908, 0.0, 0.0055677597, 0.0039081173, -0.0017878668, 0.0, -0.10728597, -0.12618187, -0.109045394, 0.0) * go_1(1.0, -1.0);
result += mat4(0.06359783, 0.064184755, 0.04934199, 0.0, -0.009819327, -0.006616115, -0.007431496, 0.0, 0.025055679, 0.024787048, 0.017360551, 0.0, -0.047140837, -0.061695747, -0.06440822, 0.0) * go_1(1.0, 0.0);
result += mat4(0.060199022, 0.06482763, 0.059514645, 0.0, 0.026998974, 0.028776823, 0.024897143, 0.0, 0.17968474, 0.19337215, 0.16760105, 0.0, 0.0075838566, 0.010503482, 0.011993149, 0.0) * go_1(1.0, 1.0);
result += vec4(-0.0052927984, -0.0060193934, -0.0048643993, 0.0);
return result + MAIN_tex(MAIN_pos);
}
================================================
FILE: assets/shaders/Anime4K_Restore_CNN_VL.glsl
================================================
// MIT License
// Copyright (c) 2019-2021 bloc97
// All rights reserved.
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x3
//!HOOK MAIN
//!BIND MAIN
//!SAVE conv2d_tf
//!WIDTH MAIN.w
//!HEIGHT MAIN.h
//!COMPONENTS 4
#define go_0(x_off, y_off) (MAIN_texOff(vec2(x_off, y_off)))
vec4 hook() {
vec4 result = mat4(0.1690102, -0.2560719, 0.39658326, -0.3679659, -0.27616683, -0.35619372, -0.3748396, 0.08430813, -0.29574734, -0.31511316, -0.09773105, 0.13616018, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, -1.0);
result += mat4(-0.1326393, -0.259433, 0.025070239, 0.58914864, -0.036478516, 0.30723435, 0.007458902, 0.012962684, 0.2493056, 0.13007334, -0.08448256, -0.38414413, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 0.0);
result += mat4(-0.11539356, 0.35253766, 0.26143202, 0.2760807, -0.09371543, -0.028165473, -0.028452158, -0.27050856, 0.06718067, -0.0056619495, -0.17654495, 0.17288211, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 1.0);
result += mat4(-0.16145481, -0.3204927, -0.54317135, 0.11830119, 0.49315026, 0.12008072, 0.50857407, -0.30382085, 0.25807253, 0.020755528, 0.29388228, 0.106109895, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, -1.0);
result += mat4(-0.22728722, 0.50484747, -0.07904469, 0.33114597, 0.50306976, -0.22760947, 0.14773269, 0.17628263, 0.14788547, -0.08223464, -0.10880935, -0.3151985, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 0.0);
result += mat4(0.3414351, 0.057279214, -0.14419858, 0.09761111, -0.11794496, 0.021717256, -0.22750235, 0.13986664, -0.38932344, 0.28996095, 0.3773904, 0.13175532, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 1.0);
result += mat4(0.1376552, -0.19587159, -0.35147396, -0.097646296, 0.1686707, -0.14385861, 0.031198, 0.12383533, -0.23089902, 0.08707301, 0.3362293, -0.100579016, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, -1.0);
result += mat4(-0.056774966, 0.047585852, -0.36395878, -0.20211312, 0.4077735, 0.12631284, 0.39813092, -0.033365678, 0.2307249, -0.09131807, 0.20823865, 0.31084216, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 0.0);
result += mat4(-0.12456089, 0.09755632, 0.31490886, -0.06579996, -0.13386595, 0.07564795, -0.26605195, -0.075180635, -0.11182657, 0.06757017, -0.14351276, -0.16828312, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 1.0);
result += vec4(-0.046043985, 0.055581126, -0.08791638, -0.13022089);
return result;
}
//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x3
//!HOOK MAIN
//!BIND MAIN
//!SAVE conv2d_tf1
//!WIDTH MAIN.w
//!HEIGHT MAIN.h
//!COMPONENTS 4
#define go_0(x_off, y_off) (MAIN_texOff(vec2(x_off, y_off)))
vec4 hook() {
vec4 result = mat4(-0.15485518, -0.29363206, -0.22610365, -0.14291525, -0.45240572, -0.18319772, -0.12209436, 0.15031648, 0.09878383, 0.06711082, 0.25763842, -0.084633484, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, -1.0);
result += mat4(-0.10204406, 0.16167697, 0.22371867, -0.37947702, -0.24476196, -0.038824454, 0.060157117, 0.15764871, -0.08072927, -0.2210841, -0.31835055, 0.009979876, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 0.0);
result += mat4(0.20506924, 0.21132155, -0.0922578, -0.07430473, 0.14529926, 0.20549752, 0.0077948375, 0.13246094, -0.32353187, 0.21074104, 0.092629515, 0.17590871, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 1.0);
result += mat4(0.04125819, -0.44050243, 0.23729716, 0.3218237, 0.12943116, -0.011674174, 0.10390632, 0.027775545, -0.20308031, -0.16904089, -0.2121676, -0.022515794, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, -1.0);
result += mat4(0.09664124, 0.20127031, 0.60345304, 0.16697013, 0.23093723, -0.38116834, 0.109695725, 0.0007595324, 0.4092646, 0.009624758, 0.11229678, 0.25326383, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 0.0);
result += mat4(0.014879592, 0.19204311, 0.07102085, -0.7312604, 0.34860876, 0.3429918, -0.027331594, 0.27636307, 0.1342437, 0.107820466, -0.12645108, 0.21081445, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 1.0);
result += mat4(-0.12687613, -0.09247973, -0.25973785, 0.4350873, -0.18987224, 0.028678741, -0.0903819, -0.63974863, 0.205591, 0.11308998, 0.18458389, -0.4149041, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, -1.0);
result += mat4(0.34691808, -0.025498383, 0.3428986, 0.21663484, 0.23404741, -0.1725327, -0.0036315925, -0.13299675, -0.1873967, 0.031331502, -0.08785591, -0.0013278709, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 0.0);
result += mat4(-0.35846514, 0.048703704, -0.104165934, 0.16529736, -0.15378916, 0.26030356, -0.07134151, 0.03692383, -0.15807101, -0.18885155, 0.044707954, -0.11444462, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 1.0);
result += vec4(-0.0022791293, -0.024132347, -0.57621074, 0.028573977);
return result;
}
//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16
//!HOOK MAIN
//!BIND conv2d_tf
//!BIND conv2d_tf1
//!SAVE conv2d_1_tf
//!WIDTH conv2d_tf.w
//!HEIGHT conv2d_tf.h
//!COMPONENTS 4
#define go_0(x_off, y_off) (max((conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_1(x_off, y_off) (max((conv2d_tf1_texOff(vec2(x_off, y_off))), 0.0))
#define go_2(x_off, y_off) (max(-(conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_3(x_off, y_off) (max(-(conv2d_tf1_texOff(vec2(x_off, y_off))), 0.0))
vec4 hook() {
vec4 result = mat4(0.010346764, 0.07230188, -0.24734616, -0.09937907, 0.02228549, -0.19550583, -0.019540425, -0.1037373, 0.033996485, -0.075554, -0.20228972, 0.07090153, -0.09194035, -0.058972966, 0.1768268, 0.27517542) * go_0(-1.0, -1.0);
result += mat4(0.020078976, 0.12433655, -0.1620775, 0.036401592, 0.079748705, 0.11660013, 0.17917652, -0.017513236, -0.18936846, 0.24478136, -0.45726213, -0.045004416, -0.08295188, 0.067733586, -0.080548316, 0.2744211) * go_0(-1.0, 0.0);
result += mat4(0.024916803, 0.27562472, 0.043771956, -0.012240604, 0.0786355, 0.042651594, 0.16049327, -0.14577515, -0.032735053, 0.17658092, 0.16382934, -0.02337374, 0.11551492, 0.056343183, -0.17930213, 0.14259394) * go_0(-1.0, 1.0);
result += mat4(0.20010485, 0.06747722, -0.19026905, 0.11013709, 0.13062745, -0.044626113, -0.0062261797, 0.2189639, 0.1403497, -0.022713251, -0.19452858, -0.010305412, -0.06407589, 0.09836748, 0.025805516, 0.23430973) * go_0(0.0, -1.0);
result += mat4(-0.14664203, 0.034910418, 0.024714258, -0.066872925, -0.15717538, -0.14179383, -0.14091893, 0.05859166, 0.18919097, -0.18544437, -0.09068573, -0.08615929, -0.051434122, 0.2170678, 0.18409058, -0.17461225) * go_0(0.0, 0.0);
result += mat4(-0.11354446, 0.10745854, 0.2682663, 0.05949201, -0.10695986, 0.1407851, -0.03551388, 0.10691649, -0.17148238, -0.38287184, 0.2074456, 0.11828914, 0.048535194, 0.1464864, -0.18169662, -0.14074169) * go_0(0.0, 1.0);
result += mat4(0.22160622, -0.1513045, -0.053284165, 0.033202525, 0.15574448, -0.043640967, -0.0093824165, -0.0019965349, -0.097964935, -0.08289824, 0.08239996, 0.07868361, 0.05731752, -0.20441617, -0.013016076, -0.253108) * go_0(1.0, -1.0);
result += mat4(-0.031249097, -0.2272863, 0.23573665, 0.03357689, 0.011395065, -0.10885564, -0.06287508, -0.031719524, 0.10331069, 0.17560169, 0.18303394, 0.022961004, -0.17011635, -0.24371737, 0.10678694, -0.3222825) * go_0(1.0, 0.0);
result += mat4(-0.1275465, -0.08844758, 0.10994917, -0.00910273, 0.09393154, 0.03894992, 0.14367905, -0.11811715, -0.09077633, -0.015776094, 0.27427456, -0.13283503, 0.18724327, -0.08139094, 0.04933602, -0.051852766) * go_0(1.0, 1.0);
result += mat4(-0.06764611, -0.27426586, 0.12045272, 0.09410856, -0.14258035, 0.11802992, -0.09093882, 0.0022018093, 0.4590643, 0.046258576, -0.07827223, 0.448011, -0.103631735, -0.016930219, -0.15421398, 0.11045997) * go_1(-1.0, -1.0);
result += mat4(-0.17295076, 0.00151352, 0.14938255, 0.08336512, -0.07496541, -0.07561223, -0.0846474, 0.14979269, -0.09142163, 0.23925088, -0.015199518, -0.37749895, -0.20636298, -0.022585187, -0.20371509, 0.0745308) * go_1(-1.0, 0.0);
result += mat4(0.06458832, -0.009722021, -0.123604394, 0.06548835, -0.3039139, -0.022024399, 0.05297587, -0.0626883, 0.23556642, 0.1516464, -0.07004877, -0.1845364, -0.05918428, 0.19158973, -0.14983447, 0.030489758) * go_1(-1.0, 1.0);
result += mat4(0.36604697, 0.17516142, -0.10853731, -0.22694224, -0.107650936, 0.23013335, 0.094055794, -0.17047717, -0.3006048, -0.08621717, -0.18815655, -0.03570218, 0.09676118, -0.017718751, 0.059138596, 0.073388465) * go_1(0.0, -1.0);
result += mat4(-0.12791575, 0.101956226, 0.13091874, -0.046373338, 0.04955811, -0.04030444, 0.13869923, -0.046699073, -0.42611042, -0.7173929, 0.052184317, 0.6178025, -0.02929954, -0.07638965, -0.15000828, 0.030710017) * go_1(0.0, 0.0);
result += mat4(0.057806686, 0.20842272, -0.20148766, 0.006666912, 0.13356528, -0.45265228, -0.07354092, 0.21447696, 0.019552143, -0.13645506, 0.14643854, -0.0071413796, -0.15487236, -0.002250615, 0.30622452, 0.0033902125) * go_1(0.0, 1.0);
result += mat4(0.06896002, 0.24397352, -0.06479052, 0.20676947, -0.24259068, 0.055320013, -0.09032122, -0.11222854, -0.08982342, -0.114818625, -0.06399291, -0.3024516, -0.06302166, -0.1925528, 0.03458982, 0.028828239) * go_1(1.0, -1.0);
result += mat4(0.09764086, 0.09599894, -0.0073313303, 0.14418933, -0.045712367, 0.12657364, 0.04620374, -0.069778584, 0.30047333, -0.012418192, 0.15516461, -0.18087754, 0.08178273, 0.14262857, -0.01741533, -0.12509112) * go_1(1.0, 0.0);
result += mat4(0.04697884, -0.1506804, 0.031823065, 0.13397239, -0.18396698, 0.10681781, -0.29586303, -0.0039136545, 0.17560847, -0.12486726, -0.018646788, -0.20688744, -0.030614454, -0.0527634, 0.23593572, -0.10542146) * go_1(1.0, 1.0);
result += mat4(-0.19182229, -0.32615846, 0.26283535, -0.1371942, -0.071202695, 0.12056063, -0.11450658, -0.27711076, -0.42096004, 0.0014352369, 0.1559669, -0.14464542, -0.17973948, 0.079166576, -0.12501791, -0.20623216) * go_2(-1.0, -1.0);
result += mat4(0.12469872, 0.32190827, -0.059510354, 0.1393449, -0.12845798, -0.019571869, -0.22630808, -0.14031963, 0.36072046, 0.05858427, 0.19278921, 0.121090546, -0.067538865, -0.018770566, 0.14318037, -0.15561756) * go_2(-1.0, 0.0);
result += mat4(0.024663208, 0.21110268, -0.016415706, 0.060093414, -0.03739678, -0.107412934, -0.077527136, 0.30331334, 0.17196326, -0.15512557, -0.09499732, -0.15748607, -0.16680105, -0.015185634, 0.16114107, -0.21288376) * go_2(-1.0, 1.0);
result += mat4(-0.17739037, -0.1190967, 0.13191372, -0.2527187, -0.14992718, -0.30511454, 0.19145966, 0.002194003, -0.12888977, 0.19152176, 0.27528167, 0.099714965, 0.12865707, -0.12051514, -0.055013947, 0.26231763) * go_2(0.0, -1.0);
result += mat4(0.46433613, -0.11708138, -0.20157282, 0.32022122, 0.079468675, 0.029407484, 0.2559102, -0.15651533, 0.08644574, -0.09747344, -0.07528584, 0.17354868, 0.19167562, -0.17698488, -0.09896657, 0.17093097) * go_2(0.0, 0.0);
result += mat4(0.20283653, -0.33680332, 0.2282385, 0.18832158, 0.20866042, 0.00076752366, 0.16471444, -0.21548858, 0.16193539, 0.17141372, 0.03140222, 0.03913644, -0.030161971, 0.00014570929, 0.08993654, -0.064823024) * go_2(0.0, 1.0);
result += mat4(-0.3075755, 0.19942546, 0.015526995, -0.120868504, -0.254515, -0.07791228, 0.03271691, 0.11794217, 0.11258601, 0.045204375, -0.061196107, -0.115958795, 0.3861869, 0.048215542, 0.07016682, -0.009975758) * go_2(1.0, -1.0);
result += mat4(-0.07623697, 0.16094944, -0.02283455, 0.14112763, -0.051149167, 0.20429814, 0.011314802, 0.18914083, -0.24240434, -0.08784008, -0.16763984, -0.08492233, 0.31062725, -0.11925119, -0.33195966, 0.2060798) * go_2(1.0, 0.0);
result += mat4(-0.016709225, -0.14472668, -0.3677625, -0.09832719, 0.030297454, -0.05775362, -0.1401375, 0.08119674, -0.01795042, 0.05183797, -0.24320887, 0.066842034, -0.22245285, -0.02740993, 0.06316751, 0.053399116) * go_2(1.0, 1.0);
result += mat4(-0.039214406, -0.08876633, 0.045552462, 0.19226661, 0.1355001, -0.13942362, 0.17398876, 0.2914014, -0.191809, 0.037143208, 0.013333581, -0.16632195, 0.113767646, -0.106692605, 0.1589787, 0.030107044) * go_3(-1.0, -1.0);
result += mat4(0.21997562, 0.13855208, -0.05783191, -0.033682413, -0.010961168, 0.10524961, 0.02177416, 0.18289444, 0.043692037, 0.07853899, -0.039936125, -0.1004449, 0.04494073, -0.020680292, 0.17578089, -0.106598996) * go_3(-1.0, 0.0);
result += mat4(0.026852835, -0.16037546, 0.11278316, 0.12656097, -0.006857894, -0.03400118, -0.051564034, 0.00085412664, -0.37556714, -0.05279987, 0.029383834, -0.14246808, -0.056380164, -0.002399925, 0.16025752, 0.036324855) * go_3(-1.0, 1.0);
result += mat4(0.022709966, 0.046350412, 0.03390721, 0.02810572, -0.14394265, 0.04215361, -0.3206118, 0.15034916, -0.0028448137, 0.1682989, -0.042686664, 0.020543462, -0.2786501, -0.007482015, -0.040313292, -0.20745736) * go_3(0.0, -1.0);
result += mat4(0.05417556, 0.18728684, -0.046121832, -0.27939513, 0.05907976, -0.09191223, -0.16625418, -0.26038164, 0.39956605, -0.052594025, -0.0596556, 0.29517552, -0.015181923, -0.0763375, 0.25131205, 0.13038464) * go_3(0.0, 0.0);
result += mat4(-0.036903054, -0.0066989153, -0.062650286, 0.05614359, -0.0064960583, 0.028512698, -0.10906273, -0.010047654, 0.23030473, 0.049983572, 0.10439064, 0.26643834, 0.05041243, 0.09185424, -0.32352915, 0.11295159) * go_3(0.0, 1.0);
result += mat4(0.09724027, -0.34962535, 0.06586686, 0.016635379, 0.13831381, 0.01707076, -0.04690347, 0.022350075, 0.018352794, 0.022000022, 0.070613205, 0.117735535, -0.025971051, 0.18832101, -0.09643588, -0.08512127) * go_3(1.0, -1.0);
result += mat4(-0.17324433, 0.06810613, -0.057295907, -0.05115964, -0.101570815, 0.12491774, 0.08762367, -0.005862404, -0.05342927, -0.031942457, -0.039624047, -0.04298937, -0.1303138, -0.11869282, -0.024832053, 0.070463404) * go_3(1.0, 0.0);
result += mat4(-0.010514842, 0.1376259, -0.11750346, -0.03786737, 0.03459249, 0.015408171, -0.031430878, -0.060825355, -0.072958425, -0.0037895301, 0.041686177, -0.12352204, -0.06261361, 0.054514423, -0.34072715, 0.13860728) * go_3(1.0, 1.0);
result += vec4(0.018166734, -0.11002478, -0.05554318, -0.0988193);
return result;
}
//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16
//!HOOK MAIN
//!BIND conv2d_tf
//!BIND conv2d_tf1
//!SAVE conv2d_1_tf1
//!WIDTH conv2d_tf.w
//!HEIGHT conv2d_tf.h
//!COMPONENTS 4
#define go_0(x_off, y_off) (max((conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_1(x_off, y_off) (max((conv2d_tf1_texOff(vec2(x_off, y_off))), 0.0))
#define go_2(x_off, y_off) (max(-(conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_3(x_off, y_off) (max(-(conv2d_tf1_texOff(vec2(x_off, y_off))), 0.0))
vec4 hook() {
vec4 result = mat4(-0.040142782, 0.0288423, 0.07569487, -0.01490842, 0.14402796, -0.13682005, 0.027765118, 0.03907358, 0.07117706, 0.058157545, -0.23862502, -0.057674367, -0.19220531, 0.0147159435, -0.18028538, 0.0963821) * go_0(-1.0, -1.0);
result += mat4(-0.1676744, -0.11937339, 0.12137117, 0.07119485, 0.14148116, -0.043578617, -0.029261118, -0.0016938087, -0.057269357, -0.080076694, 0.12193026, 0.07326153, -0.056278303, -0.01630716, -0.03792076, 0.1483611) * go_0(-1.0, 0.0);
result += mat4(-0.3021578, 0.011601693, 0.11266048, 0.19086999, -0.0122412145, 0.08431291, 0.11615175, -0.008039614, -0.39987534, 0.07820729, 0.03509667, 0.1963505, -0.08839513, -0.21571854, 0.059425723, -0.06830175) * go_0(-1.0, 1.0);
result += mat4(0.23135209, -0.12452708, 0.0943565, 0.0028859286, -0.09836373, 0.10681712, -0.3535964, 0.08457615, 0.045332734, 0.16579892, -0.03809797, -0.021596594, 0.2937497, -0.028294371, 0.046484597, -0.037604347) * go_0(0.0, -1.0);
result += mat4(0.072675414, -0.16431206, 0.28952035, 0.0076831076, -0.020242939, 0.029483542, -0.092415355, 0.08673106, 0.12109694, 0.14307201, 0.23134442, 0.11731775, 0.09981601, -0.16968462, 0.037470713, 0.14948717) * go_0(0.0, 0.0);
result += mat4(0.0029752052, 0.06526503, 0.1866458, 0.07451277, -0.31836876, 0.17115082, -0.13969697, 0.23844297, -0.03244903, -0.08832665, 0.023691226, -0.18230624, -0.074933805, -0.00044301842, 0.050572682, 0.081511915) * go_0(0.0, 1.0);
result += mat4(0.039502528, 0.051221415, -0.13968123, -0.091212444, -0.016925618, 0.15409444, -0.017455677, -0.11653652, 0.03539446, -0.00087720866, -0.12839639, 0.037198763, 0.03674469, -0.26444665, 0.019721227, -0.13013805) * go_0(1.0, -1.0);
result += mat4(0.039229527, 0.25667152, 0.0032586441, -0.00718359, 0.1617932, 0.10409968, 0.07182867, -0.09810605, 0.07789241, -0.02014911, 0.025767172, -0.14604759, 0.07175764, 0.32513744, -0.20473222, -0.16266066) * go_0(1.0, 0.0);
result += mat4(0.13418433, 0.061813723, -0.13927278, -0.2498272, 0.03468218, 0.29483125, 0.063289374, -0.04726235, 0.1898295, -0.33132064, 0.032045014, 0.02159535, -0.1148363, 0.31306976, 0.06456038, 0.048988886) * go_0(1.0, 1.0);
result += mat4(0.07151646, 0.2799246, -0.107190795, -0.16431166, -0.28007045, 0.07206954, 0.06775463, 0.009758042, 0.07032184, -0.20843789, 0.087045245, 0.1360676, -0.25718534, 0.028249472, -0.12614648, 0.009949602) * go_1(-1.0, -1.0);
result += mat4(0.020241471, -0.23390484, -0.0083223935, 0.08344701, 0.08222297, 0.12026539, -0.08652223, -0.08228822, -0.039576706, -0.24677879, -0.1157289, 0.2590508, -0.23809408, 0.19911982, -0.116798095, -0.035870325) * go_1(-1.0, 0.0);
result += mat4(0.024991842, 0.050509237, -0.024134455, -0.12659028, 0.24089767, 0.122712664, -0.10482493, -0.19403952, -0.19177693, -0.06538376, -0.041478425, 0.32176673, -0.1534002, -0.18680622, 0.06763643, 0.020806564) * go_1(-1.0, 1.0);
result += mat4(0.03437814, -0.28067374, 0.2830681, 0.038812317, -0.021698112, -0.120865285, 0.22695538, -0.045419116, -0.030475847, -0.01977341, -0.1265364, -0.3109814, 0.012255813, 0.053917278, -0.018620957, -0.14599285) * go_1(0.0, -1.0);
result += mat4(-0.016204128, -0.04093018, 0.054571863, 0.02679643, 0.01756274, -0.057685968, 0.16148666, 0.17370272, -0.11065411, 0.06378157, -0.09331551, 0.22985275, 0.057905316, 0.12323568, 0.07748665, 0.09878629) * go_1(0.0, 0.0);
result += mat4(-0.018112244, 0.063234635, -0.013184602, 0.16241394, 0.08877139, 0.02145378, -0.02490027, -0.038920373, 0.13127136, 0.14391647, 0.020553736, 0.14401346, 0.06685973, -0.25398204, 0.10369067, -0.055949755) * go_1(0.0, 1.0);
result += mat4(0.07710333, 0.047412727, 0.13813803, 0.18624061, 0.16907091, -0.039532468, 0.06234584, 0.06408178, -0.054543987, -0.045220226, -0.11093376, -0.37399602, 0.20372874, 0.004580967, -0.07742308, 0.017989937) * go_1(1.0, -1.0);
result += mat4(0.003485311, -0.08897399, -0.013108594, -0.19473282, -0.27081844, -0.16812073, 0.0052992934, -0.055331517, 0.09446357, 0.019280333, 0.16560757, -0.3230032, 0.043096773, 0.059222896, -0.064184934, -0.059852477) * go_1(1.0, 0.0);
result += mat4(0.06794279, -0.034135245, 0.083064295, 0.13506731, 0.13064219, -0.44978833, -0.03513717, 0.08999715, 0.1124541, 0.42208397, -0.0038724816, -0.014332087, -0.13751853, -0.04929869, 0.09134992, -0.17687531) * go_1(1.0, 1.0);
result += mat4(0.100909084, -0.0131197255, 0.082274795, -0.2138443, -0.08515947, -0.021058358, 0.10951775, -0.06349191, -0.29129833, -0.029262653, 0.25235432, -0.11748315, 0.121980384, 0.062347785, 0.10916932, -0.15993518) * go_2(-1.0, -1.0);
result += mat4(0.28893283, -0.05677308, -0.2641288, -0.058937225, -0.16187571, 0.006647366, -0.063294955, 0.04766719, 0.60601914, -0.07831864, -0.15710756, -0.011491797, 0.15587467, -0.08105375, 0.07847514, -0.2803333) * go_2(-1.0, 0.0);
result += mat4(-0.077989794, -0.09871811, -0.3516344, 0.15292728, 0.010889273, 0.0011189661, -0.16118282, -0.018821161, -0.039708678, -0.00060983415, -0.06367813, 0.009148068, 0.03919827, 0.18782744, 0.028040757, -0.10230145) * go_2(-1.0, 1.0);
result += mat4(-0.4079609, 0.18640275, -0.12475227, 0.13891742, 0.25121725, 0.16942379, 0.14409852, 0.087600805, 0.045335658, -0.12683709, -0.0077387216, 0.06563413, -0.19857128, 0.106910795, -0.048285246, 0.10768945) * go_2(0.0, -1.0);
result += mat4(0.5989075, 0.20941062, -0.20086494, 0.13344856, 0.073034994, 0.22358665, 0.101664364, -0.13463663, 0.18816395, -0.061176624, -0.14712185, 0.027320342, -0.09529667, 0.031148786, -0.28744993, 0.18698911) * go_2(0.0, 0.0);
result += mat4(0.14799193, 0.39471942, -0.23340325, -0.4031061, 0.18926248, -0.11091216, 0.118981816, -0.09155061, 0.17049436, 0.19803695, -0.1513267, 0.023817873, 0.0090933135, -0.04134864, 0.060486555, 0.03536634) * go_2(0.0, 1.0);
result += mat4(-0.39094314, 0.01779997, 0.12710269, 0.0067333193, -0.31255835, -0.08206612, -0.048528638, 0.369439, -0.19351655, -0.03420455, 0.15831526, -0.052294146, -0.08481741, 0.0787108, 0.1312136, -0.108919285) * go_2(1.0, -1.0);
result += mat4(-0.16068119, -0.42190582, 0.19383872, -0.018445708, 0.09803051, -0.020769652, -0.022599563, -0.052448895, -0.20645833, -0.031432863, 0.0025441595, 0.03410379, -0.20268854, 0.04481527, 0.05191063, 0.42317194) * go_2(1.0, 0.0);
result += mat4(-0.12786235, -0.23936178, 0.116561726, 0.30756372, -0.09420156, -0.044529166, -0.03585749, 0.1829332, -0.23939075, 0.24030831, 0.019878127, -0.015069802, 0.24300557, -0.22558568, -0.104956664, -0.09393648) * go_2(1.0, 1.0);
result += mat4(-0.04607054, 0.012677649, -0.027597688, 0.1618836, 0.29210827, 0.014221155, -0.13591036, -0.06895336, -0.09559534, 0.07956421, -0.11112994, -0.13325493, 0.24562472, 0.11046177, 0.057847694, 0.0016315983) * go_3(-1.0, -1.0);
result += mat4(-0.03365951, 0.027391057, 0.09653403, -0.14718771, -0.049631152, -0.06467214, -0.058545876, 0.1424002, -0.06320376, 0.181183, 0.10249362, -0.16052136, 0.3013475, -0.04156266, 0.08862033, 0.06888033) * go_3(-1.0, 0.0);
result += mat4(0.10045977, -0.004198456, -0.025856055, 0.05739418, -0.1328637, -0.025975171, 0.06553717, 0.11301186, 0.0704087, -0.083569765, 0.16066101, -0.24453588, 0.25370175, 0.037184533, 0.062386766, -0.20025635) * go_3(-1.0, 1.0);
result += mat4(-0.017958941, 0.06417776, -0.1525265, 0.12451173, 0.14567685, -0.0049682115, -0.23973411, -0.0783304, -0.010629432, 0.08055161, 0.2028341, 0.17640644, -0.20445108, -0.055524793, -0.019326134, 0.081288636) * go_3(0.0, -1.0);
result += mat4(0.007882519, -0.03722546, 0.053249408, 0.00071846246, -0.07053029, -0.21583866, 0.1415364, -0.19486657, 0.20685542, 0.17660026, -0.32156837, 0.1746825, -0.14957622, -0.09224378, -0.098153435, -0.13054638) * go_3(0.0, 0.0);
result += mat4(0.10051427, -0.17398237, 0.09842799, -0.14187703, 0.116901085, -0.1229543, -0.0007776771, -0.20410055, -0.11373484, -0.111150615, -0.1974002, -0.11641459, 0.024105398, 0.24985977, 0.015871854, -0.10724633) * go_3(0.0, 1.0);
result += mat4(-0.18081793, 0.1209351, -0.12867971, -0.019415248, 0.062617876, -0.037130393, -0.07803658, -0.22862352, 0.2586428, -0.030090366, -0.11894069, 0.18087515, -0.40921417, 0.070013195, 0.030540073, 0.035120826) * go_3(1.0, -1.0);
result += mat4(-0.13185939, 0.12992652, 0.08125049, 0.075331174, 0.064219765, 0.056629725, -0.020012032, -0.0855444, -0.044063166, -0.05396545, -0.028002812, 0.21837157, -0.15206428, -0.12681007, 0.14895032, 0.12339962) * go_3(1.0, 0.0);
result += mat4(0.08066341, -0.14773634, -0.0212227, -0.014011867, -0.048505764, 0.075407125, -0.020620076, 0.0003291325, -0.21815202, -0.23136546, 0.10853532, -0.036058456, 0.10952532, -0.052677035, -0.13005799, 0.18398996) * go_3(1.0, 1.0);
result += vec4(0.022609137, -0.028548084, 0.024431901, 0.010504478);
return result;
}
//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16
//!HOOK MAIN
//!BIND conv2d_1_tf
//!BIND conv2d_1_tf1
//!SAVE conv2d_2_tf
//!WIDTH conv2d_1_tf.w
//!HEIGHT conv2d_1_tf.h
//!COMPONENTS 4
#define go_0(x_off, y_off) (max((conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_1(x_off, y_off) (max((conv2d_1_tf1_texOff(vec2(x_off, y_off))), 0.0))
#define go_2(x_off, y_off) (max(-(conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_3(x_off, y_off) (max(-(conv2d_1_tf1_texOff(vec2(x_off, y_off))), 0.0))
vec4 hook() {
vec4 result = mat4(-0.069641694, 0.104958326, 0.14786446, 0.027633663, -0.004279524, -0.020451711, 0.0883571, -0.016224537, 0.13585235, 0.11078269, 0.20198658, -0.042161036, 0.020466218, 0.20994963, 0.20072585, -0.028024657) * go_0(-1.0, -1.0);
result += mat4(0.050872434, 0.12874635, 0.1298729, 0.115810685, 0.07087254, 0.09885682, 0.23018982, 0.19187538, 0.10953604, 0.0033836907, -0.13325337, 0.09830315, -0.06528767, 0.05096927, -0.016355392, -0.039334368) * go_0(-1.0, 0.0);
result += mat4(0.027010268, 0.018263958, 0.0360758, 0.016791478, 0.2815702, 0.15517488, 0.43415815, 0.044976447, -0.0070842914, -0.12546758, 0.16874593, 0.077622116, 0.02252915, 0.1769774, 0.07181055, -0.15128697) * go_0(-1.0, 1.0);
result += mat4(0.057129618, 0.118046716, 0.07237424, -0.07842637, -0.044214778, -0.12886304, 0.08603301, -0.10416606, -0.15852053, 0.3788151, 0.26181692, -0.09092249, 0.31635332, 0.064212754, 0.21923725, 0.07500004) * go_0(0.0, -1.0);
result += mat4(-0.16981383, 0.044409662, -0.3717617, -0.031610407, 0.03658662, -0.09459229, -0.09449437, -0.014000666, -0.19656453, 0.03934163, -0.16304104, -0.12761801, -0.06235523, 0.16438273, -0.036933117, -0.095564745) * go_0(0.0, 0.0);
result += mat4(0.09725091, 0.034022827, 0.17699842, 0.1079676, -0.13236652, 0.03718181, -0.06968635, -0.23288171, 0.10275666, 0.08464966, -0.37162134, -0.35782215, -0.11023659, 0.2519236, -0.035197742, -0.019324787) * go_0(0.0, 1.0);
result += mat4(-0.09968464, 0.01102193, 0.0073735216, 0.011999313, -0.004998707, 0.09518938, 0.045727003, -0.21544908, 0.006879454, -0.06398254, -0.12584935, -0.06759933, -0.0820037, -0.07775104, 0.021957919, -0.122708224) * go_0(1.0, -1.0);
result += mat4(-0.08869767, 0.031296413, -0.0034280645, 0.13778855, 0.10073061, -0.08393937, -0.032959275, -0.0500518, 0.010908757, -0.09189417, -0.057760105, 0.17652664, -0.08729078, -0.09639096, -0.25654703, 0.055152636) * go_0(1.0, 0.0);
result += mat4(0.0027847723, -0.12885433, 0.038065907, 0.17450769, 0.0864409, 0.04592345, -0.015443841, 0.077010944, 0.08967368, 0.06800111, -0.23636387, 0.35023567, 0.03165923, 0.03132063, 0.17964344, 0.035610788) * go_0(1.0, 1.0);
result += mat4(-0.032017227, -0.0022808525, -0.08470573, 0.05332408, -0.14674746, 0.025374275, -0.018281924, 0.041163016, 0.00096549373, 0.014724006, 0.004913065, 0.18494442, 0.034953076, -0.15731992, -0.13792977, 0.08041999) * go_1(-1.0, -1.0);
result += mat4(0.08305006, 8.6318905e-05, -0.007895379, 0.02731387, -0.061324496, 0.050034665, 0.22662131, -0.013876427, -0.074468784, -0.008136604, -0.23337875, -0.1742574, 0.011753501, -0.11666686, -0.22541048, -0.14549944) * go_1(-1.0, 0.0);
result += mat4(-0.028333234, 0.121047184, 0.06720256, -0.058930036, 0.030258363, 0.07292774, 0.06455556, 0.0019076486, 0.0073987027, 0.17144889, 0.06084024, -0.08762086, -0.114422195, -0.16595861, -0.08706028, -0.10736261) * go_1(-1.0, 1.0);
result += mat4(-0.02519315, -0.14611271, 0.0388848, 0.19481422, -0.05970354, -0.08391417, 0.18982239, -0.10447052, 0.15587378, -0.023997072, 0.0781739, 0.2182389, -0.023886079, -0.1422596, -0.13352804, 0.005008043) * go_1(0.0, -1.0);
result += mat4(0.08842712, -0.100292705, 0.18925671, 0.12198875, 0.061771665, -0.04473232, 0.025053164, 0.039047796, -0.1672479, -0.08934517, 0.33099812, -0.20269585, -0.21640155, -0.22029749, 0.16539703, -0.2442679) * go_1(0.0, 0.0);
result += mat4(-0.16332205, -0.101898365, 0.02919932, -0.11900455, 0.14442924, 0.0916815, 0.037550304, 0.024123482, 0.02042624, 0.033472955, -0.059437107, -0.18735693, -0.013749093, -0.06199881, -0.08685079, 0.04252364) * go_1(0.0, 1.0);
result += mat4(-0.09047013, -0.055188328, -0.09106191, -0.048969727, 0.05114009, -0.12753403, 0.07116141, 0.060749624, -0.074034564, -0.21952136, -0.09479503, 0.2753584, -0.014141759, -0.14883812, -0.0673838, -0.012279045) * go_1(1.0, -1.0);
result += mat4(0.013816464, -0.0747162, -0.19202435, -0.064403646, 0.34980014, 0.04375546, 0.20264609, 0.006684355, 0.11523799, 0.024674915, -0.08697566, -0.04662527, -0.12743855, -0.39463726, 0.0057380227, 0.01286557) * go_1(1.0, 0.0);
result += mat4(-0.08146522, 0.074080914, -0.16856177, -0.183158, 0.19228102, 0.12373886, 0.017574452, -0.01753772, 0.045071773, 0.07725093, 0.023422163, -0.011545186, 0.20751388, -0.10795588, 0.07606346, 0.10282933) * go_1(1.0, 1.0);
result += mat4(0.12512013, -0.102208994, -0.09125398, 0.12043188, -0.066011876, 0.08831903, -0.017038671, -0.005541508, -0.049607087, 0.08654939, -0.02037085, 0.26887566, 0.005012545, 0.01869507, -0.013064982, -0.010649147) * go_2(-1.0, -1.0);
result += mat4(0.006824864, -0.05071593, -0.20786697, -0.07327317, 0.011382597, 0.030494886, -0.04754353, -0.018284699, 0.01305972, -0.036589053, 0.26637617, 0.021887446, -0.026669119, -0.037982125, -0.063445956, -0.009104248) * go_2(-1.0, 0.0);
result += mat4(0.032602567, 0.07094331, 0.052653246, 0.08342047, -0.085082285, -0.14674088, -0.23073354, -0.07915851, 0.0017120204, 0.032407638, -0.039819505, 0.16942178, 0.023192152, -0.0353237, 0.10930186, 0.22939779) * go_2(-1.0, 1.0);
result += mat4(0.0010455973, -0.11821993, -0.12639599, 0.12250084, -0.12756817, 0.11478416, -0.1862587, 0.016819192, 0.02110181, -0.25492984, -0.1766048, 0.22188173, -0.21305011, 0.113442205, 0.04599144, -0.15840286) * go_2(0.0, -1.0);
result += mat4(-0.15086032, -0.17428935, 0.39080557, 0.07576757, 0.121703945, 0.17944208, -0.003140103, -0.11231332, 0.12102969, 0.15310267, 0.17578171, 0.40631834, -0.21299168, 0.024928993, 0.030104794, 0.020753227) * go_2(0.0, 0.0);
result += mat4(-0.098734386, -0.020072265, -0.14308836, -0.08490801, 0.017175158, 0.02250534, 0.04060829, 0.033022214, 0.0046218676, 0.17923212, 0.0112105915, 0.09574084, 0.14819936, -0.14692923, 0.12634254, 0.060762513) * go_2(0.0, 1.0);
result += mat4(0.030521613, -0.097913325, -0.016720278, 0.11273997, 0.013019863, -0.06557118, 0.0405774, 0.0915019, 0.022414956, -0.053254984, 0.18639986, 0.07820968, 0.06498986, 0.058922634, -0.02240318, -0.086019725) * go_2(1.0, -1.0);
result += mat4(0.2058775, 0.01502064, 0.05847032, 0.007249146, 0.086483665, 0.19420148, 0.03892261, -0.013546935, -0.07980237, 0.04347281, -0.10376214, -0.1366535, 0.05285337, 0.07213318, 0.3642818, -0.11331124) * go_2(1.0, 0.0);
result += mat4(-0.025740806, 0.14551482, -0.037410017, -0.17477523, -0.11853099, -0.060820814, -0.102599286, -0.13267937, -0.103053465, -0.014044828, -0.01888072, -0.06499249, 0.22311528, -0.051850274, -0.034120858, 0.044562567) * go_2(1.0, 1.0);
result += mat4(-0.21360217, 0.10093803, -0.0016407765, -0.1473997, 0.26524043, 0.02112132, 0.23173104, -0.013157391, 0.05945182, 0.044635538, 0.06031638, -0.21435826, -0.10147484, 0.069090195, 0.09641844, -0.09581093) * go_3(-1.0, -1.0);
result += mat4(-0.08576515, -0.122861005, 0.049567085, -0.085854456, 0.23809357, -0.024966082, -0.10294079, 0.046241313, 0.008621132, -0.08323767, 0.20277941, 0.163423, -0.07386535, -0.088738985, 0.05274358, -0.025479877) * go_3(-1.0, 0.0);
result += mat4(-0.041135542, -0.008365642, 0.17088248, 0.04025207, 0.13809255, -0.056895368, -0.01582834, 0.07361908, -0.00068995473, -0.09300962, 0.19117641, 0.24832036, -0.06572358, -0.026025, -0.019093119, -0.049720034) * go_3(-1.0, 1.0);
result += mat4(0.024900286, 0.11525501, 0.025882801, 0.037742402, 0.36976853, 0.052211333, -0.15143296, 0.1802276, -0.059080046, 0.017990451, 0.026395092, -0.12689115, -0.07705386, 0.1232379, 0.13273561, -0.12521964) * go_3(0.0, -1.0);
result += mat4(-0.19788785, 0.044887315, 0.07663442, 0.16688696, -0.2842248, -0.15684547, 0.028387763, 0.0063470444, -0.012245601, -0.038382255, -0.8187406, -0.25245667, 0.23014604, 0.22746666, 0.1594356, 0.16469443) * go_3(0.0, 0.0);
result += mat4(-0.12663333, 0.014730006, 0.03765697, 0.15704912, -0.106595434, -0.05317512, -0.081759915, -0.08797109, 0.064620756, -0.06341419, 0.16493447, 0.23102313, 0.068325415, -0.088058695, 0.16885915, 0.036382258) * go_3(0.0, 1.0);
result += mat4(0.035389822, -0.11811836, -0.035656307, -0.0680554, 0.1338908, 0.065852076, 0.023307983, 0.0675308, 0.09690683, 0.18170924, 0.09862692, -0.20964378, -0.08601271, -0.20016764, -0.01879598, -0.14629345) * go_3(1.0, -1.0);
result += mat4(-0.27183273, 0.013525998, -0.14995874, -0.23938845, -0.26218823, -0.0009874097, -0.13385512, -0.10664239, -0.048931994, 0.039898522, 0.047444753, 0.10934722, 0.10969629, 0.123539805, 0.11692802, 0.14172275) * go_3(1.0, 0.0);
result += mat4(-0.1656506, 0.019683002, 0.0221048, 0.12596753, 0.20420644, -0.07930122, 0.04653823, 0.11492255, -0.0050175437, -0.03271697, 0.013389486, 0.034583613, -0.2196601, -0.1615663, -0.013763388, -0.056037936) * go_3(1.0, 1.0);
result += vec4(-0.022956269, 0.029688787, -0.070148066, -0.07163476);
return result;
}
//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16
//!HOOK MAIN
//!BIND conv2d_1_tf
//!BIND conv2d_1_tf1
//!SAVE conv2d_2_tf1
//!WIDTH conv2d_1_tf.w
//!HEIGHT conv2d_1_tf.h
//!COMPONENTS 4
#define go_0(x_off, y_off) (max((conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_1(x_off, y_off) (max((conv2d_1_tf1_texOff(vec2(x_off, y_off))), 0.0))
#define go_2(x_off, y_off) (max(-(conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))
#define go_3(x_off, y_off) (max(-(conv2d_1_tf1_texOff(vec2(x_off, y_off))), 0.0))
vec4 hook() {
vec4 result = mat4(-0.15104648, 0.05522861, -0.0654341, -0.053517453, -0.08
gitextract_7r81mo3e/
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug.yml
│ │ └── other.yml
│ └── workflows/
│ ├── pr.yaml
│ └── release.yaml
├── .gitignore
├── .gitmodules
├── .metadata
├── .vscode/
│ └── settings.json
├── LICENSE
├── README.md
├── analysis_options.yaml
├── android/
│ ├── .gitignore
│ ├── app/
│ │ ├── build.gradle
│ │ └── src/
│ │ ├── debug/
│ │ │ └── AndroidManifest.xml
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin/
│ │ │ │ └── com/
│ │ │ │ └── example/
│ │ │ │ └── kazumi/
│ │ │ │ └── MainActivity.kt
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ └── launch_background.xml
│ │ │ ├── drawable-v21/
│ │ │ │ └── launch_background.xml
│ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ └── ic_launcher.xml
│ │ │ ├── values/
│ │ │ │ ├── colors.xml
│ │ │ │ └── styles.xml
│ │ │ └── values-night/
│ │ │ └── styles.xml
│ │ └── profile/
│ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle/
│ │ └── wrapper/
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ └── settings.gradle
├── assets/
│ ├── bbcode/
│ │ └── BBCode.g4
│ ├── linux/
│ │ ├── DEBIAN/
│ │ │ ├── postinst
│ │ │ └── postrm
│ │ └── io.github.Predidit.Kazumi.desktop
│ ├── plugins/
│ │ ├── 7sefun.json
│ │ ├── AGE.json
│ │ └── DM84.json
│ ├── shaders/
│ │ ├── Anime4K_AutoDownscalePre_x2.glsl
│ │ ├── Anime4K_AutoDownscalePre_x4.glsl
│ │ ├── Anime4K_Clamp_Highlights.glsl
│ │ ├── Anime4K_Restore_CNN_M.glsl
│ │ ├── Anime4K_Restore_CNN_S.glsl
│ │ ├── Anime4K_Restore_CNN_VL.glsl
│ │ ├── Anime4K_Upscale_CNN_x2_M.glsl
│ │ ├── Anime4K_Upscale_CNN_x2_S.glsl
│ │ ├── Anime4K_Upscale_CNN_x2_VL.glsl
│ │ └── LICENSE
│ └── statements/
│ └── statements.txt
├── devtools_options.yaml
├── fastlane/
│ └── metadata/
│ └── android/
│ ├── en-US/
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ └── zh-CN/
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
├── ios/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── AppFrameworkInfo.plist
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── Podfile
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── LaunchBackground.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── LaunchImage.imageset/
│ │ │ ├── Contents.json
│ │ │ └── README.md
│ │ ├── Base.lproj/
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ └── Runner-Bridging-Header.h
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ ├── Runner.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── WorkspaceSettings.xcsettings
│ └── RunnerTests/
│ └── RunnerTests.swift
├── lib/
│ ├── app_module.dart
│ ├── app_widget.dart
│ ├── bbcode/
│ │ ├── README.md
│ │ ├── bbcode_base_listener.dart
│ │ ├── bbcode_elements.dart
│ │ ├── bbcode_widget.dart
│ │ └── generated/
│ │ ├── BBCode.tokens
│ │ ├── BBCodeLexer.dart
│ │ ├── BBCodeListener.dart
│ │ └── BBCodeParser.dart
│ ├── bean/
│ │ ├── appbar/
│ │ │ ├── drag_to_move_bar.dart
│ │ │ ├── safe_mediaquery_warpper.dart
│ │ │ └── sys_app_bar.dart
│ │ ├── card/
│ │ │ ├── bangumi_card.dart
│ │ │ ├── bangumi_history_card.dart
│ │ │ ├── bangumi_info_card.dart
│ │ │ ├── bangumi_timeline_card.dart
│ │ │ ├── character_card.dart
│ │ │ ├── character_comments_card.dart
│ │ │ ├── comments_card.dart
│ │ │ ├── episode_comments_card.dart
│ │ │ ├── network_img_layer.dart
│ │ │ ├── palette_card.dart
│ │ │ └── staff_card.dart
│ │ ├── dialog/
│ │ │ └── dialog_helper.dart
│ │ ├── settings/
│ │ │ ├── color_type.dart
│ │ │ └── theme_provider.dart
│ │ └── widget/
│ │ ├── collect_button.dart
│ │ ├── custom_dropdown_menu.dart
│ │ ├── embedded_native_control_area.dart
│ │ ├── error_widget.dart
│ │ └── scrollable_wrapper.dart
│ ├── hive_registrar.g.dart
│ ├── main.dart
│ ├── modules/
│ │ ├── bangumi/
│ │ │ ├── bangumi_item.dart
│ │ │ ├── bangumi_item.g.dart
│ │ │ ├── bangumi_tag.dart
│ │ │ ├── bangumi_tag.g.dart
│ │ │ ├── episode_item.dart
│ │ │ └── weekday_item.dart
│ │ ├── character/
│ │ │ └── character_full_item.dart
│ │ ├── characters/
│ │ │ ├── actor_item.dart
│ │ │ ├── character_item.dart
│ │ │ └── characters_response.dart
│ │ ├── collect/
│ │ │ ├── collect_change_module.dart
│ │ │ ├── collect_change_module.g.dart
│ │ │ ├── collect_module.dart
│ │ │ ├── collect_module.g.dart
│ │ │ └── collect_type.dart
│ │ ├── comments/
│ │ │ ├── comment_item.dart
│ │ │ └── comment_response.dart
│ │ ├── danmaku/
│ │ │ ├── danmaku_episode_response.dart
│ │ │ ├── danmaku_module.dart
│ │ │ └── danmaku_search_response.dart
│ │ ├── download/
│ │ │ ├── download_module.dart
│ │ │ └── download_module.g.dart
│ │ ├── history/
│ │ │ ├── history_module.dart
│ │ │ └── history_module.g.dart
│ │ ├── plugin/
│ │ │ └── plugin_http_module.dart
│ │ ├── roads/
│ │ │ └── road_module.dart
│ │ ├── search/
│ │ │ ├── plugin_search_module.dart
│ │ │ ├── search_history_module.dart
│ │ │ └── search_history_module.g.dart
│ │ └── staff/
│ │ ├── staff_item.dart
│ │ └── staff_response.dart
│ ├── pages/
│ │ ├── about/
│ │ │ ├── about_module.dart
│ │ │ └── about_page.dart
│ │ ├── collect/
│ │ │ ├── collect_controller.dart
│ │ │ ├── collect_controller.g.dart
│ │ │ ├── collect_module.dart
│ │ │ └── collect_page.dart
│ │ ├── download/
│ │ │ ├── download_controller.dart
│ │ │ ├── download_controller.g.dart
│ │ │ ├── download_episode_sheet.dart
│ │ │ ├── download_page.dart
│ │ │ └── download_page_module.dart
│ │ ├── error/
│ │ │ └── storage_error_page.dart
│ │ ├── history/
│ │ │ ├── history_controller.dart
│ │ │ ├── history_controller.g.dart
│ │ │ ├── history_module.dart
│ │ │ └── history_page.dart
│ │ ├── index_module.dart
│ │ ├── index_page.dart
│ │ ├── info/
│ │ │ ├── character_page.dart
│ │ │ ├── info_controller.dart
│ │ │ ├── info_controller.g.dart
│ │ │ ├── info_module.dart
│ │ │ ├── info_page.dart
│ │ │ ├── info_tabview.dart
│ │ │ └── source_sheet.dart
│ │ ├── init_page.dart
│ │ ├── logs/
│ │ │ └── logs_page.dart
│ │ ├── menu/
│ │ │ └── menu.dart
│ │ ├── my/
│ │ │ ├── my_controller.dart
│ │ │ ├── my_controller.g.dart
│ │ │ ├── my_module.dart
│ │ │ └── my_page.dart
│ │ ├── player/
│ │ │ ├── episode_comments_sheet.dart
│ │ │ ├── player_controller.dart
│ │ │ ├── player_controller.g.dart
│ │ │ ├── player_item.dart
│ │ │ ├── player_item_panel.dart
│ │ │ ├── player_item_surface.dart
│ │ │ └── smallest_player_item_panel.dart
│ │ ├── plugin_editor/
│ │ │ ├── plugin_editor_page.dart
│ │ │ ├── plugin_module.dart
│ │ │ ├── plugin_shop_page.dart
│ │ │ ├── plugin_test_page.dart
│ │ │ └── plugin_view_page.dart
│ │ ├── popular/
│ │ │ ├── popular_controller.dart
│ │ │ ├── popular_controller.g.dart
│ │ │ ├── popular_module.dart
│ │ │ └── popular_page.dart
│ │ ├── router.dart
│ │ ├── search/
│ │ │ ├── search_controller.dart
│ │ │ ├── search_controller.g.dart
│ │ │ ├── search_module.dart
│ │ │ └── search_page.dart
│ │ ├── settings/
│ │ │ ├── danmaku/
│ │ │ │ ├── danmaku_module.dart
│ │ │ │ ├── danmaku_settings.dart
│ │ │ │ ├── danmaku_settings_sheet.dart
│ │ │ │ └── danmaku_shield_settings.dart
│ │ │ ├── decoder_settings.dart
│ │ │ ├── displaymode_settings.dart
│ │ │ ├── download_settings.dart
│ │ │ ├── interface_settings.dart
│ │ │ ├── keyboard_settings.dart
│ │ │ ├── player_settings.dart
│ │ │ ├── proxy/
│ │ │ │ ├── proxy_editor_page.dart
│ │ │ │ ├── proxy_module.dart
│ │ │ │ └── proxy_settings_page.dart
│ │ │ ├── renderer_settings.dart
│ │ │ ├── settings_module.dart
│ │ │ ├── super_resolution_settings.dart
│ │ │ └── theme_settings_page.dart
│ │ ├── timeline/
│ │ │ ├── timeline_controller.dart
│ │ │ ├── timeline_controller.g.dart
│ │ │ ├── timeline_module.dart
│ │ │ └── timeline_page.dart
│ │ ├── video/
│ │ │ ├── video_controller.dart
│ │ │ ├── video_controller.g.dart
│ │ │ ├── video_module.dart
│ │ │ └── video_page.dart
│ │ └── webdav_editor/
│ │ ├── webdav_editor_page.dart
│ │ ├── webdav_module.dart
│ │ └── webdav_setting.dart
│ ├── plugins/
│ │ ├── anti_crawler_config.dart
│ │ ├── plugin_cookie_manager.dart
│ │ ├── plugin_install_time_tracker.dart
│ │ ├── plugin_validity_tracker.dart
│ │ ├── plugins.dart
│ │ ├── plugins_controller.dart
│ │ └── plugins_controller.g.dart
│ ├── providers/
│ │ ├── captcha/
│ │ │ └── captcha_provider.dart
│ │ └── video/
│ │ ├── providers.dart
│ │ ├── video_source_provider.dart
│ │ └── webview_video_source_provider.dart
│ ├── repositories/
│ │ ├── collect_crud_repository.dart
│ │ ├── collect_repository.dart
│ │ ├── download_repository.dart
│ │ ├── history_repository.dart
│ │ └── search_history_repository.dart
│ ├── request/
│ │ ├── api.dart
│ │ ├── bangumi.dart
│ │ ├── damaku.dart
│ │ ├── interceptor.dart
│ │ ├── plugin.dart
│ │ ├── query_manager.dart
│ │ └── request.dart
│ ├── shaders/
│ │ ├── shaders_controller.dart
│ │ └── shaders_controller.g.dart
│ ├── utils/
│ │ ├── anime_season.dart
│ │ ├── auto_updater.dart
│ │ ├── background_download_service.dart
│ │ ├── constants.dart
│ │ ├── download_manager.dart
│ │ ├── extension.dart
│ │ ├── external_player.dart
│ │ ├── format_utils.dart
│ │ ├── logger.dart
│ │ ├── m3u8_ad_filter.dart
│ │ ├── m3u8_parser.dart
│ │ ├── mortis.dart
│ │ ├── proxy_manager.dart
│ │ ├── proxy_utils.dart
│ │ ├── remote.dart
│ │ ├── search_parser.dart
│ │ ├── storage.dart
│ │ ├── string_match.dart
│ │ ├── syncplay.dart
│ │ ├── syncplay_endpoint.dart
│ │ ├── timed_shutdown_service.dart
│ │ ├── utils.dart
│ │ └── webdav.dart
│ └── webview/
│ ├── captcha/
│ │ ├── captcha_webview_controller.dart
│ │ └── impl/
│ │ ├── captcha_webview_inappwebview_impl.dart
│ │ ├── captcha_webview_linux_impl.dart
│ │ └── captcha_webview_windows_impl.dart
│ └── video/
│ ├── impl/
│ │ ├── video_webview_android_impl.dart
│ │ ├── video_webview_apple_impl.dart
│ │ ├── video_webview_impl.dart
│ │ ├── video_webview_linux_impl.dart
│ │ └── video_webview_windows_impl.dart
│ └── video_webview_controller.dart
├── linux/
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── flutter/
│ │ ├── CMakeLists.txt
│ │ ├── generated_plugin_registrant.cc
│ │ ├── generated_plugin_registrant.h
│ │ └── generated_plugins.cmake
│ ├── main.cc
│ ├── my_application.cc
│ └── my_application.h
├── macos/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── Flutter-Debug.xcconfig
│ │ ├── Flutter-Release.xcconfig
│ │ └── GeneratedPluginRegistrant.swift
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ └── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── MainMenu.xib
│ │ ├── Configs/
│ │ │ ├── AppInfo.xcconfig
│ │ │ ├── Debug.xcconfig
│ │ │ ├── Release.xcconfig
│ │ │ └── Warnings.xcconfig
│ │ ├── DebugProfile.entitlements
│ │ ├── Info.plist
│ │ ├── MainFlutterWindow.swift
│ │ ├── Release.entitlements
│ │ ├── en-GB.lproj/
│ │ │ └── MainMenu.strings
│ │ ├── en.lproj/
│ │ │ └── MainMenu.strings
│ │ └── zh-Hans.lproj/
│ │ └── MainMenu.strings
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ ├── Runner.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── RunnerTests/
│ └── RunnerTests.swift
├── pubspec.yaml
├── test/
│ ├── m3u8_parser_test.dart
│ └── widget_test.dart
├── web/
│ ├── index.html
│ └── manifest.json
└── windows/
├── .gitignore
├── CMakeLists.txt
├── flutter/
│ ├── CMakeLists.txt
│ ├── generated_plugin_registrant.cc
│ ├── generated_plugin_registrant.h
│ └── generated_plugins.cmake
└── runner/
├── CMakeLists.txt
├── Runner.rc
├── external_player_utils.cpp
├── external_player_utils.h
├── flutter_window.cpp
├── flutter_window.h
├── fullscreen_utils.cpp
├── fullscreen_utils.h
├── main.cpp
├── resource.h
├── runner.exe.manifest
├── utils.cpp
├── utils.h
├── win32_window.cpp
└── win32_window.h
SYMBOL INDEX (1602 symbols across 213 files)
FILE: lib/app_module.dart
class AppModule (line 4) | class AppModule extends Module {
method binds (line 6) | void binds(i)
method routes (line 11) | void routes(r)
FILE: lib/app_widget.dart
class AppWidget (line 18) | class AppWidget extends StatefulWidget {
method createState (line 22) | State<AppWidget> createState()
class _AppWidgetState (line 25) | class _AppWidgetState extends State<AppWidget>
method initState (line 33) | void initState()
method setPreventClose (line 41) | void setPreventClose()
method dispose (line 49) | void dispose()
method onTrayIconMouseDown (line 57) | void onTrayIconMouseDown()
method onTrayIconRightMouseDown (line 62) | void onTrayIconRightMouseDown()
method onTrayMenuItemClick (line 67) | void onTrayMenuItemClick(MenuItem menuItem)
method onWindowClose (line 79) | void onWindowClose()
method onChanged (line 108) | onChanged(value)
method didChangeAppLifecycleState (line 154) | void didChangeAppLifecycleState(AppLifecycleState state)
method _handleTray (line 167) | Future<void> _handleTray()
method build (line 190) | Widget build(BuildContext context)
FILE: lib/bbcode/bbcode_base_listener.dart
class BBCodeBaseListener (line 9) | class BBCodeBaseListener implements BBCodeListener {
method _enterTag (line 13) | void _enterTag(TagContext ctx)
method _exitTag (line 71) | void _exitTag(TagContext ctx)
method enterDocument (line 180) | void enterDocument(DocumentContext ctx)
method exitDocument (line 183) | void exitDocument(DocumentContext ctx)
method enterElement (line 186) | void enterElement(ElementContext ctx)
method exitElement (line 189) | void exitElement(ElementContext ctx)
method enterTag (line 192) | void enterTag(TagContext ctx)
method exitTag (line 197) | void exitTag(TagContext ctx)
method enterPlain (line 202) | void enterPlain(PlainContext ctx)
method exitPlain (line 207) | void exitPlain(PlainContext ctx)
method enterBgm (line 210) | void enterBgm(BgmContext ctx)
method exitBgm (line 216) | void exitBgm(BgmContext ctx)
method enterSticker (line 219) | void enterSticker(StickerContext ctx)
method exitSticker (line 226) | void exitSticker(StickerContext ctx)
method enterEveryRule (line 229) | void enterEveryRule(ParserRuleContext ctx)
method exitEveryRule (line 232) | void exitEveryRule(ParserRuleContext ctx)
method visitTerminal (line 235) | void visitTerminal(TerminalNode node)
method visitErrorNode (line 238) | void visitErrorNode(ErrorNode node)
FILE: lib/bbcode/bbcode_elements.dart
class BBCodeTag (line 2) | class BBCodeTag {
method clear (line 15) | void clear()
class BBCodeText (line 30) | class BBCodeText {
class BBCodeBgm (line 60) | class BBCodeBgm {
class BBCodeSticker (line 66) | class BBCodeSticker {
class BBCodeImg (line 72) | class BBCodeImg {
FILE: lib/bbcode/bbcode_widget.dart
class BBCodeWidget (line 13) | class BBCodeWidget extends StatefulWidget {
method createState (line 19) | State<StatefulWidget> createState()
class _BBCodeWidgetState (line 22) | class _BBCodeWidgetState extends State<BBCodeWidget> {
method _parseColor (line 34) | Color? _parseColor(String hex)
method build (line 61) | Widget build(BuildContext context)
FILE: lib/bbcode/generated/BBCodeLexer.dart
class BBCodeLexer (line 4) | class BBCodeLexer extends Lexer {
method getATN (line 67) | ATN getATN()
FILE: lib/bbcode/generated/BBCodeListener.dart
class BBCodeListener (line 7) | abstract class BBCodeListener extends ParseTreeListener {
method enterDocument (line 10) | void enterDocument(DocumentContext ctx)
method exitDocument (line 13) | void exitDocument(DocumentContext ctx)
method enterElement (line 17) | void enterElement(ElementContext ctx)
method exitElement (line 20) | void exitElement(ElementContext ctx)
method enterTag (line 24) | void enterTag(TagContext ctx)
method exitTag (line 27) | void exitTag(TagContext ctx)
method enterPlain (line 31) | void enterPlain(PlainContext ctx)
method exitPlain (line 34) | void exitPlain(PlainContext ctx)
method enterBgm (line 38) | void enterBgm(BgmContext ctx)
method exitBgm (line 41) | void exitBgm(BgmContext ctx)
method enterSticker (line 45) | void enterSticker(StickerContext ctx)
method exitSticker (line 48) | void exitSticker(StickerContext ctx)
FILE: lib/bbcode/generated/BBCodeParser.dart
class BBCodeParser (line 6) | class BBCodeParser extends Parser {
method getATN (line 54) | ATN getATN()
method document (line 62) | DocumentContext document()
method element (line 90) | ElementContext element()
method tag (line 128) | TagContext tag()
method plain (line 176) | PlainContext plain()
method bgm (line 240) | BgmContext bgm()
method sticker (line 269) | StickerContext sticker()
class DocumentContext (line 319) | class DocumentContext extends ParserRuleContext {
method EOF (line 320) | TerminalNode? EOF()
method elements (line 321) | List<ElementContext> elements()
method element (line 322) | ElementContext? element(int i)
method enterRule (line 327) | void enterRule(ParseTreeListener listener)
method exitRule (line 331) | void exitRule(ParseTreeListener listener)
class ElementContext (line 336) | class ElementContext extends ParserRuleContext {
method tag (line 337) | TagContext? tag()
method plain (line 338) | PlainContext? plain()
method bgm (line 339) | BgmContext? bgm()
method sticker (line 340) | StickerContext? sticker()
method enterRule (line 345) | void enterRule(ParseTreeListener listener)
method exitRule (line 349) | void exitRule(ParseTreeListener listener)
class TagContext (line 354) | class TagContext extends ParserRuleContext {
method STRINGs (line 358) | List<TerminalNode> STRINGs()
method STRING (line 359) | TerminalNode? STRING(int i)
method elements (line 360) | List<ElementContext> elements()
method element (line 361) | ElementContext? element(int i)
method enterRule (line 366) | void enterRule(ParseTreeListener listener)
method exitRule (line 370) | void exitRule(ParseTreeListener listener)
class PlainContext (line 375) | class PlainContext extends ParserRuleContext {
method STRINGs (line 376) | List<TerminalNode> STRINGs()
method STRING (line 377) | TerminalNode? STRING(int i)
method enterRule (line 382) | void enterRule(ParseTreeListener listener)
method exitRule (line 386) | void exitRule(ParseTreeListener listener)
class BgmContext (line 391) | class BgmContext extends ParserRuleContext {
method STRING (line 393) | TerminalNode? STRING()
method enterRule (line 398) | void enterRule(ParseTreeListener listener)
method exitRule (line 402) | void exitRule(ParseTreeListener listener)
class StickerContext (line 407) | class StickerContext extends ParserRuleContext {
method enterRule (line 412) | void enterRule(ParseTreeListener listener)
method exitRule (line 416) | void exitRule(ParseTreeListener listener)
FILE: lib/bean/appbar/drag_to_move_bar.dart
class DragToMoveArea (line 23) | class DragToMoveArea extends StatelessWidget {
method build (line 32) | Widget build(BuildContext context)
FILE: lib/bean/appbar/safe_mediaquery_warpper.dart
class SafeMediaQueryWrapper (line 6) | class SafeMediaQueryWrapper extends StatelessWidget {
method build (line 19) | Widget build(BuildContext context)
FILE: lib/bean/appbar/sys_app_bar.dart
class SysAppBar (line 9) | class SysAppBar extends StatelessWidget implements PreferredSizeWidget {
method showWindowButton (line 43) | bool showWindowButton()
method build (line 49) | Widget build(BuildContext context)
FILE: lib/bean/card/bangumi_card.dart
class BangumiCardV (line 9) | class BangumiCardV extends StatelessWidget {
method build (line 22) | Widget build(BuildContext context)
class BangumiContent (line 72) | class BangumiContent extends StatelessWidget {
method build (line 78) | Widget build(BuildContext context)
FILE: lib/bean/card/bangumi_history_card.dart
class BangumiHistoryCardV (line 15) | class BangumiHistoryCardV extends StatefulWidget {
method createState (line 30) | State<BangumiHistoryCardV> createState()
class _BangumiHistoryCardVState (line 33) | class _BangumiHistoryCardVState extends State<BangumiHistoryCardV> {
method propertyChip (line 39) | Widget propertyChip({
method buildImage (line 60) | Widget buildImage(
method build (line 76) | Widget build(BuildContext context)
FILE: lib/bean/card/bangumi_info_card.dart
class BangumiInfoCardV (line 11) | class BangumiInfoCardV extends StatefulWidget {
method createState (line 24) | State<BangumiInfoCardV> createState()
class _BangumiInfoCardVState (line 27) | class _BangumiInfoCardVState extends State<BangumiInfoCardV> {
method build (line 120) | Widget build(BuildContext context)
FILE: lib/bean/card/bangumi_timeline_card.dart
class BangumiTimelineCard (line 8) | class BangumiTimelineCard extends StatelessWidget {
method build (line 27) | Widget build(BuildContext context)
method buildImage (line 70) | Widget buildImage(BuildContext context, String imageUrl, double width,...
method buildInfo (line 95) | Widget buildInfo(BuildContext context, TextScaler textScaler, bool isD...
FILE: lib/bean/card/character_card.dart
class CharacterCard (line 6) | class CharacterCard extends StatelessWidget {
method build (line 15) | Widget build(BuildContext context)
FILE: lib/bean/card/character_comments_card.dart
class CharacterCommentsCard (line 6) | class CharacterCommentsCard extends StatelessWidget {
method build (line 15) | Widget build(BuildContext context)
FILE: lib/bean/card/comments_card.dart
class CommentsCard (line 7) | class CommentsCard extends StatelessWidget {
method build (line 26) | Widget build(BuildContext context)
FILE: lib/bean/card/episode_comments_card.dart
class EpisodeCommentsCard (line 6) | class EpisodeCommentsCard extends StatelessWidget {
method build (line 15) | Widget build(BuildContext context)
FILE: lib/bean/card/network_img_layer.dart
class NetworkImgLayer (line 7) | class NetworkImgLayer extends StatelessWidget {
method build (line 30) | Widget build(BuildContext context)
method setMemCacheSizes (line 37) | void setMemCacheSizes()
method placeholder (line 93) | Widget placeholder(BuildContext context)
FILE: lib/bean/card/palette_card.dart
class PaletteCard (line 4) | class PaletteCard extends StatefulWidget {
method createState (line 15) | State<StatefulWidget> createState()
class _PaletteCardState (line 18) | class _PaletteCardState extends State<PaletteCard> {
method build (line 20) | Widget build(BuildContext context)
FILE: lib/bean/card/staff_card.dart
class StaffCard (line 4) | class StaffCard extends StatelessWidget {
method build (line 13) | Widget build(BuildContext context)
FILE: lib/bean/dialog/dialog_helper.dart
class KazumiDialog (line 10) | class KazumiDialog {
method show (line 16) | Future<T?> show<T>({
method showToast (line 44) | void showToast({
method showLoading (line 86) | Future<void> showLoading({
method showBottomSheet (line 133) | Future<T?> showBottomSheet<T>({
method dismiss (line 187) | void dismiss<T>({T? popWith})
method showTimedSuccessDialog (line 208) | void showTimedSuccessDialog({
class KazumiDialogObserver (line 275) | class KazumiDialogObserver extends NavigatorObserver {
method didPush (line 303) | void didPush(Route<dynamic> route, Route<dynamic>? previousRoute)
method didPop (line 320) | void didPop(Route<dynamic> route, Route<dynamic>? previousRoute)
method didReplace (line 332) | void didReplace({Route<dynamic>? newRoute, Route<dynamic>? oldRoute})
method didRemove (line 346) | void didRemove(Route<dynamic> route, Route<dynamic>? previousRoute)
method _updateContexts (line 358) | void _updateContexts(BuildContext context, Route<dynamic> route)
method _hasScaffold (line 368) | bool _hasScaffold(BuildContext context)
method _isKazumiDialogRoute (line 372) | bool _isKazumiDialogRoute(Route<dynamic> route)
method _removeCurrentSnackBar (line 377) | void _removeCurrentSnackBar(Route<dynamic>? route)
FILE: lib/bean/settings/theme_provider.dart
class ThemeProvider (line 4) | class ThemeProvider extends ChangeNotifier {
method setTheme (line 11) | void setTheme(ThemeData light, ThemeData dark, {bool notify = true})
method setThemeMode (line 17) | void setThemeMode(ThemeMode mode, {bool notify = true})
method setDynamic (line 22) | void setDynamic(bool useDynamicColor, {bool notify = true})
method setFontFamily (line 27) | void setFontFamily(bool useSystemFont, {bool notify = true})
FILE: lib/bean/widget/collect_button.dart
class CollectButton (line 6) | class CollectButton extends StatefulWidget {
method createState (line 34) | State<CollectButton> createState()
class _CollectButtonState (line 37) | class _CollectButtonState extends State<CollectButton> {
method initState (line 47) | void initState()
method getTypeStringByInt (line 51) | String getTypeStringByInt(int collectType)
method getIconByInt (line 68) | IconData getIconByInt(int collectType)
method build (line 86) | Widget build(BuildContext context)
FILE: lib/bean/widget/custom_dropdown_menu.dart
class CustomDropdownMenu (line 8) | class CustomDropdownMenu extends StatelessWidget {
method build (line 37) | Widget build(BuildContext context)
FILE: lib/bean/widget/embedded_native_control_area.dart
class EmbeddedNativeControlArea (line 5) | class EmbeddedNativeControlArea extends StatefulWidget {
method createState (line 19) | State<StatefulWidget> createState()
class _EmbeddedNativeControlAreaState (line 22) | class _EmbeddedNativeControlAreaState extends State<EmbeddedNativeContro...
method build (line 41) | Widget build(BuildContext context)
FILE: lib/bean/widget/error_widget.dart
class GeneralErrorWidget (line 3) | class GeneralErrorWidget extends StatelessWidget {
method build (line 14) | Widget build(BuildContext context)
class GeneralErrorButton (line 46) | class GeneralErrorButton extends StatelessWidget {
method build (line 57) | Widget build(BuildContext context)
FILE: lib/bean/widget/scrollable_wrapper.dart
class ScrollableWrapper (line 7) | class ScrollableWrapper extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
FILE: lib/hive_registrar.g.dart
function registerAdapters (line 15) | void registerAdapters()
function registerAdapters (line 29) | void registerAdapters()
FILE: lib/main.dart
function main (line 20) | void main()
FILE: lib/modules/bangumi/bangumi_item.dart
class BangumiItem (line 7) | @HiveType(typeId: 0)
method parseBangumiAliases (line 59) | List<String> parseBangumiAliases(Map<String, dynamic> jsonData)
method parseBangumiVoteCount (line 83) | List<int> parseBangumiVoteCount(Map<String, dynamic> jsonData)
FILE: lib/modules/bangumi/bangumi_item.g.dart
class BangumiItemAdapter (line 9) | class BangumiItemAdapter extends TypeAdapter<BangumiItem> {
method read (line 14) | BangumiItem read(BinaryReader reader)
method write (line 39) | void write(BinaryWriter writer, BangumiItem obj)
FILE: lib/modules/bangumi/bangumi_tag.dart
class BangumiTag (line 5) | @HiveType(typeId: 4)
method toJson (line 28) | Map<String, dynamic> toJson()
FILE: lib/modules/bangumi/bangumi_tag.g.dart
class BangumiTagAdapter (line 9) | class BangumiTagAdapter extends TypeAdapter<BangumiTag> {
method read (line 14) | BangumiTag read(BinaryReader reader)
method write (line 27) | void write(BinaryWriter writer, BangumiTag obj)
FILE: lib/modules/bangumi/episode_item.dart
class EpisodeInfo (line 1) | class EpisodeInfo {
method reset (line 29) | void reset()
method readType (line 37) | String readType()
FILE: lib/modules/bangumi/weekday_item.dart
class Weekday (line 1) | class Weekday {
FILE: lib/modules/character/character_full_item.dart
class CharacterFullItem (line 1) | class CharacterFullItem {
method toJson (line 40) | Map<String, dynamic> toJson()
FILE: lib/modules/characters/actor_item.dart
class ActorAvator (line 1) | class ActorAvator {
method toJson (line 23) | Map<String, dynamic> toJson()
class ActorItem (line 33) | class ActorItem {
method toJson (line 55) | Map<String, dynamic> toJson()
FILE: lib/modules/characters/character_item.dart
class CharacterAvator (line 3) | class CharacterAvator {
method toJson (line 25) | Map<String, dynamic> toJson()
class CharacterExtraInfo (line 35) | class CharacterExtraInfo {
class CharacterItem (line 54) | class CharacterItem {
method toJson (line 88) | Map<String, dynamic> toJson()
FILE: lib/modules/characters/characters_response.dart
class CharactersResponse (line 7) | class CharactersResponse {
method toJson (line 28) | Map<String, dynamic> toJson()
FILE: lib/modules/collect/collect_change_module.dart
class CollectedBangumiChange (line 7) | @HiveType(typeId: 5)
method toString (line 39) | String toString()
FILE: lib/modules/collect/collect_change_module.g.dart
class CollectedBangumiChangeAdapter (line 9) | class CollectedBangumiChangeAdapter
method read (line 15) | CollectedBangumiChange read(BinaryReader reader)
method write (line 30) | void write(BinaryWriter writer, CollectedBangumiChange obj)
FILE: lib/modules/collect/collect_module.dart
class CollectedBangumi (line 6) | @HiveType(typeId: 3)
method getKey (line 26) | String getKey(BangumiItem bangumiItem)
method toString (line 29) | String toString()
FILE: lib/modules/collect/collect_module.g.dart
class CollectedBangumiAdapter (line 9) | class CollectedBangumiAdapter extends TypeAdapter<CollectedBangumi> {
method read (line 14) | CollectedBangumi read(BinaryReader reader)
method write (line 27) | void write(BinaryWriter writer, CollectedBangumi obj)
FILE: lib/modules/collect/collect_type.dart
type CollectType (line 4) | enum CollectType {
FILE: lib/modules/comments/comment_item.dart
class UserAvatar (line 1) | class UserAvatar {
method toJson (line 20) | Map<String, dynamic> toJson()
class User (line 29) | class User {
method toJson (line 57) | Map<String, dynamic> toJson()
class Comment (line 69) | class Comment {
method toJson (line 90) | Map<String, dynamic> toJson()
class CommentItem (line 99) | class CommentItem {
method toJson (line 115) | Map<String, dynamic> toJson()
class EpisodeComment (line 123) | class EpisodeComment {
method toJson (line 144) | Map<String, dynamic> toJson()
class EpisodeCommentItem (line 153) | class EpisodeCommentItem {
method toJson (line 172) | Map<String, dynamic> toJson()
class CharacterComment (line 180) | class CharacterComment {
method toJson (line 201) | Map<String, dynamic> toJson()
class CharacterCommentItem (line 210) | class CharacterCommentItem {
method toJson (line 229) | Map<String, dynamic> toJson()
FILE: lib/modules/comments/comment_response.dart
class CommentResponse (line 3) | class CommentResponse {
method toJson (line 29) | Map<String, dynamic> toJson()
class EpisodeCommentResponse (line 37) | class EpisodeCommentResponse {
method toJson (line 58) | Map<String, dynamic> toJson()
class CharacterCommentResponse (line 65) | class CharacterCommentResponse {
method toJson (line 86) | Map<String, dynamic> toJson()
FILE: lib/modules/danmaku/danmaku_episode_response.dart
class DanmakuEpisode (line 1) | class DanmakuEpisode {
method toJson (line 17) | Map<String, dynamic> toJson()
class DanmakuEpisodeResponse (line 25) | class DanmakuEpisodeResponse {
method toJson (line 64) | Map<String, dynamic> toJson()
FILE: lib/modules/danmaku/danmaku_module.dart
class Danmaku (line 4) | class Danmaku {
method toJson (line 29) | Map<String, dynamic> toJson()
FILE: lib/modules/danmaku/danmaku_search_response.dart
class DanmakuAnime (line 1) | class DanmakuAnime {
method toJson (line 38) | Map<String, dynamic> toJson()
class DanmakuSearchResponse (line 53) | class DanmakuSearchResponse {
method toJson (line 78) | Map<String, dynamic> toJson()
FILE: lib/modules/download/download_module.dart
class DownloadRecord (line 5) | @HiveType(typeId: 7)
class DownloadEpisode (line 37) | @HiveType(typeId: 8)
class DownloadStatus (line 110) | class DownloadStatus {
FILE: lib/modules/download/download_module.g.dart
class DownloadRecordAdapter (line 9) | class DownloadRecordAdapter extends TypeAdapter<DownloadRecord> {
method read (line 14) | DownloadRecord read(BinaryReader reader)
method write (line 30) | void write(BinaryWriter writer, DownloadRecord obj)
class DownloadEpisodeAdapter (line 58) | class DownloadEpisodeAdapter extends TypeAdapter<DownloadEpisode> {
method read (line 63) | DownloadEpisode read(BinaryReader reader)
method write (line 89) | void write(BinaryWriter writer, DownloadEpisode obj)
FILE: lib/modules/history/history_module.dart
class History (line 6) | @HiveType(typeId: 1)
method getKey (line 34) | String getKey(String n, BangumiItem s)
method toString (line 37) | String toString()
class Progress (line 42) | @HiveType(typeId: 2)
method toString (line 60) | String toString()
FILE: lib/modules/history/history_module.g.dart
class HistoryAdapter (line 9) | class HistoryAdapter extends TypeAdapter<History> {
method read (line 14) | History read(BinaryReader reader)
method write (line 30) | void write(BinaryWriter writer, History obj)
class ProgressAdapter (line 60) | class ProgressAdapter extends TypeAdapter<Progress> {
method read (line 65) | Progress read(BinaryReader reader)
method write (line 78) | void write(BinaryWriter writer, Progress obj)
FILE: lib/modules/plugin/plugin_http_module.dart
class PluginHTTPItem (line 1) | class PluginHTTPItem {
FILE: lib/modules/roads/road_module.dart
class Road (line 1) | class Road {
FILE: lib/modules/search/plugin_search_module.dart
class SearchItem (line 1) | class SearchItem {
class PluginSearchResponse (line 15) | class PluginSearchResponse {
FILE: lib/modules/search/search_history_module.dart
class SearchHistory (line 5) | @HiveType(typeId: 6)
method toString (line 18) | String toString()
FILE: lib/modules/search/search_history_module.g.dart
class SearchHistoryAdapter (line 9) | class SearchHistoryAdapter extends TypeAdapter<SearchHistory> {
method read (line 14) | SearchHistory read(BinaryReader reader)
method write (line 26) | void write(BinaryWriter writer, SearchHistory obj)
FILE: lib/modules/staff/staff_item.dart
class StaffFullItem (line 1) | class StaffFullItem {
method toJson (line 21) | Map<String, dynamic> toJson()
class Staff (line 29) | class Staff {
method toJson (line 82) | Map<String, dynamic> toJson()
class Images (line 100) | class Images {
method toJson (line 122) | Map<String, dynamic> toJson()
class Position (line 132) | class Position {
method toJson (line 153) | Map<String, dynamic> toJson()
class PositionType (line 162) | class PositionType {
method toJson (line 193) | Map<String, dynamic> toJson()
FILE: lib/modules/staff/staff_response.dart
class StaffResponse (line 3) | class StaffResponse {
method toJson (line 28) | Map<String, dynamic> toJson()
FILE: lib/pages/about/about_module.dart
class AboutModule (line 7) | class AboutModule extends Module {
method binds (line 9) | void binds(i)
method routes (line 12) | void routes(r)
FILE: lib/pages/about/about_page.dart
class AboutPage (line 17) | class AboutPage extends StatefulWidget {
method createState (line 21) | State<AboutPage> createState()
class _AboutPageState (line 24) | class _AboutPageState extends State<AboutPage> {
method initState (line 38) | void initState()
method onBackPressed (line 44) | void onBackPressed(BuildContext context)
method _getCacheDir (line 51) | Future<Directory> _getCacheDir()
method _getCacheSize (line 56) | Future<void> _getCacheSize()
method _getTotalSizeOfFilesInDir (line 77) | Future<int> _getTotalSizeOfFilesInDir(final Directory directory)
method _clearCache (line 94) | Future<void> _clearCache()
method _showCacheDialog (line 100) | void _showCacheDialog()
method build (line 132) | Widget build(BuildContext context)
FILE: lib/pages/collect/collect_controller.dart
class _CollectController (line 19) | abstract class _CollectController with Store {
method loadCollectibles (line 30) | void loadCollectibles()
method getCollectType (line 35) | int getCollectType(BangumiItem bangumiItem)
method addCollect (line 40) | Future<void> addCollect(BangumiItem bangumiItem, {type = 1})
method deleteCollect (line 58) | Future<void> deleteCollect(BangumiItem bangumiItem)
method updateLocalCollect (line 71) | Future<void> updateLocalCollect(BangumiItem bangumiItem)
method syncCollectibles (line 76) | Future<void> syncCollectibles()
method migrateCollect (line 101) | Future<void> migrateCollect()
method getBangumiIdsByType (line 117) | Set<int> getBangumiIdsByType(CollectType type)
method filterBangumiByType (line 126) | List<BangumiItem> filterBangumiByType(
FILE: lib/pages/collect/collect_controller.g.dart
function addCollect (line 32) | Future<void> addCollect(BangumiItem bangumiItem, {dynamic type = 1})
function deleteCollect (line 41) | Future<void> deleteCollect(BangumiItem bangumiItem)
function toString (line 47) | String toString()
FILE: lib/pages/collect/collect_module.dart
class CollectModule (line 4) | class CollectModule extends Module {
method routes (line 6) | void routes(r)
FILE: lib/pages/collect/collect_page.dart
class CollectPage (line 16) | class CollectPage extends StatefulWidget {
method createState (line 20) | State<CollectPage> createState()
class _CollectPageState (line 23) | class _CollectPageState extends State<CollectPage>
method onBackPressed (line 32) | void onBackPressed(BuildContext context)
method initState (line 42) | void initState()
method dispose (line 51) | void dispose()
method build (line 65) | Widget build(BuildContext context)
method contentGrid (line 144) | List<Widget> contentGrid(List<CollectedBangumi> collectedBangumiList)
FILE: lib/pages/download/download_controller.dart
class _DownloadController (line 23) | abstract class _DownloadController with Store {
method init (line 35) | Future<void> init()
method _migrateDanmakuDataToFiles (line 65) | Future<void> _migrateDanmakuDataToFiles()
method _initBackgroundService (line 100) | Future<void> _initBackgroundService()
method _onTaskData (line 110) | void _onTaskData(Object data)
method _onDownloadProgress (line 125) | void _onDownloadProgress(String recordKey, int episodeNumber,
method _updateBackgroundNotification (line 148) | Future<void> _updateBackgroundNotification()
method _startBackgroundServiceIfNeeded (line 170) | Future<void> _startBackgroundServiceIfNeeded()
method _getDownloadStats (line 179) | ({int activeCount, int pendingCount, int totalCount, double overallPro...
method getSpeed (line 208) | double getSpeed(int bangumiId, String pluginName, int episodeNumber)
method refreshRecords (line 216) | void refreshRecords()
method _findPlugin (line 222) | Plugin? _findPlugin(String pluginName)
method getRecord (line 230) | DownloadRecord? getRecord(int bangumiId, String pluginName)
method getEpisode (line 234) | DownloadEpisode? getEpisode(
method getEpisodeByUrl (line 239) | DownloadEpisode? getEpisodeByUrl(
method getLocalVideoPath (line 244) | String? getLocalVideoPath(
method getCompletedEpisodes (line 251) | List<DownloadEpisode> getCompletedEpisodes(int bangumiId, String plugi...
method _danmakuFilePath (line 256) | String _danmakuFilePath(String downloadDirectory)
method _readDanmakuFromFile (line 262) | Future<({List<Danmaku> danmakus, int danDanBangumiID})?> _readDanmakuF...
method _writeDanmakuToFile (line 292) | Future<void> _writeDanmakuToFile(
method getCachedDanmakus (line 303) | Future<List<Danmaku>?> getCachedDanmakus(
method updateCachedDanmakus (line 318) | Future<void> updateCachedDanmakus(
method startDownload (line 348) | Future<void> startDownload({
method _processResolveQueue (line 411) | Future<void> _processResolveQueue()
method _resolveAndEnqueue (line 423) | Future<void> _resolveAndEnqueue(_ResolveRequest request)
method _fetchAndCacheDanmakuAsync (line 513) | void _fetchAndCacheDanmakuAsync(
method _failEpisode (line 574) | void _failEpisode(String recordKey, int episodeNumber, String message)
method pauseDownload (line 587) | Future<void> pauseDownload(
method pauseAllDownloads (line 607) | Future<void> pauseAllDownloads()
method retryDownload (line 631) | Future<void> retryDownload({
method cancelDownload (line 692) | Future<void> cancelDownload(
method deleteRecord (line 705) | Future<void> deleteRecord(int bangumiId, String pluginName)
method deleteEpisode (line 721) | Future<void> deleteEpisode(
method priorityDownload (line 735) | Future<void> priorityDownload({
method resumeAllDownloads (line 796) | Future<void> resumeAllDownloads(int bangumiId, String pluginName)
method completedCount (line 824) | int completedCount(DownloadRecord record)
class _ResolveRequest (line 832) | class _ResolveRequest {
FILE: lib/pages/download/download_controller.g.dart
function refreshRecords (line 32) | void refreshRecords()
function toString (line 43) | String toString()
FILE: lib/pages/download/download_episode_sheet.dart
class DownloadEpisodeSheet (line 9) | class DownloadEpisodeSheet extends StatefulWidget {
method createState (line 15) | State<DownloadEpisodeSheet> createState()
class _DownloadEpisodeSheetState (line 18) | class _DownloadEpisodeSheetState extends State<DownloadEpisodeSheet> {
method build (line 30) | Widget build(BuildContext context)
method _startBatchDownload (line 227) | void _startBatchDownload(BuildContext context)
FILE: lib/pages/download/download_page.dart
class DownloadPage (line 12) | class DownloadPage extends StatefulWidget {
method createState (line 16) | State<DownloadPage> createState()
class _DownloadPageState (line 19) | class _DownloadPageState extends State<DownloadPage> {
method initState (line 24) | void initState()
method build (line 30) | Widget build(BuildContext context)
method _buildRecordCard (line 51) | Widget _buildRecordCard(DownloadRecord record)
method _buildEpisodeTile (line 122) | Widget _buildEpisodeTile(DownloadRecord record, DownloadEpisode episode)
method _getStatusIcon (line 173) | Widget _getStatusIcon(DownloadEpisode episode)
method _getStatusText (line 207) | String _getStatusText(DownloadRecord record, DownloadEpisode episode)
method _getActionButtons (line 233) | List<Widget> _getActionButtons(
method _playEpisode (line 313) | void _playEpisode(DownloadRecord record, DownloadEpisode episode)
method _confirmDeleteEpisode (line 365) | void _confirmDeleteEpisode(DownloadRecord record, DownloadEpisode epis...
method _confirmDeleteRecord (line 394) | void _confirmDeleteRecord(DownloadRecord record)
FILE: lib/pages/download/download_page_module.dart
class DownloadModule (line 4) | class DownloadModule extends Module {
method routes (line 6) | void routes(r)
FILE: lib/pages/error/storage_error_page.dart
class StorageErrorPage (line 6) | class StorageErrorPage extends StatelessWidget {
method build (line 10) | Widget build(BuildContext context)
FILE: lib/pages/history/history_controller.dart
class _HistoryController (line 11) | abstract class _HistoryController with Store {
method init (line 17) | void init()
method updateHistory (line 23) | Future<void> updateHistory(
method lastWatching (line 37) | Progress? lastWatching(BangumiItem bangumiItem, String adapterName)
method findProgress (line 41) | Progress? findProgress(BangumiItem bangumiItem, String adapterName, in...
method deleteHistory (line 45) | Future<void> deleteHistory(History history)
method clearProgress (line 50) | Future<void> clearProgress(BangumiItem bangumiItem, String adapterName...
method clearAll (line 55) | Future<void> clearAll()
FILE: lib/pages/history/history_controller.g.dart
function toString (line 29) | String toString()
FILE: lib/pages/history/history_module.dart
class HistoryModule (line 4) | class HistoryModule extends Module {
method routes (line 6) | void routes(r)
FILE: lib/pages/history/history_page.dart
class HistoryPage (line 10) | class HistoryPage extends StatefulWidget {
method createState (line 14) | State<HistoryPage> createState()
class _HistoryPageState (line 17) | class _HistoryPageState extends State<HistoryPage>
method initState (line 25) | void initState()
method onBackPressed (line 30) | void onBackPressed(BuildContext context)
method showHistoryClearDialog (line 37) | void showHistoryClearDialog()
method build (line 69) | Widget build(BuildContext context)
FILE: lib/pages/index_module.dart
class IndexModule (line 26) | class IndexModule extends Module {
method binds (line 31) | void binds(i)
method routes (line 53) | void routes(r)
FILE: lib/pages/index_page.dart
class IndexPage (line 5) | class IndexPage extends StatefulWidget {
method createState (line 10) | State<IndexPage> createState()
class _IndexPageState (line 13) | class _IndexPageState extends State<IndexPage> with WidgetsBindingObser...
method build (line 16) | Widget build(BuildContext context)
FILE: lib/pages/info/character_page.dart
class CharacterPage (line 10) | class CharacterPage extends StatefulWidget {
method createState (line 16) | State<CharacterPage> createState()
class _CharacterPageState (line 19) | class _CharacterPageState extends State<CharacterPage> {
method loadCharacter (line 25) | Future<void> loadCharacter()
method loadComments (line 40) | Future<void> loadComments()
method initState (line 56) | void initState()
method build (line 65) | Widget build(BuildContext context)
FILE: lib/pages/info/info_controller.dart
class _InfoController (line 17) | abstract class _InfoController with Store {
method queryBangumiInfoByID (line 39) | Future<void> queryBangumiInfoByID(int id, {String type = "init"})
method queryBangumiCommentsByID (line 62) | Future<void> queryBangumiCommentsByID(int id, {int offset = 0})
method queryBangumiCharactersByID (line 72) | Future<void> queryBangumiCharactersByID(int id)
method queryBangumiStaffsByID (line 95) | Future<void> queryBangumiStaffsByID(int id)
FILE: lib/pages/info/info_controller.g.dart
function toString (line 110) | String toString()
FILE: lib/pages/info/info_module.dart
class InfoModule (line 4) | class InfoModule extends Module {
method routes (line 6) | void routes(r)
FILE: lib/pages/info/info_page.dart
class InfoPage (line 24) | class InfoPage extends StatefulWidget {
method createState (line 28) | State<InfoPage> createState()
class _InfoPageState (line 31) | class _InfoPageState extends State<InfoPage> with TickerProviderStateMix...
method loadCharacters (line 51) | Future<void> loadCharacters()
method loadStaff (line 74) | Future<void> loadStaff()
method loadMoreComments (line 97) | Future<void> loadMoreComments({int offset = 0})
method initState (line 121) | void initState()
method dispose (line 159) | void dispose()
method queryBangumiInfoByID (line 170) | Future<void> queryBangumiInfoByID(int id, {String type = "init"})
method build (line 180) | Widget build(BuildContext context)
FILE: lib/pages/info/info_tabview.dart
class InfoTabView (line 15) | class InfoTabView extends StatefulWidget {
method createState (line 46) | State<InfoTabView> createState()
class _InfoTabViewState (line 49) | class _InfoTabViewState extends State<InfoTabView>
method build (line 462) | Widget build(BuildContext context)
FILE: lib/pages/info/source_sheet.dart
class SourceSheet (line 20) | class SourceSheet extends StatefulWidget {
method createState (line 31) | State<SourceSheet> createState()
class _SourceSheetState (line 34) | class _SourceSheetState extends State<SourceSheet>
method initState (line 52) | void initState()
method dispose (line 62) | void dispose()
method showAntiCrawlerDialog (line 73) | void showAntiCrawlerDialog(Plugin plugin)
method showCaptchaDialog (line 83) | void showCaptchaDialog(Plugin plugin)
method doSubmit (line 106) | Future<void> doSubmit()
method showButtonClickDialog (line 280) | void showButtonClickDialog(Plugin plugin)
method onVerified (line 289) | void onVerified()
method buildPluginView (line 370) | Widget buildPluginView(Plugin plugin, List<Widget> cardList)
method showAliasSearchDialog (line 420) | void showAliasSearchDialog(String pluginName)
method showCustomSearchDialog (line 497) | void showCustomSearchDialog(String pluginName)
method build (line 546) | Widget build(BuildContext context)
FILE: lib/pages/init_page.dart
class InitPage (line 20) | class InitPage extends StatefulWidget {
method createState (line 24) | State<InitPage> createState()
class _InitPageState (line 27) | class _InitPageState extends State<InitPage> {
method initState (line 38) | void initState()
method _initializeApp (line 44) | Future<void> _initializeApp()
method _setupBackgroundDownloadNavigation (line 65) | void _setupBackgroundDownloadNavigation()
method _startDefaultPage (line 111) | void _startDefaultPage()
method _migrateStorage (line 124) | Future<void> _migrateStorage()
method _loadShaders (line 128) | Future<void> _loadShaders()
method _loadDanmakuShield (line 132) | Future<void> _loadDanmakuShield()
method _webDavInit (line 136) | Future<void> _webDavInit()
method _checkRunningOnX11 (line 156) | Future<void> _checkRunningOnX11()
method _pluginInit (line 196) | Future<void> _pluginInit()
method _switchUpdateMirror (line 250) | Future<void> _switchUpdateMirror()
method _update (line 306) | Future<void> _update()
method _pluginUpdate (line 313) | Future<void> _pluginUpdate()
method build (line 327) | Widget build(BuildContext context)
class LoadingWidget (line 332) | class LoadingWidget extends StatelessWidget {
method build (line 336) | Widget build(BuildContext context)
FILE: lib/pages/logs/logs_page.dart
class LogsPage (line 9) | class LogsPage extends StatefulWidget {
method createState (line 13) | State<LogsPage> createState()
class _LogsPageState (line 16) | class _LogsPageState extends State<LogsPage> {
method initState (line 30) | void initState()
method dispose (line 37) | void dispose()
method _onScroll (line 43) | void _onScroll()
method _loadLogs (line 57) | Future<void> _loadLogs()
method _loadMoreLines (line 97) | void _loadMoreLines()
method _getLogsFile (line 121) | Future<File> _getLogsFile()
method _clearLogs (line 127) | Future<void> _clearLogs()
method _copyLogs (line 145) | Future<void> _copyLogs()
method build (line 157) | Widget build(BuildContext context)
FILE: lib/pages/menu/menu.dart
class ScaffoldMenu (line 8) | class ScaffoldMenu extends StatefulWidget {
method createState (line 12) | State<ScaffoldMenu> createState()
class NavigationBarState (line 15) | class NavigationBarState extends ChangeNotifier {
method getDefaultSelectedIndex (line 26) | int getDefaultSelectedIndex()
method updateSelectedIndex (line 44) | void updateSelectedIndex(int pageIndex)
method hideNavigate (line 49) | void hideNavigate()
method showNavigate (line 54) | void showNavigate()
class _ScaffoldMenu (line 60) | class _ScaffoldMenu extends State<ScaffoldMenu> {
method build (line 64) | Widget build(BuildContext context)
method bottomMenuWidget (line 77) | Widget bottomMenuWidget(BuildContext context, NavigationBarState state)
method sideMenuWidget (line 121) | Widget sideMenuWidget(BuildContext context, NavigationBarState state)
FILE: lib/pages/my/my_controller.dart
class _MyController (line 12) | abstract class _MyController with Store {
method isDanmakuBlocked (line 18) | bool isDanmakuBlocked(String? danmaku)
method loadShieldList (line 38) | void loadShieldList()
method addShieldList (line 43) | void addShieldList(String item)
method removeShieldList (line 61) | void removeShieldList(String item)
method checkUpdate (line 67) | Future<bool> checkUpdate({String type = 'manual'})
FILE: lib/pages/my/my_controller.g.dart
function toString (line 29) | String toString()
FILE: lib/pages/my/my_module.dart
class MyModule (line 4) | class MyModule extends Module {
method routes (line 6) | void routes(r)
FILE: lib/pages/my/my_page.dart
class MyPage (line 9) | class MyPage extends StatefulWidget {
method createState (line 13) | State<MyPage> createState()
class _MyPageState (line 16) | class _MyPageState extends State<MyPage> {
method onBackPressed (line 19) | void onBackPressed(BuildContext context)
method initState (line 29) | void initState()
method build (line 36) | Widget build(BuildContext context)
FILE: lib/pages/player/episode_comments_sheet.dart
class EpisodeInfo (line 10) | class EpisodeInfo extends InheritedWidget {
method updateShouldNotify (line 18) | bool updateShouldNotify(covariant InheritedWidget oldWidget)
method of (line 20) | EpisodeInfo? of(BuildContext context)
class EpisodeCommentsSheet (line 25) | class EpisodeCommentsSheet extends StatefulWidget {
method createState (line 29) | State<EpisodeCommentsSheet> createState()
class _EpisodeCommentsSheetState (line 32) | class _EpisodeCommentsSheetState extends State<EpisodeCommentsSheet> {
method initState (line 43) | void initState()
method loadComments (line 47) | Future<void> loadComments(int episode)
method toggleSortOrder (line 64) | void toggleSortOrder()
method didChangeDependencies (line 69) | void didChangeDependencies()
method dispose (line 82) | void dispose()
method showEpisodeSelection (line 206) | void showEpisodeSelection()
method build (line 251) | Widget build(BuildContext context)
FILE: lib/pages/player/player_controller.dart
class PlaybackInitParams (line 28) | class PlaybackInitParams {
type DanmakuDestination (line 56) | enum DanmakuDestination {
class SyncPlayChatMessage (line 61) | class SyncPlayChatMessage {
class _PlayerController (line 77) | abstract class _PlayerController with Store {
method init (line 227) | Future<void> init(PlaybackInitParams params)
method setupPlayerDebugInfoSubscription (line 298) | Future<void> setupPlayerDebugInfoSubscription()
method cancelPlayerDebugInfoSubscription (line 340) | Future<void> cancelPlayerDebugInfoSubscription()
method createVideoController (line 351) | Future<Player> createVideoController(
method setShader (line 481) | Future<void> setShader(int type, {bool synchronized = true})
method setPlaybackSpeed (line 511) | Future<void> setPlaybackSpeed(double playerSpeed)
method updateDanmakuSpeed (line 524) | void updateDanmakuSpeed()
method setVolume (line 535) | Future<void> setVolume(double value)
method playOrPause (line 548) | Future<void> playOrPause()
method seek (line 556) | Future<void> seek(Duration duration, {bool enableSync = true})
method pause (line 568) | Future<void> pause({bool enableSync = true})
method play (line 580) | Future<void> play({bool enableSync = true})
method dispose (line 592) | Future<void> dispose({bool disposeSyncPlayController = true})
method stop (line 609) | Future<void> stop()
method screenshot (line 616) | Future<Uint8List?> screenshot({String format = 'image/jpeg'})
method setButtonForwardTime (line 620) | void setButtonForwardTime(int time)
method setArrowKeyForwardTime (line 625) | void setArrowKeyForwardTime(int time)
method _loadDanmaku (line 631) | Future<void> _loadDanmaku(
method _loadCachedDanmaku (line 640) | Future<void> _loadCachedDanmaku(
method _saveDanmakuToCache (line 694) | void _saveDanmakuToCache(DownloadController downloadController, int ba...
method getDanDanmakuByBgmBangumiID (line 712) | Future<void> getDanDanmakuByBgmBangumiID(
method getDanDanmakuByEpisodeID (line 738) | Future<void> getDanDanmakuByEpisodeID(int episodeID)
method addDanmakus (line 758) | void addDanmakus(List<Danmaku> danmakus)
method lanunchExternalPlayer (line 772) | void lanunchExternalPlayer()
method createSyncPlayRoom (line 820) | Future<void> createSyncPlayRoom(
method setSyncPlayCurrentPosition (line 980) | void setSyncPlayCurrentPosition(
method setSyncPlayPlayingBangumi (line 995) | Future<void> setSyncPlayPlayingBangumi(
method requestSyncPlaySync (line 1005) | Future<void> requestSyncPlaySync({bool? doSeek})
method sendSyncPlayChatMessage (line 1009) | Future<void> sendSyncPlayChatMessage(String message)
method exitSyncPlayRoom (line 1016) | Future<void> exitSyncPlayRoom()
FILE: lib/pages/player/player_controller.g.dart
function toString (line 573) | String toString()
FILE: lib/pages/player/player_item.dart
class PlayerItem (line 34) | class PlayerItem extends StatefulWidget {
method createState (line 60) | State<PlayerItem> createState()
class _PlayerItemState (line 63) | class _PlayerItemState extends State<PlayerItem>
method didChangeAppLifecycleState (line 129) | void didChangeAppLifecycleState(AppLifecycleState state)
method _loadShortcuts (line 138) | void _loadShortcuts()
method _initKeyboardActions (line 147) | void _initKeyboardActions()
method _initPlayerMenu (line 178) | void _initPlayerMenu()
method _disposePlayerMenu (line 183) | void _disposePlayerMenu()
method handleShortcutDown (line 188) | bool handleShortcutDown(String keyLabel)
method handleShortcutLongPress (line 204) | bool handleShortcutLongPress(String keyLabel, String mode)
method handlePreNextEpisode (line 219) | Future<void> handlePreNextEpisode(String direction)
method handleShortcutRewind (line 248) | Future<void> handleShortcutRewind()
method handleShortcutForwardDown (line 266) | Future<void> handleShortcutForwardDown()
method handleShortcutForwardRepeat (line 270) | Future<void> handleShortcutForwardRepeat()
method handleShortcutForwardUp (line 278) | Future<void> handleShortcutForwardUp()
method handleShortcutFullscreen (line 301) | void handleShortcutFullscreen()
method handleShortcutExitFullscreen (line 306) | void handleShortcutExitFullscreen()
method _handleTap (line 319) | void _handleTap()
method _handleDoubleTap (line 331) | void _handleDoubleTap()
method _handleHove (line 339) | void _handleHove()
method _handleMouseScroller (line 347) | void _handleMouseScroller()
method skipOP (line 359) | Future<void> skipOP()
method handleDanmaku (line 364) | void handleDanmaku()
method _uploadHistoryToWebDav (line 386) | Future<void> _uploadHistoryToWebDav()
method _handleFullscreenChange (line 395) | void _handleFullscreenChange(BuildContext context)
method handleProgressBarDragStart (line 402) | void handleProgressBarDragStart(ThumbDragDetails details)
method handleProgressBarDragEnd (line 409) | void handleProgressBarDragEnd()
method handleScreenshot (line 417) | Future<void> handleScreenshot()
method handleSuperResolutionChange (line 448) | Future<void> handleSuperResolutionChange(int shaderIndex)
method handleFullscreen (line 541) | void handleFullscreen()
method displayVideoController (line 556) | void displayVideoController()
method hideVideoController (line 563) | void hideVideoController()
method setPlaybackSpeed (line 569) | Future<void> setPlaybackSpeed(double speed)
method handleSpeedChange (line 573) | Future<void> handleSpeedChange(String type)
method handleShortcutVolumeChange (line 597) | Future<void> handleShortcutVolumeChange(String type)
method setBrightness (line 630) | Future<void> setBrightness(double value)
method startHideTimer (line 637) | void startHideTimer()
method cancelHideTimer (line 648) | void cancelHideTimer()
method getPlayerTimer (line 652) | Timer getPlayerTimer()
method showDanmakuSearchDialog (line 763) | void showDanmakuSearchDialog(String keyword)
method showDanmakuSwitch (line 844) | void showDanmakuSwitch()
method showVideoInfo (line 1019) | void showVideoInfo()
method showSyncPlayEndPointSwitchDialog (line 1061) | void showSyncPlayEndPointSwitchDialog()
method showSyncPlayRoomCreateDialog (line 1190) | void showSyncPlayRoomCreateDialog()
method needFullPanel (line 1265) | bool needFullPanel(BuildContext context)
method onWindowRestore (line 1293) | void onWindowRestore()
method initState (line 1298) | void initState()
method dispose (line 1360) | void dispose()
method build (line 1388) | Widget build(BuildContext context)
FILE: lib/pages/player/player_item_panel.dart
class PlayerItemPanel (line 22) | class PlayerItemPanel extends StatefulWidget {
method createState (line 77) | State<PlayerItemPanel> createState()
class _PlayerItemPanelState (line 80) | class _PlayerItemPanelState extends State<PlayerItemPanel> {
method showSetSpeedSheet (line 180) | void showSetSpeedSheet()
method showForwardChange (line 232) | void showForwardChange()
method initState (line 280) | void initState()
method cacheSvgIcons (line 307) | void cacheSvgIcons()
method danmakuOnIcon (line 323) | Widget danmakuOnIcon(BuildContext context)
method _buildDanmakuToggleButton (line 345) | Widget _buildDanmakuToggleButton(BuildContext context)
method forwardIcon (line 372) | Widget forwardIcon()
method build (line 392) | Widget build(BuildContext context)
FILE: lib/pages/player/player_item_surface.dart
class PlayerItemSurface (line 7) | class PlayerItemSurface extends StatefulWidget {
method createState (line 11) | State<PlayerItemSurface> createState()
class _PlayerItemSurfaceState (line 14) | class _PlayerItemSurfaceState extends State<PlayerItemSurface> {
method build (line 18) | Widget build(BuildContext context)
FILE: lib/pages/player/smallest_player_item_panel.dart
class SmallestPlayerItemPanel (line 21) | class SmallestPlayerItemPanel extends StatefulWidget {
method createState (line 66) | State<SmallestPlayerItemPanel> createState()
class _SmallestPlayerItemPanelState (line 70) | class _SmallestPlayerItemPanelState extends State<SmallestPlayerItemPane...
method showForwardChange (line 89) | void showForwardChange()
method initState (line 135) | void initState()
method cacheSvgIcons (line 162) | void cacheSvgIcons()
method danmakuOnIcon (line 171) | Widget danmakuOnIcon(BuildContext context)
method _buildDanmakuToggleButton (line 193) | Widget _buildDanmakuToggleButton(BuildContext context)
method forwardIcon (line 220) | Widget forwardIcon()
method build (line 240) | Widget build(BuildContext context)
FILE: lib/pages/plugin_editor/plugin_editor_page.dart
class PluginEditorPage (line 10) | class PluginEditorPage extends StatefulWidget {
method createState (line 16) | State<PluginEditorPage> createState()
class _PluginEditorPageState (line 19) | class _PluginEditorPageState extends State<PluginEditorPage> {
method initState (line 55) | void initState()
method build (line 85) | Widget build(BuildContext context)
method _buildTextFieldTile (line 383) | Widget _buildTextFieldTile(
FILE: lib/pages/plugin_editor/plugin_module.dart
class PluginModule (line 7) | class PluginModule extends Module {
method binds (line 9) | void binds(i)
method routes (line 12) | void routes(r)
FILE: lib/pages/plugin_editor/plugin_shop_page.dart
class PluginShopPage (line 11) | class PluginShopPage extends StatefulWidget {
method createState (line 15) | State<PluginShopPage> createState()
class _PluginShopPageState (line 18) | class _PluginShopPageState extends State<PluginShopPage> {
method onBackPressed (line 28) | void onBackPressed(BuildContext context)
method initState (line 36) | void initState()
method _handleRefresh (line 43) | void _handleRefresh()
method _toggleSort (line 65) | void _toggleSort()
method build (line 234) | Widget build(BuildContext context)
FILE: lib/pages/plugin_editor/plugin_test_page.dart
type CoreColorType (line 20) | enum CoreColorType { error, success, waiting }
function getCoreColor (line 23) | Color getCoreColor(CoreColorType type)
class PluginTestPage (line 35) | class PluginTestPage extends StatefulWidget {
method createState (line 39) | State<PluginTestPage> createState()
class _PluginTestPageState (line 42) | class _PluginTestPageState extends State<PluginTestPage> {
method initState (line 71) | void initState()
method dispose (line 79) | void dispose()
method onBackPressed (line 89) | void onBackPressed()
method resetState (line 92) | void resetState()
method _parseItemHtml (line 105) | String _parseItemHtml(int index)
method _toggleItemHtml (line 120) | void _toggleItemHtml(int index)
method startTest (line 131) | Future<void> startTest()
method build (line 158) | Widget build(BuildContext context)
method _buildExpansionTile (line 221) | Widget _buildExpansionTile({
method _buildKeywordInput (line 241) | Widget _buildKeywordInput(ThemeData theme)
method _buildErrorWidget (line 259) | Widget _buildErrorWidget(ThemeData theme)
method _buildLoading (line 295) | Widget _buildLoading(ThemeData theme)
method _buildEmpty (line 302) | Widget _buildEmpty(String text, ThemeData theme, {bool isError = false})
method _getSearchSubtitle (line 317) | String _getSearchSubtitle()
method _getSubtitleColor (line 324) | Color _getSubtitleColor(String subtitle, ThemeData theme)
method _buildSearchContent (line 338) | Widget _buildSearchContent(ThemeData theme)
method _getParseSubtitle (line 361) | String _getParseSubtitle()
method _buildParseContent (line 368) | Widget _buildParseContent(ThemeData theme)
method _buildSearchItemCard (line 385) | Widget _buildSearchItemCard(SearchItem item, int i, ThemeData theme)
method _getChapterSubtitle (line 448) | String _getChapterSubtitle()
method _buildChapterContent (line 456) | Widget _buildChapterContent(ThemeData theme)
method _buildChapterCard (line 474) | Widget _buildChapterCard(Road road, int i, ThemeData theme)
FILE: lib/pages/plugin_editor/plugin_view_page.dart
class PluginViewPage (line 12) | class PluginViewPage extends StatefulWidget {
method createState (line 16) | State<PluginViewPage> createState()
class _PluginViewPageState (line 19) | class _PluginViewPageState extends State<PluginViewPage> {
method _handleUpdate (line 28) | Future<void> _handleUpdate()
method _handleAdd (line 39) | void _handleAdd()
method _showInputDialog (line 80) | void _showInputDialog()
method onBackPressed (line 122) | void onBackPressed(BuildContext context)
method initState (line 130) | void initState()
method build (line 135) | Widget build(BuildContext context)
method pluginCardTrailing (line 354) | Widget pluginCardTrailing(int index)
method popupMenuButton (line 381) | Widget popupMenuButton(int index)
FILE: lib/pages/popular/popular_controller.dart
class _PopularController (line 11) | abstract class _PopularController with Store {
method setCurrentTag (line 31) | void setCurrentTag(String s)
method clearBangumiList (line 35) | void clearBangumiList()
method queryBangumiByTrend (line 39) | Future<void> queryBangumiByTrend({String type = 'add'})
method queryBangumiByTag (line 51) | Future<void> queryBangumiByTag({String type = 'add'})
FILE: lib/pages/popular/popular_controller.g.dart
function toString (line 93) | String toString()
FILE: lib/pages/popular/popular_module.dart
class PopularModule (line 4) | class PopularModule extends Module {
method routes (line 6) | void routes(r)
FILE: lib/pages/popular/popular_page.dart
class PopularPage (line 19) | class PopularPage extends StatefulWidget {
method createState (line 23) | State<PopularPage> createState()
class _PopularPageState (line 26) | class _PopularPageState extends State<PopularPage>
method initState (line 41) | void initState()
method didChangeDependencies (line 50) | void didChangeDependencies()
method dispose (line 55) | void dispose()
method scrollListener (line 61) | void scrollListener()
method showWindowButton (line 75) | bool showWindowButton()
method onBackPressed (line 80) | void onBackPressed(BuildContext context)
method build (line 96) | Widget build(BuildContext context)
method contentGrid (line 166) | Widget contentGrid(bangumiList)
method buildSliverAppBar (line 200) | Widget buildSliverAppBar()
method buildActions (line 266) | List<Widget> buildActions()
method showTagMenu (line 296) | Future<void> showTagMenu()
FILE: lib/pages/router.dart
class MenuRouteItem (line 7) | class MenuRouteItem {
class MenuRoute (line 17) | class MenuRoute {
FILE: lib/pages/search/search_controller.dart
class _SearchPageController (line 15) | abstract class _SearchPageController with Store {
method loadSearchHistories (line 38) | void loadSearchHistories()
method attachSortParams (line 49) | String attachSortParams(String input, String sort)
method searchBangumi (line 56) | Future<void> searchBangumi(String input, {String type = 'add'})
method deleteSearchHistory (line 100) | Future<void> deleteSearchHistory(SearchHistory history)
method clearSearchHistory (line 106) | Future<void> clearSearchHistory()
method setNotShowWatchedBangumis (line 112) | Future<void> setNotShowWatchedBangumis(bool value)
method setNotShowAbandonedBangumis (line 118) | Future<void> setNotShowAbandonedBangumis(bool value)
method loadWatchedBangumiIds (line 123) | Set<int> loadWatchedBangumiIds()
method loadAbandonedBangumiIds (line 127) | Set<int> loadAbandonedBangumiIds()
FILE: lib/pages/search/search_controller.g.dart
function searchBangumi (line 126) | Future<void> searchBangumi(String input, {String type = 'add'})
function deleteSearchHistory (line 136) | Future<void> deleteSearchHistory(SearchHistory history)
function clearSearchHistory (line 145) | Future<void> clearSearchHistory()
function setNotShowWatchedBangumis (line 155) | Future<void> setNotShowWatchedBangumis(bool value)
function setNotShowAbandonedBangumis (line 165) | Future<void> setNotShowAbandonedBangumis(bool value)
function loadSearchHistories (line 174) | void loadSearchHistories()
function toString (line 185) | String toString()
FILE: lib/pages/search/search_module.dart
class SearchModule (line 4) | class SearchModule extends Module {
method binds (line 6) | void binds(i)
method routes (line 9) | void routes(r)
FILE: lib/pages/search/search_page.dart
class SearchPage (line 11) | class SearchPage extends StatefulWidget {
method createState (line 17) | State<SearchPage> createState()
class _SearchPageState (line 20) | class _SearchPageState extends State<SearchPage> {
method initState (line 34) | void initState()
method dispose (line 41) | void dispose()
method scrollListener (line 47) | void scrollListener()
method showFilterSwitcher (line 58) | Widget showFilterSwitcher()
method showSortSwitcher (line 99) | Widget showSortSwitcher()
method showSearchOptionTabBar (line 141) | Widget showSearchOptionTabBar({required List<Widget> options})
method build (line 164) | Widget build(BuildContext context)
FILE: lib/pages/settings/danmaku/danmaku_module.dart
class DanmakuModule (line 5) | class DanmakuModule extends Module {
method binds (line 7) | void binds(i)
method routes (line 10) | void routes(r)
FILE: lib/pages/settings/danmaku/danmaku_settings.dart
class DanmakuSettingsPage (line 11) | class DanmakuSettingsPage extends StatefulWidget {
method createState (line 15) | State<DanmakuSettingsPage> createState()
class _DanmakuSettingsPageState (line 18) | class _DanmakuSettingsPageState extends State<DanmakuSettingsPage> {
method initState (line 41) | void initState()
method onBackPressed (line 79) | void onBackPressed(BuildContext context)
method updateDanmakuArea (line 86) | void updateDanmakuArea(double i)
method updateDanmakuOpacity (line 93) | void updateDanmakuOpacity(double i)
method updateDanmakuFontSize (line 100) | void updateDanmakuFontSize(double i)
method updateDanmakuDuration (line 107) | void updateDanmakuDuration(double i)
method updateDanmakuLineHeight (line 114) | void updateDanmakuLineHeight(double i)
method updateDanmakuFontWeight (line 121) | void updateDanmakuFontWeight(int i)
method updateDanmakuBorderSize (line 128) | void updateDanmakuBorderSize(double i)
method build (line 136) | Widget build(BuildContext context)
FILE: lib/pages/settings/danmaku/danmaku_settings_sheet.dart
class DanmakuSettingsSheet (line 9) | class DanmakuSettingsSheet extends StatefulWidget {
method createState (line 20) | State<DanmakuSettingsSheet> createState()
class _DanmakuSettingsSheetState (line 23) | class _DanmakuSettingsSheetState extends State<DanmakuSettingsSheet> {
method showDanmakuShieldSheet (line 26) | void showDanmakuShieldSheet()
method build (line 45) | Widget build(BuildContext context)
FILE: lib/pages/settings/danmaku/danmaku_shield_settings.dart
class DanmakuShieldSettings (line 7) | class DanmakuShieldSettings extends StatefulWidget {
method createState (line 11) | State<DanmakuShieldSettings> createState()
class _DanmakuShieldSettingsState (line 14) | class _DanmakuShieldSettingsState extends State<DanmakuShieldSettings> {
method build (line 19) | Widget build(BuildContext context)
FILE: lib/pages/settings/decoder_settings.dart
class DecoderSettings (line 8) | class DecoderSettings extends StatefulWidget {
method createState (line 12) | State<DecoderSettings> createState()
class _DecoderSettingsState (line 15) | class _DecoderSettingsState extends State<DecoderSettings> {
method build (line 22) | Widget build(BuildContext context)
FILE: lib/pages/settings/displaymode_settings.dart
class SetDisplayMode (line 9) | class SetDisplayMode extends StatefulWidget {
method createState (line 13) | State<SetDisplayMode> createState()
class _SetDisplayModeState (line 16) | class _SetDisplayModeState extends State<SetDisplayMode> {
method initState (line 29) | void initState()
method fetchAll (line 37) | Future<void> fetchAll()
method init (line 44) | Future<void> init()
method getDisplayModeType (line 54) | Future<DisplayMode> getDisplayModeType(modes)
method build (line 64) | Widget build(BuildContext context)
FILE: lib/pages/settings/download_settings.dart
class DownloadSettingsPage (line 7) | class DownloadSettingsPage extends StatefulWidget {
method createState (line 11) | State<DownloadSettingsPage> createState()
class _DownloadSettingsPageState (line 14) | class _DownloadSettingsPageState extends State<DownloadSettingsPage> {
method initState (line 21) | void initState()
method build (line 38) | Widget build(BuildContext context)
FILE: lib/pages/settings/interface_settings.dart
class InterfaceSettingsPage (line 9) | class InterfaceSettingsPage extends StatefulWidget {
method createState (line 13) | State<InterfaceSettingsPage> createState()
class _InterfaceSettingsPageState (line 16) | class _InterfaceSettingsPageState extends State<InterfaceSettingsPage> {
method initState (line 30) | void initState()
method updateDefaultPage (line 37) | void updateDefaultPage(String page)
method build (line 45) | Widget build(BuildContext context)
FILE: lib/pages/settings/keyboard_settings.dart
class KeyboardSettingsPage (line 9) | class KeyboardSettingsPage extends StatefulWidget {
method createState (line 13) | State<KeyboardSettingsPage> createState()
class _KeyboardSettingsPageState (line 16) | class _KeyboardSettingsPageState extends State<KeyboardSettingsPage> {
method initState (line 26) | void initState()
method dispose (line 38) | void dispose()
method handleShortcutInput (line 49) | bool handleShortcutInput(String rawKey)
method startListening (line 79) | void startListening(String func, int index)
method build (line 92) | Widget build(BuildContext context)
FILE: lib/pages/settings/player_settings.dart
class PlayerSettingsPage (line 12) | class PlayerSettingsPage extends StatefulWidget {
method createState (line 16) | State<PlayerSettingsPage> createState()
class _PlayerSettingsPageState (line 19) | class _PlayerSettingsPageState extends State<PlayerSettingsPage> {
method initState (line 41) | void initState()
method onBackPressed (line 73) | void onBackPressed(BuildContext context)
method updateDefaultPlaySpeed (line 80) | void updateDefaultPlaySpeed(double speed)
method updateDefaultShortcutForwardPlaySpeed (line 87) | void updateDefaultShortcutForwardPlaySpeed(double speed)
method updatePlayerLogLevel (line 94) | void updatePlayerLogLevel(int level)
method updateDefaultAspectRatioType (line 101) | void updateDefaultAspectRatioType(int type)
method updateButtonSkipTime (line 108) | Future<void> updateButtonSkipTime()
method _showSkipTimeChangeDialog (line 122) | Future<int?> _showSkipTimeChangeDialog(
method build (line 176) | Widget build(BuildContext context)
FILE: lib/pages/settings/proxy/proxy_editor_page.dart
class ProxyEditorPage (line 11) | class ProxyEditorPage extends StatefulWidget {
method createState (line 15) | State<ProxyEditorPage> createState()
class _ProxyEditorPageState (line 18) | class _ProxyEditorPageState extends State<ProxyEditorPage> {
method initState (line 25) | void initState()
method dispose (line 34) | void dispose()
method saveAndTest (line 40) | Future<void> saveAndTest()
method build (line 84) | Widget build(BuildContext context)
FILE: lib/pages/settings/proxy/proxy_module.dart
class ProxyModule (line 5) | class ProxyModule extends Module {
method binds (line 7) | void binds(i)
method routes (line 10) | void routes(r)
FILE: lib/pages/settings/proxy/proxy_settings_page.dart
class ProxySettingsPage (line 10) | class ProxySettingsPage extends StatefulWidget {
method createState (line 14) | State<ProxySettingsPage> createState()
class _ProxySettingsPageState (line 17) | class _ProxySettingsPageState extends State<ProxySettingsPage> {
method initState (line 22) | void initState()
method onBackPressed (line 27) | void onBackPressed(BuildContext context)
method updateProxyEnable (line 34) | Future<void> updateProxyEnable(bool value)
method build (line 54) | Widget build(BuildContext context)
FILE: lib/pages/settings/renderer_settings.dart
class RendererSettings (line 8) | class RendererSettings extends StatefulWidget {
method createState (line 12) | State<RendererSettings> createState()
class _RendererSettingsState (line 15) | class _RendererSettingsState extends State<RendererSettings> {
method build (line 22) | Widget build(BuildContext context)
FILE: lib/pages/settings/settings_module.dart
class SettingsModule (line 19) | class SettingsModule extends Module {
method routes (line 21) | void routes(r)
FILE: lib/pages/settings/super_resolution_settings.dart
class SuperResolutionSettings (line 7) | class SuperResolutionSettings extends StatefulWidget {
method createState (line 11) | State<SuperResolutionSettings> createState()
class _SuperResolutionSettingsState (line 15) | class _SuperResolutionSettingsState extends State<SuperResolutionSetting...
method initState (line 25) | void initState()
method build (line 32) | Widget build(BuildContext context)
FILE: lib/pages/settings/theme_settings_page.dart
class ThemeSettingsPage (line 17) | class ThemeSettingsPage extends StatefulWidget {
method createState (line 21) | State<ThemeSettingsPage> createState()
class _ThemeSettingsPageState (line 24) | class _ThemeSettingsPageState extends State<ThemeSettingsPage> {
method initState (line 38) | void initState()
method onBackPressed (line 54) | void onBackPressed(BuildContext context)
method setTheme (line 61) | void setTheme(Color? color)
method resetTheme (line 86) | void resetTheme()
method updateTheme (line 111) | void updateTheme(String theme)
method updateOledEnhance (line 127) | void updateOledEnhance()
method build (line 139) | Widget build(BuildContext context)
FILE: lib/pages/timeline/timeline_controller.dart
class _TimelineController (line 13) | abstract class _TimelineController with Store {
method init (line 39) | void init()
method getSchedules (line 45) | Future<void> getSchedules()
method getSchedulesBySeason (line 57) | Future<void> getSchedulesBySeason()
method tryEnterSeason (line 87) | void tryEnterSeason(DateTime date)
method changeSortType (line 96) | void changeSortType(int type)
method setNotShowAbandonedBangumis (line 121) | Future<void> setNotShowAbandonedBangumis(bool value)
method setNotShowWatchedBangumis (line 127) | Future<void> setNotShowWatchedBangumis(bool value)
method loadAbandonedBangumiIds (line 132) | Set<int> loadAbandonedBangumiIds()
method loadWatchedBangumiIds (line 136) | Set<int> loadWatchedBangumiIds()
FILE: lib/pages/timeline/timeline_controller.g.dart
function setNotShowAbandonedBangumis (line 127) | Future<void> setNotShowAbandonedBangumis(bool value)
function setNotShowWatchedBangumis (line 137) | Future<void> setNotShowWatchedBangumis(bool value)
function toString (line 143) | String toString()
FILE: lib/pages/timeline/timeline_module.dart
class TimelineModule (line 4) | class TimelineModule extends Module {
method routes (line 6) | void routes(r)
FILE: lib/pages/timeline/timeline_page.dart
class TimelinePage (line 17) | class TimelinePage extends StatefulWidget {
method createState (line 21) | State<TimelinePage> createState()
class _TimelinePageState (line 24) | class _TimelinePageState extends State<TimelinePage>
method initState (line 38) | void initState()
method dispose (line 52) | void dispose()
method onBackPressed (line 57) | void onBackPressed(BuildContext context)
method generateDateTime (line 66) | DateTime generateDateTime(int year, String season)
method getStringByDateTime (line 93) | String getStringByDateTime(DateTime d)
method showSeasonBottomSheet (line 97) | void showSeasonBottomSheet(BuildContext context)
method buildSeasonSegmentedButton (line 233) | Widget buildSeasonSegmentedButton(
method getSeasonIcon (line 291) | Widget getSeasonIcon(String seasonName)
method onSeasonSelected (line 316) | void onSeasonSelected(DateTime date)
method showFilterSwitcher (line 330) | Widget showFilterSwitcher()
method showSortSwitcher (line 371) | Widget showSortSwitcher()
method showTimelineOptionTabBar (line 404) | Widget showTimelineOptionTabBar({required List<Widget> options})
method build (line 427) | Widget build(BuildContext context)
method contentGrid (line 514) | List<Widget> contentGrid(List<List<BangumiItem>> bangumiCalendar)
FILE: lib/pages/video/video_controller.dart
class _VideoPageController (line 29) | abstract class _VideoPageController with Store {
method initForOfflinePlayback (line 110) | void initForOfflinePlayback({
method _buildOfflineRoadList (line 146) | void _buildOfflineRoadList(List<DownloadEpisode> episodes)
method resetOfflineMode (line 161) | void resetOfflineMode()
method changeEpisode (line 185) | Future<void> changeEpisode(int episode,
method _changeOfflineEpisode (line 211) | Future<void> _changeOfflineEpisode(int episode, int offset)
method _getLocalVideoPath (line 256) | String? _getLocalVideoPath(
method _resolveWithProvider (line 264) | Future<void> _resolveWithProvider(String url, int offset)
method cancelVideoSourceResolution (line 326) | void cancelVideoSourceResolution()
method queryBangumiEpisodeCommentsByID (line 336) | Future<void> queryBangumiEpisodeCommentsByID(int id, int episode)
method queryRoads (line 354) | Future<void> queryRoads(String url, String pluginName,
method toggleSortOrder (line 380) | void toggleSortOrder()
method cancelQueryRoads (line 389) | void cancelQueryRoads()
method enterFullScreen (line 397) | void enterFullScreen()
method exitFullScreen (line 403) | void exitFullScreen()
method isDesktopFullscreen (line 408) | void isDesktopFullscreen()
method handleOnEnterFullScreen (line 414) | void handleOnEnterFullScreen()
method handleOnExitFullScreen (line 419) | void handleOnExitFullScreen()
FILE: lib/pages/video/video_controller.g.dart
function toString (line 205) | String toString()
FILE: lib/pages/video/video_module.dart
class VideoModule (line 5) | class VideoModule extends Module {
method routes (line 7) | void routes(r)
method binds (line 12) | void binds(i)
FILE: lib/pages/video/video_page.dart
class VideoPage (line 26) | class VideoPage extends StatefulWidget {
method createState (line 30) | State<VideoPage> createState()
class _VideoPageState (line 33) | class _VideoPageState extends State<VideoPage>
method initState (line 65) | void initState()
method _initOfflineMode (line 125) | void _initOfflineMode()
method _initOnlineMode (line 152) | void _initOnlineMode()
method dispose (line 195) | void dispose()
method onWindowEnterFullScreen (line 238) | void onWindowEnterFullScreen()
method onWindowLeaveFullScreen (line 243) | void onWindowLeaveFullScreen()
method showDebugConsole (line 247) | void showDebugConsole()
method hideDebugConsole (line 253) | void hideDebugConsole()
method switchDebugConsole (line 259) | void switchDebugConsole()
method clearWebviewLog (line 265) | void clearWebviewLog()
method changeEpisode (line 271) | Future<void> changeEpisode(int episode,
method menuJumpToCurrentEpisode (line 284) | void menuJumpToCurrentEpisode()
method openTabBodyAnimated (line 293) | void openTabBodyAnimated()
method closeTabBodyAnimated (line 302) | void closeTabBodyAnimated()
method onBackPressed (line 314) | void onBackPressed(BuildContext context)
method pauseForTimedShutdown (line 339) | void pauseForTimedShutdown()
method sendDanmaku (line 346) | void sendDanmaku(String msg)
method showMobileDanmakuInput (line 394) | void showMobileDanmakuInput()
method showDanmakuDestinationPickerAndSend (line 461) | void showDanmakuDestinationPickerAndSend(String msg)
method build (line 503) | Widget build(BuildContext context)
method _getEpisodeFromRecords (line 859) | DownloadEpisode? _getEpisodeFromRecords(
method _buildDownloadStatusIcon (line 879) | Widget _buildDownloadStatusIcon(int episodeNumber, String episodePageUrl)
FILE: lib/pages/webdav_editor/webdav_editor_page.dart
class WebDavEditorPage (line 8) | class WebDavEditorPage extends StatefulWidget {
method createState (line 14) | State<WebDavEditorPage> createState()
class _WebDavEditorPageState (line 17) | class _WebDavEditorPageState extends State<WebDavEditorPage> {
method initState (line 27) | void initState()
method build (line 38) | Widget build(BuildContext context)
FILE: lib/pages/webdav_editor/webdav_module.dart
class WebDavModule (line 5) | class WebDavModule extends Module {
method binds (line 7) | void binds(i)
method routes (line 10) | void routes(r)
FILE: lib/pages/webdav_editor/webdav_setting.dart
class WebDavSettingsPage (line 10) | class WebDavSettingsPage extends StatefulWidget {
method createState (line 14) | State<WebDavSettingsPage> createState()
class _PlayerSettingsPageState (line 17) | class _PlayerSettingsPageState extends State<WebDavSettingsPage> {
method initState (line 24) | void initState()
method onBackPressed (line 33) | void onBackPressed(BuildContext context)
method checkWebDav (line 40) | Future<void> checkWebDav()
method updateWebdav (line 62) | Future<void> updateWebdav()
method downloadWebdav (line 84) | Future<void> downloadWebdav()
method build (line 107) | Widget build(BuildContext context)
FILE: lib/plugins/anti_crawler_config.dart
class CaptchaType (line 7) | class CaptchaType {
class AntiCrawlerConfig (line 16) | class AntiCrawlerConfig {
method toJson (line 68) | Map<String, dynamic> toJson()
method copyWith (line 78) | AntiCrawlerConfig copyWith({
FILE: lib/plugins/plugin_cookie_manager.dart
class PluginCookieManager (line 10) | class PluginCookieManager {
method getJar (line 16) | CookieJar getJar(String pluginName)
method saveFromWebView (line 20) | Future<void> saveFromWebView(
method _parseCookieString (line 36) | List<Cookie> _parseCookieString(String raw, Uri uri)
method clearCookies (line 55) | void clearCookies(String pluginName)
method hasCookies (line 59) | bool hasCookies(String pluginName)
FILE: lib/plugins/plugin_install_time_tracker.dart
class PluginInstallTimeTracker (line 3) | class PluginInstallTimeTracker {
method setInstallTime (line 8) | void setInstallTime(String pluginName, int timestamp)
method getInstallTime (line 13) | int getInstallTime(String pluginName)
FILE: lib/plugins/plugin_validity_tracker.dart
class PluginValidityTracker (line 3) | class PluginValidityTracker {
method markSearchValid (line 8) | void markSearchValid(String pluginName)
method isSearchValid (line 13) | bool isSearchValid(String pluginName)
FILE: lib/plugins/plugins.dart
class CaptchaRequiredException (line 16) | class CaptchaRequiredException implements Exception {
method toString (line 20) | String toString()
class NoResultException (line 25) | class NoResultException implements Exception {
method toString (line 29) | String toString()
class SearchErrorException (line 34) | class SearchErrorException implements Exception {
method toString (line 39) | String toString()
class Plugin (line 42) | class Plugin {
method toJson (line 139) | Map<String, dynamic> toJson()
method queryBangumi (line 164) | Future<PluginSearchResponse> queryBangumi(String keyword,
method querychapterRoads (line 247) | Future<List<Road>> querychapterRoads(String url, {CancelToken? cancelT...
method testSearchRequest (line 293) | Future<String> testSearchRequest(String keyword,
method _cookieHeaderFor (line 333) | Future<String> _cookieHeaderFor(String url)
method buildFullUrl (line 347) | String buildFullUrl(String urlItem)
method buildHttpHeaders (line 355) | Map<String, String> buildHttpHeaders()
method testQueryBangumi (line 362) | PluginSearchResponse testQueryBangumi(String htmlString)
FILE: lib/plugins/plugins_controller.dart
class _PluginsController (line 21) | abstract class _PluginsController with Store {
method init (line 41) | Future<void> init()
method loadAllPlugins (line 55) | Future<void> loadAllPlugins()
method getPluginFiles (line 85) | Future<List<String>> getPluginFiles()
method copyPluginsToExternalDirectory (line 99) | Future<void> copyPluginsToExternalDirectory()
method pluginListToJson (line 115) | List<dynamic> pluginListToJson()
method getPluginListFromJson (line 124) | List<Plugin> getPluginListFromJson(String jsonString)
method removePlugin (line 133) | Future<void> removePlugin(Plugin plugin)
method updatePlugin (line 139) | void updatePlugin(Plugin plugin)
method onReorder (line 154) | void onReorder(int oldIndex, int newIndex)
method savePlugins (line 163) | Future<void> savePlugins()
method queryPluginHTTPList (line 170) | Future<void> queryPluginHTTPList()
method queryPluginHTTP (line 176) | Future<Plugin?> queryPluginHTTP(String name)
method pluginStatus (line 182) | String pluginStatus(PluginHTTPItem pluginHTTPItem)
method pluginUpdateStatus (line 197) | String pluginUpdateStatus(Plugin plugin)
method tryUpdatePlugin (line 207) | Future<int> tryUpdatePlugin(Plugin plugin)
method tryUpdatePluginByName (line 211) | Future<int> tryUpdatePluginByName(String name)
method tryUpdateAllPlugin (line 223) | Future<int> tryUpdateAllPlugin()
method removePlugins (line 235) | void removePlugins(Set<String> pluginNames)
FILE: lib/plugins/plugins_controller.g.dart
function toString (line 45) | String toString()
FILE: lib/providers/captcha/captcha_provider.dart
class CaptchaProvider (line 26) | class CaptchaProvider {
method _ensureInitialized (line 42) | Future<void> _ensureInitialized()
method loadForCaptcha (line 65) | Future<void> loadForCaptcha(String url, String captchaXpath, {String? ...
method submitCaptcha (line 89) | Future<void> submitCaptcha({
method onDisappeared (line 105) | Future<void> onDisappeared()
method loadForButtonClick (line 133) | Future<void> loadForButtonClick({
method onDisappeared (line 145) | Future<void> onDisappeared()
method saveAndUnload (line 170) | Future<void> saveAndUnload(String pluginName)
method dispose (line 191) | void dispose()
FILE: lib/providers/video/video_source_provider.dart
type VideoSourceType (line 4) | enum VideoSourceType {
class VideoSource (line 12) | class VideoSource {
method toString (line 29) | String toString()
class VideoSourceNotFoundException (line 33) | class VideoSourceNotFoundException implements Exception {
method toString (line 38) | String toString()
class VideoSourceTimeoutException (line 42) | class VideoSourceTimeoutException implements Exception {
method toString (line 47) | String toString()
class VideoSourceCancelledException (line 51) | class VideoSourceCancelledException implements Exception {
method toString (line 55) | String toString()
class IVideoSourceProvider (line 64) | abstract class IVideoSourceProvider {
method resolve (line 78) | Future<VideoSource> resolve(
method cancel (line 88) | void cancel()
method dispose (line 91) | void dispose()
FILE: lib/providers/video/webview_video_source_provider.dart
class WebViewVideoSourceProvider (line 11) | class WebViewVideoSourceProvider implements IVideoSourceProvider {
method resolve (line 25) | Future<VideoSource> resolve(
method cancel (line 91) | void cancel()
method dispose (line 96) | void dispose()
FILE: lib/repositories/collect_crud_repository.dart
class ICollectCrudRepository (line 10) | abstract class ICollectCrudRepository {
method getAllCollectibles (line 12) | List<CollectedBangumi> getAllCollectibles()
method getCollectible (line 18) | CollectedBangumi? getCollectible(int id)
method getCollectType (line 24) | int getCollectType(int id)
method addCollectible (line 30) | Future<void> addCollectible(BangumiItem bangumiItem, int type)
method updateCollectible (line 35) | Future<void> updateCollectible(BangumiItem bangumiItem)
method deleteCollectible (line 40) | Future<void> deleteCollectible(int id)
method addCollectChange (line 45) | Future<void> addCollectChange(CollectedBangumiChange change)
method getFavorites (line 48) | List<BangumiItem> getFavorites()
method clearFavorites (line 51) | Future<void> clearFavorites()
class CollectCrudRepository (line 57) | class CollectCrudRepository implements ICollectCrudRepository {
method getAllCollectibles (line 63) | List<CollectedBangumi> getAllCollectibles()
method getCollectible (line 76) | CollectedBangumi? getCollectible(int id)
method getCollectType (line 89) | int getCollectType(int id)
method addCollectible (line 103) | Future<void> addCollectible(BangumiItem bangumiItem, int type)
method updateCollectible (line 123) | Future<void> updateCollectible(BangumiItem bangumiItem)
method deleteCollectible (line 146) | Future<void> deleteCollectible(int id)
method addCollectChange (line 161) | Future<void> addCollectChange(CollectedBangumiChange change)
method getFavorites (line 176) | List<BangumiItem> getFavorites()
method clearFavorites (line 189) | Future<void> clearFavorites()
FILE: lib/repositories/collect_repository.dart
class ICollectRepository (line 8) | abstract class ICollectRepository {
method getBangumiIdsByType (line 13) | Set<int> getBangumiIdsByType(CollectType type)
method getBangumiIdsByTypes (line 19) | Set<int> getBangumiIdsByTypes(List<CollectType> types)
method getSearchNotShowWatchedBangumis (line 24) | bool getSearchNotShowWatchedBangumis()
method updateSearchNotShowWatchedBangumis (line 27) | Future<void> updateSearchNotShowWatchedBangumis(bool value)
method getSearchNotShowAbandonedBangumis (line 30) | bool getSearchNotShowAbandonedBangumis()
method updateSearchNotShowAbandonedBangumis (line 33) | Future<void> updateSearchNotShowAbandonedBangumis(bool value)
method getTimelineNotShowAbandonedBangumis (line 38) | bool getTimelineNotShowAbandonedBangumis()
method updateTimelineNotShowAbandonedBangumis (line 41) | Future<void> updateTimelineNotShowAbandonedBangumis(bool value)
method getTimelineNotShowWatchedBangumis (line 44) | bool getTimelineNotShowWatchedBangumis()
method updateTimelineNotShowWatchedBangumis (line 47) | Future<void> updateTimelineNotShowWatchedBangumis(bool value)
method getPrivateMode (line 52) | bool getPrivateMode()
class CollectRepository (line 58) | class CollectRepository implements ICollectRepository {
method getBangumiIdsByType (line 63) | Set<int> getBangumiIdsByType(CollectType type)
method getBangumiIdsByTypes (line 79) | Set<int> getBangumiIdsByTypes(List<CollectType> types)
method getSearchNotShowWatchedBangumis (line 98) | bool getSearchNotShowWatchedBangumis()
method updateSearchNotShowWatchedBangumis (line 115) | Future<void> updateSearchNotShowWatchedBangumis(bool value)
method getSearchNotShowAbandonedBangumis (line 128) | bool getSearchNotShowAbandonedBangumis()
method updateSearchNotShowAbandonedBangumis (line 146) | Future<void> updateSearchNotShowAbandonedBangumis(bool value)
method getTimelineNotShowAbandonedBangumis (line 161) | bool getTimelineNotShowAbandonedBangumis()
method updateTimelineNotShowAbandonedBangumis (line 179) | Future<void> updateTimelineNotShowAbandonedBangumis(bool value)
method getTimelineNotShowWatchedBangumis (line 192) | bool getTimelineNotShowWatchedBangumis()
method updateTimelineNotShowWatchedBangumis (line 210) | Future<void> updateTimelineNotShowWatchedBangumis(bool value)
method getPrivateMode (line 225) | bool getPrivateMode()
FILE: lib/repositories/download_repository.dart
class IDownloadRepository (line 5) | abstract class IDownloadRepository {
method getAllRecords (line 6) | List<DownloadRecord> getAllRecords()
method getRecord (line 7) | DownloadRecord? getRecord(String key)
method putRecord (line 8) | Future<void> putRecord(DownloadRecord record)
method deleteRecord (line 9) | Future<void> deleteRecord(String key)
method updateEpisode (line 10) | Future<void> updateEpisode(String recordKey, int episodeNumber, Downlo...
method deleteEpisode (line 11) | Future<void> deleteEpisode(String recordKey, int episodeNumber)
method getForceAdBlocker (line 12) | bool getForceAdBlocker()
method getRecordByBangumiId (line 18) | DownloadRecord? getRecordByBangumiId(int bangumiId, String pluginName)
method getEpisode (line 25) | DownloadEpisode? getEpisode(int bangumiId, String pluginName, int epis...
method getCompletedEpisodes (line 32) | List<DownloadEpisode> getCompletedEpisodes(int bangumiId, String plugi...
method getEpisodeByUrl (line 40) | DownloadEpisode? getEpisodeByUrl(int bangumiId, String pluginName, Str...
class DownloadRepository (line 43) | class DownloadRepository implements IDownloadRepository {
method getAllRecords (line 47) | List<DownloadRecord> getAllRecords()
method getRecord (line 75) | DownloadRecord? getRecord(String key)
method putRecord (line 95) | Future<void> putRecord(DownloadRecord record)
method deleteRecord (line 110) | Future<void> deleteRecord(String key)
method updateEpisode (line 133) | Future<void> updateEpisode(String recordKey, int episodeNumber, Downlo...
method getEpisodeWithProgress (line 164) | DownloadEpisode? getEpisodeWithProgress(String recordKey, int episodeN...
method getForceAdBlocker (line 175) | bool getForceAdBlocker()
method deleteEpisode (line 180) | Future<void> deleteEpisode(String recordKey, int episodeNumber)
method getRecordByBangumiId (line 206) | DownloadRecord? getRecordByBangumiId(int bangumiId, String pluginName)
method getEpisode (line 212) | DownloadEpisode? getEpisode(int bangumiId, String pluginName, int epis...
method getCompletedEpisodes (line 218) | List<DownloadEpisode> getCompletedEpisodes(int bangumiId, String plugi...
method getEpisodeByUrl (line 229) | DownloadEpisode? getEpisodeByUrl(int bangumiId, String pluginName, Str...
FILE: lib/repositories/history_repository.dart
class IHistoryRepository (line 9) | abstract class IHistoryRepository {
method getAllHistories (line 11) | List<History> getAllHistories()
method getHistory (line 18) | History? getHistory(String adapterName, BangumiItem bangumiItem)
method updateHistory (line 29) | Future<void> updateHistory({
method getLastWatchingProgress (line 44) | Progress? getLastWatchingProgress(BangumiItem bangumiItem, String adap...
method findProgress (line 52) | Progress? findProgress(BangumiItem bangumiItem, String adapterName, in...
method deleteHistory (line 57) | Future<void> deleteHistory(History history)
method clearProgress (line 64) | Future<void> clearProgress(BangumiItem bangumiItem, String adapterName...
method clearAllHistories (line 67) | Future<void> clearAllHistories()
method getPrivateMode (line 70) | bool getPrivateMode()
class HistoryRepository (line 76) | class HistoryRepository implements IHistoryRepository {
method getAllHistories (line 81) | List<History> getAllHistories()
method getHistory (line 101) | History? getHistory(String adapterName, BangumiItem bangumiItem)
method updateHistory (line 115) | Future<void> updateHistory({
method getLastWatchingProgress (line 165) | Progress? getLastWatchingProgress(BangumiItem bangumiItem, String adap...
method findProgress (line 180) | Progress? findProgress(BangumiItem bangumiItem, String adapterName, in...
method deleteHistory (line 195) | Future<void> deleteHistory(History history)
method clearProgress (line 208) | Future<void> clearProgress(BangumiItem bangumiItem, String adapterName...
method clearAllHistories (line 225) | Future<void> clearAllHistories()
method getPrivateMode (line 238) | bool getPrivateMode()
FILE: lib/repositories/search_history_repository.dart
class ISearchHistoryRepository (line 8) | abstract class ISearchHistoryRepository {
method getAllHistories (line 10) | List<SearchHistory> getAllHistories()
method saveHistory (line 16) | Future<bool> saveHistory(String keyword)
method deleteHistory (line 21) | Future<void> deleteHistory(SearchHistory history)
method clearAllHistories (line 24) | Future<void> clearAllHistories()
method deleteDuplicates (line 29) | Future<void> deleteDuplicates(String keyword)
method isHistoryFull (line 35) | bool isHistoryFull(int maxCount)
method deleteOldest (line 38) | Future<void> deleteOldest()
class SearchHistoryRepository (line 44) | class SearchHistoryRepository implements ISearchHistoryRepository {
method getAllHistories (line 48) | List<SearchHistory> getAllHistories()
method saveHistory (line 64) | Future<bool> saveHistory(String keyword)
method deleteHistory (line 81) | Future<void> deleteHistory(SearchHistory history)
method clearAllHistories (line 94) | Future<void> clearAllHistories()
method deleteDuplicates (line 107) | Future<void> deleteDuplicates(String keyword)
method isHistoryFull (line 124) | bool isHistoryFull(int maxCount)
method deleteOldest (line 138) | Future<void> deleteOldest()
FILE: lib/request/api.dart
class Api (line 1) | class Api {
method formatUrl (line 65) | String formatUrl(String url, List<dynamic> params)
FILE: lib/request/bangumi.dart
class BangumiHTTP (line 11) | class BangumiHTTP {
method getCalendar (line 14) | Future<List<List<BangumiItem>>> getCalendar()
method getCalendarBySearch (line 42) | Future<List<List<BangumiItem>>> getCalendarBySearch(
method getBangumiList (line 91) | Future<List<BangumiItem>> getBangumiList(
method getBangumiTrendsList (line 137) | Future<List<BangumiItem>> getBangumiTrendsList(
method bangumiSearch (line 163) | Future<List<BangumiItem>> bangumiSearch(String keyword,
method getBangumiInfoByID (line 206) | Future<BangumiItem?> getBangumiInfoByID(int id)
method getBangumiEpisodeByID (line 218) | Future<EpisodeInfo> getBangumiEpisodeByID(int id, int episode)
method getBangumiCommentsByID (line 238) | Future<CommentResponse> getBangumiCommentsByID(int id,
method getBangumiCommentsByEpisodeID (line 254) | Future<EpisodeCommentResponse> getBangumiCommentsByEpisodeID(
method getCharacterCommentsByCharacterID (line 272) | Future<CharacterCommentResponse> getCharacterCommentsByCharacterID(
method getBangumiStaffByID (line 290) | Future<StaffResponse> getBangumiStaffByID(int id)
method getCharatersByBangumiID (line 305) | Future<CharactersResponse> getCharatersByBangumiID(int id)
method getCharacterByCharacterID (line 319) | Future<CharacterFullItem> getCharacterByCharacterID(int id)
FILE: lib/request/damaku.dart
class DanmakuRequest (line 9) | class DanmakuRequest {
method getDanDanBangumiIDByBgmBangumiID (line 11) | Future<int> getDanDanBangumiIDByBgmBangumiID(int bgmBangumiID)
method getBangumiIDByTitle (line 23) | Future<int> getBangumiIDByTitle(String title)
method getDanmakuEpisodesByBangumiID (line 54) | Future<DanmakuEpisodeResponse> getDanmakuEpisodesByBangumiID(
method getDanDanEpisodesByDanDanBangumiID (line 67) | Future<DanmakuEpisodeResponse> getDanDanEpisodesByDanDanBangumiID(
method getDanmakuSearchResponse (line 80) | Future<DanmakuSearchResponse> getDanmakuSearchResponse(
method getDanDanmaku (line 97) | Future<List<Danmaku>> getDanDanmaku(int bangumiID, int episode)
method getDanDanmakuByEpisodeID (line 125) | Future<List<Danmaku>> getDanDanmakuByEpisodeID(int episodeID)
FILE: lib/request/interceptor.dart
class ApiInterceptor (line 11) | class ApiInterceptor extends Interceptor {
method onRequest (line 14) | void onRequest(RequestOptions options, RequestInterceptorHandler handler)
method onResponse (line 43) | void onResponse(Response response, ResponseInterceptorHandler handler)
method onError (line 48) | void onError(DioException err, ErrorInterceptorHandler handler)
method dioError (line 65) | Future<String> dioError(DioException error)
method checkConnect (line 92) | Future<String> checkConnect()
FILE: lib/request/plugin.dart
class PluginHTTP (line 8) | class PluginHTTP {
method getPluginList (line 9) | Future<List<PluginHTTPItem>> getPluginList()
method getPlugin (line 26) | Future<Plugin?> getPlugin(String name)
FILE: lib/request/query_manager.dart
class QueryManager (line 9) | class QueryManager {
method querySource (line 19) | Future<void> querySource(String keyword, String pluginName)
method queryAllSource (line 63) | Future<void> queryAllSource(String keyword)
method cancel (line 110) | void cancel()
FILE: lib/request/request.dart
class Request (line 12) | class Request {
method setCookie (line 19) | Future<void> setCookie()
method setOptionsHeaders (line 30) | void setOptionsHeaders()
method setProxy (line 36) | void setProxy()
method disableProxy (line 71) | void disableProxy()
method get (line 121) | Future<Response> get(url, {data, options, cancelToken, extra, bool sho...
method post (line 158) | Future<Response> post(url, {data, queryParameters, options, cancelToke...
method headerUa (line 186) | String headerUa({type = 'mob'})
FILE: lib/shaders/shaders_controller.dart
class _ShadersController (line 12) | abstract class _ShadersController with Store {
method copyShadersToExternalDirectory (line 15) | Future<void> copyShadersToExternalDirectory()
FILE: lib/shaders/shaders_controller.g.dart
function toString (line 13) | String toString()
FILE: lib/utils/anime_season.dart
class AnimeSeason (line 2) | class AnimeSeason {
method _getYearAndSeason (line 10) | List<int> _getYearAndSeason(DateTime dt)
method toSeasonStartAndEnd (line 30) | List<String> toSeasonStartAndEnd()
method toString (line 48) | String toString()
FILE: lib/utils/auto_updater.dart
type InstallationType (line 15) | enum InstallationType {
class UpdateInfo (line 27) | class UpdateInfo {
class AutoUpdater (line 57) | class AutoUpdater {
method _detectAvailableInstallationTypes (line 69) | Future<List<InstallationType>> _detectAvailableInstallationTypes()
method checkForUpdates (line 103) | Future<UpdateInfo?> checkForUpdates()
method autoCheckForUpdates (line 140) | Future<void> autoCheckForUpdates()
method manualCheckForUpdates (line 157) | Future<void> manualCheckForUpdates()
method _showUpdateDialog (line 171) | void _showUpdateDialog(UpdateInfo updateInfo, {bool isAutoCheck = false})
method _getInstallationTypeDescription (line 315) | String _getInstallationTypeDescription(InstallationType type)
method _downloadUpdateWithType (line 337) | Future<void> _downloadUpdateWithType(
method _downloadUpdate (line 385) | Future<void> _downloadUpdate(
method _cancelDownload (line 491) | void _cancelDownload()
method _showDownloadCompleteDialog (line 496) | void _showDownloadCompleteDialog(String filePath, UpdateInfo updateInfo)
method _downloadFile (line 586) | Future<String> _downloadFile(
method _installUpdate (line 646) | void _installUpdate(
method _revealInFileManager (line 686) | void _revealInFileManager(String filePath)
method _getDownloadUrlForType (line 733) | Future<String> _getDownloadUrlForType(
method _getFilePatterns (line 753) | List<String> _getFilePatterns(InstallationType installationType)
method _getFileNameFromUrl (line 773) | String _getFileNameFromUrl(String url, String version)
method _getFileHashFromAssets (line 796) | String _getFileHashFromAssets(List<dynamic> assets, String downloadUrl)
FILE: lib/utils/background_download_service.dart
class BackgroundDownloadService (line 13) | class BackgroundDownloadService {
method init (line 30) | Future<void> init()
method needsNotificationPermission (line 60) | Future<bool> needsNotificationPermission()
method requestNotificationPermission (line 66) | Future<bool> requestNotificationPermission()
method startService (line 72) | Future<bool> startService()
method stopService (line 125) | Future<void> stopService()
method updateNotification (line 137) | Future<void> updateNotification({
method updateProgress (line 153) | Future<void> updateProgress({
method showCompletedNotification (line 176) | Future<void> showCompletedNotification({
method handleNotificationAction (line 184) | void handleNotificationAction(String buttonId)
method handleNavigateToDownload (line 195) | void handleNavigateToDownload()
method addTaskDataCallback (line 199) | void addTaskDataCallback(void Function(Object) callback)
method removeTaskDataCallback (line 203) | void removeTaskDataCallback(void Function(Object) callback)
function _backgroundCallback (line 213) | void _backgroundCallback()
class _DownloadTaskHandler (line 217) | class _DownloadTaskHandler extends TaskHandler {
method onStart (line 219) | Future<void> onStart(DateTime timestamp, TaskStarter starter)
method onRepeatEvent (line 224) | void onRepeatEvent(DateTime timestamp)
method onNotificationButtonPressed (line 229) | void onNotificationButtonPressed(String id)
method onNotificationPressed (line 235) | void onNotificationPressed()
method onNotificationDismissed (line 241) | void onNotificationDismissed()
method onDestroy (line 246) | Future<void> onDestroy(DateTime timestamp, bool isTimeout)
method onReceiveData (line 251) | void onReceiveData(Object data)
FILE: lib/utils/constants.dart
class StyleString (line 4) | class StyleString {
class LayoutBreakpoint (line 54) | class LayoutBreakpoint {
FILE: lib/utils/download_manager.dart
class _NotM3u8Exception (line 13) | class _NotM3u8Exception implements Exception {
method toString (line 17) | String toString()
class _InsufficientStorageException (line 20) | class _InsufficientStorageException implements Exception {
method toString (line 25) | String toString()
class DownloadTask (line 28) | class DownloadTask {
type ProgressCallback (line 42) | typedef ProgressCallback = void Function(
class DownloadRequest (line 45) | class DownloadRequest {
class IDownloadManager (line 67) | abstract class IDownloadManager {
method isDownloading (line 70) | bool isDownloading(String recordKey, int episodeNumber)
method enqueue (line 71) | Future<void> enqueue(DownloadRequest request)
method enqueuePriority (line 72) | Future<void> enqueuePriority(DownloadRequest request)
method pause (line 73) | void pause(String recordKey, int episodeNumber)
method resume (line 74) | Future<void> resume(DownloadRequest request)
method cancel (line 75) | void cancel(String recordKey, int episodeNumber)
method getLocalVideoPath (line 76) | String? getLocalVideoPath(DownloadEpisode? episode)
method deleteEpisodeFiles (line 77) | Future<void> deleteEpisodeFiles(int bangumiId, String pluginName, int ...
method deleteRecordFiles (line 78) | Future<void> deleteRecordFiles(int bangumiId, String pluginName)
method getSpeed (line 79) | double getSpeed(String recordKey, int episodeNumber)
class _SpeedTracker (line 82) | class _SpeedTracker {
method update (line 87) | void update(int totalBytes)
method reset (line 98) | void reset()
class DownloadManager (line 105) | class DownloadManager implements IDownloadManager {
method _loadSettings (line 128) | void _loadSettings()
method _getAvailableStorage (line 141) | Future<int> _getAvailableStorage(String path)
method _checkStorageSpace (line 156) | Future<void> _checkStorageSpace(String downloadDir, {int requiredBytes...
method _getStorageErrorMessage (line 166) | String _getStorageErrorMessage(FileSystemException e)
method getSpeed (line 183) | double getSpeed(String recordKey, int episodeNumber)
method _taskKey (line 188) | String _taskKey(String recordKey, int episodeNumber)
method isDownloading (line 192) | bool isDownloading(String recordKey, int episodeNumber)
method getEpisodeDir (line 200) | String getEpisodeDir(String downloadBase, int bangumiId, String plugin...
method enqueue (line 205) | Future<void> enqueue(DownloadRequest request)
method enqueuePriority (line 234) | Future<void> enqueuePriority(DownloadRequest request)
method pause (line 262) | void pause(String recordKey, int episodeNumber)
method resume (line 272) | Future<void> resume(DownloadRequest request)
method cancel (line 299) | void cancel(String recordKey, int episodeNumber)
method _processQueue (line 311) | void _processQueue()
method _runEpisodeDownload (line 334) | Future<void> _runEpisodeDownload({
method _runDirectFileDownload (line 582) | Future<void> _runDirectFileDownload({
method _onTaskComplete (line 735) | void _onTaskComplete(String key)
method _notifyProgress (line 742) | void _notifyProgress(
method _fetchM3u8 (line 749) | Future<String> _fetchM3u8(
method _downloadFile (line 797) | Future<void> _downloadFile(String url, String savePath,
method _downloadSegmentWithRetry (line 807) | Future<int> _downloadSegmentWithRetry(
method deleteEpisodeFiles (line 841) | Future<void> deleteEpisodeFiles(
method deleteRecordFiles (line 851) | Future<void> deleteRecordFiles(int bangumiId, String pluginName)
method getLocalVideoPath (line 860) | String? getLocalVideoPath(DownloadEpisode? episode)
class _Semaphore (line 870) | class _Semaphore {
method acquire (line 877) | Future<void> acquire()
method release (line 887) | void release()
FILE: lib/utils/extension.dart
function cacheSize (line 4) | int cacheSize(BuildContext context)
FILE: lib/utils/external_player.dart
class ExternalPlayer (line 4) | class ExternalPlayer {
method launchURLWithMIME (line 10) | Future<bool> launchURLWithMIME(String url, String mimeType)
method launchURLWithReferer (line 22) | Future<bool> launchURLWithReferer(String url, String referer)
FILE: lib/utils/format_utils.dart
function formatBytes (line 1) | String formatBytes(int bytes)
function formatSpeed (line 10) | String formatSpeed(double bytesPerSec)
FILE: lib/utils/logger.dart
class KazumiLogFilter (line 11) | class KazumiLogFilter extends LogFilter {
method shouldLog (line 13) | bool shouldLog(LogEvent event)
class KazumiLogPrinter (line 22) | class KazumiLogPrinter extends PrettyPrinter {
method log (line 36) | List<String> log(LogEvent event)
method _getPrefix (line 56) | String _getPrefix(Level level)
method _getLevelTag (line 83) | String _getLevelTag(Level level)
method _getLevelName (line 102) | String _getLevelName(Level level)
class KazumiLogOutput (line 107) | class KazumiLogOutput extends LogOutput {
method _getLogFilePath (line 111) | Future<String> _getLogFilePath()
method output (line 125) | void output(OutputEvent event)
method _writeToFile (line 137) | void _writeToFile(OutputEvent event)
method _removeAnsiCodes (line 164) | String _removeAnsiCodes(String text)
class KazumiLogger (line 169) | class KazumiLogger {
method _log (line 184) | void _log(void Function() logFn, bool forceLog)
method t (line 193) | void t(dynamic message,
method d (line 199) | void d(dynamic message,
method i (line 205) | void i(dynamic message,
method w (line 211) | void w(dynamic message,
method e (line 217) | void e(dynamic message,
method f (line 223) | void f(dynamic message,
function getLogsPath (line 229) | Future<File> getLogsPath()
function clearLogs (line 250) | Future<bool> clearLogs()
FILE: lib/utils/m3u8_ad_filter.dart
class M3u8AdFilter (line 3) | class M3u8AdFilter {
method filterAds (line 6) | List<M3u8Segment> filterAds(List<M3u8Segment> segments)
method calculateTargetDuration (line 76) | double calculateTargetDuration(List<M3u8Segment> segments)
FILE: lib/utils/m3u8_parser.dart
class M3u8Key (line 1) | class M3u8Key {
method toString (line 20) | String toString()
class M3u8Segment (line 29) | class M3u8Segment {
class M3u8Variant (line 43) | class M3u8Variant {
class M3u8MasterPlaylist (line 51) | class M3u8MasterPlaylist {
class M3u8MediaPlaylist (line 61) | class M3u8MediaPlaylist {
type M3u8Type (line 73) | enum M3u8Type { master, media }
class M3u8Parser (line 75) | class M3u8Parser {
method detectType (line 76) | M3u8Type detectType(String content)
method resolveUrl (line 83) | String resolveUrl(String baseUrl, String relativeUrl)
method parseMasterPlaylist (line 95) | M3u8MasterPlaylist parseMasterPlaylist(String content, String baseUrl)
method parseMediaPlaylist (line 126) | M3u8MediaPlaylist parseMediaPlaylist(String content, String baseUrl)
method _parseKey (line 181) | M3u8Key? _parseKey(String line, String baseUrl)
method extractUniqueKeys (line 198) | List<M3u8Key> extractUniqueKeys(M3u8MediaPlaylist playlist)
method buildLocalM3u8 (line 210) | String buildLocalM3u8(
method _isM3u8Url (line 254) | bool _isM3u8Url(String url)
method resolveNestedSegments (line 262) | Future<List<M3u8Segment>> resolveNestedSegments(
FILE: lib/utils/proxy_manager.dart
class ProxyManager (line 6) | class ProxyManager {
method applyProxy (line 10) | void applyProxy()
method clearProxy (line 15) | void clearProxy()
FILE: lib/utils/proxy_utils.dart
class ProxyUtils (line 2) | class ProxyUtils {
method parseProxyUrl (line 11) | (String, int)? parseProxyUrl(String url)
method getFormattedProxyUrl (line 36) | String? getFormattedProxyUrl(String url)
method isValidProxyUrl (line 43) | bool isValidProxyUrl(String url)
FILE: lib/utils/remote.dart
class RemotePlay (line 8) | class RemotePlay {
method castVideo (line 9) | Future<void> castVideo(String video, String referer)
method _deviceUPnPIcon (line 88) | Icon _deviceUPnPIcon(String deviceType)
FILE: lib/utils/search_parser.dart
class SearchParser (line 1) | class SearchParser {
method parseId (line 9) | String? parseId()
method parseTag (line 14) | String? parseTag()
method parseSort (line 19) | String? parseSort()
method parseKeywords (line 24) | String parseKeywords()
method hasSortSyntax (line 31) | bool hasSortSyntax()
method removeSort (line 35) | String removeSort()
method updateSort (line 39) | String updateSort(String sortValue)
FILE: lib/utils/storage.dart
class GStorage (line 13) | class GStorage {
method init (line 27) | Future init()
method _openBoxSafe (line 53) | Future<Box<T>> _openBoxSafe<T>(String boxName)
method _deleteBoxFiles (line 75) | Future<void> _deleteBoxFiles(String boxName)
method backupBox (line 95) | Future<void> backupBox(String boxName, String backupFilePath)
method patchHistory (line 106) | Future<void> patchHistory(String backupFilePath)
method restoreCollectibles (line 128) | Future<void> restoreCollectibles(String backupFilePath)
method getCollectiblesFromFile (line 144) | Future<List<CollectedBangumi>> getCollectiblesFromFile(
method getCollectChangesFromFile (line 162) | Future<List<CollectedBangumiChange>> getCollectChangesFromFile(
method patchCollectibles (line 180) | Future<void> patchCollectibles(
class SettingBoxKey (line 266) | class SettingBoxKey {
FILE: lib/utils/string_match.dart
function levenshteinDistance (line 6) | int levenshteinDistance(String s1, String s2)
function calculateSimilarity (line 31) | double calculateSimilarity(String s1, String s2)
FILE: lib/utils/syncplay.dart
class SyncplayException (line 9) | class SyncplayException implements Exception {
class SyncplayConnectionException (line 14) | class SyncplayConnectionException extends SyncplayException {
class SyncplayProtocolException (line 18) | class SyncplayProtocolException extends SyncplayException {
class SyncplayMessage (line 22) | abstract class SyncplayMessage {
method toJson (line 23) | Map<String, dynamic> toJson()
class HelloMessage (line 26) | class HelloMessage extends SyncplayMessage {
method toJson (line 38) | Map<String, dynamic> toJson()
class StateMessage (line 56) | class StateMessage extends SyncplayMessage {
method toJson (line 84) | Map<String, dynamic> toJson()
class SetMessage (line 107) | class SetMessage extends SyncplayMessage {
method toJson (line 129) | Map<String, dynamic> toJson()
class ChatMessage (line 166) | class ChatMessage extends SyncplayMessage {
method toJson (line 174) | Map<String, dynamic> toJson()
class TLSMessage (line 177) | class TLSMessage extends SyncplayMessage {
method toJson (line 185) | Map<String, dynamic> toJson()
class SyncplayClient (line 192) | class SyncplayClient {
method connect (line 263) | Future<void> connect({bool enableTLS = true})
method requestTLS (line 291) | Future<void> requestTLS()
method joinRoom (line 296) | Future<void> joinRoom(String room, String username)
method sendChatMessage (line 305) | Future<void> sendChatMessage(String message)
method setSyncPlayPlaying (line 318) | Future<void> setSyncPlayPlaying(
method sendSyncPlaySyncRequest (line 335) | Future<void> sendSyncPlaySyncRequest({bool? doSeek})
method disconnect (line 344) | Future<void> disconnect()
method setPosition (line 375) | void setPosition(double position)
method setPaused (line 379) | void setPaused(bool paused)
method _setupSocketHandlers (line 383) | void _setupSocketHandlers()
method _handleMessage (line 434) | void _handleMessage(dynamic data)
method _setReady (line 570) | Future<void> _setReady()
method _sendMessage (line 591) | Future<void> _sendMessage(SyncplayMessage message)
method _sendState (line 605) | void _sendState(
method _updateClientRttAndFd (line 635) | void _updateClientRttAndFd(double? timestamp, double senderRtt)
FILE: lib/utils/syncplay_endpoint.dart
class SyncPlayEndPoint (line 1) | class SyncPlayEndPoint {
function parseSyncPlayEndPoint (line 8) | SyncPlayEndPoint? parseSyncPlayEndPoint(String endPoint)
FILE: lib/utils/timed_shutdown_service.dart
class TimedShutdownService (line 7) | class TimedShutdownService {
method start (line 38) | void start(int minutes, {VoidCallback? onExpired})
method repeat (line 64) | void repeat()
method cancel (line 71) | void cancel()
method _onTimerExpired (line 91) | void _onTimerExpired()
method _showTimerExpiredDialog (line 106) | void _showTimerExpiredDialog()
method formatRemainingTime (line 146) | String formatRemainingTime()
method formatMinutesToDisplay (line 155) | String formatMinutesToDisplay(int totalMinutes)
method showCustomTimerDialog (line 170) | void showCustomTimerDialog({
FILE: lib/utils/utils.dart
class Utils (line 21) | class Utils {
method checkWebViewFeatureSupport (line 27) | Future<void> checkWebViewFeatureSupport()
method isLowResolution (line 37) | Future<bool> isLowResolution()
method getRandomUA (line 48) | String getRandomUA()
method getRandomAcceptedLanguage (line 55) | String getRandomAcceptedLanguage()
method getScreenInfo (line 62) | Future<Map<String, double>> getScreenInfo()
method decodeVideoSource (line 78) | String decodeVideoSource(String iframeUrl)
method formatTimestampToRelativeTime (line 98) | String formatTimestampToRelativeTime(timeStamp)
method dateFormat (line 118) | String dateFormat(timeStamp, {formatType = 'list'})
method CustomStamp_str (line 158) | String CustomStamp_str(
method makeHeroTag (line 213) | String makeHeroTag(v)
method needUpdate (line 218) | bool needUpdate(localVersion, remoteVersion)
method dateStringToWeekday (line 234) | int dateStringToWeekday(String dateString)
method jsonToKazumiBase64 (line 243) | String jsonToKazumiBase64(String jsonStr)
method kazumiBase64ToJson (line 248) | String kazumiBase64ToJson(String kazumiBase64Str)
method durationToString (line 257) | String durationToString(Duration duration)
method pad (line 258) | String pad(int n)
method latest (line 269) | Future<String> latest()
method oledDarkTheme (line 282) | oledDarkTheme(ThemeData defaultDarkTheme)
method generateDanmakuColor (line 296) | generateDanmakuColor(int colorValue)
method mergeDuplicateDanmakus (line 306) | List<Danmaku> mergeDuplicateDanmakus(
method extractEpisodeNumber (line 419) | int extractEpisodeNumber(String input)
method isDesktop (line 431) | bool isDesktop()
method isWideScreen (line 436) | bool isWideScreen()
method isTablet (line 445) | bool isTablet()
method isCompact (line 450) | bool isCompact()
method isInMultiWindowMode (line 455) | Future<bool> isInMultiWindowMode()
method isRunningOnX11 (line 471) | Future<bool> isRunningOnX11()
method enterWindowsFullscreen (line 486) | Future<void> enterWindowsFullscreen()
method exitWindowsFullscreen (line 498) | Future<void> exitWindowsFullscreen()
method enterFullScreen (line 510) | Future<void> enterFullScreen({bool lockOrientation = true})
method getAndroidSdkVersion (line 534) | Future<int> getAndroidSdkVersion()
method exitFullScreen (line 550) | Future<void> exitFullScreen({bool lockOrientation = true})
method landScape (line 594) | Future<void> landScape()
method verticalScreen (line 614) | Future<void> verticalScreen()
method unlockScreenRotation (line 621) | Future<void> unlockScreenRotation()
method getSeasonStringByMonth (line 625) | String getSeasonStringByMonth(int month)
method enterDesktopPIPWindow (line 633) | Future<void> enterDesktopPIPWindow()
method exitDesktopPIPWindow (line 639) | Future<void> exitDesktopPIPWindow()
method isSameSeason (line 647) | bool isSameSeason(DateTime d1, DateTime d2)
method getPlayerTempPath (line 651) | Future<String> getPlayerTempPath()
method buildShadersAbsolutePath (line 656) | String buildShadersAbsolutePath(
method generateDandanSignature (line 667) | String generateDandanSignature(String path, int timestamp)
method formatDate (line 678) | String formatDate(String dateString)
method calculateFileHash (line 688) | Future<String> calculateFileHash(File file)
method disposePlayerMenu (line 695) | Future<void> disposePlayerMenu()
method initPlayerMenu (line 705) | Future<void> initPlayerMenu(
FILE: lib/utils/webdav.dart
class WebDav (line 10) | class WebDav {
method init (line 25) | Future<void> init()
method update (line 65) | Future<void> update(String boxName)
method updateHistory (line 91) | Future<void> updateHistory()
method updateCollectibles (line 107) | Future<void> updateCollectibles()
method download (line 122) | Future<void> download(String boxName)
method downloadAndPatchHistory (line 134) | Future<void> downloadAndPatchHistory()
method syncCollectibles (line 154) | Future<void> syncCollectibles()
method ping (line 201) | Future<void> ping()
FILE: lib/webview/captcha/captcha_webview_controller.dart
class CaptchaWebviewController (line 8) | abstract class CaptchaWebviewController<T> {
method init (line 43) | Future<void> init()
method loadPage (line 50) | Future<void> loadPage(String url, String captchaXpath, {String? inputX...
method loadPageForButtonClick (line 57) | Future<void> loadPageForButtonClick(String url, String buttonXpath)
method submitCaptchaInteract (line 64) | Future<void> submitCaptchaInteract(
method getCookieString (line 70) | Future<String> getCookieString(String pageUrl)
method unloadPage (line 73) | Future<void> unloadPage()
method dispose (line 76) | void dispose()
class CaptchaWebviewControllerFactory (line 79) | class CaptchaWebviewControllerFactory {
method getController (line 80) | CaptchaWebviewController getController()
FILE: lib/webview/captcha/impl/captcha_webview_inappwebview_impl.dart
class CaptchaWebviewInAppWebviewImpl (line 8) | class CaptchaWebviewInAppWebviewImpl
method init (line 16) | Future<void> init()
method _registerHandlers (line 53) | void _registerHandlers()
method _addCaptchaUserScript (line 114) | Future<void> _addCaptchaUserScript()
method loadPage (line 254) | Future<void> loadPage(String url, String captchaXpath, {String? inputX...
method loadPageForButtonClick (line 271) | Future<void> loadPageForButtonClick(String url, String buttonXpath)
method _addButtonClickUserScript (line 286) | Future<void> _addButtonClickUserScript(String buttonXpath)
method submitCaptchaInteract (line 353) | Future<void> submitCaptchaInteract(
method getCookieString (line 397) | Future<String> getCookieString(String pageUrl)
method unloadPage (line 411) | Future<void> unloadPage()
method dispose (line 419) | void dispose()
FILE: lib/webview/captcha/impl/captcha_webview_linux_impl.dart
class CaptchaWebviewLinuxImpl (line 10) | class CaptchaWebviewLinuxImpl
method init (line 17) | Future<void> init()
method _getProxyConfiguration (line 30) | ProxyConfiguration? _getProxyConfiguration()
method _initMessageBridge (line 46) | void _initMessageBridge()
method _initNavigationListener (line 71) | void _initNavigationListener()
method _onNavigationInject (line 79) | Future<void> _onNavigationInject()
method _onNavigationCompletion (line 90) | Future<void> _onNavigationCompletion()
method _isCaptchaPresent (line 112) | Future<bool> _isCaptchaPresent()
method _injectCaptchaScript (line 133) | Future<void> _injectCaptchaScript()
method loadPage (line 226) | Future<void> loadPage(String url, String captchaXpath, {String? inputX...
method loadPageForButtonClick (line 235) | Future<void> loadPageForButtonClick(String url, String buttonXpath)
method _injectButtonClickScript (line 243) | Future<void> _injectButtonClickScript(String buttonXpath)
method submitCaptchaInteract (line 304) | Future<void> submitCaptchaInteract(
method getCookieString (line 352) | Future<String> getCookieString(String pageUrl)
method unloadPage (line 367) | Future<void> unloadPage()
method dispose (line 372) | void dispose()
FILE: lib/webview/captcha/impl/captcha_webview_windows_impl.dart
class CaptchaWebviewWindowsImpl (line 9) | class CaptchaWebviewWindowsImpl
method init (line 19) | Future<void> init()
method _onWebMessage (line 72) | void _onWebMessage(dynamic message)
method _isCaptchaPresent (line 94) | Future<bool> _isCaptchaPresent()
method _injectCaptchaScript (line 115) | Future<void> _injectCaptchaScript()
method loadPage (line 241) | Future<void> loadPage(String url, String captchaXpath, {String? inputX...
method loadPageForButtonClick (line 252) | Future<void> loadPageForButtonClick(String url, String buttonXpath)
method _injectButtonClickScript (line 261) | Future<void> _injectButtonClickScript(String buttonXpath)
method submitCaptchaInteract (line 321) | Future<void> submitCaptchaInteract(
method getCookieString (line 369) | Future<String> getCookieString(String pageUrl)
method unloadPage (line 380) | Future<void> unloadPage()
method dispose (line 390) | void dispose()
method _setupProxy (line 412) | Future<void> _setupProxy()
FILE: lib/webview/video/impl/video_webview_android_impl.dart
class VideoWebviewAndroidImpl (line 11) | class VideoWebviewAndroidImpl
method init (line 18) | Future<void> init()
method loadUrl (line 50) | Future<void> loadUrl(String url, bool useLegacyParser,
method addJavaScriptHandlers (line 68) | void addJavaScriptHandlers(bool useLegacyParser)
method addUserScripts (line 128) | Future<void> addUserScripts(bool useLegacyParser)
method unloadPage (line 277) | Future<void> unloadPage()
method dispose (line 283) | void dispose()
method _setupProxy (line 289) | Future<void> _setupProxy()
FILE: lib/webview/video/impl/video_webview_apple_impl.dart
class VideoWebviewAppleImpl (line 8) | class VideoWebviewAppleImpl
method init (line 14) | Future<void> init()
method loadUrl (line 125) | Future<void> loadUrl(String url, bool useLegacyParser,
method addJavaScriptHandlers (line 142) | void addJavaScriptHandlers(bool useLegacyParser)
method addUserScripts (line 202) | Future<void> addUserScripts(
method unloadPage (line 320) | Future<void> unloadPage()
method dispose (line 326) | void dispose()
FILE: lib/webview/video/impl/video_webview_impl.dart
class VideoWebviewImpl (line 12) | class VideoWebviewImpl
method init (line 20) | Future<void> init()
method loadUrl (line 79) | Future<void> loadUrl(String url, bool useLegacyParser,
method _addJavaScriptHandlers (line 96) | void _addJavaScriptHandlers(bool useLegacyParser)
method _onLoadStart (line 156) | Future<void> _onLoadStart()
method _onLoadStop (line 267) | Future<void> _onLoadStop()
method _startVideoParserTimer (line 371) | void _startVideoParserTimer()
method _pollVideoSource (line 383) | Future<void> _pollVideoSource()
method unloadPage (line 427) | Future<void> unloadPage()
method dispose (line 435) | void dispose()
method _isM3U8Url (line 443) | bool _isM3U8Url(String lower)
method _isRangeVideoRequest (line 449) | bool _isRangeVideoRequest(String lower, Map<String, String>? headers)
method _isAdUrl (line 469) | bool _isAdUrl(String lower)
method _setupProxy (line 476) | Future<void> _setupProxy()
FILE: lib/webview/video/impl/video_webview_linux_impl.dart
class VideoWebviewLinuxImpl (line 9) | class VideoWebviewLinuxImpl extends VideoWebviewController<Webview> {
method init (line 13) | Future<void> init()
method _getProxyConfiguration (line 39) | ProxyConfiguration? _getProxyConfiguration()
method initBridge (line 59) | Future<void> initBridge(bool useLegacyParser)
method loadUrl (line 65) | Future<void> loadUrl(String url, bool useLegacyParser,
method unloadPage (line 80) | Future<void> unloadPage()
method dispose (line 85) | void dispose()
method initJSBridge (line 90) | Future<void> initJSBridge(bool useLegacyParser)
method redirect2Blank (line 215) | Future<void> redirect2Blank()
FILE: lib/webview/video/impl/video_webview_windows_impl.dart
class VideoWebviewWindowsImpl (line 8) | class VideoWebviewWindowsImpl
method init (line 15) | Future<void> init()
method _setupProxy (line 23) | Future<void> _setupProxy()
method loadUrl (line 49) | Future<void> loadUrl(String url, bool useLegacyParser,
method unloadPage (line 87) | Future<void> unloadPage()
method dispose (line 98) | void dispose()
method redirect2Blank (line 113) | Future<void> redirect2Blank()
FILE: lib/webview/video/video_webview_controller.dart
class VideoWebviewController (line 11) | abstract class VideoWebviewController<T> {
method init (line 23) | Future<void> init()
method loadUrl (line 51) | Future<void> loadUrl(String url, bool useLegacyParser,
method unloadPage (line 55) | Future<void> unloadPage()
method dispose (line 58) | void dispose()
class VideoWebviewControllerFactory (line 61) | class VideoWebviewControllerFactory {
method getController (line 62) | VideoWebviewController getController()
FILE: linux/flutter/generated_plugin_registrant.cc
function fl_register_plugins (line 19) | void fl_register_plugins(FlPluginRegistry* registry) {
FILE: linux/main.cc
function main (line 3) | int main(int argc, char** argv) {
FILE: linux/my_application.cc
type _MyApplication (line 11) | struct _MyApplication {
function FlMethodResponse (line 20) | static FlMethodResponse* is_running_on_x11() {
function storage_method_call_handler (line 27) | static void storage_method_call_handler(FlMethodChannel* channel,
function intent_method_call_handler (line 60) | static void intent_method_call_handler(FlMethodChannel* channel,
function my_application_activate (line 77) | static void my_application_activate(GApplication* application) {
function gboolean (line 136) | static gboolean my_application_local_command_line(GApplication* applicat...
function my_application_startup (line 155) | static void my_application_startup(GApplication* application) {
function my_application_shutdown (line 164) | static void my_application_shutdown(GApplication* application) {
function my_application_dispose (line 173) | static void my_application_dispose(GObject* object) {
function my_application_class_init (line 181) | static void my_application_class_init(MyApplicationClass* klass) {
function my_application_init (line 189) | static void my_application_init(MyApplication* self) {}
function MyApplication (line 191) | MyApplication* my_application_new() {
FILE: test/m3u8_parser_test.dart
function main (line 4) | void main()
FILE: test/widget_test.dart
function main (line 11) | void main()
FILE: windows/flutter/generated_plugin_registrant.cc
function RegisterPlugins (line 20) | void RegisterPlugins(flutter::PluginRegistry* registry) {
FILE: windows/runner/external_player_utils.h
function class (line 16) | class ExternalPlayerUtils {
FILE: windows/runner/flutter_window.cpp
function LRESULT (line 64) | LRESULT
FILE: windows/runner/flutter_window.h
function class (line 12) | class FlutterWindow : public Win32Window {
FILE: windows/runner/fullscreen_utils.h
function class (line 16) | class FullscreenUtils {
FILE: windows/runner/main.cpp
function ActivateExistingWindow (line 25) | bool ActivateExistingWindow()
function isSingleInstance (line 60) | bool isSingleInstance()
function wWinMain (line 77) | int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
FILE: windows/runner/utils.cpp
function CreateAndAttachConsole (line 10) | void CreateAndAttachConsole() {
function GetCommandLineArguments (line 24) | std::vector<std::string> GetCommandLineArguments() {
function Utf8FromUtf16 (line 44) | std::string Utf8FromUtf16(const wchar_t* utf16_string) {
FILE: windows/runner/win32_window.cpp
function Scale (line 36) | int Scale(int source, double scale_factor) {
function EnableFullDpiSupportIfAvailable (line 42) | void EnableFullDpiSupportIfAvailable(HWND hwnd) {
class WindowClassRegistrar (line 59) | class WindowClassRegistrar {
method WindowClassRegistrar (line 64) | static WindowClassRegistrar* GetInstance() {
method WindowClassRegistrar (line 80) | WindowClassRegistrar() = default;
function wchar_t (line 89) | const wchar_t* WindowClassRegistrar::GetWindowClass() {
function LRESULT (line 157) | LRESULT CALLBACK Win32Window::WndProc(HWND const window,
function LRESULT (line 176) | LRESULT
function Win32Window (line 244) | Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {
function RECT (line 260) | RECT Win32Window::GetClientArea() {
function HWND (line 266) | HWND Win32Window::GetHandle() {
FILE: windows/runner/win32_window.h
type Size (line 21) | struct Size {
Condensed preview — 339 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,113K chars).
[
{
"path": ".gitattributes",
"chars": 1415,
"preview": "# Set default behavior to automatically normalize line endings\n* text=auto\n\n# Explicitly declare text files you want to "
},
{
"path": ".github/ISSUE_TEMPLATE/bug.yml",
"chars": 1386,
"preview": "name: Bug 反馈\ndescription: 提交一个 Bug 反馈。\ntitle: \"[Bug]: \"\nlabels: [\"bug\"]\nbody:\n - type: markdown\n attributes:\n v"
},
{
"path": ".github/ISSUE_TEMPLATE/other.yml",
"chars": 470,
"preview": "name: 其他 issue\ndescription: 新功能需求、问题询问等\nbody:\n - type: markdown\n attributes:\n value: |\n 请详细填写以下内容~\n - t"
},
{
"path": ".github/workflows/pr.yaml",
"chars": 13928,
"preview": "---\n name: \"PR workflow\"\n\n on:\n pull_request:\n types:\n - opened\n - synchronize\n "
},
{
"path": ".github/workflows/release.yaml",
"chars": 19080,
"preview": "---\n name: \"release\"\n \n on:\n push:\n tags:\n - \"*\"\n workflow_dispatch:\n inputs:\n"
},
{
"path": ".gitignore",
"chars": 959,
"preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.build/\n.buildlog/\n.history\n.svn/\n.swiftpm/\nmigrate_working_d"
},
{
"path": ".gitmodules",
"chars": 283,
"preview": "[submodule \"fastlane/.flutter\"]\n\tpath = fastlane/.flutter\n\turl = https://github.com/flutter/flutter.git\n\tbranch = stable"
},
{
"path": ".metadata",
"chars": 1706,
"preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
},
{
"path": ".vscode/settings.json",
"chars": 2200,
"preview": "{\n \"cmake.ignoreCMakeListsMissing\": true,\n \"search.exclude\": {\n \"**/fastlane\": true\n },\n \"dart.analys"
},
{
"path": "LICENSE",
"chars": 35149,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 5005,
"preview": "# Kazumi\n使用 Flutter 开发的基于自定义规则的番剧采集与在线观看程序。使用最多五行基于 `Xpath` 语法的选择器构建自己的规则。支持规则导入与规则分享。支持基于 `Anime4K` 的实时超分辨率。绝赞开发中 (~ ̄▽ ̄"
},
{
"path": "analysis_options.yaml",
"chars": 1420,
"preview": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n#"
},
{
"path": "android/.gitignore",
"chars": 285,
"preview": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n# Remembe"
},
{
"path": "android/app/build.gradle",
"chars": 2854,
"preview": "plugins {\n id \"com.android.application\"\n id \"kotlin-android\"\n id \"dev.flutter.flutter-gradle-plugin\"\n}\n\ndef loc"
},
{
"path": "android/app/src/debug/AndroidManifest.xml",
"chars": 378,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <!-- The INTERNET permission is required for d"
},
{
"path": "android/app/src/main/AndroidManifest.xml",
"chars": 3245,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <application\n android:label=\"Kazumi\"\n "
},
{
"path": "android/app/src/main/kotlin/com/example/kazumi/MainActivity.kt",
"chars": 2854,
"preview": "package com.example.kazumi\n\nimport android.content.Intent\nimport android.os.Build\nimport android.os.StatFs\nimport androi"
},
{
"path": "android/app/src/main/res/drawable/launch_background.xml",
"chars": 434,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
},
{
"path": "android/app/src/main/res/drawable-v21/launch_background.xml",
"chars": 438,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
},
{
"path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
"chars": 264,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <bac"
},
{
"path": "android/app/src/main/res/values/colors.xml",
"chars": 120,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"ic_launcher_background\">#ffffff</color>\n</resources>"
},
{
"path": "android/app/src/main/res/values/styles.xml",
"chars": 1360,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n <!-- Theme applied"
},
{
"path": "android/app/src/main/res/values-night/styles.xml",
"chars": 1361,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n <!-- Theme applied"
},
{
"path": "android/app/src/profile/AndroidManifest.xml",
"chars": 378,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <!-- The INTERNET permission is required for d"
},
{
"path": "android/build.gradle",
"chars": 322,
"preview": "allprojects {\n repositories {\n google()\n mavenCentral()\n }\n}\n\nrootProject.buildDir = '../build'\nsubp"
},
{
"path": "android/gradle/wrapper/gradle-wrapper.properties",
"chars": 203,
"preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dist"
},
{
"path": "android/gradle.properties",
"chars": 79,
"preview": "org.gradle.jvmargs=-Xmx4G\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n"
},
{
"path": "android/settings.gradle",
"chars": 790,
"preview": "pluginManagement {\n def flutterSdkPath = {\n def properties = new Properties()\n file(\"local.properties\")"
},
{
"path": "assets/bbcode/BBCode.g4",
"chars": 724,
"preview": "grammar BBCode;\n\noptions { language=Dart; }\n\ndocument\n : element* EOF\n ;\n\nelement\n : tag\n | plain\n | bgm\n"
},
{
"path": "assets/linux/DEBIAN/postinst",
"chars": 192,
"preview": "#!/usr/bin/env sh\nln -sf /opt/Kazumi/kazumi /usr/bin/kazumi\nchmod +x /usr/bin/kazumi\nupdate-mime-database /usr/share/mim"
},
{
"path": "assets/linux/DEBIAN/postrm",
"chars": 144,
"preview": "#!/usr/bin/env sh\nrm /usr/bin/kazumi\nupdate-mime-database /usr/share/mime || true\nupdate-desktop-database /usr/share/app"
},
{
"path": "assets/linux/io.github.Predidit.Kazumi.desktop",
"chars": 235,
"preview": "[Desktop Entry]\nName=Kazumi\nComment=Watch Animes online with danmaku support.\nComment[zh_CN]=一款好用的追番软件\nExec=kazumi\nStart"
},
{
"path": "assets/plugins/7sefun.json",
"chars": 526,
"preview": "{\n \"api\": \"4\",\n \"type\": \"anime\",\n \"name\": \"7sefun\",\n \"version\": \"1.2\",\n \"muliSources\": true,\n \"useWebv"
},
{
"path": "assets/plugins/AGE.json",
"chars": 527,
"preview": "{\n \"api\": \"1\",\n \"type\": \"anime\",\n \"name\": \"AGE\",\n \"version\": \"1.5\",\n \"muliSources\": true,\n \"useWebview"
},
{
"path": "assets/plugins/DM84.json",
"chars": 485,
"preview": "{\n \"api\": \"5\",\n \"type\": \"anime\",\n \"name\": \"DM84\",\n \"version\": \"1.4\",\n \"muliSources\": true,\n \"useWebvie"
},
{
"path": "assets/shaders/Anime4K_AutoDownscalePre_x2.glsl",
"chars": 1560,
"preview": "// This is free and unencumbered software released into the public domain.\n\n// Anyone is free to copy, modify, publish, "
},
{
"path": "assets/shaders/Anime4K_AutoDownscalePre_x4.glsl",
"chars": 1568,
"preview": "// This is free and unencumbered software released into the public domain.\n\n// Anyone is free to copy, modify, publish, "
},
{
"path": "assets/shaders/Anime4K_Clamp_Highlights.glsl",
"chars": 2795,
"preview": "// MIT License\n\n// Copyright (c) 2019-2021 bloc97\n// All rights reserved.\n\n// Permission is hereby granted, free of char"
},
{
"path": "assets/shaders/Anime4K_Restore_CNN_M.glsl",
"chars": 35916,
"preview": "// MIT License\n\n// Copyright (c) 2019-2021 bloc97\n// All rights reserved.\n\n// Permission is hereby granted, free of char"
},
{
"path": "assets/shaders/Anime4K_Restore_CNN_S.glsl",
"chars": 17136,
"preview": "// MIT License\n\n// Copyright (c) 2019-2021 bloc97\n// All rights reserved.\n\n// Permission is hereby granted, free of char"
},
{
"path": "assets/shaders/Anime4K_Restore_CNN_VL.glsl",
"chars": 144075,
"preview": "// MIT License\n\n// Copyright (c) 2019-2021 bloc97\n// All rights reserved.\n\n// Permission is hereby granted, free of char"
},
{
"path": "assets/shaders/Anime4K_Upscale_CNN_x2_M.glsl",
"chars": 37685,
"preview": "// MIT License\n\n// Copyright (c) 2019-2021 bloc97\n// All rights reserved.\n\n// Permission is hereby granted, free of char"
},
{
"path": "assets/shaders/Anime4K_Upscale_CNN_x2_S.glsl",
"chars": 18638,
"preview": "// MIT License\n\n// Copyright (c) 2019-2021 bloc97\n// All rights reserved.\n\n// Permission is hereby granted, free of char"
},
{
"path": "assets/shaders/Anime4K_Upscale_CNN_x2_VL.glsl",
"chars": 146743,
"preview": "// MIT License\n\n// Copyright (c) 2019-2021 bloc97\n// All rights reserved.\n\n// Permission is hereby granted, free of char"
},
{
"path": "assets/shaders/LICENSE",
"chars": 1062,
"preview": "MIT License\n\nCopyright (c) 2019 bloc97\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof "
},
{
"path": "assets/statements/statements.txt",
"chars": 603,
"preview": "在使用本软件之前,请您仔细阅读以下内容,并确保您充分理解并同意以下条款:\n1、本软件为开源软件,您应该免费获取和使用。如果您是从第三方付费获取,建议您向其索取赔偿。\n2、本软件完全基于您个人意愿使用,您应该对自己的使用行为和所有结果承担全部"
},
{
"path": "devtools_options.yaml",
"chars": 12,
"preview": "extensions:\n"
},
{
"path": "fastlane/metadata/android/en-US/full_description.txt",
"chars": 220,
"preview": "A flutter app for collecting and watching anime online with custom rules. Use up to five lines of Xpath expressions to b"
},
{
"path": "fastlane/metadata/android/en-US/short_description.txt",
"chars": 46,
"preview": "An anime collection APP based on custom rules."
},
{
"path": "fastlane/metadata/android/en-US/title.txt",
"chars": 6,
"preview": "Kazumi"
},
{
"path": "fastlane/metadata/android/zh-CN/full_description.txt",
"chars": 88,
"preview": "使用 flutter 开发的基于自定义规则的番剧采集与在线观看程序。使用最多五行基于 Xpath 语法的选择器构建自己的规则。支持规则导入与规则分享。绝赞开发中 (~ ̄▽ ̄)~"
},
{
"path": "fastlane/metadata/android/zh-CN/short_description.txt",
"chars": 31,
"preview": "基于自定义规则的番剧采集APP,支持流媒体在线观看,支持弹幕。"
},
{
"path": "fastlane/metadata/android/zh-CN/title.txt",
"chars": 6,
"preview": "Kazumi"
},
{
"path": "ios/.gitignore",
"chars": 569,
"preview": "**/dgph\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/De"
},
{
"path": "ios/Flutter/AppFrameworkInfo.plist",
"chars": 774,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Flutter/Debug.xcconfig",
"chars": 107,
"preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
},
{
"path": "ios/Flutter/Release.xcconfig",
"chars": 109,
"preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
},
{
"path": "ios/Podfile",
"chars": 1391,
"preview": "# Uncomment this line to define a global platform for your project\n# platform :ios, '13.0'\n\n# CocoaPods analytics sends "
},
{
"path": "ios/Runner/AppDelegate.swift",
"chars": 3868,
"preview": "import UIKit\nimport Flutter\nimport AVKit\n\n@main\n@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelega"
},
{
"path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 2519,
"preview": "{\n \"images\" : [\n {\n \"size\" : \"20x20\",\n \"idiom\" : \"iphone\",\n \"filename\" : \"Icon-App-20x20@2x.png\",\n "
},
{
"path": "ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json",
"chars": 361,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"background.png\",\n \"idiom\" : \"universal\"\n },\n {\n \"appearances\""
},
{
"path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
"chars": 1069,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"LaunchImage.png\",\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
"chars": 336,
"preview": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in"
},
{
"path": "ios/Runner/Base.lproj/LaunchScreen.storyboard",
"chars": 3489,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "ios/Runner/Base.lproj/Main.storyboard",
"chars": 1605,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "ios/Runner/Info.plist",
"chars": 2490,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Runner/Runner-Bridging-Header.h",
"chars": 38,
"preview": "#import \"GeneratedPluginRegistrant.h\"\n"
},
{
"path": "ios/Runner.xcodeproj/project.pbxproj",
"chars": 23767,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
"chars": 226,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
"chars": 3647,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1510\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "ios/Runner.xcworkspace/contents.xcworkspacedata",
"chars": 152,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:Runner.xcodepr"
},
{
"path": "ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
"chars": 226,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/RunnerTests/RunnerTests.swift",
"chars": 285,
"preview": "import Flutter\nimport UIKit\nimport XCTest\n\nclass RunnerTests: XCTestCase {\n\n func testExample() {\n // If you add cod"
},
{
"path": "lib/app_module.dart",
"chars": 252,
"preview": "import 'package:flutter_modular/flutter_modular.dart';\nimport 'package:kazumi/pages/index_module.dart';\n\nclass AppModule"
},
{
"path": "lib/app_widget.dart",
"chars": 10655,
"preview": "import 'dart:io';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_localizations/flutter_localizations.da"
},
{
"path": "lib/bbcode/README.md",
"chars": 1814,
"preview": "# 基于 antlr4 的 BBCode 解析\n\n## 相关文件\n\n- [assets/bbcode/BBCode.g4](../../assets/bbcode/BBCode.g4): antlr4 语法文件\n- [lib/bbcode/"
},
{
"path": "lib/bbcode/bbcode_base_listener.dart",
"chars": 6263,
"preview": "import 'package:flutter/material.dart';\nimport 'package:antlr4/antlr4.dart';\nimport 'package:kazumi/utils/logger.dart';\n"
},
{
"path": "lib/bbcode/bbcode_elements.dart",
"chars": 1224,
"preview": "// 记录进入 tag 时 list 所在位置\nclass BBCodeTag {\n int? bold;\n int? italic;\n int? underline;\n int? strikeThrough;\n int? mas"
},
{
"path": "lib/bbcode/bbcode_widget.dart",
"chars": 6369,
"preview": "import 'dart:ui' as ui;\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:"
},
{
"path": "lib/bbcode/generated/BBCode.tokens",
"chars": 530,
"preview": "T__0=1\nT__1=2\nT__2=3\nT__3=4\nT__4=5\nT__5=6\nT__6=7\nT__7=8\nT__8=9\nT__9=10\nT__10=11\nT__11=12\nT__12=13\nT__13=14\nT__14=15\nT__1"
},
{
"path": "lib/bbcode/generated/BBCodeLexer.dart",
"chars": 8117,
"preview": "import 'package:antlr4/antlr4.dart';\n\n\nclass BBCodeLexer extends Lexer {\n static final checkVersion = () => RuntimeMeta"
},
{
"path": "lib/bbcode/generated/BBCodeListener.dart",
"chars": 1714,
"preview": "import 'package:antlr4/antlr4.dart';\n\nimport 'BBCodeParser.dart';\n\n/// This abstract class defines a complete listener f"
},
{
"path": "lib/bbcode/generated/BBCodeParser.dart",
"chars": 13815,
"preview": "import 'package:antlr4/antlr4.dart';\n\nimport 'BBCodeListener.dart';\nconst int RULE_document = 0, RULE_element = 1, RULE_"
},
{
"path": "lib/bean/appbar/drag_to_move_bar.dart",
"chars": 916,
"preview": "import 'package:kazumi/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:window_manager/window_"
},
{
"path": "lib/bean/appbar/safe_mediaquery_warpper.dart",
"chars": 1280,
"preview": "import 'package:flutter/material.dart';\n\n/// workaround for padding check error on Xiaomi HyperOS devices\n/// caused by "
},
{
"path": "lib/bean/appbar/sys_app_bar.dart",
"chars": 3819,
"preview": "import 'dart:io';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:kazumi"
},
{
"path": "lib/bean/card/bangumi_card.dart",
"chars": 3194,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_modular/flutter_modular.dart';\nimport 'package:kazumi/be"
},
{
"path": "lib/bean/card/bangumi_history_card.dart",
"chars": 8024,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_modular/flutter_modular.dart';\nimport 'package:kazumi/be"
},
{
"path": "lib/bean/card/bangumi_info_card.dart",
"chars": 10915,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_rating_bar/flutter_rating_bar.dart';\nimport 'package:kaz"
},
{
"path": "lib/bean/card/bangumi_timeline_card.dart",
"chars": 6096,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_modular/flutter_modular.dart';\nimport 'package:kazumi/mo"
},
{
"path": "lib/bean/card/character_card.dart",
"chars": 1537,
"preview": "import 'package:kazumi/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:kazumi/modules/charact"
},
{
"path": "lib/bean/card/character_comments_card.dart",
"chars": 3390,
"preview": "import 'package:flutter/material.dart';\nimport 'package:kazumi/bbcode/bbcode_widget.dart';\nimport 'package:kazumi/module"
},
{
"path": "lib/bean/card/comments_card.dart",
"chars": 2757,
"preview": "import 'package:flutter/material.dart';\nimport 'package:kazumi/modules/comments/comment_item.dart';\nimport 'package:kazu"
},
{
"path": "lib/bean/card/episode_comments_card.dart",
"chars": 3519,
"preview": "import 'package:flutter/material.dart';\nimport 'package:kazumi/bbcode/bbcode_widget.dart';\nimport 'package:kazumi/module"
},
{
"path": "lib/bean/card/network_img_layer.dart",
"chars": 3836,
"preview": "import 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/material.dart';\nimport 'package"
},
{
"path": "lib/bean/card/palette_card.dart",
"chars": 2591,
"preview": "import 'package:flutter/material.dart';\nimport 'package:material_color_utilities/material_color_utilities.dart';\n\nclass "
},
{
"path": "lib/bean/card/staff_card.dart",
"chars": 932,
"preview": "import 'package:flutter/material.dart';\nimport 'package:kazumi/modules/staff/staff_item.dart';\n\nclass StaffCard extends "
},
{
"path": "lib/bean/dialog/dialog_helper.dart",
"chars": 12950,
"preview": "import 'dart:async';\nimport 'package:flutter/material.dart';\nimport 'package:kazumi/utils/constants.dart';\n\n// A simple "
},
{
"path": "lib/bean/settings/color_type.dart",
"chars": 496,
"preview": "import 'package:flutter/material.dart';\n\nfinal List<Map<String, dynamic>> colorThemeTypes = [\n {'color': Colors.green, "
},
{
"path": "lib/bean/settings/theme_provider.dart",
"chars": 908,
"preview": "import 'package:flutter/material.dart';\nimport 'package:kazumi/utils/constants.dart';\n\nclass ThemeProvider extends Chang"
},
{
"path": "lib/bean/widget/collect_button.dart",
"chars": 4139,
"preview": "import 'package:flutter/material.dart';\nimport 'package:kazumi/modules/bangumi/bangumi_item.dart';\nimport 'package:kazum"
},
{
"path": "lib/bean/widget/custom_dropdown_menu.dart",
"chars": 4091,
"preview": "import 'package:flutter/material.dart';\n\n/// A custom dropdown menu widget that provides smooth animations without flick"
},
{
"path": "lib/bean/widget/embedded_native_control_area.dart",
"chars": 1246,
"preview": "import 'dart:io';\nimport 'package:flutter/material.dart';\nimport 'package:kazumi/utils/storage.dart';\n\nclass EmbeddedNat"
},
{
"path": "lib/bean/widget/error_widget.dart",
"chars": 1764,
"preview": "import 'package:flutter/material.dart';\n\nclass GeneralErrorWidget extends StatelessWidget {\n const GeneralErrorWidget({"
},
{
"path": "lib/bean/widget/scrollable_wrapper.dart",
"chars": 1197,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter/gestures.dart';\n\n/// 滚动容器\n/// 支持鼠标滚轮滚动和拖动滚动\n/// 传入ListVi"
},
{
"path": "lib/hive_registrar.g.dart",
"chars": 1526,
"preview": "// Generated by Hive CE\n// Do not modify\n// Check in to version control\n\nimport 'package:hive_ce/hive.dart';\nimport 'pac"
},
{
"path": "lib/main.dart",
"chars": 3779,
"preview": "import 'dart:io';\nimport 'package:flutter/material.dart';\nimport 'package:kazumi/app_module.dart';\nimport 'package:kazum"
},
{
"path": "lib/modules/bangumi/bangumi_item.dart",
"chars": 3831,
"preview": "import 'package:hive_ce/hive.dart';\nimport 'package:kazumi/utils/utils.dart';\nimport 'package:kazumi/modules/bangumi/ban"
},
{
"path": "lib/modules/bangumi/bangumi_item.g.dart",
"chars": 2461,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'bangumi_item.dart';\n\n// ********************************************"
},
{
"path": "lib/modules/bangumi/bangumi_tag.dart",
"chars": 654,
"preview": "import 'package:hive_ce/hive.dart';\n\npart 'bangumi_tag.g.dart';\n\n@HiveType(typeId: 4)\nclass BangumiTag {\n @HiveField(0)"
},
{
"path": "lib/modules/bangumi/bangumi_tag.g.dart",
"chars": 1209,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'bangumi_tag.dart';\n\n// *********************************************"
},
{
"path": "lib/modules/bangumi/episode_item.dart",
"chars": 940,
"preview": "class EpisodeInfo {\n int id;\n num episode;\n int type;\n String name;\n String nameCn;\n\n EpisodeInfo({\n required t"
},
{
"path": "lib/modules/bangumi/weekday_item.dart",
"chars": 299,
"preview": "class Weekday {\n String? en;\n String? cn;\n String? ja;\n int? id;\n\n Weekday({this.en, this.cn, this.ja, this.id});\n\n"
},
{
"path": "lib/modules/character/character_full_item.dart",
"chars": 1000,
"preview": "class CharacterFullItem {\n final int id;\n final String name;\n final String nameCN;\n final String info;\n final Strin"
},
{
"path": "lib/modules/characters/actor_item.dart",
"chars": 1239,
"preview": "class ActorAvator {\n final String small;\n final String medium;\n final String grid;\n final String large;\n\n ActorAvat"
},
{
"path": "lib/modules/characters/character_item.dart",
"chars": 2313,
"preview": "import 'package:kazumi/modules/characters/actor_item.dart';\n\nclass CharacterAvator {\n final String small;\n final Strin"
},
{
"path": "lib/modules/characters/characters_response.dart",
"chars": 892,
"preview": "import 'package:kazumi/request/api.dart';\nimport 'package:kazumi/modules/characters/character_item.dart';\n\n/// The respo"
},
{
"path": "lib/modules/collect/collect_change_module.dart",
"chars": 884,
"preview": "import 'package:hive_ce/hive.dart';\n\npart 'collect_change_module.g.dart';\n\n// The box stores the changes history of coll"
},
{
"path": "lib/modules/collect/collect_change_module.g.dart",
"chars": 1438,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'collect_change_module.dart';\n\n// ***********************************"
},
{
"path": "lib/modules/collect/collect_module.dart",
"chars": 630,
"preview": "import 'package:hive_ce/hive.dart';\nimport 'package:kazumi/modules/bangumi/bangumi_item.dart';\n\npart 'collect_module.g.d"
},
{
"path": "lib/modules/collect/collect_module.g.dart",
"chars": 1223,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'collect_module.dart';\n\n// ******************************************"
},
{
"path": "lib/modules/collect/collect_type.dart",
"chars": 612,
"preview": "/// 收藏类型枚举\n///\n/// 用于标识番剧的收藏状态\nenum CollectType {\n /// 未收藏\n none(0, '未收藏'),\n\n /// 在看\n watching(1, '在看'),\n\n /// 想看\n "
},
{
"path": "lib/modules/comments/comment_item.dart",
"chars": 4734,
"preview": "class UserAvatar {\n final String small;\n final String medium;\n final String large;\n\n UserAvatar({\n required this."
},
{
"path": "lib/modules/comments/comment_response.dart",
"chars": 2105,
"preview": "import 'package:kazumi/modules/comments/comment_item.dart';\n\nclass CommentResponse {\n List<CommentItem> commentList;\n "
},
{
"path": "lib/modules/danmaku/danmaku_episode_response.dart",
"chars": 1657,
"preview": "class DanmakuEpisode {\n int episodeId;\n String episodeTitle;\n\n DanmakuEpisode({\n required this.episodeId,\n requ"
},
{
"path": "lib/modules/danmaku/danmaku_module.dart",
"chars": 1204,
"preview": "import 'package:flutter/material.dart';\nimport 'package:kazumi/utils/utils.dart';\n\nclass Danmaku {\n // 弹幕内容\n String me"
},
{
"path": "lib/modules/danmaku/danmaku_search_response.dart",
"chars": 2141,
"preview": "class DanmakuAnime {\n int animeId;\n String animeTitle;\n String type;\n String typeDescription;\n String imageUrl;\n D"
},
{
"path": "lib/modules/download/download_module.dart",
"chars": 2092,
"preview": "import 'package:hive_ce/hive.dart';\n\npart 'download_module.g.dart';\n\n@HiveType(typeId: 7)\nclass DownloadRecord {\n @Hive"
},
{
"path": "lib/modules/download/download_module.g.dart",
"chars": 3722,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'download_module.dart';\n\n// *****************************************"
},
{
"path": "lib/modules/history/history_module.dart",
"chars": 1309,
"preview": "import 'package:hive_ce/hive.dart';\nimport 'package:kazumi/modules/bangumi/bangumi_item.dart';\n\npart 'history_module.g.d"
},
{
"path": "lib/modules/history/history_module.g.dart",
"chars": 2498,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'history_module.dart';\n\n// ******************************************"
},
{
"path": "lib/modules/plugin/plugin_http_module.dart",
"chars": 912,
"preview": "class PluginHTTPItem {\n String name;\n String version;\n bool useNativePlayer;\n String author;\n int lastUpdate;\n boo"
},
{
"path": "lib/modules/roads/road_module.dart",
"chars": 171,
"preview": "class Road {\n String name;\n List<String> data;\n List<String> identifier;\n\n Road({\n required this.name,\n requir"
},
{
"path": "lib/modules/search/plugin_search_module.dart",
"chars": 676,
"preview": "class SearchItem {\n String name;\n String src;\n\n SearchItem({\n required this.name,\n required this.src,\n });\n\n "
},
{
"path": "lib/modules/search/search_history_module.dart",
"chars": 420,
"preview": "import 'package:hive_ce/hive.dart';\n\npart 'search_history_module.g.dart';\n\n@HiveType(typeId: 6)\nclass SearchHistory {\n "
},
{
"path": "lib/modules/search/search_history_module.g.dart",
"chars": 1134,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'search_history_module.dart';\n\n// ***********************************"
},
{
"path": "lib/modules/staff/staff_item.dart",
"chars": 4345,
"preview": "class StaffFullItem {\n final Staff staff;\n final List<Position> positions;\n\n StaffFullItem({\n required this.staff,"
},
{
"path": "lib/modules/staff/staff_response.dart",
"chars": 770,
"preview": "import 'package:kazumi/modules/staff/staff_item.dart';\n\nclass StaffResponse {\n final List<StaffFullItem> data;\n final "
},
{
"path": "lib/pages/about/about_module.dart",
"chars": 651,
"preview": "import 'package:flutter/material.dart';\nimport 'package:kazumi/request/api.dart';\nimport 'package:kazumi/pages/about/abo"
},
{
"path": "lib/pages/about/about_page.dart",
"chars": 10858,
"preview": "import 'dart:io';\n\nimport 'package:card_settings_ui/card_settings_ui.dart';\nimport 'package:flutter/material.dart';\nimpo"
},
{
"path": "lib/pages/collect/collect_controller.dart",
"chars": 4287,
"preview": "import 'package:flutter_modular/flutter_modular.dart';\nimport 'package:kazumi/bean/dialog/dialog_helper.dart';\nimport 'p"
},
{
"path": "lib/pages/collect/collect_controller.g.dart",
"chars": 1675,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'collect_controller.dart';\n\n// **************************************"
},
{
"path": "lib/pages/collect/collect_module.dart",
"chars": 240,
"preview": "import 'package:kazumi/pages/collect/collect_page.dart';\nimport 'package:flutter_modular/flutter_modular.dart';\n\nclass C"
},
{
"path": "lib/pages/collect/collect_page.dart",
"chars": 8096,
"preview": "import 'package:flutter_mobx/flutter_mobx.dart';\nimport 'package:kazumi/bean/dialog/dialog_helper.dart';\nimport 'package"
},
{
"path": "lib/pages/download/download_controller.dart",
"chars": 27476,
"preview": "import 'dart:convert';\nimport 'dart:io';\nimport 'package:flutter_modular/flutter_modular.dart';\nimport 'package:hive_ce/"
},
{
"path": "lib/pages/download/download_controller.g.dart",
"chars": 1476,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'download_controller.dart';\n\n// *************************************"
},
{
"path": "lib/pages/download/download_episode_sheet.dart",
"chars": 9644,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_modular/flutter_modular.dart';\nimport 'package:kazumi/be"
},
{
"path": "lib/pages/download/download_page.dart",
"chars": 13529,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_mobx/flutter_mobx.dart';\nimport 'package:flutter_modular"
},
{
"path": "lib/pages/download/download_page_module.dart",
"chars": 244,
"preview": "import 'package:flutter_modular/flutter_modular.dart';\nimport 'package:kazumi/pages/download/download_page.dart';\n\nclass"
},
{
"path": "lib/pages/error/storage_error_page.dart",
"chars": 1227,
"preview": "import 'dart:io';\nimport 'package:flutter/material.dart';\nimport 'package:kazumi/bean/widget/error_widget.dart';\nimport "
},
{
"path": "lib/pages/history/history_controller.dart",
"chars": 1903,
"preview": "import 'package:flutter_modular/flutter_modular.dart';\nimport 'package:kazumi/modules/bangumi/bangumi_item.dart';\nimport"
},
{
"path": "lib/pages/history/history_controller.g.dart",
"chars": 1045,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'history_controller.dart';\n\n// **************************************"
},
{
"path": "lib/pages/history/history_module.dart",
"chars": 240,
"preview": "import 'package:kazumi/pages/history/history_page.dart';\nimport 'package:flutter_modular/flutter_modular.dart';\n\nclass H"
},
{
"path": "lib/pages/history/history_page.dart",
"chars": 4342,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_mobx/flutter_mobx.dart';\nimport 'package:flutter_modular"
},
{
"path": "lib/pages/index_module.dart",
"chars": 3184,
"preview": "import 'package:kazumi/pages/index_page.dart';\nimport 'package:flutter_modular/flutter_modular.dart';\nimport 'package:ka"
},
{
"path": "lib/pages/index_page.dart",
"chars": 435,
"preview": "import 'package:flutter/material.dart';\nimport 'package:kazumi/pages/menu/menu.dart';\n\n\nclass IndexPage extends Stateful"
},
{
"path": "lib/pages/info/character_page.dart",
"chars": 10945,
"preview": "import 'dart:ui';\nimport 'package:flutter/material.dart';\nimport 'package:kazumi/modules/character/character_full_item.d"
},
{
"path": "lib/pages/info/info_controller.dart",
"chars": 3368,
"preview": "import 'package:kazumi/bean/dialog/dialog_helper.dart';\nimport 'package:kazumi/modules/bangumi/bangumi_item.dart';\nimpor"
},
{
"path": "lib/pages/info/info_controller.g.dart",
"chars": 3460,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'info_controller.dart';\n\n// *****************************************"
},
{
"path": "lib/pages/info/info_module.dart",
"chars": 228,
"preview": "import 'package:kazumi/pages/info/info_page.dart';\nimport 'package:flutter_modular/flutter_modular.dart';\n\nclass InfoMod"
},
{
"path": "lib/pages/info/info_page.dart",
"chars": 16335,
"preview": "import 'dart:io';\nimport 'dart:ui';\nimport 'package:kazumi/utils/utils.dart';\nimport 'package:flutter/material.dart';\nim"
},
{
"path": "lib/pages/info/info_tabview.dart",
"chars": 19477,
"preview": "import 'dart:ui' as ui;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_modular/flutter_modular.dart';\ni"
},
{
"path": "lib/pages/info/source_sheet.dart",
"chars": 26262,
"preview": "import 'package:flutter/material.dart';\nimport 'package:kazumi/utils/utils.dart';\nimport 'package:flutter_mobx/flutter_m"
},
{
"path": "lib/pages/init_page.dart",
"chars": 10645,
"preview": "import 'dart:io';\nimport 'package:flutter/material.dart';\nimport 'package:hive_ce/hive.dart';\nimport 'package:kazumi/bea"
},
{
"path": "lib/pages/logs/logs_page.dart",
"chars": 5906,
"preview": "import 'dart:io';\nimport 'dart:async';\nimport 'package:flutter/material.dart';\nimport 'package:kazumi/bean/dialog/dialog"
},
{
"path": "lib/pages/menu/menu.dart",
"chars": 6620,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_modular/flutter_modular.dart';\nimport 'package:kazumi/be"
},
{
"path": "lib/pages/my/my_controller.dart",
"chars": 2344,
"preview": "import 'package:kazumi/bean/dialog/dialog_helper.dart';\nimport 'package:kazumi/utils/logger.dart';\nimport 'package:mobx/"
},
{
"path": "lib/pages/my/my_controller.g.dart",
"chars": 1034,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'my_controller.dart';\n\n// *******************************************"
},
{
"path": "lib/pages/my/my_module.dart",
"chars": 220,
"preview": "import 'package:kazumi/pages/my/my_page.dart';\nimport 'package:flutter_modular/flutter_modular.dart';\n\nclass MyModule ex"
},
{
"path": "lib/pages/my/my_page.dart",
"chars": 7271,
"preview": "import 'package:card_settings_ui/card_settings_ui.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter"
},
{
"path": "lib/pages/player/episode_comments_sheet.dart",
"chars": 8562,
"preview": "import 'dart:ui';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutte"
},
{
"path": "lib/pages/player/player_controller.dart",
"chars": 32923,
"preview": "import 'dart:io';\nimport 'dart:async';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter_volume_controll"
},
{
"path": "lib/pages/player/player_controller.g.dart",
"chars": 15232,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'player_controller.dart';\n\n// ***************************************"
},
{
"path": "lib/pages/player/player_item.dart",
"chars": 63450,
"preview": "import 'dart:async';\nimport 'dart:io';\nimport 'package:audio_video_progress_bar/audio_video_progress_bar.dart';\nimport '"
},
{
"path": "lib/pages/player/player_item_panel.dart",
"chars": 58619,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_mobx/flutter_mobx.dart';\nimport 'package:flutter_modular"
},
{
"path": "lib/pages/player/player_item_surface.dart",
"chars": 2059,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_mobx/flutter_mobx.dart';\nimport 'package:media_kit_video"
},
{
"path": "lib/pages/player/smallest_player_item_panel.dart",
"chars": 36456,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_mobx/flutter_mobx.dart';\nimport 'package:flutter_modular"
},
{
"path": "lib/pages/plugin_editor/plugin_editor_page.dart",
"chars": 19610,
"preview": "import 'package:card_settings_ui/card_settings_ui.dart';\nimport 'package:card_settings_ui/tile/settings_tile_info.dart';"
},
{
"path": "lib/pages/plugin_editor/plugin_module.dart",
"chars": 795,
"preview": "import 'package:kazumi/pages/plugin_editor/plugin_test_page.dart';\nimport 'package:kazumi/pages/plugin_editor/plugin_vie"
},
{
"path": "lib/pages/plugin_editor/plugin_shop_page.dart",
"chars": 9527,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_mobx/flutter_mobx.dart';\nimport 'package:flutter_modular"
},
{
"path": "lib/pages/plugin_editor/plugin_test_page.dart",
"chars": 17600,
"preview": "import 'package:dio/dio.dart';\nimport 'package:flutter/material.dart' hide Element;\nimport 'package:flutter_modular/flut"
},
{
"path": "lib/pages/plugin_editor/plugin_view_page.dart",
"chars": 20610,
"preview": "import 'dart:convert';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:f"
},
{
"path": "lib/pages/popular/popular_controller.dart",
"chars": 1599,
"preview": "import 'dart:math';\nimport 'package:flutter/material.dart';\nimport 'package:kazumi/request/bangumi.dart';\nimport 'packag"
},
{
"path": "lib/pages/popular/popular_controller.g.dart",
"chars": 2676,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'popular_controller.dart';\n\n// **************************************"
},
{
"path": "lib/pages/popular/popular_module.dart",
"chars": 240,
"preview": "import 'package:kazumi/pages/popular/popular_page.dart';\nimport 'package:flutter_modular/flutter_modular.dart';\n\nclass P"
},
{
"path": "lib/pages/popular/popular_page.dart",
"chars": 11984,
"preview": "import 'dart:ui';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_modular/flutter_modular.dart';\nimport "
},
{
"path": "lib/pages/router.dart",
"chars": 1154,
"preview": "import 'package:flutter_modular/flutter_modular.dart';\nimport 'package:kazumi/pages/popular/popular_module.dart';\nimport"
},
{
"path": "lib/pages/search/search_controller.dart",
"chars": 4027,
"preview": "import 'package:flutter_modular/flutter_modular.dart';\nimport 'package:mobx/mobx.dart';\nimport 'package:kazumi/modules/b"
},
{
"path": "lib/pages/search/search_controller.g.dart",
"chars": 5810,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'search_controller.dart';\n\n// ***************************************"
},
{
"path": "lib/pages/search/search_module.dart",
"chars": 315,
"preview": "import 'package:flutter_modular/flutter_modular.dart';\nimport 'package:kazumi/pages/search/search_page.dart';\n\nclass Sea"
},
{
"path": "lib/pages/search/search_page.dart",
"chars": 12876,
"preview": "import 'package:flutter/material.dart';\nimport 'package:kazumi/utils/constants.dart';\nimport 'package:kazumi/bean/card/b"
},
{
"path": "lib/pages/settings/danmaku/danmaku_module.dart",
"chars": 439,
"preview": "import 'package:kazumi/pages/settings/danmaku/danmaku_settings.dart';\nimport 'package:flutter_modular/flutter_modular.da"
},
{
"path": "lib/pages/settings/danmaku/danmaku_settings.dart",
"chars": 15149,
"preview": "import 'package:kazumi/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_modular/flutte"
},
{
"path": "lib/pages/settings/danmaku/danmaku_settings_sheet.dart",
"chars": 9164,
"preview": "import 'package:canvas_danmaku/canvas_danmaku.dart';\nimport 'package:flutter/material.dart';\nimport 'package:hive_ce/hiv"
},
{
"path": "lib/pages/settings/danmaku/danmaku_shield_settings.dart",
"chars": 3124,
"preview": "import 'package:flutter/material.dart';\nimport 'package:kazumi/bean/appbar/sys_app_bar.dart';\nimport 'package:kazumi/pag"
},
{
"path": "lib/pages/settings/decoder_settings.dart",
"chars": 1919,
"preview": "import 'package:flutter/material.dart';\nimport 'package:hive_ce/hive.dart';\nimport 'package:kazumi/bean/appbar/sys_app_b"
},
{
"path": "lib/pages/settings/displaymode_settings.dart",
"chars": 3297,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/services.dart';"
}
]
// ... and 139 more files (download for full content)
About this extraction
This page contains the full source code of the Predidit/Kazumi GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 339 files (1.9 MB), approximately 590.0k tokens, and a symbol index with 1602 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.