Showing preview only (2,039K chars total). Download the full file or copy to clipboard to get everything.
Repository: Night-stars-1/Han1meViewer
Branch: master
Commit: cc61b0c58cb2
Files: 553
Total size: 1.8 MB
Directory structure:
gitextract_rimhsaes/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── custom.md
│ │ └── feature_request.yml
│ ├── PULL_REQUEST_TEMPLATE/
│ │ ├── bug_fix.md
│ │ ├── feature_addition.md
│ │ └── submit_h_keyframe.md
│ ├── dependabot.yml
│ └── workflows/
│ ├── ci.yml
│ ├── ci_release.yml
│ └── pr_check.yml
├── .gitignore
├── .idea/
│ ├── .gitignore
│ ├── .name
│ ├── AndroidProjectSystem.xml
│ ├── appInsightsSettings.xml
│ ├── codeStyles/
│ │ ├── Project.xml
│ │ └── codeStyleConfig.xml
│ ├── compiler.xml
│ ├── dbnavigator.xml
│ ├── deploymentTargetDropDown.xml
│ ├── deploymentTargetSelector.xml
│ ├── dictionaries/
│ │ └── wrzg8.xml
│ ├── gradle.xml
│ ├── inspectionProfiles/
│ │ └── Project_Default.xml
│ ├── kotlinc.xml
│ ├── ktlint-plugin.xml
│ ├── migrations.xml
│ ├── misc.xml
│ ├── render.experimental.xml
│ ├── runConfigurations.xml
│ ├── studiobot.xml
│ └── vcs.xml
├── LICENSE
├── README.md
├── README_TECH.md
├── app/
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── keystore/
│ │ └── Han1meViewerKeystore.jks
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── com/
│ │ └── yenaly/
│ │ └── han1meviewer/
│ │ └── ExampleInstrumentedTest.kt
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── assets/
│ │ │ ├── h_keyframes/
│ │ │ │ ├── 12444.json
│ │ │ │ ├── 14463.json
│ │ │ │ ├── 21806.json
│ │ │ │ ├── 22068.json
│ │ │ │ ├── 37176.json
│ │ │ │ ├── 37177.json
│ │ │ │ ├── 37178.json
│ │ │ │ ├── 37179.json
│ │ │ │ ├── 37220.json
│ │ │ │ ├── 37221.json
│ │ │ │ ├── 38387.json
│ │ │ │ ├── 38389.json
│ │ │ │ ├── 38457.json
│ │ │ │ ├── 38461.json
│ │ │ │ ├── 39192.json
│ │ │ │ ├── 39305.json
│ │ │ │ ├── 39306.json
│ │ │ │ ├── 39468.json
│ │ │ │ ├── 39811.json
│ │ │ │ ├── 84717.json
│ │ │ │ ├── 84718.json
│ │ │ │ ├── 85926.json
│ │ │ │ ├── 85927.json
│ │ │ │ ├── 87968.json
│ │ │ │ ├── 87969.json
│ │ │ │ ├── 89087.json
│ │ │ │ ├── 89088.json
│ │ │ │ └── README.md
│ │ │ ├── search_options/
│ │ │ │ ├── brands.json
│ │ │ │ ├── duration.json
│ │ │ │ ├── genre.json
│ │ │ │ ├── sort_option.json
│ │ │ │ └── tags.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
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── yenaly/
│ │ │ └── han1meviewer/
│ │ │ ├── Constants.kt
│ │ │ ├── FirebaseConstants.kt
│ │ │ ├── HAdvancedSearch.kt
│ │ │ ├── HCacheManager.kt
│ │ │ ├── HCrashHandler.kt
│ │ │ ├── HFileManager.kt
│ │ │ ├── HInitializer.kt
│ │ │ ├── HanimeApplication.kt
│ │ │ ├── HanimeManager.kt
│ │ │ ├── HanimeResolution.kt
│ │ │ ├── Preferences.kt
│ │ │ ├── VideoCoverSize.kt
│ │ │ ├── logic/
│ │ │ │ ├── DatabaseRepo.kt
│ │ │ │ ├── NetworkRepo.kt
│ │ │ │ ├── Parser.kt
│ │ │ │ ├── dao/
│ │ │ │ │ ├── DownloadDatabase.kt
│ │ │ │ │ ├── HKeyframeDao.kt
│ │ │ │ │ ├── HistoryDatabase.kt
│ │ │ │ │ ├── MiscellanyDatabase.kt
│ │ │ │ │ ├── SearchHistoryDao.kt
│ │ │ │ │ ├── WatchHistoryDao.kt
│ │ │ │ │ └── download/
│ │ │ │ │ ├── DownloadCategoryDao.kt
│ │ │ │ │ ├── HUpdateDao.kt
│ │ │ │ │ └── HanimeDownloadDao.kt
│ │ │ │ ├── entity/
│ │ │ │ │ ├── HKeyframeEntity.kt
│ │ │ │ │ ├── SearchHistoryEntity.kt
│ │ │ │ │ ├── WatchHistoryEntity.kt
│ │ │ │ │ └── download/
│ │ │ │ │ ├── DownloadCategoryEntity.kt
│ │ │ │ │ ├── HUpdateEntity.kt
│ │ │ │ │ ├── HanimeCategoryCrossRef.kt
│ │ │ │ │ ├── HanimeDownloadEntity.kt
│ │ │ │ │ └── VideoWithCategories.kt
│ │ │ │ ├── exception/
│ │ │ │ │ ├── CloudFlareBlockedException.kt
│ │ │ │ │ ├── HanimeNotFoundException.kt
│ │ │ │ │ ├── IPBlockedException.kt
│ │ │ │ │ └── ParseException.kt
│ │ │ │ ├── model/
│ │ │ │ │ ├── HanimeInfo.kt
│ │ │ │ │ ├── HanimePreview.kt
│ │ │ │ │ ├── HanimeVideo.kt
│ │ │ │ │ ├── HomePage.kt
│ │ │ │ │ ├── MultiItemEntity.kt
│ │ │ │ │ ├── MyListItems.kt
│ │ │ │ │ ├── ParamEnum.kt
│ │ │ │ │ ├── Playlists.kt
│ │ │ │ │ ├── SearchOption.kt
│ │ │ │ │ ├── SearchTag.kt
│ │ │ │ │ ├── Subscription.kt
│ │ │ │ │ ├── VideoComments.kt
│ │ │ │ │ └── github/
│ │ │ │ │ ├── Commit.kt
│ │ │ │ │ ├── Latest.kt
│ │ │ │ │ ├── Release.kt
│ │ │ │ │ └── Workflow.kt
│ │ │ │ ├── network/
│ │ │ │ │ ├── GitHubDns.kt
│ │ │ │ │ ├── HCookieJar.kt
│ │ │ │ │ ├── HDns.kt
│ │ │ │ │ ├── HProxySelector.kt
│ │ │ │ │ ├── HUpdater.kt
│ │ │ │ │ ├── HanimeNetwork.kt
│ │ │ │ │ ├── ServiceCreator.kt
│ │ │ │ │ ├── interceptor/
│ │ │ │ │ │ ├── SpeedLimitInterceptor.kt
│ │ │ │ │ │ ├── SpeedLimitResponseBody.kt
│ │ │ │ │ │ └── UserAgentInterceptor.kt
│ │ │ │ │ └── service/
│ │ │ │ │ ├── HGitHubService.kt
│ │ │ │ │ ├── HanimeBaseService.kt
│ │ │ │ │ ├── HanimeCommentService.kt
│ │ │ │ │ ├── HanimeMyListService.kt
│ │ │ │ │ └── HanimeSubscriptionService.kt
│ │ │ │ └── state/
│ │ │ │ ├── DownloadState.kt
│ │ │ │ ├── PageLoadingState.kt
│ │ │ │ ├── VideoLoadingState.kt
│ │ │ │ └── WebsiteState.kt
│ │ │ ├── ui/
│ │ │ │ ├── StateLayoutMixin.kt
│ │ │ │ ├── activity/
│ │ │ │ │ ├── DownloadActivity.kt
│ │ │ │ │ ├── LoginActivity.kt
│ │ │ │ │ ├── MainActivity.kt
│ │ │ │ │ ├── PreviewActivity.kt
│ │ │ │ │ ├── PreviewCommentActivity.kt
│ │ │ │ │ ├── SearchActivity.kt
│ │ │ │ │ ├── SettingsActivity.kt
│ │ │ │ │ ├── SettingsRouter.kt
│ │ │ │ │ └── VideoActivity.kt
│ │ │ │ ├── adapter/
│ │ │ │ │ ├── AdapterLikeDataBindingPage.kt
│ │ │ │ │ ├── BaseSingleDifferAdapter.kt
│ │ │ │ │ ├── FixedGridLayoutManager.kt
│ │ │ │ │ ├── HKeyframesRvAdapter.kt
│ │ │ │ │ ├── HRvItemAdapter.kt
│ │ │ │ │ ├── HSearchTagAdapter.kt
│ │ │ │ │ ├── HSubscriptionAdapter.kt
│ │ │ │ │ ├── HanimeDownloadedRvAdapter.kt
│ │ │ │ │ ├── HanimeDownloadingRvAdapter.kt
│ │ │ │ │ ├── HanimeMyListVideoAdapter.kt
│ │ │ │ │ ├── HanimePreviewNewsRvAdapter.kt
│ │ │ │ │ ├── HanimePreviewTourRvAdapter.kt
│ │ │ │ │ ├── HanimeSearchHistoryRvAdapter.kt
│ │ │ │ │ ├── HanimeUpdateRvAdapter.kt
│ │ │ │ │ ├── HanimeUpdatedRvAdapter.kt
│ │ │ │ │ ├── HanimeVideoRvAdapter.kt
│ │ │ │ │ ├── PlaylistRvAdapter.kt
│ │ │ │ │ ├── RvWrapper.kt
│ │ │ │ │ ├── SharedHKeyframesRvAdapter.kt
│ │ │ │ │ ├── SuperResolutionAdapter.kt
│ │ │ │ │ ├── VideoColumnTitleAdapter.kt
│ │ │ │ │ ├── VideoCommentRvAdapter.kt
│ │ │ │ │ ├── VideoSpeedAdapter.kt
│ │ │ │ │ └── WatchHistoryRvAdapter.kt
│ │ │ │ ├── fragment/
│ │ │ │ │ ├── IToolbarFragment.kt
│ │ │ │ │ ├── LoginNeededFragmentMixin.kt
│ │ │ │ │ ├── home/
│ │ │ │ │ │ ├── DownloadFragment.kt
│ │ │ │ │ │ ├── HomePageFragment.kt
│ │ │ │ │ │ ├── MyFavVideoFragment.kt
│ │ │ │ │ │ ├── MyPlaylistFragment.kt
│ │ │ │ │ │ ├── MyWatchLaterFragment.kt
│ │ │ │ │ │ ├── WatchHistoryFragment.kt
│ │ │ │ │ │ └── download/
│ │ │ │ │ │ ├── DownloadedFragment.kt
│ │ │ │ │ │ └── DownloadingFragment.kt
│ │ │ │ │ ├── search/
│ │ │ │ │ │ ├── HCheckBoxFragment.kt
│ │ │ │ │ │ ├── HMultiChoicesDialog.kt
│ │ │ │ │ │ ├── HTimePickerDialog.kt
│ │ │ │ │ │ └── SearchOptionsPopupFragment.kt
│ │ │ │ │ ├── settings/
│ │ │ │ │ │ ├── DownloadSettingsFragment.kt
│ │ │ │ │ │ ├── HKeyframeSettingsFragment.kt
│ │ │ │ │ │ ├── HKeyframesFragment.kt
│ │ │ │ │ │ ├── HomeSettingsFragment.kt
│ │ │ │ │ │ ├── NetworkSettingsFragment.kt
│ │ │ │ │ │ ├── PlayerSettingsFragment.kt
│ │ │ │ │ │ └── SharedHKeyframesFragment.kt
│ │ │ │ │ └── video/
│ │ │ │ │ ├── ChildCommentPopupFragment.kt
│ │ │ │ │ ├── CommentFragment.kt
│ │ │ │ │ └── VideoIntroductionFragment.kt
│ │ │ │ ├── popup/
│ │ │ │ │ ├── CoilImageLoader.kt
│ │ │ │ │ ├── HTimePickerPopup.kt
│ │ │ │ │ └── ReplyPopup.kt
│ │ │ │ ├── view/
│ │ │ │ │ ├── BlurTransformation.kt
│ │ │ │ │ ├── CenterLinearLayoutManager.kt
│ │ │ │ │ ├── CollapsibleTags.kt
│ │ │ │ │ ├── HOptionChip.kt
│ │ │ │ │ ├── HanimeSearchBar.kt
│ │ │ │ │ ├── HorizontalNestedScrollView.kt
│ │ │ │ │ ├── LinearSmoothToStartScroller.kt
│ │ │ │ │ ├── PlaylistHeader.kt
│ │ │ │ │ ├── funcbar/
│ │ │ │ │ │ ├── Hanidapter.kt
│ │ │ │ │ │ ├── Hanidock.kt
│ │ │ │ │ │ ├── Hanidokitem.kt
│ │ │ │ │ │ └── Hanidontroller.kt
│ │ │ │ │ ├── pref/
│ │ │ │ │ │ ├── HPrivacyPreference.kt
│ │ │ │ │ │ └── MaterialDialogPreference.kt
│ │ │ │ │ └── video/
│ │ │ │ │ ├── HJzvdStd.kt
│ │ │ │ │ ├── HMediaKernel.kt
│ │ │ │ │ ├── HanimeDataSource.kt
│ │ │ │ │ └── IMedia.kt
│ │ │ │ └── viewmodel/
│ │ │ │ ├── AppViewModel.kt
│ │ │ │ ├── CommentViewModel.kt
│ │ │ │ ├── DownloadViewModel.kt
│ │ │ │ ├── IHCsrfToken.kt
│ │ │ │ ├── MainViewModel.kt
│ │ │ │ ├── MyListViewModel.kt
│ │ │ │ ├── PreviewCommentPrefetcher.kt
│ │ │ │ ├── PreviewViewModel.kt
│ │ │ │ ├── SearchViewModel.kt
│ │ │ │ ├── SettingsViewModel.kt
│ │ │ │ ├── VideoViewModel.kt
│ │ │ │ └── mylist/
│ │ │ │ ├── FavSubViewModel.kt
│ │ │ │ ├── PlaylistSubViewModel.kt
│ │ │ │ ├── SubscriptionSubViewModel.kt
│ │ │ │ └── WatchLaterSubViewModel.kt
│ │ │ ├── util/
│ │ │ │ ├── Adapters.kt
│ │ │ │ ├── AlertDialogs.kt
│ │ │ │ ├── Animations.kt
│ │ │ │ ├── AnimeShaders.kt
│ │ │ │ ├── Colors.kt
│ │ │ │ ├── Cookies.kt
│ │ │ │ ├── Extend.kt
│ │ │ │ ├── Files.kt
│ │ │ │ ├── Firebases.kt
│ │ │ │ ├── GridSpacingDecoration.kt
│ │ │ │ ├── HImageMeower.kt
│ │ │ │ ├── MediaUtils.kt
│ │ │ │ ├── Networks.kt
│ │ │ │ ├── Parcels.kt
│ │ │ │ ├── Permissions.kt
│ │ │ │ ├── Platform.kt
│ │ │ │ ├── Preferences.kt
│ │ │ │ ├── TextViews.kt
│ │ │ │ ├── Versions.kt
│ │ │ │ └── Views.kt
│ │ │ └── worker/
│ │ │ ├── HUpdateWorker.kt
│ │ │ ├── HanimeDownloadManager.kt
│ │ │ ├── HanimeDownloadManagerV2.kt
│ │ │ ├── HanimeDownloadWorker.kt
│ │ │ └── WorkerMixin.kt
│ │ └── res/
│ │ ├── anim/
│ │ │ ├── fade_in.xml
│ │ │ ├── fade_out.xml
│ │ │ ├── slide_in_from_bottom.xml
│ │ │ └── slide_out_to_bottom.xml
│ │ ├── drawable/
│ │ │ ├── baseline_add_24.xml
│ │ │ ├── baseline_add_link_24.xml
│ │ │ ├── baseline_advanced_search_24.xml
│ │ │ ├── baseline_arrow_forward_ios_24.xml
│ │ │ ├── baseline_bug_report_24.xml
│ │ │ ├── baseline_data_usage_24.xml
│ │ │ ├── baseline_dns_24.xml
│ │ │ ├── baseline_edit_24.xml
│ │ │ ├── baseline_error_outline_24.xml
│ │ │ ├── baseline_format_list_bulleted_24.xml
│ │ │ ├── baseline_forum_24.xml
│ │ │ ├── baseline_h_24.xml
│ │ │ ├── baseline_keyboard_arrow_down_24.xml
│ │ │ ├── baseline_keyboard_arrow_up_24.xml
│ │ │ ├── baseline_link_24.xml
│ │ │ ├── baseline_more_horiz_24.xml
│ │ │ ├── baseline_refresh_24.xml
│ │ │ ├── baseline_remove_circle_24.xml
│ │ │ ├── baseline_simp_to_trad_24.xml
│ │ │ ├── baseline_sort_24.xml
│ │ │ ├── gradient_black80_transparent_270.xml
│ │ │ ├── gradient_black_transparent_90.xml
│ │ │ ├── ic_baseline_access_time_24.xml
│ │ │ ├── ic_baseline_arrow_back_24.xml
│ │ │ ├── ic_baseline_arrow_forward_24.xml
│ │ │ ├── ic_baseline_cancel_24.xml
│ │ │ ├── ic_baseline_check_circle_24.xml
│ │ │ ├── ic_baseline_checklist_24.xml
│ │ │ ├── ic_baseline_clear_all_24.xml
│ │ │ ├── ic_baseline_close_24.xml
│ │ │ ├── ic_baseline_comment_24.xml
│ │ │ ├── ic_baseline_delete_24.xml
│ │ │ ├── ic_baseline_download_24.xml
│ │ │ ├── ic_baseline_favorite_24.xml
│ │ │ ├── ic_baseline_favorite_border_24.xml
│ │ │ ├── ic_baseline_help_24.xml
│ │ │ ├── ic_baseline_history_24.xml
│ │ │ ├── ic_baseline_home_24.xml
│ │ │ ├── ic_baseline_info_24.xml
│ │ │ ├── ic_baseline_language_24.xml
│ │ │ ├── ic_baseline_list_24.xml
│ │ │ ├── ic_baseline_menu_24.xml
│ │ │ ├── ic_baseline_more_time_24.xml
│ │ │ ├── ic_baseline_newspaper_24.xml
│ │ │ ├── ic_baseline_pause_24.xml
│ │ │ ├── ic_baseline_pause_24_tintwhite.xml
│ │ │ ├── ic_baseline_play_arrow_24.xml
│ │ │ ├── ic_baseline_play_arrow_24_tintwhite.xml
│ │ │ ├── ic_baseline_play_circle_outline_24.xml
│ │ │ ├── ic_baseline_reply_24.xml
│ │ │ ├── ic_baseline_search_24.xml
│ │ │ ├── ic_baseline_send_24.xml
│ │ │ ├── ic_baseline_settings_24.xml
│ │ │ ├── ic_baseline_share_24.xml
│ │ │ ├── ic_baseline_tag_24.xml
│ │ │ ├── ic_baseline_thumb_down_alt_24.xml
│ │ │ ├── ic_baseline_thumb_down_off_alt_24.xml
│ │ │ ├── ic_baseline_thumb_up_alt_24.xml
│ │ │ ├── ic_baseline_thumb_up_off_alt_24.xml
│ │ │ ├── ic_baseline_update_24.xml
│ │ │ ├── ic_baseline_watch_later_24.xml
│ │ │ ├── ic_launcher_background.xml
│ │ │ ├── ic_outline_watch_later_24.xml
│ │ │ ├── line_divider.xml
│ │ │ ├── menu_24px.xml
│ │ │ ├── open_in_new_24px.xml
│ │ │ ├── outline_home_24.xml
│ │ │ ├── pause_circle_24px.xml
│ │ │ ├── pip_24px.xml
│ │ │ ├── play_circle_24px.xml
│ │ │ ├── scaled_added_time.xml
│ │ │ ├── screenshot_frame_2_24px.xml
│ │ │ ├── search_bar.xml
│ │ │ ├── shape_download_func_bar.xml
│ │ │ ├── shape_preview_button_left.xml
│ │ │ ├── shape_preview_button_right.xml
│ │ │ ├── shape_reply_show_bottom_dialog.xml
│ │ │ ├── shape_tag_selector.xml
│ │ │ ├── shape_title_mask.xml
│ │ │ ├── shape_title_mask_black.xml
│ │ │ └── translated_border.xml
│ │ ├── drawable-v24/
│ │ │ └── ic_launcher_foreground.xml
│ │ ├── layout/
│ │ │ ├── activity_download.xml
│ │ │ ├── activity_login.xml
│ │ │ ├── activity_main.xml
│ │ │ ├── activity_preview.xml
│ │ │ ├── activity_preview_comment.xml
│ │ │ ├── activity_search.xml
│ │ │ ├── activity_settings.xml
│ │ │ ├── activity_video.xml
│ │ │ ├── base_column_title.xml
│ │ │ ├── dialog_apply_deep_links.xml
│ │ │ ├── dialog_login.xml
│ │ │ ├── dialog_modify_h_keyframe.xml
│ │ │ ├── dialog_modify_h_keyframes.xml
│ │ │ ├── dialog_playlist_modify_edit_text.xml
│ │ │ ├── dialog_proxy.xml
│ │ │ ├── fragment_comment.xml
│ │ │ ├── fragment_h_keyframes.xml
│ │ │ ├── fragment_home_page.xml
│ │ │ ├── fragment_list_only.xml
│ │ │ ├── fragment_page_list.xml
│ │ │ ├── fragment_playlist.xml
│ │ │ ├── fragment_tab_view_pager_only.xml
│ │ │ ├── fragment_tag_selector.xml
│ │ │ ├── fragment_video_introduction.xml
│ │ │ ├── item_h_keyframe.xml
│ │ │ ├── item_h_keyframes.xml
│ │ │ ├── item_h_subscription.xml
│ │ │ ├── item_hanidock.xml
│ │ │ ├── item_hanime_downloaded.xml
│ │ │ ├── item_hanime_downloading.xml
│ │ │ ├── item_hanime_preview_news.xml
│ │ │ ├── item_hanime_preview_news_pic.xml
│ │ │ ├── item_hanime_preview_news_v2.xml
│ │ │ ├── item_hanime_updated.xml
│ │ │ ├── item_hanime_updating.xml
│ │ │ ├── item_hanime_video.xml
│ │ │ ├── item_hanime_video_simplified.xml
│ │ │ ├── item_playlist.xml
│ │ │ ├── item_preview_tour_simplified.xml
│ │ │ ├── item_rv_wrapper.xml
│ │ │ ├── item_search_history.xml
│ │ │ ├── item_shared_h_keyframes.xml
│ │ │ ├── item_tag_chip.xml
│ │ │ ├── item_tag_chip_group.xml
│ │ │ ├── item_video_column_title.xml
│ │ │ ├── item_video_comment.xml
│ │ │ ├── item_video_introduction.xml
│ │ │ ├── item_video_tag_chip.xml
│ │ │ ├── item_watch_history.xml
│ │ │ ├── jz_layout_speed.xml
│ │ │ ├── layout_collapsible_tag.xml
│ │ │ ├── layout_empty_view.xml
│ │ │ ├── layout_hanidock.xml
│ │ │ ├── layout_hanime_search_bar.xml
│ │ │ ├── layout_header_h_keyframes.xml
│ │ │ ├── layout_jzvd_with_speed.xml
│ │ │ ├── layout_playlist_header.xml
│ │ │ ├── layout_playlist_header_v2.xml
│ │ │ ├── layout_rv_scrollbars.xml
│ │ │ ├── nav_header_ability.xml
│ │ │ ├── pop_up_ext_h_time_picker.xml
│ │ │ ├── pop_up_fragment_child_comment.xml
│ │ │ ├── pop_up_fragment_search_options.xml
│ │ │ ├── pop_up_hanime_search_tag.xml
│ │ │ ├── pop_up_hanime_time_picker.xml
│ │ │ └── pop_up_reply.xml
│ │ ├── layout-sw600dp/
│ │ │ ├── activity_main.xml
│ │ │ └── fragment_home_page.xml
│ │ ├── menu/
│ │ │ ├── menu_downloaded_toolbar.xml
│ │ │ ├── menu_downloading_toolbar.xml
│ │ │ ├── menu_h_keyframes_toolbar.xml
│ │ │ ├── menu_main_bnv.xml
│ │ │ ├── menu_main_nv.xml
│ │ │ ├── menu_main_rail_nv.xml
│ │ │ ├── menu_main_toolbar.xml
│ │ │ ├── menu_my_list_toolbar.xml
│ │ │ ├── menu_playlist_toolbar.xml
│ │ │ ├── menu_preview_toolbar.xml
│ │ │ ├── menu_search_toolbar.xml
│ │ │ └── menu_watch_history_toolbar.xml
│ │ ├── mipmap-anydpi-v26/
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ ├── navigation/
│ │ │ ├── nav_main.xml
│ │ │ └── nav_settings.xml
│ │ ├── values/
│ │ │ ├── arrays.xml
│ │ │ ├── colors.xml
│ │ │ ├── dimens.xml
│ │ │ ├── ic_launcher_background.xml
│ │ │ ├── ids.xml
│ │ │ ├── strings.xml
│ │ │ └── themes.xml
│ │ ├── values-en/
│ │ │ └── strings.xml
│ │ ├── values-night/
│ │ │ └── themes.xml
│ │ ├── values-zh-rCN/
│ │ │ └── strings.xml
│ │ └── xml/
│ │ ├── backup_rules.xml
│ │ ├── data_extraction_rules.xml
│ │ ├── file_paths.xml
│ │ ├── locales_config.xml
│ │ ├── settings_download.xml
│ │ ├── settings_h_keyframe.xml
│ │ ├── settings_home.xml
│ │ ├── settings_network.xml
│ │ └── settings_player.xml
│ └── test/
│ └── java/
│ └── com/
│ └── yenaly/
│ └── han1meviewer/
│ └── ExampleUnitTest.kt
├── build.gradle.kts
├── buildSrc/
│ ├── build.gradle.kts
│ └── src/
│ └── main/
│ └── java/
│ └── Config.kt
├── gradle/
│ ├── libs.versions.toml
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── settings.gradle.kts
└── yenaly_libs/
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src/
├── androidTest/
│ └── java/
│ └── com/
│ └── yenaly/
│ └── yenaly_libs/
│ └── ExampleInstrumentedTest.kt
├── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ └── com/
│ │ └── yenaly/
│ │ └── yenaly_libs/
│ │ ├── ActivityManager.kt
│ │ ├── SingletonHolder.kt
│ │ ├── base/
│ │ │ ├── IViewBinding.kt
│ │ │ ├── YenalyActivity.kt
│ │ │ ├── YenalyApplication.kt
│ │ │ ├── YenalyBottomSheetDialogFragment.kt
│ │ │ ├── YenalyCrashHandler.kt
│ │ │ ├── YenalyFragment.kt
│ │ │ ├── YenalyInitializer.kt
│ │ │ ├── YenalyViewModel.kt
│ │ │ ├── dialog/
│ │ │ │ └── YenalyCrashDialogActivity.kt
│ │ │ ├── frame/
│ │ │ │ ├── FrameActivity.kt
│ │ │ │ └── FrameFragment.kt
│ │ │ ├── preference/
│ │ │ │ ├── LongClickablePreference.kt
│ │ │ │ ├── LongClickableSwitchPreference.kt
│ │ │ │ └── MaterialSwitchPreference.kt
│ │ │ ├── settings/
│ │ │ │ ├── YenalySettingsActivity.kt
│ │ │ │ └── YenalySettingsFragment.kt
│ │ │ └── view/
│ │ │ ├── NestedScrollableHost.kt
│ │ │ └── RecyclerViewAtViewPager2.kt
│ │ └── utils/
│ │ ├── ActivityResultUtil.kt
│ │ ├── AppUtil.kt
│ │ ├── ArrayUtil.kt
│ │ ├── Base64Util.kt
│ │ ├── ClipboardUtil.kt
│ │ ├── ContextUtil.kt
│ │ ├── DeviceUtil.kt
│ │ ├── FileUtil.kt
│ │ ├── ImageUtil.kt
│ │ ├── LanguageHelper.kt
│ │ ├── LogUtil.kt
│ │ ├── OrientationManager.kt
│ │ ├── ResourceUtil.kt
│ │ ├── ShareUtil.kt
│ │ ├── SharedPreferencesUtil.kt
│ │ ├── SingleFlowLaunch.kt
│ │ ├── SnackBarUtil.kt
│ │ ├── SystemStatusUtil.kt
│ │ ├── TextUtil.kt
│ │ ├── ToastUtil.kt
│ │ ├── UnicodeUtil.kt
│ │ ├── UriUtil.kt
│ │ ├── _AesUtil.kt
│ │ ├── _GsonUtil.kt
│ │ ├── _IntentUtil.kt
│ │ ├── _LazyUtil.kt
│ │ ├── span/
│ │ │ ├── SpannedTextGenerator.kt
│ │ │ ├── YenalyImageSpan.kt
│ │ │ └── YenalyQuoteSpan.kt
│ │ └── view/
│ │ ├── AppBarLayoutStateChangeListener.kt
│ │ ├── BottomNavViewMediator.kt
│ │ ├── BottomNavViewUtil.kt
│ │ ├── BottomNavigationViewMediator.kt
│ │ ├── ClickUtil.kt
│ │ ├── EditTextUtil.kt
│ │ ├── SimpleBottomNavViewMediator.kt
│ │ ├── SimpleFragmentStateAdapter.kt
│ │ ├── TabLayoutUtil.kt
│ │ ├── ViewPagerUtil.kt
│ │ ├── ViewUtil.kt
│ │ └── YenalyHideBottomViewOnScrollBehavior.kt
│ └── res/
│ ├── anim/
│ │ ├── yenaly_bottom_to_top_in.xml
│ │ ├── yenaly_bottom_to_top_out.xml
│ │ ├── yenaly_top_to_bottom_in.xml
│ │ └── yenaly_top_to_bottom_out.xml
│ ├── layout/
│ │ ├── yenaly_activity_crash_dialog.xml
│ │ ├── yenaly_activity_settings.xml
│ │ ├── yenaly_dialog_loading.xml
│ │ └── yenaly_preference_switch_widget.xml
│ ├── values/
│ │ ├── ids.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── xml/
│ └── http_network_config.xml
└── test/
└── java/
└── com/
└── yenaly/
└── yenaly_libs/
└── UtilUnitTest.kt
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: 🐞 問題回報
description: 回報在 Han1meViewer 中出現的問題
labels: [bug]
body:
- type: textarea
id: actual-behavior
attributes:
label: 實際行為
description: 請簡短解釋實際發生的事
placeholder: |
Example:
"我打開 Han1meViewer 發生了..."
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: 預期行為
description: 請簡短解釋你應該發生的事
placeholder: |
Example:
"我應該要..."
validations:
required: true
- type: input
id: version
attributes:
label: Han1meViewer version
description: 你的**Han1meViewer**版本
placeholder: |
Example: "v0.14.0"
validations:
required: true
- type: input
id: android-version
attributes:
label: Android version
description: 你的**Android**版本
placeholder: |
Example: "Android 13"
validations:
required: true
- type: input
id: device
attributes:
label: Device
description: 你的設備型號
placeholder: |
Example: "Google Pixel 5"
validations:
required: true
- type: textarea
id: other-details
attributes:
label: 其他
placeholder: |
其他詳細的說明
================================================
FILE: .github/ISSUE_TEMPLATE/custom.md
================================================
---
name: 自定義問題
about: 描述此問題的目的
title: ''
labels: ''
assignees: ''
---
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: ⭐ 功能請求
description: 建議一個功能來改善 Han1meViewer
labels: [ good idea | 好主意 ]
body:
- type: textarea
id: feature-description
attributes:
label: 描述您建議的功能
description: 如何改進 Han1meViewer?
placeholder: |
Example:
"我想要bla bla bla..."
validations:
required: true
- type: textarea
id: other-details
attributes:
label: 其他你想講的
description: 比如哪些軟體有您所說的類似功能,我方便偷過來
placeholder: |
其他補充資訊
================================================
FILE: .github/PULL_REQUEST_TEMPLATE/bug_fix.md
================================================
---
name: "Bug 修復"
about: "用於提交 Bug 修復的拉取請求"
title: "[BUGFIX] <簡短描述>"
labels: "bug"
assignees: ""
---
### 描述
<!-- 請簡短描述你修復的 Bug -->
### 修復方法
<!-- 請描述你是如何修復這個 Bug 的 -->
================================================
FILE: .github/PULL_REQUEST_TEMPLATE/feature_addition.md
================================================
---
name: "新功能添加"
about: "用於提交新功能的拉取請求"
title: "[FEATURE] <簡短描述>"
labels: "good idea | 好主意"
assignees: ""
---
### 功能描述
<!-- 請簡短描述你添加的新功能 -->
================================================
FILE: .github/PULL_REQUEST_TEMPLATE/submit_h_keyframe.md
================================================
---
name: "提交關鍵H幀"
about: "分享你的關鍵H幀"
title: "[HKeyframe] <簡短描述>"
labels: "𝐇Keyframe"
assignees: ""
---
### 關鍵H幀描述
<!-- 請簡短描述你添加的新關鍵H幀 -->
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: gradle
directory: "/" # Location of package manifests
schedule:
interval: weekly
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on:
push:
branches: [ "master" ]
paths-ignore:
- "**.md"
workflow_dispatch:
permissions:
contents: write
actions: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: gradle
- name: Load Google Services File
env:
DATA: ${{ secrets.HA1_GOOGLE_SERVICES_JSON_BASE64 }}
run: echo $DATA | base64 -di > app/google-services.json
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build and sign APK with Gradle
run: ./gradlew assembleRelease
env:
HA1_KEYSTORE_PASSWORD: ${{ secrets.HA1_KEYSTORE_PASSWORD }}
HA1_GITHUB_TOKEN: ${{ secrets.HA1_GITHUB_TOKEN }}
HA1_VERSION_SOURCE: 'ci'
- name: Upload Artifacts(arm32)
uses: actions/upload-artifact@v4
with:
path: app/build/outputs/apk/release/Han1meViewer-v*_armeabi-v7a.apk
name: Han1meViewer-ci-${{ github.sha }}-armeabi-v7a
- name: Upload Artifacts(arm64)
uses: actions/upload-artifact@v4
with:
path: app/build/outputs/apk/release/Han1meViewer-v*_arm64-v8a.apk
name: Han1meViewer-ci-${{ github.sha }}-arm64-v8a
- name: Upload Artifacts(universal)
uses: actions/upload-artifact@v4
with:
path: app/build/outputs/apk/release/Han1meViewer-v*_universal.apk
name: Han1meViewer-ci-${{ github.sha }}-universal
================================================
FILE: .github/workflows/ci_release.yml
================================================
name: CI
on:
push:
tags:
- "v*.*.*"
permissions:
contents: write
actions: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: gradle
- name: Load Google Services File
env:
DATA: ${{ secrets.HA1_GOOGLE_SERVICES_JSON_BASE64 }}
run: echo $DATA | base64 -di > app/google-services.json
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build and sign APK with Gradle
run: |
./gradlew assembleRelease
echo "VERSION_CODE=$(find app/build/outputs/apk/release -name '*arm64-v8a.apk' | head -n 1 | grep -oP '(?<=release\+)\d+(?=_arm64-v8a)')" >> $GITHUB_ENV
env:
HA1_KEYSTORE_PASSWORD: ${{ secrets.HA1_KEYSTORE_PASSWORD }}
HA1_GITHUB_TOKEN: ${{ secrets.HA1_GITHUB_TOKEN }}
HA1_VERSION_SOURCE: 'release'
- name: Create release
uses: softprops/action-gh-release@v2.0.4
with:
name: Han1meViewer ${{ github.ref_name }}+${{ env.VERSION_CODE }}
files: app/build/outputs/apk/release/Han1meViewer-v*.apk
changelog:
name: Generate Changelog
runs-on: windows-latest
needs: build
steps:
- name: Checkout
uses: actions/checkout@v4.1.1
with:
fetch-depth: 0
fetch-tags: true
- name: Generate Changelog
id: generate_changelog
uses: Night-stars-1/changelog-generator-action@main
- name: Update Changelog
uses: softprops/action-gh-release@v2.0.4
with:
body: ${{ steps.generate_changelog.outputs.changelog }}
make_latest: true
================================================
FILE: .github/workflows/pr_check.yml
================================================
name: Pull Request Check
on:
pull_request:
branches: [ "master" ]
paths-ignore:
- "**.md"
jobs:
check:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: gradle
- name: Load Google Services File
env:
DATA: ${{ secrets.HA1_GOOGLE_SERVICES_JSON_BASE64 }}
run: echo $DATA | base64 -di > app/google-services.json
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build
run: ./gradlew build
================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties
================================================
FILE: .idea/.gitignore
================================================
# Default ignored files
/shelf/
/workspace.xml
================================================
FILE: .idea/.name
================================================
Han1meViewer
================================================
FILE: .idea/AndroidProjectSystem.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidProjectSystem">
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
</component>
</project>
================================================
FILE: .idea/appInsightsSettings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AppInsightsSettings">
<option name="selectedTabId" value="Firebase Crashlytics" />
<option name="tabSettings">
<map>
<entry key="Firebase Crashlytics">
<value>
<InsightsFilterSettings>
<option name="connection">
<ConnectionSetting>
<option name="appId" value="com.yenaly.han1meviewer.debug" />
<option name="mobileSdkAppId" value="1:713839264129:android:f7ff12857c3c14f3e4e880" />
<option name="projectId" value="han1meviewer" />
<option name="projectNumber" value="713839264129" />
</ConnectionSetting>
</option>
<option name="signal" value="SIGNAL_UNSPECIFIED" />
<option name="timeIntervalDays" value="THIRTY_DAYS" />
<option name="visibilityType" value="ALL" />
</InsightsFilterSettings>
</value>
</entry>
</map>
</option>
</component>
</project>
================================================
FILE: .idea/codeStyles/Project.xml
================================================
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<JetCodeStyleSettings>
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<codeStyleSettings language="XML">
<option name="FORCE_REARRANGE_MODE" value="1" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>ANDROID_ATTRIBUTE_ORDER</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
<codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</codeStyleSettings>
</code_scheme>
</component>
================================================
FILE: .idea/codeStyles/codeStyleConfig.xml
================================================
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>
================================================
FILE: .idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" />
</component>
</project>
================================================
FILE: .idea/dbnavigator.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DBNavigator.Project.DataEditorManager">
<record-view-column-sorting-type value="BY_INDEX" />
<value-preview-text-wrapping value="false" />
<value-preview-pinned value="false" />
</component>
<component name="DBNavigator.Project.DataExportManager">
<export-instructions>
<create-header value="true" />
<friendly-headers value="false" />
<quote-values-containing-separator value="true" />
<quote-all-values value="false" />
<value-separator value="" />
<file-name value="" />
<file-location value="" />
<scope value="GLOBAL" />
<destination value="FILE" />
<format value="EXCEL" />
<charset value="GBK" />
</export-instructions>
</component>
<component name="DBNavigator.Project.DatabaseBrowserManager">
<autoscroll-to-editor value="false" />
<autoscroll-from-editor value="true" />
<show-object-properties value="true" />
<loaded-nodes />
</component>
<component name="DBNavigator.Project.DatabaseEditorStateManager">
<last-used-providers />
</component>
<component name="DBNavigator.Project.DatabaseFileManager">
<open-files />
</component>
<component name="DBNavigator.Project.EditorStateManager">
<last-used-providers />
</component>
<component name="DBNavigator.Project.ExecutionManager">
<retain-sticky-names value="false" />
</component>
<component name="DBNavigator.Project.MethodExecutionManager">
<method-browser />
<execution-history>
<group-entries value="true" />
<execution-inputs />
</execution-history>
<argument-values-cache />
</component>
<component name="DBNavigator.Project.ObjectDependencyManager">
<last-used-dependency-type value="INCOMING" />
</component>
<component name="DBNavigator.Project.ObjectQuickFilterManager">
<last-used-operator value="EQUAL" />
<filters />
</component>
<component name="DBNavigator.Project.ParserDiagnosticsManager">
<diagnostics-history />
</component>
<component name="DBNavigator.Project.ScriptExecutionManager" clear-outputs="true">
<recently-used-interfaces />
</component>
<component name="DBNavigator.Project.Settings">
<connections />
<browser-settings>
<general>
<display-mode value="TABBED" />
<navigation-history-size value="100" />
<show-object-details value="false" />
</general>
<filters>
<object-type-filter>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="true" />
<object-type name="ROLE" enabled="true" />
<object-type name="PRIVILEGE" enabled="true" />
<object-type name="CHARSET" enabled="true" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED_VIEW" enabled="true" />
<object-type name="NESTED_TABLE" enabled="true" />
<object-type name="COLUMN" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET_TRIGGER" enabled="true" />
<object-type name="DATABASE_TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="true" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="TYPE_ATTRIBUTE" enabled="true" />
<object-type name="ARGUMENT" enabled="true" />
<object-type name="DIMENSION" enabled="true" />
<object-type name="CLUSTER" enabled="true" />
<object-type name="DBLINK" enabled="true" />
</object-type-filter>
</filters>
<sorting>
<object-type name="COLUMN" sorting-type="NAME" />
<object-type name="FUNCTION" sorting-type="NAME" />
<object-type name="PROCEDURE" sorting-type="NAME" />
<object-type name="ARGUMENT" sorting-type="POSITION" />
<object-type name="TYPE ATTRIBUTE" sorting-type="POSITION" />
</sorting>
<default-editors>
<object-type name="VIEW" editor-type="SELECTION" />
<object-type name="PACKAGE" editor-type="SELECTION" />
<object-type name="TYPE" editor-type="SELECTION" />
</default-editors>
</browser-settings>
<navigation-settings>
<lookup-filters>
<lookup-objects>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="false" />
<object-type name="ROLE" enabled="false" />
<object-type name="PRIVILEGE" enabled="false" />
<object-type name="CHARSET" enabled="false" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED VIEW" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET TRIGGER" enabled="true" />
<object-type name="DATABASE TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="false" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="DIMENSION" enabled="false" />
<object-type name="CLUSTER" enabled="false" />
<object-type name="DBLINK" enabled="true" />
</lookup-objects>
<force-database-load value="false" />
<prompt-connection-selection value="true" />
<prompt-schema-selection value="true" />
</lookup-filters>
</navigation-settings>
<dataset-grid-settings>
<general>
<enable-zooming value="true" />
<enable-column-tooltip value="true" />
</general>
<sorting>
<nulls-first value="true" />
<max-sorting-columns value="4" />
</sorting>
<audit-columns>
<column-names value="" />
<visible value="true" />
<editable value="false" />
</audit-columns>
</dataset-grid-settings>
<dataset-editor-settings>
<text-editor-popup>
<active value="false" />
<active-if-empty value="false" />
<data-length-threshold value="100" />
<popup-delay value="1000" />
</text-editor-popup>
<values-actions-popup>
<show-popup-button value="true" />
<element-count-threshold value="1000" />
<data-length-threshold value="250" />
</values-actions-popup>
<general>
<fetch-block-size value="100" />
<fetch-timeout value="30" />
<trim-whitespaces value="true" />
<convert-empty-strings-to-null value="true" />
<select-content-on-cell-edit value="true" />
<large-value-preview-active value="true" />
</general>
<filters>
<prompt-filter-dialog value="true" />
<default-filter-type value="BASIC" />
</filters>
<qualified-text-editor text-length-threshold="300">
<content-types>
<content-type name="Text" enabled="true" />
<content-type name="Properties" enabled="true" />
<content-type name="XML" enabled="true" />
<content-type name="DTD" enabled="true" />
<content-type name="HTML" enabled="true" />
<content-type name="XHTML" enabled="true" />
<content-type name="Java" enabled="true" />
<content-type name="SQL" enabled="true" />
<content-type name="PL/SQL" enabled="true" />
<content-type name="JSON" enabled="true" />
<content-type name="JSON5" enabled="true" />
<content-type name="Groovy" enabled="true" />
<content-type name="AIDL" enabled="true" />
<content-type name="YAML" enabled="true" />
<content-type name="Manifest" enabled="true" />
</content-types>
</qualified-text-editor>
<record-navigation>
<navigation-target value="VIEWER" />
</record-navigation>
</dataset-editor-settings>
<code-editor-settings>
<general>
<show-object-navigation-gutter value="false" />
<show-spec-declaration-navigation-gutter value="true" />
<enable-spellchecking value="true" />
<enable-reference-spellchecking value="false" />
</general>
<confirmations>
<save-changes value="false" />
<revert-changes value="true" />
</confirmations>
</code-editor-settings>
<code-completion-settings>
<filters>
<basic-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="false" />
<filter-element type="OBJECT" id="view" selected="false" />
<filter-element type="OBJECT" id="materialized view" selected="false" />
<filter-element type="OBJECT" id="index" selected="false" />
<filter-element type="OBJECT" id="constraint" selected="false" />
<filter-element type="OBJECT" id="trigger" selected="false" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="false" />
<filter-element type="OBJECT" id="procedure" selected="false" />
<filter-element type="OBJECT" id="function" selected="false" />
<filter-element type="OBJECT" id="package" selected="false" />
<filter-element type="OBJECT" id="type" selected="false" />
<filter-element type="OBJECT" id="dimension" selected="false" />
<filter-element type="OBJECT" id="cluster" selected="false" />
<filter-element type="OBJECT" id="dblink" selected="false" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</basic-filter>
<extended-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</extended-filter>
</filters>
<sorting enabled="true">
<sorting-element type="RESERVED_WORD" id="keyword" />
<sorting-element type="RESERVED_WORD" id="datatype" />
<sorting-element type="OBJECT" id="column" />
<sorting-element type="OBJECT" id="table" />
<sorting-element type="OBJECT" id="view" />
<sorting-element type="OBJECT" id="materialized view" />
<sorting-element type="OBJECT" id="index" />
<sorting-element type="OBJECT" id="constraint" />
<sorting-element type="OBJECT" id="trigger" />
<sorting-element type="OBJECT" id="synonym" />
<sorting-element type="OBJECT" id="sequence" />
<sorting-element type="OBJECT" id="procedure" />
<sorting-element type="OBJECT" id="function" />
<sorting-element type="OBJECT" id="package" />
<sorting-element type="OBJECT" id="type" />
<sorting-element type="OBJECT" id="dimension" />
<sorting-element type="OBJECT" id="cluster" />
<sorting-element type="OBJECT" id="dblink" />
<sorting-element type="OBJECT" id="schema" />
<sorting-element type="OBJECT" id="role" />
<sorting-element type="OBJECT" id="user" />
<sorting-element type="RESERVED_WORD" id="function" />
<sorting-element type="RESERVED_WORD" id="parameter" />
</sorting>
<format>
<enforce-code-style-case value="true" />
</format>
</code-completion-settings>
<execution-engine-settings>
<statement-execution>
<fetch-block-size value="100" />
<execution-timeout value="20" />
<debug-execution-timeout value="600" />
<focus-result value="false" />
<prompt-execution value="false" />
</statement-execution>
<script-execution>
<command-line-interfaces />
<execution-timeout value="300" />
</script-execution>
<method-execution>
<execution-timeout value="30" />
<debug-execution-timeout value="600" />
<parameter-history-size value="10" />
</method-execution>
</execution-engine-settings>
<operation-settings>
<transactions>
<uncommitted-changes>
<on-project-close value="ASK" />
<on-disconnect value="ASK" />
<on-autocommit-toggle value="ASK" />
</uncommitted-changes>
<multiple-uncommitted-changes>
<on-commit value="ASK" />
<on-rollback value="ASK" />
</multiple-uncommitted-changes>
</transactions>
<session-browser>
<disconnect-session value="ASK" />
<kill-session value="ASK" />
<reload-on-filter-change value="false" />
</session-browser>
<compiler>
<compile-type value="KEEP" />
<compile-dependencies value="ASK" />
<always-show-controls value="false" />
</compiler>
<debugger>
<debugger-type value="ASK" />
<use-generic-runners value="true" />
</debugger>
</operation-settings>
<ddl-file-settings>
<extensions>
<mapping file-type-id="VIEW" extensions="vw" />
<mapping file-type-id="TRIGGER" extensions="trg" />
<mapping file-type-id="PROCEDURE" extensions="prc" />
<mapping file-type-id="FUNCTION" extensions="fnc" />
<mapping file-type-id="PACKAGE" extensions="pkg" />
<mapping file-type-id="PACKAGE_SPEC" extensions="pks" />
<mapping file-type-id="PACKAGE_BODY" extensions="pkb" />
<mapping file-type-id="TYPE" extensions="tpe" />
<mapping file-type-id="TYPE_SPEC" extensions="tps" />
<mapping file-type-id="TYPE_BODY" extensions="tpb" />
</extensions>
<general>
<lookup-ddl-files value="true" />
<create-ddl-files value="false" />
<synchronize-ddl-files value="true" />
<use-qualified-names value="false" />
<make-scripts-rerunnable value="true" />
</general>
</ddl-file-settings>
<general-settings>
<regional-settings>
<date-format value="MEDIUM" />
<number-format value="UNGROUPED" />
<locale value="SYSTEM_DEFAULT" />
<use-custom-formats value="false" />
</regional-settings>
<environment>
<environment-types>
<environment-type id="development" name="Development" description="Development environment" color="-2430209/-12296320" readonly-code="false" readonly-data="false" />
<environment-type id="integration" name="Integration" description="Integration environment" color="-2621494/-12163514" readonly-code="true" readonly-data="false" />
<environment-type id="production" name="Production" description="Productive environment" color="-11574/-10271420" readonly-code="true" readonly-data="true" />
<environment-type id="other" name="Other" description="" color="-1576/-10724543" readonly-code="false" readonly-data="false" />
</environment-types>
<visibility-settings>
<connection-tabs value="true" />
<dialog-headers value="true" />
<object-editor-tabs value="true" />
<script-editor-tabs value="false" />
<execution-result-tabs value="true" />
</visibility-settings>
</environment>
</general-settings>
</component>
<component name="DBNavigator.Project.StatementExecutionManager">
<execution-variables />
</component>
</project>
================================================
FILE: .idea/deploymentTargetDropDown.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<value>
<entry key="PreviewActivity">
<State />
</entry>
<entry key="app">
<State />
</entry>
</value>
</component>
</project>
================================================
FILE: .idea/deploymentTargetSelector.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2025-07-23T14:50:30.320520800Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="PhysicalDevice" identifier="serial=cd2b3532" />
</handle>
</Target>
</DropdownSelection>
<DialogSelection />
</SelectionState>
</selectionStates>
</component>
</project>
================================================
FILE: .idea/dictionaries/wrzg8.xml
================================================
<component name="ProjectDictionaryState">
<dictionary name="wrzg8" />
</component>
================================================
FILE: .idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<compositeConfiguration>
<compositeBuild compositeDefinitionSource="SCRIPT">
<builds>
<build path="$PROJECT_DIR$/buildSrc" name="buildSrc">
<projects>
<project path="$PROJECT_DIR$/buildSrc" />
</projects>
</build>
</builds>
</compositeBuild>
</compositeConfiguration>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="jbr-21" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
<option value="$PROJECT_DIR$/buildSrc" />
<option value="$PROJECT_DIR$/yenaly_libs" />
</set>
</option>
<option name="resolveExternalAnnotations" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>
================================================
FILE: .idea/inspectionProfiles/Project_Default.xml
================================================
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="NullableBooleanElvis" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="ReplaceCollectionCountWithSize" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
</profile>
</component>
================================================
FILE: .idea/kotlinc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Kotlin2JvmCompilerArguments">
<option name="jvmTarget" value="1.8" />
</component>
<component name="KotlinJpsPluginSettings">
<option name="version" value="2.0.20" />
</component>
</project>
================================================
FILE: .idea/ktlint-plugin.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KtLint plugin">
<ktlintMode>DISABLED</ktlintMode>
<formatOnSave>false</formatOnSave>
</component>
</project>
================================================
FILE: .idea/migrations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>
================================================
FILE: .idea/misc.xml
================================================
<project version="4">
<component name="DesignSurface">
<option name="filePathToZoomLevelMap">
<map>
<entry key="..\:/Users/wrzg8/.gradle/caches/transforms-3/5289e4e06c8c1345f256b44f2a8bf24b/transformed/jetified-about-2.5.1/res/layout/about_page_main_activity.xml" value="0.268" />
<entry key="..\:/Users/wrzg8/.gradle/caches/transforms-3/7db9194aba099019cadb4a1513f39d10/transformed/jetified-XPopup-2.8.3/res/layout/_xpopup_bottom_popup_view.xml" value="0.22573749465583584" />
<entry key="..\:/Users/wrzg8/.gradle/caches/transforms-3/87e9ff2b1f11a88e5e2d5c256d23de02/transformed/jetified-MaterialSearchBar-0.8.5/res/drawable-mdpi-v4/ic_menu_animated.xml" value="0.2455" />
<entry key="..\:/Users/wrzg8/.gradle/caches/transforms-3/87e9ff2b1f11a88e5e2d5c256d23de02/transformed/jetified-MaterialSearchBar-0.8.5/res/layout/item_last_request.xml" value="0.36" />
<entry key="..\:/Users/wrzg8/.gradle/caches/transforms-3/87e9ff2b1f11a88e5e2d5c256d23de02/transformed/jetified-MaterialSearchBar-0.8.5/res/layout/searchbar.xml" value="0.3" />
<entry key="..\:/Users/wrzg8/.gradle/caches/transforms-3/bc7aadf64a90ff594b2f090b0cdd700e/transformed/jetified-jiaozivideoplayer-7.7.0/res/drawable/jz_bottom_progress.xml" value="0.139" />
<entry key="..\:/Users/wrzg8/.gradle/caches/transforms-3/bc7aadf64a90ff594b2f090b0cdd700e/transformed/jetified-jiaozivideoplayer-7.7.0/res/drawable/jz_click_back_tiny_selector.xml" value="0.107" />
<entry key="..\:/Users/wrzg8/.gradle/caches/transforms-3/bc7aadf64a90ff594b2f090b0cdd700e/transformed/jetified-jiaozivideoplayer-7.7.0/res/layout/jz_dialog_brightness.xml" value="0.275" />
<entry key="..\:/Users/wrzg8/.gradle/caches/transforms-3/bc7aadf64a90ff594b2f090b0cdd700e/transformed/jetified-jiaozivideoplayer-7.7.0/res/layout/jz_dialog_progress.xml" value="0.275" />
<entry key="..\:/Users/wrzg8/.gradle/caches/transforms-3/bc7aadf64a90ff594b2f090b0cdd700e/transformed/jetified-jiaozivideoplayer-7.7.0/res/layout/jz_dialog_volume.xml" value="0.275" />
<entry key="..\:/Users/wrzg8/.gradle/caches/transforms-3/bc7aadf64a90ff594b2f090b0cdd700e/transformed/jetified-jiaozivideoplayer-7.7.0/res/layout/jz_layout_clarity.xml" value="0.275" />
<entry key="..\:/Users/wrzg8/.gradle/caches/transforms-3/bc7aadf64a90ff594b2f090b0cdd700e/transformed/jetified-jiaozivideoplayer-7.7.0/res/layout/jz_layout_clarity_item.xml" value="0.275" />
<entry key="..\:/Users/wrzg8/.gradle/caches/transforms-3/bc7aadf64a90ff594b2f090b0cdd700e/transformed/jetified-jiaozivideoplayer-7.7.0/res/layout/jz_layout_std.xml" value="0.3" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_baseline_clear_all_24.xml" value="0.139" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_baseline_comment_24.xml" value="0.2455" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_baseline_delete_24.xml" value="0.137" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_baseline_download_24.xml" value="0.2455" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_baseline_favorite_24.xml" value="0.139" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_baseline_favorite_border_24.xml" value="0.139" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_baseline_help_24.xml" value="0.137" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_baseline_info_24.xml" value="0.137" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_baseline_language_24.xml" value="0.137" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_baseline_menu_24.xml" value="0.137" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_baseline_more_time_24.xml" value="0.137" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_baseline_reply_24.xml" value="0.137" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_baseline_share_24.xml" value="0.139" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_baseline_tag_24.xml" value="0.137" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_baseline_update_24.xml" value="0.137" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_baseline_watch_later_24.xml" value="0.139" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/drawable/ic_outline_watch_later_24.xml" value="0.2455" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/activity_login.xml" value="0.132" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/activity_main.xml" value="0.10389055151774262" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/activity_preview.xml" value="0.20172257479601088" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/activity_preview_comment.xml" value="0.22488242838820008" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/activity_search.xml" value="0.268" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/activity_settings.xml" value="0.22573749465583584" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/activity_video.xml" value="0.10560068405301411" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/fragment_comment.xml" value="0.268" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/fragment_comment_reply.xml" value="0.10389055151774262" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/fragment_home_page.xml" value="0.10389055151774262" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/fragment_list_only.xml" value="0.1564102564102564" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/fragment_page_list.xml" value="0.22488242838820008" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/fragment_tab_view_pager_only.xml" value="0.1" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/fragment_tag_selector.xml" value="0.2606837606837607" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/fragment_video_introduction.xml" value="0.36" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/fragment_watch_history.xml" value="0.3" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/item_hanime_download.xml" value="0.36" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/item_hanime_downloaded.xml" value="0.3" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/item_hanime_preview_news.xml" value="0.3" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/item_hanime_preview_news_pic.xml" value="0.10389055151774262" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/item_hanime_video.xml" value="0.10389055151774262" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/item_hanime_video_simplified.xml" value="0.10389055151774262" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/item_tag_chip.xml" value="0.10389055151774262" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/item_tag_chip_group.xml" value="0.22573749465583584" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/item_tag_selector.xml" value="0.1" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/item_video_comment.xml" value="0.44000000000000006" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/item_video_tag_chip.xml" value="0.10389055151774262" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/item_watch_history.xml" value="0.44000000000000006" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/layout_custom_search_bar.xml" value="0.44000000000000006" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/layout_empty_view.xml" value="0.132" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/layout_search_bar.xml" value="0.44000000000000006" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/nav_header_ability.xml" value="0.22573749465583584" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/pop_up_comment.xml" value="0.4" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/pop_up_hanime_search_tag.xml" value="0.10389055151774262" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/layout/widget_search_bar.xml" value="0.4378947368421053" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/menu/menu_main_bnv.xml" value="0.22573749465583584" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/menu/menu_main_nv.xml" value="0.4" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/menu/menu_main_toolbar.xml" value="0.22573749465583584" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/menu/menu_my_list_toolbar.xml" value="0.268" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/menu/menu_preview_toolbar.xml" value="0.22573749465583584" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/menu/menu_search_toolbar.xml" value="0.10389055151774262" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/menu/menu_watch_history_toolbar.xml" value="0.4" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/app/src/main/res/xml/settings_home.xml" value="0.2" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Han1meViewer/yenaly_libs/src/main/res/layout/yenaly_activity_settings.xml" value="0.22573749465583584" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/drawable/gradient_black_transparent.xml" value="0.137" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/drawable/ic_baseline_access_time_24.xml" value="0.137" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml" value="0.139" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/drawable/ic_baseline_cancel_24.xml" value="0.137" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/drawable/ic_baseline_checklist_24.xml" value="0.256" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/drawable/ic_baseline_newspaper_24.xml" value="0.139" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/drawable/ic_baseline_play_circle_outline_24.xml" value="0.137" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/drawable/ic_baseline_search_24.xml" value="0.256" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/drawable/ic_baseline_thumb_down_alt_24.xml" value="0.139" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/drawable/ic_baseline_thumb_down_off_alt_24.xml" value="0.139" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/drawable/ic_baseline_thumb_up_alt_24.xml" value="0.139" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/drawable/ic_baseline_thumb_up_off_alt_24.xml" value="0.139" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/drawable/search_bar.xml" value="0.256" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/drawable/shape_reply_show_bottom_dialog.xml" value="0.139" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/drawable/shape_tag_selector.xml" value="0.136" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/drawable/shape_title_mask.xml" value="0.139" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/activity_hanime_preview.xml" value="0.4" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/activity_main.xml" value="0.1265625" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/activity_preview.xml" value="0.20153985507246377" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/activity_search.xml" value="0.3" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/activity_video.xml" value="0.3" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/fragment_home_page.xml" value="0.212784588441331" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/fragment_home_page_main.xml" value="0.1" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/fragment_search.xml" value="0.27395833333333336" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/fragment_tag_selector.xml" value="0.3516642547033285" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/fragment_video_comment.xml" value="0.275" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/fragment_video_comment_reply.xml" value="0.36" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/fragment_video_introduction.xml" value="0.44000000000000006" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/item_hanime_preview_news.xml" value="0.4" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/item_hanime_preview_news_pic.xml" value="0.22488242838820008" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/item_hanime_simplified.xml" value="0.27395833333333336" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/item_hanime_video.xml" value="0.44000000000000006" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/item_hanime_video_simplified.xml" value="0.4" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/item_home_page.xml" value="0.3" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/item_tag_chip.xml" value="0.4" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/item_tag_chip_group.xml" value="0.268" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/item_tag_selector.xml" value="0.12552083333333333" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/item_video_comment.xml" value="0.268" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/item_video_tag_chip.xml" value="0.12552083333333333" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/layout/pop_up_hanime_search_tag.xml" value="0.268" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/menu/menu_main_bnv.xml" value="0.275" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/menu/menu_main_toolbar.xml" value="0.27395833333333336" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/app/src/main/res/menu/menu_search_toolbar.xml" value="0.275" />
<entry key="..\:/Users/wrzg8/AndroidStudioProjects/Hanime1/yenaly_libs/src/main/res/layout/yenaly_activity_crash_dialog.xml" value="0.1" />
<entry key="..\:/Users/wrzg8/AppData/Local/Android/Sdk/platforms/android-32/data/res/layout/auto_complete_list.xml" value="0.10389055151774262" />
<entry key="..\:/Users/wrzg8/AppData/Local/Android/Sdk/platforms/android-32/data/res/layout/simple_list_item_1.xml" value="0.1265625" />
<entry key="..\:/Users/wrzg8/AppData/Local/Android/Sdk/platforms/android-32/data/res/layout/simple_list_item_2.xml" value="0.1265625" />
</map>
</option>
</component>
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>
================================================
FILE: .idea/render.experimental.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RenderSettings">
<option name="useLiveRendering" value="false" />
</component>
</project>
================================================
FILE: .idea/runConfigurations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
</set>
</option>
</component>
</project>
================================================
FILE: .idea/studiobot.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="StudioBotProjectSettings">
<option name="shareContext" value="OptedIn" />
</component>
</project>
================================================
FILE: .idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GitSharedSettings">
<option name="FORCE_PUSH_PROHIBITED_PATTERNS">
<list />
</option>
</component>
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
Copyright 2021 Yenaly
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
# Han1meViewer

Han1meViewer 是一个使用 Kotlin 开发的第三方动漫浏览器,旨在为用户提供流畅、美观且高效的动画内容浏览体验。支持多种自定义与扩展,适合二次元爱好者和开发者共同完善。
## 功能特点
- **Anime4K超分**:集成 Anime4K 技术,提供高清晰度的动画画质。
- **动画内容浏览**:快速、流畅地浏览、搜索和筛选动漫资源。
- **多主题支持**:支持深色与浅色主题,个性化你的观影体验。
- **收藏与历史记录**:一键收藏喜欢的动画,随时查看观影历史。
- **高性能**:基于 Kotlin,界面响应快,占用资源少。
- **开源自由**:欢迎二次开发与贡献,持续优化功能。
- **画中画**:支持画中画模式,边看边做其他事情。
- **垂直视频适配**:优化垂直视频播放体验,适合手机用户。
## 安装与运行
1. 克隆本仓库到本地:
```bash
git clone https://github.com/Night-stars-1/Han1meViewer.git
```
2. 使用 Android Studio 或其他支持 Kotlin 的 IDE 打开项目。
3. 配置依赖并编译运行到你的 Android 设备。
## 项目结构
- `app/` 主程序源码
- `res/` 资源文件(图片、布局等)
- `gradle/` 构建相关配置
- `README.md` 项目说明
- 其他相关代码和配置文件
## 贡献指南
欢迎任何形式的贡献!你可以通过以下方式参与项目:
- 提交 Issue 报告 bug 或建议新功能
- Fork 并提交 Pull Request
- 优化文档与翻译
## 特别鸣谢
- 感谢所有参与本项目的开发者和贡献者
- [Han1meViewer(YenalyLiew)](https://github.com/YenalyLiew/Han1meViewer) 原项目
- [Anime4K](https://github.com/bloc97/Anime4K) Anime4K超分辨率
- [mpv-android](https://github.com/abdallahmehiz/mpv-android) MPV 播放器内核
- [mpv-android](https://github.com/mpv-android/mpv-android) MPV 播放器内核
## License
本项目采用 Apache-2.0 开源许可证,详见 [LICENSE](LICENSE) 文件。
================================================
FILE: README_TECH.md
================================================
# Han1meViewer 技术相关
> 抄是程序员进步的阶梯。
## 概括
本软件使用 MVVM 架构,Material 3 视觉风格,Jetpack 不用问肯定用,但未使用 Compose(有一说一不用 Compose
写 xml 真是写到吐)。网络请求使用 Retrofit,图片加载使用 Coil,视频播放使用 Jiaozi,Json 解析使用
Serialization,部分弹窗使用的 Xpopup。未使用 LiveData,全部改用功能更强大的 Flow。
## 受众人群
这篇文章主要给谁看的呢?一是那些刚学习 Android 的同学,想看看本项目是怎么写的,或者对其中某个功能很感兴趣,想学习一下并且快速集成于自己的
App 中;二是普通开发者感兴趣来捧个场,能学到东西更好,写的不对的来发 discussion 拷打我。
## 功能解析
### 断点续传下载
#### 你可以学到
1. WorkManager 使用,如何在 WorkManager 中对下载任务进行基础管理?
2. RecyclerView 使用,DiffUtil 使用,如何充分利用 `payload` 参数对某个特定的控件进行刷新?
3. Room 使用,如何通过数据库实现回调?
#### 关键文件
- [HanimeDownloadWorker.kt](app/src/main/java/com/yenaly/han1meviewer/worker/HanimeDownloadWorker.kt) - 关键作业类
- [HanimeDownloadEntity.kt](app/src/main/java/com/yenaly/han1meviewer/logic/entity/HanimeDownloadEntity.kt) - 下载 实体类
- [HanimeDownloadDao.kt](app/src/main/java/com/yenaly/han1meviewer/logic/dao/HanimeDownloadDao.kt) - 下载 Dao 类
- [DownloadDatabase.kt](app/src/main/java/com/yenaly/han1meviewer/logic/dao/DownloadDatabase.kt) - 下载 数据库类
- [HanimeDownloadingRvAdapter.kt](app/src/main/java/com/yenaly/han1meviewer/ui/adapter/HanimeDownloadingRvAdapter.kt) - 下载界面的 RecyclerView Adapter
#### 解释
你可能问我你就这几个文件就实现了?我接口呢,没接口你怎么回调的?
**先去看**我写的 [小白如何快速实现简单的可保存状态断点续传后台下载?一个 Jetpack 库搞定一切!](https://juejin.cn/post/7278929337067225149),看完再看下面。
但是不要照搬,使用前要注意这么几点:
1. 你所下载的东西是否可以断点续传?对于视频类 App 来说,视频基本都是可以断点续传的,毕竟要播放嘛!所以我在实现下载的时候不必考虑那么多。
2. 是否要对每个下载任务进行很粒度的操作?不是说不行,但可能实现起来有点麻烦。
3. 一次性下载数目是否很多?如果使用上述文章的做法去下载极多文件可能会对手机性能造成一定压力,一会细说。
为什么说下载数目过多会造成一定压力?
聚焦于 [HanimeDownloadWorker.kt](app/src/main/java/com/yenaly/han1meviewer/worker/HanimeDownloadWorker.kt) 第 180 行左右:
```kotlin
const val RESPONSE_INTERVAL = 500L
if (System.currentTimeMillis() - delayTime > RESPONSE_INTERVAL) {
val progress = entity.downloadedLength * 100 / entity.length
setProgress(workDataOf(PROGRESS to progress.toInt()))
setForeground(createForegroundInfo(progress.toInt()))
DatabaseRepo.HanimeDownload.update(entity)
delayTime = System.currentTimeMillis()
}
```
我在 App 里设置的是 500 ms 一更新,相当于 `2 次数据库更新操作/s/job`,加上通过 Flow/LiveData 回调,当数据库检测到数据更新,会立即返回全新的、拥有最新数据的列表,相当于又有 `回调 2 次/s/job`。如果一次性下载极多个文件,并且调低了 `RESPONSE_INTERVAL`,可能会对数据库造成一定负担。这个时候这种方法就不太好用了。
配置好了 RecyclerView,那刷新闪烁问题该如何解决?我在原文章中提供的方法并不好:
```kotlin
rv.itemAnimator?.changeDuration = 0
```
这句代码只是解决了表面问题,实际上背后还是接着“闪”。因为即使是通过了 DiffUtil 进行了差分刷新,但还仍是全局更新,这只是自我欺骗罢了。不信你可以试试 `holder.binding.pbProgress.setProgress(item.progress, true)` 能不能正常出现动态效果。那怎么实现,`isDownloading` 字段发生修改,就单独对暂停按钮修改;`downloadedLength` 字段发生修改,就单独对进度条修改?这时候就需要 `payload` 出场了。
与 `payload` 相关的文章真的挺多,StackOverflow 甚至 掘金 上不少介绍这个的文章,自己去搜一搜马上就能看懂,我就不赘述了。关键就是 `DiffUtil.ItemCallback` 中的 `getChangePayload` 方法和 `onBindViewHolder` 中的 `payloads` 参数。
**先去看** `payload` 使用相关文章,再看下面。
但我发现,很多人确实介绍了这种方法,但鲜少有人去介绍如何高效率实现一次性去处理多个字段。你可能想到了 `List<Int>` 或 `IntArray`,通过遍历对应去处理每一种情况。这样的话,时间复杂度和空间复杂度都是 `O(n)`,`n` 是你需要监听的数目;再聪明点也可以想到使用 `Set<Int>`,在 `onBindViewHolder` 中分别查询 set 中是否含有某个情况来对应处理,这时候时间复杂度降到了 `O(1)`。如果在刷新不频繁的情况下,这样做确实没什么不妥,但是高强度下,每次 new 一个数据结构确实是一个小负担,那应该怎么样做呢?
这时候可以选择简单的 Bitmap 数据结构。你可能刚听说,但它确实很常见,你在使用 `Intent#addFlags` 打开新 Activity 的时候,大概率会接触到这种数据结构。我们可以利用一个仅 4 个字节的 32-bit 整数值去实现查找 (`find`)、判空 (`isEmpty`)、添加 (`add`) 的功能(我们只需要这些功能,而且不同情况数量大概率不超过 32 个)。
聚焦于 [HanimeDownloadingRvAdapter.kt](app/src/main/java/com/yenaly/han1meviewer/ui/adapter/HanimeDownloadingRvAdapter.kt)
> 注意:我使用了 BRVAH 作为 RecyclerView 的代替,所以具体方法和 RecyclerView 不一定一致,但使用方法基本一致。
```kotlin
companion object {
private const val DOWNLOADING = 1 // 0000 0001
private const val PAUSE = 1 shl 1 // 0000 0010
val COMPARATOR = object : DiffUtil.ItemCallback<HanimeDownloadEntity>() {
override fun areContentsTheSame(
oldItem: HanimeDownloadEntity,
newItem: HanimeDownloadEntity,
): Boolean {
return oldItem == newItem
}
override fun areItemsTheSame(
oldItem: HanimeDownloadEntity,
newItem: HanimeDownloadEntity,
): Boolean {
return oldItem.id == newItem.id
}
override fun getChangePayload(
oldItem: HanimeDownloadEntity,
newItem: HanimeDownloadEntity,
): Any {
// 假设当前只有 progress 和原来不一样
var bitset = 0
// bitset == 0000 0000
if (oldItem.progress != newItem.progress || oldItem.downloadedLength != newItem.downloadedLength)
bitset = bitset or DOWNLOADING
// bitset == 0000 0001
if (oldItem.isDownloading != newItem.isDownloading)
bitset = bitset or PAUSE
// 不经过这里
return bitset
// return 0000 0001
}
}
}
```
```kotlin
override fun onBindViewHolder(
holder: DataBindingHolder<ItemHanimeDownloadingBinding>,
position: Int,
item: HanimeDownloadEntity?,
payloads: List<Any>,
) {
// 如果 payloads 列表为空,或者为 0000 0000,说明不需要修改
if (payloads.isEmpty() || payloads.first() == 0)
return super.onBindViewHolder(holder, position, item, payloads)
item.notNull()
val bitset = payloads.first() as Int
// 0000 0001 & 0000 0001 = 0000 0001 != 0000 0000
// 对进度相关控件进行修改
if (bitset and DOWNLOADING != 0) {
holder.binding.tvSize.text = spannable {
item.downloadedLength.formatFileSize().text()
" | ".span { color(Color.RED) }
item.length.formatFileSize().span { style(Typeface.BOLD) }
}
holder.binding.tvProgress.text = "${item.progress}%"
holder.binding.pbProgress.setProgress(item.progress, true)
}
// 0000 0001 & 0000 0010 = 0000 0000 == 0000 0000
// 不经过下面
if (bitset and PAUSE != 0) {
holder.binding.btnStart.handleStartButton(item.isDownloading)
}
}
```
就这样实现了效率比较高的差分刷新。
### CI 更新渠道
#### 你可以学到
#### 关键文件
#### 解释
当你的软件拓展性比较高,但受限于题材内容或者单纯懒,不方便自建服务器去读取这些拓展文件。但你又希望能让用户通过其他渠道实时的获取到更新(比如好心人上传了拓展文件,我合并到主分支之后,几分钟后用户就可以获得更新,而不用我自己做包),但又不是所有人需要这些拓展功能(要是人家不愿用你那功能,又一会一个 Release,用户也会烦;你自己一会发一个包你也会烦)。所以能不能给用户提供两种渠道?一个是稳定更新渠道,自己发版本;另一个是开发版,GitHub 自动构建,保证最新功能(最新拓展功能立即集成)但不保证稳定性。
答案是肯定的。其实我之前也不知道怎么做,但是 @NekoOuO 给我发了 [Foolbar/EhViewer](https://github.com/FooIbar/EhViewer/) 的做法,我想都没想就抄过来了。但没人详细教怎么做,我今天就来讲讲。
**先去看** GitHub CI 基础用法。
谷歌、掘金上全是教程。你先去查一查用法然后配置一下,刚开始的要求不多,你上传 commit 之后,GitHub CI 开始工作并成功 Build,就算入门了,先不用管 Build 之后干什么或者别的。如果你操作非常顺利,再看以下步骤。
待更...
### 共享关键H帧
#### 你可以学到
1. 如何充分利用 Kotlin 的集合操作函数,将一个个单独的 JSON 文件进行排序、分类甚至扁平化?
相关函数:`groupBy`、`flatMap`、`sortedWith` `=>` `compareBy`、`thenBy`
#### 关键文件
- [HKeyframes 文件夹](app/src/main/assets/h_keyframes) - 存放所有共享关键H帧
- [DatabaseRepo.kt](app/src/main/java/com/yenaly/han1meviewer/logic/DatabaseRepo.kt) - 处理共享关键H帧
- [SharedHKeyframesRvAdapter.kt](app/src/main/java/com/yenaly/han1meviewer/ui/adapter/SharedHKeyframesRvAdapter.kt) - 界面 Adapter
- [HKeyframeEntity.kt](app/src/main/java/com/yenaly/han1meviewer/logic/entity/HKeyframeEntity.kt) - 相关实体类
#### 解释
很多人看到 [HKeyframes 文件夹](app/src/main/assets/h_keyframes) 先笑了,所有 JSON 文件都放一块,作者是个傻宝吧,这都不知道分文件夹来分类?
你以为我没想到吗?首先分文件夹为什么不太行:
1. 分文件夹无法一次性读取到对应影片的关键H帧。比如你正在看 `videoCode` 为 `114514` 的影片,我不分文件夹直接读取文件夹下的对应文件即可,不需要遍历各个文件夹去寻找,相当于 List 和 Map 的区别。
2. 假设分文件夹后,在根目录创建 JSON 来写好哪个文件夹包含哪些影片的代号,也不是不行,但是会增加其他想提供共享H帧的人的负担。
主要还是历史遗留问题,我懒得改了😄。Kotlin 这么多集合操作函数,分个组排个序不轻轻松松?
我现在给你一个关键H帧的 JSON,你来考虑考虑怎么转化为以下格式:
格式:
```
- 系列 1
- 系列 1 第一集
- 系列 1 第二集
- 系列 1 第三集
- 系列 2
- 系列 2 第一集
- 系列 2 第二集
```
随机一段关键H帧:
> 你要注意,该网站的 `videoCode` 不是按照顺序排列的,第一集和第二集中间可能会夹带一个其他系列的影片。
```json
{
"videoCode": "114514",
"group": "系列 2",
"title": "系列 2 第二集",
"episode": 2,
"author": "Bekki Chen",
"keyframes": [
{
"position": 482500,
"prompt": null
},
{
"position": 500500,
"prompt": null
},
{
"position": 556000,
"prompt": null
},
{
"position": 777300,
"prompt": null
}
]
}
```
你可能想用 Map 分类,但是 RecyclerView 可是传不了 Map 的,那怎么才能扁平化成一个 List,并且能实现 RecyclerView 多布局呢?如果是两种截然不同的两个数据去实现 RecyclerView 多布局,不得不依靠接口,比如说本 App 中共享关键H帧界面中数据不一样的标题和内容。
聚焦于 [HKeyframeEntity.kt](app/src/main/java/com/yenaly/han1meviewer/logic/entity/HKeyframeEntity.kt)
```kotlin
interface MultiItemEntity {
val itemType: Int
}
interface HKeyframeType : MultiItemEntity {
companion object {
const val H_KEYFRAME = 0
const val HEADER = 1
}
}
```
然后 HKeyframeEntity 和 HKeyframeHeader 我就不多说了,把正确的 `itemType` override 给对应的 `itemType` 字段就好。
现在问题是怎么读取那些共享关键H帧并将其扁平化?
聚焦于 [DatabaseRepo.kt](app/src/main/java/com/yenaly/han1meviewer/logic/DatabaseRepo.kt)
```kotlin
@OptIn(ExperimentalSerializationApi::class)
fun loadAllShared(): Flow<List<HKeyframeType>> = flow {
val res = applicationContext.assets.let { assets ->
// assets.list 方法获取到文件夹所有文件的 List
assets.list("h_keyframes")?.asSequence() // 将其转化为一个序列
?.filter { it.endsWith(".json") } // 把其中结尾为 json 的挑出来
?.mapNotNull { fileName -> // 将 文件名 映射 为 文件,再通过 文件 转化为 实体
try {
// assets.open 方法打开文件
assets.open("h_keyframes/$fileName").use { inputStream ->
Json.decodeFromStream<HKeyframeEntity>(inputStream)
}
} catch (e: Exception) { // 出现问题返回 null
e.printStackTrace()
null
}
}
?.sortedWith(
compareBy<HKeyframeEntity> { it.group }.thenBy { it.episode }
) // 排序,先以 group 进行排序,然后对 episode 进行排序
?.groupBy { it.group ?: "???" } // 分组,以 group 为 key,以 group 下的所有影片的列表为 value 建立 Map,若 group 为 null,加入组 ??? 里
?.flatMap { (group, entities) -> // 提供两个参数,分别为 key 和 value
listOf(HKeyframeHeader(title = group, attached = entities)) + entities
} // 关键:扁平化,group 与 entities 由主从关系变为并列关系
.orEmpty() // 若 list 为 null,返回一个长度为 0 的空列表
}
emit(res)
}
```
然后在对应 RecyclerView 中设置好 `itemType`,再分 `itemType` 配置相关函数就可以了。
具体查看 [SharedHKeyframesRvAdapter.kt](app/src/main/java/com/yenaly/han1meviewer/ui/adapter/SharedHKeyframesRvAdapter.kt)
================================================
FILE: app/.gitignore
================================================
/build
/keystore/ha1_keystore_password.txt
/ha1_github_token.txt
================================================
FILE: app/build.gradle.kts
================================================
@file:Suppress("UnstableApiUsage")
import Config.Version.createVersion
import Config.Version.source
import Config.isRelease
import Config.lastCommitSha
import com.android.build.gradle.internal.api.BaseVariantOutputImpl
plugins {
alias(libs.plugins.com.android.application)
alias(libs.plugins.org.jetbrains.kotlin.android)
alias(libs.plugins.org.jetbrains.kotlin.plugin.parcelize)
alias(libs.plugins.org.jetbrains.kotlin.plugin.serialization)
alias(libs.plugins.com.google.devtools.ksp)
alias(libs.plugins.com.google.gms.google.services)
alias(libs.plugins.com.google.firebase.crashlytics)
alias(libs.plugins.com.google.firebase.firebase.pref)
// alias(libs.plugins.compose.compiler)
}
android {
compileSdk = property("compile.sdk")?.toString()?.toIntOrNull()
val commitSha = if (isRelease) lastCommitSha else "b8eace8" // 方便调试
// 先 Github Secrets 再读取环境变量,若没有则读取本地文件
val signPwd = System.getenv("HA1_KEYSTORE_PASSWORD") ?: File(
projectDir, "keystore/ha1_keystore_password.txt"
).checkIfExists()?.readText().orEmpty()
val githubToken = System.getenv("HA1_GITHUB_TOKEN") ?: File(
projectDir, "ha1_github_token.txt"
).checkIfExists()?.readText().orEmpty()
val signConfig = if (isRelease) signingConfigs.create("release") {
storeFile = File(projectDir, "keystore/Han1meViewerKeystore.jks").checkIfExists()
storePassword = signPwd
keyAlias = "night_star"
keyPassword = signPwd
enableV3Signing = true
enableV4Signing = true
} else null
defaultConfig {
applicationId = "com.yenaly.han1meviewer"
minSdk = property("min.sdk")?.toString()?.toIntOrNull()
targetSdk = property("target.sdk")?.toString()?.toIntOrNull()
val (code, name) = createVersion(major = 0, minor = 18, patch = 0)
versionCode = code
versionName = name
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
buildConfigField("String", "COMMIT_SHA", "\"$commitSha\"")
buildConfigField("String", "VERSION_NAME", "\"${versionName}\"")
buildConfigField("int", "VERSION_CODE", "$versionCode")
buildConfigField("String", "HA1_GITHUB_TOKEN", "\"${githubToken}\"")
buildConfigField("String", "HA1_VERSION_SOURCE", "\"${source}\"")
}
splits {
abi {
isEnable = true
reset()
include("armeabi-v7a", "arm64-v8a")
isUniversalApk = true
}
}
buildTypes {
release {
isMinifyEnabled = true
signingConfig = signConfig
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
)
}
debug {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
)
applicationIdSuffix = ".debug"
}
}
applicationVariants.all {
outputs.forEach { output ->
val outputImpl = output as BaseVariantOutputImpl
val abi = outputImpl.filters.find { it.filterType == "ABI" }?.identifier
outputImpl.outputFileName = if (abi != null) {
"Han1meViewer-v${defaultConfig.versionName}_$abi.apk"
} else {
"Han1meViewer-v${defaultConfig.versionName}_universal.apk"
}
}
}
buildFeatures {
//noinspection DataBindingWithoutKapt
dataBinding = true
buildConfig = true
// compose = true
}
compileOptions {
isCoreLibraryDesugaringEnabled = true
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_21.toString()
freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn", "-Xjvm-default=all-compatibility")
}
lint {
disable += setOf("EnsureInitializerMetadata")
}
namespace = "com.yenaly.han1meviewer"
}
dependencies {
implementation(project(":yenaly_libs"))
// android related
implementation(libs.bundles.android.base)
implementation(libs.bundles.android.jetpack)
implementation(libs.palette)
// implementation(platform(libs.compose.compose.bom))
// androidTestImplementation(platform(libs.compose.compose.bom))
// implementation(libs.compose.material3)
// implementation(libs.androidx.activity.compose)
// implementation(libs.compose.ui.graphics)
// implementation(libs.compose.ui.ui.tooling.preview)
// debugImplementation(libs.compose.ui.ui.tooling)
// datetime
implementation(libs.datetime)
// parse
implementation(libs.serialization.json)
implementation(libs.jsoup)
// network
implementation(libs.retrofit)
implementation(libs.converter.serialization)
// pic
implementation(libs.coil)
// popup
implementation(libs.xpopup)
implementation(libs.xpopup.ext)
// video
implementation(libs.jiaozi.video.player)
implementation(libs.media3.exoplayer)
implementation(libs.media3.exoplayer.hls)
// view
implementation(libs.refresh.layout.kernel)
implementation(libs.refresh.header.material)
implementation(libs.refresh.footer.classics)
implementation(libs.multitype)
implementation(libs.base.recyclerview.adapter.helper4)
implementation(libs.expandable.textview)
implementation(libs.spannable.x)
implementation(libs.about)
implementation(libs.statelayout)
implementation(libs.circular.reveal.switch)
// firebase
implementation(platform(libs.firebase.bom))
implementation(libs.firebase.analytics)
implementation(libs.firebase.crashlytics)
implementation(libs.firebase.perf)
implementation(libs.firebase.config)
// mpv
implementation(libs.mpv.lib)
ksp(libs.room.compiler)
coreLibraryDesugaring(libs.desugar.jdk.libs)
testImplementation(libs.junit)
androidTestImplementation(libs.test.junit)
androidTestImplementation(libs.test.espresso.core)
// debugImplementation(libs.leak.canary)
}
/**
* This function is used to check if a file exists and is a file.
*/
fun File.checkIfExists(): File? = if (exists() && isFile) this else null
================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.kts.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
-keepattributes SourceFile, LineNumberTable
-keepnames class * extends android.app.Activity
-keepnames class * extends androidx.fragment.app.Fragment
-keep class * extends cn.jzvd.** { *; }
-keep class com.google.android.gms.** { *; }
-keep interface com.google.android.gms.** { *; }
-keep,allowoptimization class is.xyz.mpv.** { public protected *; }
================================================
FILE: app/src/androidTest/java/com/yenaly/han1meviewer/ExampleInstrumentedTest.kt
================================================
package com.yenaly.han1meviewer
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.yenaly.han1meviewer", appContext.packageName)
}
}
================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:mimeType="video/*" />
</intent>
</queries>
<!-- 暂时关闭了 enableOnBackInvokedCallback,因为稳定性还是有点差 -->
<application
android:name=".HanimeApplication"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:enableOnBackInvokedCallback="false"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/hanime_app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Hanime1"
tools:targetApi="34">
<service
android:name="androidx.work.impl.foreground.SystemForegroundService"
android:foregroundServiceType="dataSync"
tools:node="merge" />
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
android:initOrder="114514"
tools:node="merge">
<meta-data
android:name="com.yenaly.han1meviewer.HInitializer"
android:value="androidx.startup" />
</provider>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<activity
android:name=".ui.activity.VideoActivity"
android:supportsPictureInPicture="true"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"
android:exported="true"
android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="hanime1.com" />
<data android:host="hanime1.me" />
<data android:path="/watch" />
</intent-filter>
</activity>
<activity
android:name=".ui.activity.MainActivity"
android:configChanges="orientation|screenSize"
android:exported="true"
android:launchMode="singleTask"
android:theme="@style/Theme.Hanime1.Main">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.activity.SearchActivity"
android:configChanges="orientation|screenSize"
android:exported="true">
</activity>
<activity
android:name=".ui.activity.PreviewActivity"
android:configChanges="screenSize|orientation"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@style/Theme.Hanime1.Preview"
tools:ignore="LockedOrientationActivity">
</activity>
<activity
android:name=".ui.activity.PreviewCommentActivity"
android:configChanges="screenSize|orientation"
android:exported="true">
</activity>
<activity
android:name=".ui.activity.SettingsActivity"
android:configChanges="screenSize|orientation"
android:exported="true">
</activity>
<activity
android:name=".ui.activity.LoginActivity"
android:configChanges="screenSize|orientation"
android:exported="true">
</activity>
<activity
android:name=".ui.activity.DownloadActivity"
android:configChanges="orientation|screenSize"
android:exported="true"></activity>
</application>
</manifest>
================================================
FILE: app/src/main/assets/h_keyframes/12444.json
================================================
{
"videoCode": "12444",
"group": "思春期SEX",
"title": "思春期SEX#1",
"episode": 1,
"author": "NeKoOuO",
"keyframes": [
{
"position": 482500,
"prompt": null
},
{
"position": 545000,
"prompt": null
},
{
"position": 832000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/14463.json
================================================
{
"videoCode": "14463",
"group": "思春期SEX",
"title": "思春期SEX#3",
"episode": 3,
"author": "NeKoOuO",
"keyframes": [
{
"position": 311500,
"prompt": null
},
{
"position": 432500,
"prompt": null
},
{
"position": 824000,
"prompt": null
},
{
"position": 861300,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/21806.json
================================================
{
"videoCode": "21806",
"group": "思春期SEX",
"title": "思春期SEX#4",
"episode": 4,
"author": "NeKoOuO",
"keyframes": [
{
"position": 481000,
"prompt": null
},
{
"position": 657700,
"prompt": null
},
{
"position": 742700,
"prompt": null
},
{
"position": 813000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/22068.json
================================================
{
"videoCode": "22068",
"group": "思春期SEX",
"title": "思春期SEX#2",
"episode": 2,
"author": "NeKoOuO",
"keyframes": [
{
"position": 324000,
"prompt": null
},
{
"position": 602000,
"prompt": null
},
{
"position": 734000,
"prompt": null
},
{
"position": 816000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/37176.json
================================================
{
"videoCode": "37176",
"group": "援助交配",
"title": "援助交配#1",
"episode": 1,
"author": "NeKoOuO",
"keyframes": [
{
"position": 363600,
"prompt": null
},
{
"position": 633000,
"prompt": null
},
{
"position": 796000,
"prompt": null
},
{
"position": 881700,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/37177.json
================================================
{
"videoCode": "37177",
"group": "援助交配",
"title": "援助交配#2",
"episode": 2,
"author": "NeKoOuO",
"keyframes": [
{
"position": 376000,
"prompt": null
},
{
"position": 420000,
"prompt": null
},
{
"position": 600000,
"prompt": null
},
{
"position": 774000,
"prompt": null
},
{
"position": 800000,
"prompt": null
},
{
"position": 840000,
"prompt": null
},
{
"position": 856500,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/37178.json
================================================
{
"videoCode": "37178",
"group": "援助交配",
"title": "援助交配#3",
"episode": 3,
"author": "NeKoOuO",
"keyframes": [
{
"position": 239000,
"prompt": null
},
{
"position": 307000,
"prompt": null
},
{
"position": 439000,
"prompt": null
},
{
"position": 641000,
"prompt": null
},
{
"position": 820000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/37179.json
================================================
{
"videoCode": "37179",
"group": "援助交配",
"title": "援助交配#4",
"episode": 4,
"author": "NeKoOuO",
"keyframes": [
{
"position": 36000,
"prompt": null
},
{
"position": 480000,
"prompt": null
},
{
"position": 570000,
"prompt": null
},
{
"position": 655000,
"prompt": null
},
{
"position": 800000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/37220.json
================================================
{
"videoCode": "37220",
"group": "今泉家似乎變成辣妹的聚會所",
"title": "今泉家似乎變成辣妹的聚會所#1",
"episode": 1,
"author": "NeKoOuO",
"keyframes": [
{
"position": 265000,
"prompt": null
},
{
"position": 403000,
"prompt": null
},
{
"position": 493000,
"prompt": null
},
{
"position": 540000,
"prompt": null
},
{
"position": 604000,
"prompt": null
},
{
"position": 725000,
"prompt": null
},
{
"position": 769000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/37221.json
================================================
{
"videoCode": "37221",
"group": "今泉家似乎變成辣妹的聚會所",
"title": "今泉家似乎變成辣妹的聚會所#2",
"episode": 2,
"author": "NeKoOuO",
"keyframes": [
{
"position": 278500,
"prompt": null
},
{
"position": 403000,
"prompt": null
},
{
"position": 510000,
"prompt": null
},
{
"position": 627000,
"prompt": null
},
{
"position": 836000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/38387.json
================================================
{
"videoCode": "38387",
"group": "援助交配",
"title": "援助交配#5",
"episode": 5,
"author": "NeKoOuO",
"keyframes": [
{
"position": 335000,
"prompt": null
},
{
"position": 652000,
"prompt": null
},
{
"position": 817000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/38389.json
================================================
{
"videoCode": "38389",
"group": "闇憑村",
"title": "闇憑村#1",
"episode": 1,
"author": "NeKoOuO",
"keyframes": [
{
"position": 290700,
"prompt": null
},
{
"position": 428000,
"prompt": null
},
{
"position": 510000,
"prompt": null
},
{
"position": 592000,
"prompt": null
},
{
"position": 798000,
"prompt": null
},
{
"position": 934500,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/38457.json
================================================
{
"videoCode": "38457",
"group": "闇憑村",
"title": "闇憑村#2",
"episode": 2,
"author": "NeKoOuO",
"keyframes": [
{
"position": 345300,
"prompt": null
},
{
"position": 458000,
"prompt": null
},
{
"position": 502500,
"prompt": null
},
{
"position": 507500,
"prompt": null
},
{
"position": 549000,
"prompt": null
},
{
"position": 562000,
"prompt": null
},
{
"position": 574000,
"prompt": null
},
{
"position": 686000,
"prompt": null
},
{
"position": 779500,
"prompt": null
},
{
"position": 868000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/38461.json
================================================
{
"videoCode": "38461",
"group": "援助交配",
"title": "援助交配#6",
"episode": 6,
"author": "NeKoOuO",
"keyframes": [
{
"position": 86000,
"prompt": null
},
{
"position": 638000,
"prompt": null
},
{
"position": 755000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/39192.json
================================================
{
"videoCode": "39192",
"group": "援助交配",
"title": "援助交配#7",
"episode": 7,
"author": "NeKoOuO",
"keyframes": [
{
"position": 260000,
"prompt": null
},
{
"position": 413500,
"prompt": null
},
{
"position": 520000,
"prompt": null
},
{
"position": 564000,
"prompt": null
},
{
"position": 656000,
"prompt": null
},
{
"position": 802000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/39305.json
================================================
{
"videoCode": "39305",
"group": "到了異世界就拿出性本事",
"title": "到了異世界就拿出性本事#1",
"episode": 1,
"author": "NeKoOuO",
"keyframes": [
{
"position": 387500,
"prompt": null
},
{
"position": 457000,
"prompt": null
},
{
"position": 712500,
"prompt": null
},
{
"position": 829500,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/39306.json
================================================
{
"videoCode": "39306",
"group": "到了異世界就拿出性本事",
"title": "到了異世界就拿出性本事#2",
"episode": 2,
"author": "NeKoOuO",
"keyframes": [
{
"position": 254000,
"prompt": null
},
{
"position": 405000,
"prompt": null
},
{
"position": 502000,
"prompt": null
},
{
"position": 740500,
"prompt": null
},
{
"position": 914000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/39468.json
================================================
{
"videoCode": "39468",
"group": "援助交配",
"title": "援助交配#8",
"episode": 8,
"author": "NeKoOuO",
"keyframes": [
{
"position": 223000,
"prompt": null
},
{
"position": 324000,
"prompt": null
},
{
"position": 608000,
"prompt": null
},
{
"position": 848000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/39811.json
================================================
{
"videoCode": "39811",
"group": "今泉家似乎變成辣妹的聚會所",
"title": "今泉家似乎變成辣妹的聚會所#4",
"episode": 4,
"author": "NeKoOuO",
"keyframes": [
{
"position": 175000,
"prompt": null
},
{
"position": 425000,
"prompt": null
},
{
"position": 629000,
"prompt": null
},
{
"position": 825000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/84717.json
================================================
{
"videoCode": "84717",
"group": "初戀時間",
"title": "初戀時間#1",
"episode": 1,
"author": "NeKoOuO",
"keyframes": [
{
"position": 72000,
"prompt": null
},
{
"position": 427270,
"prompt": null
},
{
"position": 499500,
"prompt": null
},
{
"position": 650000,
"prompt": null
},
{
"position": 840500,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/84718.json
================================================
{
"videoCode": "84718",
"group": "初戀時間",
"title": "初戀時間#2",
"episode": 2,
"author": "NeKoOuO",
"keyframes": [
{
"position": 462000,
"prompt": null
},
{
"position": 576500,
"prompt": null
},
{
"position": 588000,
"prompt": null
},
{
"position": 678500,
"prompt": null
},
{
"position": 823430,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/85926.json
================================================
{
"videoCode": "85926",
"group": "初戀時間",
"title": "初戀時間#3",
"episode": 3,
"author": "NeKoOuO",
"keyframes": [
{
"position": 438000,
"prompt": null
},
{
"position": 602500,
"prompt": null
},
{
"position": 822500,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/85927.json
================================================
{
"videoCode": "85927",
"group": "初戀時間",
"title": "初戀時間#4",
"episode": 4,
"author": "NeKoOuO",
"keyframes": [
{
"position": 376000,
"prompt": null
},
{
"position": 474950,
"prompt": null
},
{
"position": 633500,
"prompt": null
},
{
"position": 715000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/87968.json
================================================
{
"videoCode": "87968",
"group": "到了異世界就拿出性本事",
"title": "到了異世界就拿出性本事#3",
"episode": 3,
"author": "NeKoOuO",
"keyframes": [
{
"position": 229500,
"prompt": null
},
{
"position": 445500,
"prompt": null
},
{
"position": 637200,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/87969.json
================================================
{
"videoCode": "87969",
"group": "到了異世界就拿出性本事",
"title": "到了異世界就拿出性本事#4",
"episode": 4,
"author": "NeKoOuO",
"keyframes": [
{
"position": 474500,
"prompt": null
},
{
"position": 791000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/89087.json
================================================
{
"videoCode": "89087",
"group": "初戀時間",
"title": "初戀時間#5",
"episode": 5,
"author": "NeKoOuO",
"keyframes": [
{
"position": 482500,
"prompt": null
},
{
"position": 500500,
"prompt": null
},
{
"position": 556000,
"prompt": null
},
{
"position": 777300,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/89088.json
================================================
{
"videoCode": "89088",
"group": "初戀時間",
"title": "初戀時間#6",
"episode": 6,
"author": "NeKoOuO",
"keyframes": [
{
"position": 304000,
"prompt": null
},
{
"position": 387000,
"prompt": null
},
{
"position": 546000,
"prompt": null
},
{
"position": 644000,
"prompt": null
},
{
"position": 710000,
"prompt": null
},
{
"position": 808000,
"prompt": null
}
]
}
================================================
FILE: app/src/main/assets/h_keyframes/README.md
================================================
# 关键H帧
## 何为关键H帧?
就是影片到达「**顶点**」的那一刻。
还在因为不能和影片内「顶点」同步,而不停地记着「顶点」的时刻然后看进度条卡时间同步吗?
现在你可能不需要了。如果你开启了该功能(默认开启),并且在影片内**手动标记**每一个关键H帧,它会在 5-30s
前在屏幕**左上角**倒计时提醒(可调整)。在 0-1s 时,会精确到一位小数,方便你更好的控制时间。
此外,还提供了**共享关键H帧集**。这些关键H帧是内置于软件里的,来源于贡献者在 GitHub
上的补充。目前是随着版本更新(或 CI 实时更新)来更新共享关键H帧集,暂时不考虑服务器在线共享之类的(太危险)。
[共享关键库位置](./)
## 须知
1. 中字候补(生肉,字幕未上传)时**不要**上传,因为出字幕后可能会与未出字幕前**有一定的时间差**,导致时间不准。
2. 每一个关键H帧的`prompt`尽可能短,因为太长会影响观看。
3. 两个关键H帧必须**间隔 5s 及以上**!
## 怎么共享关键H帧?
> 注意:共享关键H帧是无法在程序内部修改的,只可读。
### Fork & Clone
先把我项目 Fork 了,然后从你项目里 Clone 到本地。
fork 仓库步骤:
1. 登录GitHub账号,进入要fork的仓库页面。
2. 点击右上角的“Fork”按钮。
3. 等待一段时间后,就可以在个人的GitHub仓库中看到已经fork过来的仓库。
clone 仓库步骤:
1. 在要clone的仓库页面上找到“clone with HTTPS”或“clone with SSH”按钮,并复制HTTPS或SSH地址。
2. 在本地打开终端(或命令行界面),进入要存放仓库的文件夹。
3. 输入命令 `git clone <复制的仓库地址>`,其中`<复制的仓库地址>`替换为刚才复制的地址。
4. 等待一段时间后,就可以在本地文件夹中看到已经克隆过来的仓库。
以上步骤完成后,就可以在本地使用这个仓库了。
### 创建文件
在该 md 文件所处的文件夹下创建一个 JSON 文件,命名为 `<影片代号>.json`。
该影片代号从哪里来呢?举个例子,你所看的番,网址是`https://hanime1.me/watch?v=37453`
,它的代号就是`v=`后面的`37453`。如果你想共享该影片的关键H帧,你需要创建名为`37453.json`的文件。
### 了解并编写 JSON 结构
以代号为`84711`的影片为例(内容我乱填的),就按这个格式写:
```json
{
"videoCode": "84711",
"group": "aaa",
"title": "abc",
"episode": 1,
"author": "yenaly",
"keyframes": [
{
"position": 1000000,
"prompt": "abc"
},
{
"position": 2000000,
"prompt": null
}
]
}
```
介绍一下每一个键值是干什么的:
> 注意-1:`author`为`null`时代表个人本地储存的,不为空才代表是共享的。所以不允许 JSON 文件里出现`null`的`author`。
>
> 注意-2:编写前务必查询当前已上传的关键H帧是否存在。假设有一人已上传 AAA 的第一集,group 名为`aaa`,title 为`aaa-01`,你也要按照他的方式进行修改,不要自行更改 group 名为`AAA`。如果你觉得你的命名更准确、更优质,也可以选择将其所有当前系列的group名和title名一起修改。
| 键 | 值类型 | 作用 |
| --------- | ----------------- | ------------------------------------------------------------ |
| videoCode | string (not null) | 影片代号,用于识别影片 |
| group | string (nullable) | 影片系列名称,用于影片分组,为 null 代表无系列 |
| title | string (not null) | 影片标题,看得清晰些 |
| episode | number | 影片集数,如果无系列请填 0 |
| author | string (not null) | 关键H帧作者,也就是你,**而不是**影片作者! |
| keyframes | array | 关键H帧列表 |
| position | number | 「顶点」位置,怎么获取下面说,两个 position 必须间隔 5s 及以上 |
| prompt | string (nullable) | 「顶点」提示,最好少于五个字,或 null |
#### 怎么获取「顶点」位置?
首先要打开关键H帧功能,然后进入该影片全屏界面,在「顶点」处暂停,长按选单栏的`🥵`按钮,会弹出一个窗口,例如:
> ......
>
> 当前时刻:1830ms
此时,`1830`就是你所需要填写的`position`数值。同时,你也可以在此时保存到你的个人本地关键H帧中。
### Commit & Push
将代码提交到本地仓库和推送到远程仓库的步骤如下:
commit 到本地仓库:
1. 在本地文件夹中找到要修改的代码文件。
2. 对代码进行修改、添加或删除。
3. 使用命令 `git add <文件名>` 将修改后的文件添加到暂存区,也可以使用 `git add .` 将所有修改后的文件添加到暂存区。
4. 使用命令 `git commit -m "<提交信息>"` 提交暂存区的文件到本地仓库,其中 `<提交信息>` 是本次提交的说明。
push 到远程仓库:
1. 使用命令 `git push origin <分支名>` 将当前分支推送到远程仓库,其中 `<分支名>`
是要推送的分支名称。例如,如果要将当前分支推送到远程主机的 master
分支,可以输入 `git push origin master`。
以上步骤完成后,就可以将代码从本地仓库推送到远程仓库了。
> 注意,提交信息的格式为:`[HKeyframe] 添加/修改/删除 <影片名称>`
>
> 简繁都行,英文也行。
>
> 例如:`[HKeyframe] 添加 初恋时间系列`
### Pull Request
从我本体的 Pull Request 里提交合并请求,如果没什么大问题就合并了。
以下是Pull Request的步骤:
1. 确认分支:首先,确保你已经在本地仓库中创建了一个新的分支,并且在该分支上进行了修改。
2. 创建远程分支:将本地分支推送到远程仓库中,可以使用 `git push -u origin <分支名>`
命令,其中 `<分支名>` 是当前分支的名称。
3. 打开 GitHub 页面:在浏览器中打开目标仓库的页面,并切换到要合并的分支。
4. 创建 Pull Request:在页面上找到 “New Pull Request” 按钮,点击后会出现一个新的页面,其中包含了你推送的分支和目标仓库的信息。
5. 填写 Pull Request 信息:在新页面中,可以填写一些关于 Pull Request
的信息,例如标题、描述、标签等。这些信息可以帮助其他人更好地理解你提交的代码修改。
6. 提交 Pull Request:最后,点击 “Create Pull Request” 按钮提交 Pull Request。
7. 等待审核:一旦提交了 Pull Request,等我审核你的修改。如果审核通过,你的修改将合并到目标仓库中。
================================================
FILE: app/src/main/assets/search_options/brands.json
================================================
[
{
"name": "妄想実現めでぃあ",
"search_key": "妄想実現めでぃあ"
},
{
"name": "メリー・ジェーン",
"search_key": "メリー・ジェーン"
},
{
"name": "ピンクパイナップル",
"search_key": "ピンクパイナップル"
},
{
"name": "ばにぃうぉ~か~",
"search_key": "ばにぃうぉ~か~"
},
{
"name": "Queen Bee",
"search_key": "Queen Bee"
},
{
"name": "PoRO",
"search_key": "PoRO"
},
{
"name": "せるふぃっしゅ",
"search_key": "せるふぃっしゅ"
},
{
"name": "鈴木みら乃",
"search_key": "鈴木みら乃"
},
{
"name": "ショーテン",
"search_key": "ショーテン"
},
{
"name": "GOLD BEAR",
"search_key": "GOLD BEAR"
},
{
"name": "ZIZ",
"search_key": "ZIZ"
},
{
"name": "EDGE",
"search_key": "EDGE"
},
{
"name": "Collaboration Works",
"search_key": "Collaboration Works"
},
{
"name": "BOOTLEG",
"search_key": "BOOTLEG"
},
{
"name": "BOMB!CUTE!BOMB!",
"search_key": "BOMB!CUTE!BOMB!"
},
{
"name": "nur",
"search_key": "nur"
},
{
"name": "あんてきぬすっ",
"search_key": "あんてきぬすっ"
},
{
"name": "魔人",
"search_key": "魔人"
},
{
"name": "ルネ",
"search_key": "ルネ"
},
{
"name": "Princess Sugar",
"search_key": "Princess Sugar"
},
{
"name": "パシュミナ",
"search_key": "パシュミナ"
},
{
"name": "WHITE BEAR",
"search_key": "WHITE BEAR"
},
{
"name": "AniMan",
"search_key": "AniMan"
},
{
"name": "chippai",
"search_key": "chippai"
},
{
"name": "トップマーシャル",
"search_key": "トップマーシャル"
},
{
"name": "erozuki",
"search_key": "erozuki"
},
{
"name": "サークルトリビュート",
"search_key": "サークルトリビュート"
},
{
"name": "spermation",
"search_key": "spermation"
},
{
"name": "Milky",
"search_key": "Milky"
},
{
"name": "King Bee",
"search_key": "King Bee"
},
{
"name": "PashminaA",
"search_key": "PashminaA"
},
{
"name": "じゅうしぃまんご~",
"search_key": "じゅうしぃまんご~"
},
{
"name": "Hills",
"search_key": "Hills"
},
{
"name": "妄想専科",
"search_key": "妄想専科"
},
{
"name": "ディスカバリー",
"search_key": "ディスカバリ���"
},
{
"name": "ひまじん",
"search_key": "ひまじん"
},
{
"name": "37℃",
"search_key": "37℃"
},
{
"name": "schoolzone",
"search_key": "schoolzone"
},
{
"name": "GREEN BUNNY",
"search_key": "GREEN BUNNY"
},
{
"name": "バニラ",
"search_key": "バニラ"
},
{
"name": "L.",
"search_key": "L."
},
{
"name": "PIXY",
"search_key": "PIXY"
},
{
"name": "こっとんど~る",
"search_key": "こっとんど~る"
},
{
"name": "ANIMAC",
"search_key": "ANIMAC"
},
{
"name": "Celeb",
"search_key": "Celeb"
},
{
"name": "MOON ROCK",
"search_key": "MOON ROCK"
},
{
"name": "Dream",
"search_key": "Dream"
},
{
"name": "ミンク",
"search_key": "ミンク"
},
{
"name": "オズ・インク",
"search_key": "オズ・インク"
},
{
"name": "サン出版",
"search_key": "サン出版"
},
{
"name": "ポニーキャニオン",
"search_key": "ポニーキャニオン"
},
{
"name": "わるきゅ~れ++",
"search_key": "わるきゅ~れ++"
},
{
"name": "株式会社虎の穴",
"search_key": "株式会社虎の穴"
},
{
"name": "エンゼルフィッシュ",
"search_key": "エンゼルフィッシュ"
},
{
"name": "UNION-CHO",
"search_key": "UNION-CHO"
},
{
"name": "TOHO",
"search_key": "TOHO"
},
{
"name": "ミルクセーキ",
"search_key": "ミルクセーキ"
},
{
"name": "2匹目のどぜう",
"search_key": "2匹目のどぜう"
},
{
"name": "じゅうしぃまんご~",
"search_key": "じゅうしぃまんご~"
},
{
"name": "ツクルノモリ",
"search_key": "ツクルノモリ"
},
{
"name": "サークルトリビュート",
"search_key": "サークルトリビュート"
},
{
"name": "トップマーシャル",
"search_key": "トップマーシャル"
},
{
"name": "彗星社",
"search_key": "彗星社"
},
{
"name": "ナチュラルハイ",
"search_key": "ナチュラルハイ"
},
{
"name": "れもんは~と",
"search_key": "れもんは~と"
}
]
================================================
FILE: app/src/main/assets/search_options/duration.json
================================================
[
{
"lang": {
"zh-rCN": "全部",
"en": "All",
"zh-rTW": "全部"
},
"search_key": null
},
{
"lang": {
"zh-rCN": "1分钟+",
"en": "1 min+",
"zh-rTW": "1分鐘+"
},
"search_key": "1 分鐘 +"
},
{
"lang": {
"zh-rCN": "5分钟+",
"en": "5 min+",
"zh-rTW": "5分鐘+"
},
"search_key": "5 分鐘 +"
},
{
"lang": {
"zh-rCN": "10分钟+",
"en": "10 min+",
"zh-rTW": "10分鐘+"
},
"search_key": "10 分鐘 +"
},
{
"lang": {
"zh-rCN": "20分钟+",
"en": "20 min+",
"zh-rTW": "20分鐘+"
},
"search_key": "20 分鐘 +"
},
{
"lang": {
"zh-rCN": "30分钟+",
"en": "30 min+",
"zh-rTW": "30分鐘+"
},
"search_key": "30 分鐘 +"
},
{
"lang": {
"zh-rCN": "60分钟+",
"en": "60 min+",
"zh-rTW": "60分鐘+"
},
"search_key": "60 分鐘 +"
},
{
"lang": {
"zh-rCN": "0-10分钟",
"en": "0-10 min",
"zh-rTW": "0-10分鐘"
},
"search_key": "0 - 10 分鐘"
},
{
"lang": {
"zh-rCN": "0-20分钟",
"en": "0-20 min",
"zh-rTW": "0-20分鐘"
},
"search_key": "0 - 20 分鐘"
}
]
================================================
FILE: app/src/main/assets/search_options/genre.json
================================================
[
{
"lang": {
"zh-rCN": "全部",
"en": "All",
"zh-rTW": "全部"
},
"search_key": "全部"
},
{
"lang": {
"zh-rCN": "里番",
"en": "Hentai",
"zh-rTW": "裏番"
},
"search_key": "裏番"
},
{
"lang": {
"zh-rCN": "泡面番",
"en": "Short Anime",
"zh-rTW": "泡麵番"
},
"search_key": "泡麵番"
},
{
"lang": {
"zh-rCN": "Motion Anime",
"en": "Motion Anime",
"zh-rTW": "Motion Anime"
},
"search_key": "Motion Anime"
},
{
"lang": {
"zh-rCN": "3D动画",
"en": "3D Animation",
"zh-rTW": "3D動畫"
},
"search_key": "3D動畫"
},
{
"lang": {
"zh-rCN": "同人作品",
"en": "Doujin",
"zh-rTW": "同人作品"
},
"search_key": "同人作品"
},
{
"lang": {
"zh-rCN": "MMD",
"en": "MMD",
"zh-rTW": "MMD"
},
"search_key": "MMD"
},
{
"lang": {
"zh-rCN": "Cosplay",
"en": "Cosplay",
"zh-rTW": "Cosplay"
},
"search_key": "Cosplay"
}
]
================================================
FILE: app/src/main/assets/search_options/sort_option.json
================================================
[
{
"lang": {
"zh-rCN": "最新上市",
"en": "New Arrival",
"zh-rTW": "最新上市"
},
"search_key": "最新上市"
},
{
"lang": {
"zh-rCN": "最新上傳",
"en": "New Upload",
"zh-rTW": "最新上傳"
},
"search_key": "最新上傳"
},
{
"lang": {
"zh-rCN": "本日排行",
"en": "Daily Ranking",
"zh-rTW": "本日排行"
},
"search_key": "本日排行"
},
{
"lang": {
"zh-rCN": "本週排行",
"en": "Weekly Ranking",
"zh-rTW": "本週排行"
},
"search_key": "本週排行"
},
{
"lang": {
"zh-rCN": "本月排行",
"en": "Monthly Ranking",
"zh-rTW": "本月排行"
},
"search_key": "本月排行"
},
{
"lang": {
"zh-rCN": "观看次数",
"en": "View Count",
"zh-rTW": "觀看次數"
},
"search_key": "觀看次數"
},
{
"lang": {
"zh-rCN": "点赞比例",
"en": "Like Proportion",
"zh-rTW": "讚好比例"
},
"search_key": "讚好比例"
},
{
"lang": {
"zh-rCN": "时长最长",
"en": "longest Duration",
"zh-rTW": "時長最長"
},
"search_key": "時長最長"
},
{
"lang": {
"zh-rCN": "他们在看",
"en": "Trending",
"zh-rTW": "他們在看"
},
"search_key": "他們在看"
}
]
================================================
FILE: app/src/main/assets/search_options/tags.json
================================================
{
"video_attributes": [
{
"lang": {
"zh-rCN": "无码",
"en": "Uncensored",
"zh-rTW": "無碼"
},
"search_key": "無碼"
},
{
"lang": {
"zh-rCN": "AI解码",
"en": "AI Decoded",
"zh-rTW": "AI解碼"
},
"search_key": "AI解碼"
},
{
"lang": {
"zh-rCN": "中文字幕",
"en": "Chinese Subtitle",
"zh-rTW": "中文字幕"
},
"search_key": "中文字幕"
},
{
"lang": {
"zh-rCN": "1080P",
"en": "1080P",
"zh-rTW": "1080P"
},
"search_key": "1080P"
},
{
"lang": {
"zh-rCN": "60FPS",
"en": "60FPS",
"zh-rTW": "60FPS"
},
"search_key": "60FPS"
},
{
"lang": {
"zh-rCN": "ASMR",
"en": "ASMR",
"zh-rTW": "ASMR"
},
"search_key": "ASMR"
},
{
"lang": {
"zh-rCN": "断面图",
"en": "Sectional View",
"zh-rTW": "斷面圖"
},
"search_key": "斷面圖"
}
],
"character_relationships": [
{
"lang": {
"zh-rCN": "近亲",
"en": "Incest",
"zh-rTW": "近親"
},
"search_key": "近親"
},
{
"lang": {
"zh-rCN": "姐",
"en": "Elder Sister",
"zh-rTW": "姐"
},
"search_key": "姐"
},
{
"lang": {
"zh-rCN": "妹",
"en": "Younger Sister",
"zh-rTW": "妹"
},
"search_key": "妹"
},
{
"lang": {
"zh-rCN": "母",
"en": "Mother",
"zh-rTW": "母"
},
"search_key": "母"
},
{
"lang": {
"zh-rCN": "女儿",
"en": "Daughter",
"zh-rTW": "女兒"
},
"search_key": "女兒"
},
{
"lang": {
"zh-rCN": "师生",
"en": "Teacher Student",
"zh-rTW": "師生"
},
"search_key": "師生"
},
{
"lang": {
"zh-rCN": "情侣",
"en": "Couple",
"zh-rTW": "情侶"
},
"search_key": "情侶"
},
{
"lang": {
"zh-rCN": "青梅竹马",
"en": "Childhood Friend",
"zh-rTW": "青梅竹馬"
},
"search_key": "青梅竹馬"
},
{
"lang": {
"zh-rCN": "同事",
"en": "Colleague",
"zh-rTW": "同事"
},
"search_key": "同事"
}
],
"characteristics": [
{
"lang": {
"zh-rCN": "JK",
"zh-rTW": "JK"
},
"search_key": "JK"
},
{
"lang": {
"zh-rCN": "处女",
"en": "virgin",
"zh-rTW": "處女"
},
"search_key": "處女"
},
{
"lang": {
"zh-rCN": "御姐",
"en": "Royal sister",
"zh-rTW": "御姐"
},
"search_key": "御姐"
},
{
"lang": {
"zh-rCN": "熟女",
"en": "MILF",
"zh-rTW": "熟女"
},
"search_key": "熟女"
},
{
"lang": {
"zh-rCN": "人妻",
"en": "wife",
"zh-rTW": "人妻"
},
"search_key": "人妻"
},
{
"lang": {
"zh-rCN": "女教师",
"en": "female teacher",
"zh-rTW": "女教師"
},
"search_key": "女教師"
},
{
"lang": {
"zh-rCN": "男教师",
"en": "male teacher ",
"zh-rTW": "男教師"
},
"search_key": "男教師"
},
{
"lang": {
"zh-rCN": "女医生",
"en": "female doctor",
"zh-rTW": "女醫生"
},
"search_key": "女醫生"
},
{
"lang": {
"zh-rCN": "女病人",
"en": "female patient",
"zh-rTW": "女病人"
},
"search_key": "女病人"
},
{
"lang": {
"zh-rCN": "护士",
"en": "Nurse",
"zh-rTW": "護士"
},
"search_key": "護士"
},
{
"lang": {
"zh-rCN": "OL",
"zh-rTW": "OL"
},
"search_key": "OL"
},
{
"lang": {
"zh-rCN": "女警",
"en": "policewoman",
"zh-rTW": "女警"
},
"search_key": "女警"
},
{
"lang": {
"zh-rCN": "大小姐",
"en": "Miss",
"zh-rTW": "大小姐"
},
"search_key": "大小姐"
},
{
"lang": {
"zh-rCN": "偶像",
"en": "idol",
"zh-rTW": "偶像"
},
"search_key": "偶像"
},
{
"lang": {
"zh-rCN": "女仆",
"en": "maid",
"zh-rTW": "女僕"
},
"search_key": "女僕"
},
{
"lang": {
"zh-rCN": "巫女",
"en": "miko",
"zh-rTW": "巫女"
},
"search_key": "巫女"
},
{
"lang": {
"zh-rCN": "魔女",
"en": "Witch",
"zh-rTW": "魔女"
},
"search_key": "魔女"
},
{
"lang": {
"zh-rCN": "修女",
"en": "nun",
"zh-rTW": "修女"
},
"search_key": "修女"
},
{
"lang": {
"zh-rCN": "风俗娘",
"en": "custom girl",
"zh-rTW": "風俗娘"
},
"search_key": "風俗娘"
},
{
"lang": {
"zh-rCN": "公主",
"en": "princess",
"zh-rTW": "公主"
},
"search_key": "公主"
},
{
"lang": {
"zh-rCN": "女忍者",
"en": "female ninja",
"zh-rTW": "女忍者"
},
"search_key": "女忍者"
},
{
"lang": {
"zh-rCN": "女战士",
"en": "female warrior",
"zh-rTW": "女戰士"
},
"search_key": "女戰士"
},
{
"lang": {
"zh-rCN": "女骑士",
"en": "female knight",
"zh-rTW": "女騎士"
},
"search_key": "女騎士"
},
{
"lang": {
"zh-rCN": "魔法少女",
"en": "magical girl",
"zh-rTW": "魔法少女"
},
"search_key": "魔法少女"
},
{
"lang": {
"zh-rCN": "异种族",
"en": "interracial",
"zh-rTW": "異種族"
},
"search_key": "異種族"
},
{
"lang": {
"zh-rCN": "天使",
"en": "Angel",
"zh-rTW": "天使"
},
"search_key": "天使"
},
{
"lang": {
"zh-rCN": "妖精",
"en": "goblin",
"zh-rTW": "妖精"
},
"search_key": "妖精"
},
{
"lang": {
"zh-rCN": "魔物娘",
"en": "monster girl",
"zh-rTW": "魔物娘"
},
"search_key": "魔物娘"
},
{
"lang": {
"zh-rCN": "魅魔",
"en": "succubus",
"zh-rTW": "魅魔"
},
"search_key": "魅魔"
},
{
"lang": {
"zh-rCN": "吸血鬼",
"en": "vampire",
"zh-rTW": "吸血鬼"
},
"search_key": "吸血鬼"
},
{
"lang": {
"zh-rCN": "女鬼",
"en": "ghost woman",
"zh-rTW": "女鬼"
},
"search_key": "女鬼"
},
{
"lang": {
"zh-rCN": "兽娘",
"en": "Beast Girl",
"zh-rTW": "獸娘"
},
"search_key": "獸娘"
},
{
"lang": {
"zh-rCN": "乳牛",
"en": "dairy cow",
"zh-rTW": "乳牛"
},
"search_key": "乳牛"
},
{
"lang": {
"zh-rCN": "机械娘",
"en": "Mechanical girl",
"zh-rTW": "機械娘"
},
"search_key": "機械娘"
},
{
"lang": {
"zh-rCN": "碧池",
"en": "Bitike",
"zh-rTW": "碧池"
},
"search_key": "碧池"
},
{
"lang": {
"zh-rCN": "痴女",
"en": "Slut",
"zh-rTW": "痴女"
},
"search_key": "痴女"
},
{
"lang": {
"zh-rCN": "雌小鬼",
"en": "female imp",
"zh-rTW": "雌小鬼"
},
"search_key": "雌小鬼"
},
{
"lang": {
"zh-rCN": "不良少女",
"en": "bad girl",
"zh-rTW": "不良少女"
},
"search_key": "不良少女"
},
{
"lang": {
"zh-rCN": "傲娇",
"en": "Tsundere",
"zh-rTW": "傲嬌"
},
"search_key": "傲嬌"
},
{
"lang": {
"zh-rCN": "病娇",
"en": "yandere",
"zh-rTW": "病嬌"
},
"search_key": "病嬌"
},
{
"lang": {
"zh-rCN": "无口",
"en": "Mouthless",
"zh-rTW": "無口"
},
"search_key": "無口"
},
{
"lang": {
"zh-rCN": "无表情",
"en": "expressionless",
"zh-rTW": "無表情"
},
"search_key": "無表情"
},
{
"lang": {
"zh-rCN": "眼神死",
"en": "Dead eyes",
"zh-rTW": "眼神死"
},
"search_key": "眼神死"
},
{
"lang": {
"zh-rCN": "正太",
"en": "Shota",
"zh-rTW": "正太"
},
"search_key": "正太"
},
{
"lang": {
"zh-rCN": "伪娘",
"en": "femboy",
"zh-rTW": "偽娘"
},
"search_key": "偽娘"
},
{
"lang": {
"zh-rCN": "扶他",
"en": "Help him",
"zh-rTW": "扶他"
},
"search_key": "扶他"
}
],
"appearance_and_figure": [
{
"lang": {
"zh-rCN": "短发",
"zh-rTW": "短髮",
"en": "Short Hair"
},
"search_key": "短髮"
},
{
"lang": {
"zh-rCN": "马尾",
"zh-rTW": "馬尾",
"en": "Ponytail"
},
"search_key": "馬尾"
},
{
"lang": {
"zh-rCN": "双马尾",
"zh-rTW": "雙馬尾",
"en": "Twin Tails"
},
"search_key": "雙馬尾"
},
{
"lang": {
"zh-rCN": "巨乳",
"zh-rTW": "巨乳",
"en": "Large Breasts"
},
"search_key": "巨乳"
},
{
"lang": {
"zh-rCN": "乳环",
"zh-rTW": "乳環",
"en": "Nipple Ring"
},
"search_key": "乳環"
},
{
"lang": {
"zh-rCN": "舌环",
"zh-rTW": "舌環",
"en": "Tongue Ring"
},
"search_key": "舌環"
},
{
"lang": {
"zh-rCN": "贫乳",
"zh-rTW": "貧乳",
"en": "Small Breasts"
},
"search_key": "貧乳"
},
{
"lang": {
"zh-rCN": "黑皮肤",
"zh-rTW": "黑皮膚",
"en": "Dark Skin"
},
"search_key": "黑皮膚"
},
{
"lang": {
"zh-rCN": "晒痕",
"zh-rTW": "曬痕",
"en": "Tan Lines"
},
"search_key": "曬痕"
},
{
"lang": {
"zh-rCN": "眼镜娘",
"zh-rTW": "眼鏡娘",
"en": "Girl with Glasses"
},
"search_key": "眼鏡娘"
},
{
"lang": {
"zh-rCN": "兽耳",
"zh-rTW": "獸耳",
"en": "Animal Ears"
},
"search_key": "獸耳"
},
{
"lang": {
"zh-rCN": "尖耳朵",
"zh-rTW": "尖耳朵",
"en": "Pointed Ears"
},
"search_key": "尖耳朵"
},
{
"lang": {
"zh-rCN": "异色瞳",
"zh-rTW": "異色瞳",
"en": "Heterochromia"
},
"search_key": "異色瞳"
},
{
"lang": {
"zh-rCN": "美人痣",
"zh-rTW": "美人痣",
"en": "Beauty Mark"
},
"search_key": "美人痣"
},
{
"lang": {
"zh-rCN": "肌肉女",
"zh-rTW": "肌肉女",
"en": "Muscular Female"
},
"search_key": "肌肉女"
},
{
"lang": {
"zh-rCN": "白虎",
"zh-rTW": "白虎",
"en": "Hairless"
},
"search_key": "白虎"
},
{
"lang": {
"zh-rCN": "阴毛",
"zh-rTW": "陰毛",
"en": "Pubic Hair"
},
"search_key": "陰毛"
},
{
"lang": {
"zh-rCN": "腋毛",
"zh-rTW": "腋毛",
"en": "Armpit Hair"
},
"search_key": "腋毛"
},
{
"lang": {
"zh-rCN": "大屌",
"zh-rTW": "大屌",
"en": "Big Dick"
},
"search_key": "大屌"
},
{
"lang": {
"zh-rCN": "水手服",
"zh-rTW": "水手服",
"en": "Sailor Uniform"
},
"search_key": "水手服"
},
{
"lang": {
"zh-rCN": "体操服",
"zh-rTW": "體操服",
"en": "Gym Uniform"
},
"search_key": "體操服"
},
{
"lang": {
"zh-rCN": "泳装",
"zh-rTW": "泳裝",
"en": "Swimsuit"
},
"search_key": "泳裝"
},
{
"lang": {
"zh-rCN": "比基尼",
"zh-rTW": "比基尼",
"en": "Bikini"
},
"search_key": "比基尼"
},
{
"lang": {
"zh-rCN": "死库水",
"zh-rTW": "死庫水",
"en": "School Swimsuit"
},
"search_key": "死庫水"
},
{
"lang": {
"zh-rCN": "和服",
"zh-rTW": "和服",
"en": "Kimono"
},
"search_key": "和服"
},
{
"lang": {
"zh-rCN": "兔女郎",
"zh-rTW": "兔女郎",
"en": "Bunny Girl"
},
"search_key": "兔女郎"
},
{
"lang": {
"zh-rCN": "围裙",
"zh-rTW": "圍裙",
"en": "Apron"
},
"search_key": "圍裙"
},
{
"lang": {
"zh-rCN": "啦啦队",
"zh-rTW": "啦啦隊",
"en": "Cheerleader"
},
"search_key": "啦啦隊"
},
{
"lang": {
"zh-rCN": "丝袜",
"zh-rTW": "絲襪",
"en": "Stockings"
},
"search_key": "絲襪"
},
{
"lang": {
"zh-rCN": "吊袜带",
"zh-rTW": "吊襪帶",
"en": "Garter Belt"
},
"search_key": "吊襪帶"
},
{
"lang": {
"zh-rCN": "热裤",
"zh-rTW": "熱褲",
"en": "Short Shorts"
},
"search_key": "熱褲"
},
{
"lang": {
"zh-rCN": "迷你裙",
"zh-rTW": "迷你裙",
"en": "Miniskirt"
},
"search_key": "迷你裙"
},
{
"lang": {
"zh-rCN": "性感内衣",
"zh-rTW": "性感內衣",
"en": "Sexy Lingerie"
},
"search_key": "性感內衣"
},
{
"lang": {
"zh-rCN": "紧身衣",
"zh-rTW": "緊身衣",
"en": "Bodysuit"
},
"search_key": "緊身衣"
},
{
"lang": {
"zh-rCN": "丁字裤",
"zh-rTW": "丁字褲",
"en": "Thong"
},
"search_key": "丁字褲"
},
{
"lang": {
"zh-rCN": "高跟鞋",
"zh-rTW": "高跟鞋",
"en": "High Heels"
},
"search_key": "高跟鞋"
},
{
"lang": {
"zh-rCN": "婚纱",
"zh-rTW": "婚紗",
"en": "Wedding Dress"
},
"search_key": "婚紗"
},
{
"lang": {
"zh-rCN": "旗袍",
"zh-rTW": "旗袍",
"en": "Cheongsam"
},
"search_key": "旗袍"
},
{
"lang": {
"zh-rCN": "古装",
"zh-rTW": "古裝",
"en": "Traditional Chinese Clothing"
},
"search_key": "古裝"
},
{
"lang": {
"zh-rCN": "哥德萝莉塔",
"zh-rTW": "哥德蘿莉塔",
"en": "Gothic Lolita"
},
"search_key": "哥德蘿莉塔"
},
{
"lang": {
"zh-rCN": "口罩",
"zh-rTW": "口罩",
"en": "Mask"
},
"search_key": "口罩"
},
{
"lang": {
"zh-rCN": "刺青",
"zh-rTW": "刺青",
"en": "Tattoo"
},
"search_key": "刺青"
},
{
"lang": {
"zh-rCN": "淫纹",
"zh-rTW": "淫紋",
"en": "Lewd Tattoo"
},
"search_key": "淫紋"
},
{
"lang": {
"zh-rCN": "身体写字",
"zh-rTW": "身體寫字",
"en": "Body Writing"
},
"search_key": "身體寫字"
}
],
"story_plot": [
{
"lang": {
"zh-rCN": "纯爱",
"en": "pure love",
"zh-rTW": "純愛"
},
"search_key": "纯爱"
},
{
"lang": {
"zh-rCN": "恋爱喜剧",
"en": "romantic comedy",
"zh-rTW": "戀愛喜劇"
},
"search_key": "恋爱喜剧"
},
{
"lang": {
"zh-rCN": "后宫",
"en": "harem",
"zh-rTW": "後宮"
},
"search_key": "后宫"
},
{
"lang": {
"zh-rCN": "开大车",
"en": "drive big",
"zh-rTW": "開大車"
},
"search_key": "开大车"
},
{
"lang": {
"zh-rCN": "校园",
"en": "campus",
"zh-rTW": "校園"
},
"search_key": "校园"
},
{
"lang": {
"zh-rCN": "教室",
"en": "classroom",
"zh-rTW": "教室"
},
"search_key": "教室"
},
{
"lang": {
"zh-rCN": "公众场合",
"en": "public places",
"zh-rTW": "公眾場合"
},
"search_key": "公众场合"
},
{
"lang": {
"zh-rCN": "公共厕所",
"en": "public toilet",
"zh-rTW": "公共廁所"
},
"search_key": "公共厕所"
},
{
"lang": {
"zh-rCN": "NTR",
"zh-rTW": "NTR"
},
"search_key": "NTR"
},
{
"lang": {
"zh-rCN": "精神控制",
"en": "mind control",
"zh-rTW": "精神控制"
},
"search_key": "精神控制"
},
{
"lang": {
"zh-rCN": "药物",
"en": "drug",
"zh-rTW": "藥物"
},
"search_key": "药物"
},
{
"lang": {
"zh-rCN": "痴汉",
"en": "Idiot",
"zh-rTW": "痴漢"
},
"search_key": "痴汉"
},
{
"lang": {
"zh-rCN": "阿嘿颜",
"en": "orgasm face",
"zh-rTW": "阿嘿顏"
},
"search_key": "阿嘿颜"
},
{
"lang": {
"zh-rCN": "精神崩溃",
"en": "nervous breakdown",
"zh-rTW": "精神崩潰"
},
"search_key": "精神崩溃"
},
{
"lang": {
"zh-rCN": "猎奇",
"en": "Curiosity",
"zh-rTW": "獵奇"
},
"search_key": "猎奇"
},
{
"lang": {
"zh-rCN": "BDSM",
"zh-rTW": "BDSM"
},
"search_key": "BDSM"
},
{
"lang": {
"zh-rCN": "捆绑",
"en": "bundle",
"zh-rTW": "綑綁"
},
"search_key": "捆绑"
},
{
"lang": {
"zh-rCN": "眼罩",
"en": "blindfold",
"zh-rTW": "眼罩"
},
"search_key": "眼罩"
},
{
"lang": {
"zh-rCN": "项圈",
"en": "collar",
"zh-rTW": "項圈"
},
"search_key": "项圈"
},
{
"lang": {
"zh-rCN": "调教",
"en": "training",
"zh-rTW": "調教"
},
"search_key": "调教"
},
{
"lang": {
"zh-rCN": "异物插入",
"en": "Foreign body insertion",
"zh-rTW": "異物插入"
},
"search_key": "异物插入"
},
{
"lang": {
"zh-rCN": "寻欢洞",
"en": "glory hole",
"zh-rTW": "尋歡洞"
},
"search_key": "寻欢洞"
},
{
"lang": {
"zh-rCN": "肉便器",
"en": "meat toilet",
"zh-rTW": "肉便器"
},
"search_key": "肉便器"
},
{
"lang": {
"zh-rCN": "性奴隶",
"en": "slave",
"zh-rTW": "性奴隸"
},
"search_key": "性奴隶"
},
{
"lang": {
"zh-rCN": "胃凸",
"en": "Stomach protrusion",
"zh-rTW": "胃凸"
},
"search_key": "胃凸"
},
{
"lang": {
"zh-rCN": "强制",
"en": "forced",
"zh-rTW": "強制"
},
"search_key": "强制"
},
{
"lang": {
"zh-rCN": "轮奸",
"en": "gang rape",
"zh-rTW": "輪姦"
},
"search_key": "轮奸"
},
{
"lang": {
"zh-rCN": "凌辱",
"en": "insult",
"zh-rTW": "凌辱"
},
"search_key": "凌辱"
},
{
"lang": {
"zh-rCN": "扯头发",
"en": "pull hair",
"zh-rTW": "扯頭髮"
},
"search_key": "扯头发"
},
{
"lang": {
"zh-rCN": "打屁股",
"en": "spanking",
"zh-rTW": "打屁股"
},
"search_key": "打屁股"
},
{
"lang": {
"zh-rCN": "肉棒打脸",
"en": "Cock slapping face",
"zh-rTW": "肉棒打臉"
},
"search_key": "肉棒打脸"
},
{
"lang": {
"zh-rCN": "性暴力",
"en": "sexual violence",
"zh-rTW": "性暴力"
},
"search_key": "性暴力"
},
{
"lang": {
"zh-rCN": "逆强制",
"en": "Counter coercion",
"zh-rTW": "逆強制"
},
"search_key": "逆强制"
},
{
"lang": {
"zh-rCN": "女王样",
"en": "Queenlike",
"zh-rTW": "女王樣"
},
"search_key": "女王样"
},
{
"lang": {
"zh-rCN": "母女丼",
"en": "Mother and Daughter Donburi",
"zh-rTW": "母女丼"
},
"search_key": "母女丼"
},
{
"lang": {
"zh-rCN": "姐妹丼",
"en": "Sisters' Donburi",
"zh-rTW": "姐妹丼"
},
"search_key": "姐妹丼"
},
{
"lang": {
"zh-rCN": "出轨",
"en": "Cheating",
"zh-rTW": "出軌"
},
"search_key": "出轨"
},
{
"lang": {
"zh-rCN": "醉酒",
"en": "Drunk",
"zh-rTW": "醉酒"
},
"search_key": "醉酒"
},
{
"lang": {
"zh-rCN": "摄影",
"en": "photography",
"zh-rTW": "攝影"
},
"search_key": "摄影"
},
{
"lang": {
"zh-rCN": "睡眠奸",
"en": "sleep rape",
"zh-rTW": "睡眠姦"
},
"search_key": "睡眠奸"
},
{
"lang": {
"zh-rCN": "机械奸",
"en": "Mechanical rape",
"zh-rTW": "機械姦"
},
"search_key": "机械奸"
},
{
"lang": {
"zh-rCN": "虫奸",
"en": "Insect rape",
"zh-rTW": "蟲姦"
},
"search_key": "虫奸"
},
{
"lang": {
"zh-rCN": "性转换",
"en": "sexual conversion",
"zh-rTW": "性轉換"
},
"search_key": "性转换"
},
{
"lang": {
"zh-rCN": "百合",
"en": "lily",
"zh-rTW": "百合"
},
"search_key": "百合"
},
{
"lang": {
"zh-rCN": "耽美",
"en": "BL",
"zh-rTW": "耽美"
},
"search_key": "耽美"
},
{
"lang": {
"zh-rCN": "时间停止",
"en": "time stop",
"zh-rTW": "時間停止"
},
"search_key": "时间停止"
},
{
"lang": {
"zh-rCN": "异世界",
"en": "Another World",
"zh-rTW": "異世界"
},
"search_key": "异世界"
},
{
"lang": {
"zh-rCN": "怪兽",
"en": "monster",
"zh-rTW": "怪獸"
},
"search_key": "怪兽"
},
{
"lang": {
"zh-rCN": "哥布林",
"en": "Goblin",
"zh-rTW": "哥布林"
},
"search_key": "哥布林"
},
{
"lang": {
"zh-rCN": "世界末日",
"en": "end of the world",
"zh-rTW": "世界末日"
},
"search_key": "世界末日"
}
],
"sex_positions": [
{
"lang": {
"zh-rCN": "手交",
"en": "handjob",
"zh-rTW": "手交"
},
"search_key": "手交"
},
{
"lang": {
"zh-rCN": "指交",
"en": "fingering",
"zh-rTW": "指交"
},
"search_key": "指交"
},
{
"lang": {
"zh-rCN": "乳交",
"en": "Titjob",
"zh-rTW": "乳交"
},
"search_key": "乳交"
},
{
"lang": {
"zh-rCN": "乳头交",
"en": "mammary intercourse",
"zh-rTW": "乳頭交"
},
"search_key": "乳頭交"
},
{
"lang": {
"zh-rCN": "肛交",
"en": "anal",
"zh-rTW": "肛交"
},
"search_key": "肛交"
},
{
"lang": {
"zh-rCN": "双洞齐下",
"en": "Double holes",
"zh-rTW": "雙洞齊下"
},
"search_key": "雙洞齊下"
},
{
"lang": {
"zh-rCN": "脚交",
"en": "footjob",
"zh-rTW": "腳交"
},
"search_key": "腳交"
},
{
"lang": {
"zh-rCN": "素股",
"en": "Plain stocks",
"zh-rTW": "素股"
},
"search_key": "素股"
},
{
"lang": {
"zh-rCN": "拳交",
"en": "fisting",
"zh-rTW": "拳交"
},
"search_key": "拳交"
},
{
"lang": {
"zh-rCN": "3P",
"zh-rTW": "3P"
},
"search_key": "3P"
},
{
"lang": {
"zh-rCN": "群交",
"en": "Group sex",
"zh-rTW": "群交"
},
"search_key": "群交"
},
{
"lang": {
"zh-rCN": "口交",
"en": "oral sex",
"zh-rTW": "口交"
},
"search_key": "口交"
},
{
"lang": {
"zh-rCN": "深喉咙",
"en": "Deep Throat",
"zh-rTW": "深喉嚨"
},
"search_key": "深喉嚨"
},
{
"lang": {
"zh-rCN": "口爆",
"en": "oral sex",
"zh-rTW": "口爆"
},
"search_key": "口爆"
},
{
"lang": {
"zh-rCN": "吞精",
"en": "swallow semen",
"zh-rTW": "吞精"
},
"search_key": "吞精"
},
{
"lang": {
"zh-rCN": "舔蛋蛋",
"en": "Licking balls",
"zh-rTW": "舔蛋蛋"
},
"search_key": "舔蛋蛋"
},
{
"lang": {
"zh-rCN": "舔穴",
"en": "Licking pussy",
"zh-rTW": "舔穴"
},
"search_key": "舔穴"
},
{
"lang": {
"zh-rCN": "69",
"zh-rTW": "69"
},
"search_key": "69"
},
{
"lang": {
"zh-rCN": "自慰",
"en": "masturbate",
"zh-rTW": "自慰"
},
"search_key": "自慰"
},
{
"lang": {
"zh-rCN": "腋交",
"en": "armpit sex",
"zh-rTW": "腋交"
},
"search_key": "腋交"
},
{
"lang": {
"zh-rCN": "舔腋下",
"en": "lick armpits",
"zh-rTW": "舔腋下"
},
"search_key": "舔腋下"
},
{
"lang": {
"zh-rCN": "发交",
"en": "Send",
"zh-rTW": "髮交"
},
"search_key": "髮交"
},
{
"lang": {
"zh-rCN": "舔耳朵",
"en": "Licking ears",
"zh-rTW": "舔耳朵"
},
"search_key": "舔耳朵"
},
{
"lang": {
"zh-rCN": "内射",
"en": "Creampie",
"zh-rTW": "內射"
},
"search_key": "內射"
},
{
"lang": {
"zh-rCN": "外射",
"en": "ejaculate externally",
"zh-rTW": "外射"
},
"search_key": "外射"
},
{
"lang": {
"zh-rCN": "颜射",
"en": "Facial cumshot",
"zh-rTW": "顏射"
},
"search_key": "顏射"
},
{
"lang": {
"zh-rCN": "潮吹",
"en": "squirt",
"zh-rTW": "潮吹"
},
"search_key": "潮吹"
},
{
"lang": {
"zh-rCN": "怀孕",
"en": "pregnant",
"zh-rTW": "懷孕"
},
"search_key": "懷孕"
},
{
"lang": {
"zh-rCN": "喷奶",
"en": "Squirt",
"zh-rTW": "噴奶"
},
"search_key": "噴奶"
},
{
"lang": {
"zh-rCN": "放尿",
"en": "urinate",
"zh-rTW": "放尿"
},
"search_key": "放尿"
},
{
"lang": {
"zh-rCN": "排便",
"en": "Defecation",
"zh-rTW": "排便"
},
"search_key": "排便"
},
{
"lang": {
"zh-rCN": "骑乘位",
"en": "riding",
"zh-rTW": "騎乘位"
},
"search_key": "騎乘位"
},
{
"lang": {
"zh-rCN": "背后位",
"en": "Behind back",
"zh-rTW": "背後位"
},
"search_key": "背後位"
},
{
"lang": {
"zh-rCN": "颜面骑乘",
"en": "Facesitting",
"zh-rTW": "顏面騎乘"
},
"search_key": "顏面騎乘"
},
{
"lang": {
"zh-rCN": "火车便当",
"en": "train lunch",
"zh-rTW": "火車便當"
},
"search_key": "火車便當"
},
{
"lang": {
"zh-rCN": "车震",
"en": "car shock",
"zh-rTW": "車震"
},
"search_key": "車震"
},
{
"lang": {
"zh-rCN": "性玩具",
"en": "sex toys",
"zh-rTW": "性玩具"
},
"search_key": "性玩具"
},
{
"lang": {
"zh-rCN": "飞机杯",
"en": "airplane cup",
"zh-rTW": "飛機杯"
},
"search_key": "飛機杯"
},
{
"lang": {
"zh-rCN": "跳蛋",
"en": "Vibrator",
"zh-rTW": "跳蛋"
},
"search_key": "跳蛋"
},
{
"lang": {
"zh-rCN": "毒龙钻",
"en": "Poison Dragon Diamond",
"zh-rTW": "毒龍鑽"
},
"search_key": "毒龍鑽"
},
{
"lang": {
"zh-rCN": "触手",
"en": "tentacle",
"zh-rTW": "觸手"
},
"search_key": "觸手"
},
{
"lang": {
"zh-rCN": "兽交",
"en": "bestiality",
"zh-rTW": "獸交"
},
"search_key": "獸交"
},
{
"lang": {
"zh-rCN": "颈手枷",
"en": "pillory",
"zh-rTW": "頸手枷"
},
"search_key": "頸手枷"
},
{
"lang": {
"zh-rCN": "着衣",
"en": "dress",
"zh-rTW": "著衣"
},
"search_key": "著衣"
},
{
"lang": {
"zh-rCN": "阴道外翻",
"en": "vaginal eversion",
"zh-rTW": "陰道外翻"
},
"search_key": "陰道外翻"
},
{
"lang": {
"zh-rCN": "接吻",
"en": "kiss",
"zh-rTW": "接吻"
},
"search_key": "接吻"
},
{
"lang": {
"zh-rCN": "舌吻",
"en": "French kiss",
"zh-rTW": "舌吻"
},
"search_key": "舌吻"
},
{
"lang": {
"zh-rCN": "POV",
"zh-rTW": "POV"
},
"search_key": "POV"
}
]
}
================================================
FILE: app/src/main/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: app/src/main/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: app/src/main/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: app/src/main/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: app/src/main/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.
gitextract_rimhsaes/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── custom.md
│ │ └── feature_request.yml
│ ├── PULL_REQUEST_TEMPLATE/
│ │ ├── bug_fix.md
│ │ ├── feature_addition.md
│ │ └── submit_h_keyframe.md
│ ├── dependabot.yml
│ └── workflows/
│ ├── ci.yml
│ ├── ci_release.yml
│ └── pr_check.yml
├── .gitignore
├── .idea/
│ ├── .gitignore
│ ├── .name
│ ├── AndroidProjectSystem.xml
│ ├── appInsightsSettings.xml
│ ├── codeStyles/
│ │ ├── Project.xml
│ │ └── codeStyleConfig.xml
│ ├── compiler.xml
│ ├── dbnavigator.xml
│ ├── deploymentTargetDropDown.xml
│ ├── deploymentTargetSelector.xml
│ ├── dictionaries/
│ │ └── wrzg8.xml
│ ├── gradle.xml
│ ├── inspectionProfiles/
│ │ └── Project_Default.xml
│ ├── kotlinc.xml
│ ├── ktlint-plugin.xml
│ ├── migrations.xml
│ ├── misc.xml
│ ├── render.experimental.xml
│ ├── runConfigurations.xml
│ ├── studiobot.xml
│ └── vcs.xml
├── LICENSE
├── README.md
├── README_TECH.md
├── app/
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── keystore/
│ │ └── Han1meViewerKeystore.jks
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── com/
│ │ └── yenaly/
│ │ └── han1meviewer/
│ │ └── ExampleInstrumentedTest.kt
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── assets/
│ │ │ ├── h_keyframes/
│ │ │ │ ├── 12444.json
│ │ │ │ ├── 14463.json
│ │ │ │ ├── 21806.json
│ │ │ │ ├── 22068.json
│ │ │ │ ├── 37176.json
│ │ │ │ ├── 37177.json
│ │ │ │ ├── 37178.json
│ │ │ │ ├── 37179.json
│ │ │ │ ├── 37220.json
│ │ │ │ ├── 37221.json
│ │ │ │ ├── 38387.json
│ │ │ │ ├── 38389.json
│ │ │ │ ├── 38457.json
│ │ │ │ ├── 38461.json
│ │ │ │ ├── 39192.json
│ │ │ │ ├── 39305.json
│ │ │ │ ├── 39306.json
│ │ │ │ ├── 39468.json
│ │ │ │ ├── 39811.json
│ │ │ │ ├── 84717.json
│ │ │ │ ├── 84718.json
│ │ │ │ ├── 85926.json
│ │ │ │ ├── 85927.json
│ │ │ │ ├── 87968.json
│ │ │ │ ├── 87969.json
│ │ │ │ ├── 89087.json
│ │ │ │ ├── 89088.json
│ │ │ │ └── README.md
│ │ │ ├── search_options/
│ │ │ │ ├── brands.json
│ │ │ │ ├── duration.json
│ │ │ │ ├── genre.json
│ │ │ │ ├── sort_option.json
│ │ │ │ └── tags.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
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── yenaly/
│ │ │ └── han1meviewer/
│ │ │ ├── Constants.kt
│ │ │ ├── FirebaseConstants.kt
│ │ │ ├── HAdvancedSearch.kt
│ │ │ ├── HCacheManager.kt
│ │ │ ├── HCrashHandler.kt
│ │ │ ├── HFileManager.kt
│ │ │ ├── HInitializer.kt
│ │ │ ├── HanimeApplication.kt
│ │ │ ├── HanimeManager.kt
│ │ │ ├── HanimeResolution.kt
│ │ │ ├── Preferences.kt
│ │ │ ├── VideoCoverSize.kt
│ │ │ ├── logic/
│ │ │ │ ├── DatabaseRepo.kt
│ │ │ │ ├── NetworkRepo.kt
│ │ │ │ ├── Parser.kt
│ │ │ │ ├── dao/
│ │ │ │ │ ├── DownloadDatabase.kt
│ │ │ │ │ ├── HKeyframeDao.kt
│ │ │ │ │ ├── HistoryDatabase.kt
│ │ │ │ │ ├── MiscellanyDatabase.kt
│ │ │ │ │ ├── SearchHistoryDao.kt
│ │ │ │ │ ├── WatchHistoryDao.kt
│ │ │ │ │ └── download/
│ │ │ │ │ ├── DownloadCategoryDao.kt
│ │ │ │ │ ├── HUpdateDao.kt
│ │ │ │ │ └── HanimeDownloadDao.kt
│ │ │ │ ├── entity/
│ │ │ │ │ ├── HKeyframeEntity.kt
│ │ │ │ │ ├── SearchHistoryEntity.kt
│ │ │ │ │ ├── WatchHistoryEntity.kt
│ │ │ │ │ └── download/
│ │ │ │ │ ├── DownloadCategoryEntity.kt
│ │ │ │ │ ├── HUpdateEntity.kt
│ │ │ │ │ ├── HanimeCategoryCrossRef.kt
│ │ │ │ │ ├── HanimeDownloadEntity.kt
│ │ │ │ │ └── VideoWithCategories.kt
│ │ │ │ ├── exception/
│ │ │ │ │ ├── CloudFlareBlockedException.kt
│ │ │ │ │ ├── HanimeNotFoundException.kt
│ │ │ │ │ ├── IPBlockedException.kt
│ │ │ │ │ └── ParseException.kt
│ │ │ │ ├── model/
│ │ │ │ │ ├── HanimeInfo.kt
│ │ │ │ │ ├── HanimePreview.kt
│ │ │ │ │ ├── HanimeVideo.kt
│ │ │ │ │ ├── HomePage.kt
│ │ │ │ │ ├── MultiItemEntity.kt
│ │ │ │ │ ├── MyListItems.kt
│ │ │ │ │ ├── ParamEnum.kt
│ │ │ │ │ ├── Playlists.kt
│ │ │ │ │ ├── SearchOption.kt
│ │ │ │ │ ├── SearchTag.kt
│ │ │ │ │ ├── Subscription.kt
│ │ │ │ │ ├── VideoComments.kt
│ │ │ │ │ └── github/
│ │ │ │ │ ├── Commit.kt
│ │ │ │ │ ├── Latest.kt
│ │ │ │ │ ├── Release.kt
│ │ │ │ │ └── Workflow.kt
│ │ │ │ ├── network/
│ │ │ │ │ ├── GitHubDns.kt
│ │ │ │ │ ├── HCookieJar.kt
│ │ │ │ │ ├── HDns.kt
│ │ │ │ │ ├── HProxySelector.kt
│ │ │ │ │ ├── HUpdater.kt
│ │ │ │ │ ├── HanimeNetwork.kt
│ │ │ │ │ ├── ServiceCreator.kt
│ │ │ │ │ ├── interceptor/
│ │ │ │ │ │ ├── SpeedLimitInterceptor.kt
│ │ │ │ │ │ ├── SpeedLimitResponseBody.kt
│ │ │ │ │ │ └── UserAgentInterceptor.kt
│ │ │ │ │ └── service/
│ │ │ │ │ ├── HGitHubService.kt
│ │ │ │ │ ├── HanimeBaseService.kt
│ │ │ │ │ ├── HanimeCommentService.kt
│ │ │ │ │ ├── HanimeMyListService.kt
│ │ │ │ │ └── HanimeSubscriptionService.kt
│ │ │ │ └── state/
│ │ │ │ ├── DownloadState.kt
│ │ │ │ ├── PageLoadingState.kt
│ │ │ │ ├── VideoLoadingState.kt
│ │ │ │ └── WebsiteState.kt
│ │ │ ├── ui/
│ │ │ │ ├── StateLayoutMixin.kt
│ │ │ │ ├── activity/
│ │ │ │ │ ├── DownloadActivity.kt
│ │ │ │ │ ├── LoginActivity.kt
│ │ │ │ │ ├── MainActivity.kt
│ │ │ │ │ ├── PreviewActivity.kt
│ │ │ │ │ ├── PreviewCommentActivity.kt
│ │ │ │ │ ├── SearchActivity.kt
│ │ │ │ │ ├── SettingsActivity.kt
│ │ │ │ │ ├── SettingsRouter.kt
│ │ │ │ │ └── VideoActivity.kt
│ │ │ │ ├── adapter/
│ │ │ │ │ ├── AdapterLikeDataBindingPage.kt
│ │ │ │ │ ├── BaseSingleDifferAdapter.kt
│ │ │ │ │ ├── FixedGridLayoutManager.kt
│ │ │ │ │ ├── HKeyframesRvAdapter.kt
│ │ │ │ │ ├── HRvItemAdapter.kt
│ │ │ │ │ ├── HSearchTagAdapter.kt
│ │ │ │ │ ├── HSubscriptionAdapter.kt
│ │ │ │ │ ├── HanimeDownloadedRvAdapter.kt
│ │ │ │ │ ├── HanimeDownloadingRvAdapter.kt
│ │ │ │ │ ├── HanimeMyListVideoAdapter.kt
│ │ │ │ │ ├── HanimePreviewNewsRvAdapter.kt
│ │ │ │ │ ├── HanimePreviewTourRvAdapter.kt
│ │ │ │ │ ├── HanimeSearchHistoryRvAdapter.kt
│ │ │ │ │ ├── HanimeUpdateRvAdapter.kt
│ │ │ │ │ ├── HanimeUpdatedRvAdapter.kt
│ │ │ │ │ ├── HanimeVideoRvAdapter.kt
│ │ │ │ │ ├── PlaylistRvAdapter.kt
│ │ │ │ │ ├── RvWrapper.kt
│ │ │ │ │ ├── SharedHKeyframesRvAdapter.kt
│ │ │ │ │ ├── SuperResolutionAdapter.kt
│ │ │ │ │ ├── VideoColumnTitleAdapter.kt
│ │ │ │ │ ├── VideoCommentRvAdapter.kt
│ │ │ │ │ ├── VideoSpeedAdapter.kt
│ │ │ │ │ └── WatchHistoryRvAdapter.kt
│ │ │ │ ├── fragment/
│ │ │ │ │ ├── IToolbarFragment.kt
│ │ │ │ │ ├── LoginNeededFragmentMixin.kt
│ │ │ │ │ ├── home/
│ │ │ │ │ │ ├── DownloadFragment.kt
│ │ │ │ │ │ ├── HomePageFragment.kt
│ │ │ │ │ │ ├── MyFavVideoFragment.kt
│ │ │ │ │ │ ├── MyPlaylistFragment.kt
│ │ │ │ │ │ ├── MyWatchLaterFragment.kt
│ │ │ │ │ │ ├── WatchHistoryFragment.kt
│ │ │ │ │ │ └── download/
│ │ │ │ │ │ ├── DownloadedFragment.kt
│ │ │ │ │ │ └── DownloadingFragment.kt
│ │ │ │ │ ├── search/
│ │ │ │ │ │ ├── HCheckBoxFragment.kt
│ │ │ │ │ │ ├── HMultiChoicesDialog.kt
│ │ │ │ │ │ ├── HTimePickerDialog.kt
│ │ │ │ │ │ └── SearchOptionsPopupFragment.kt
│ │ │ │ │ ├── settings/
│ │ │ │ │ │ ├── DownloadSettingsFragment.kt
│ │ │ │ │ │ ├── HKeyframeSettingsFragment.kt
│ │ │ │ │ │ ├── HKeyframesFragment.kt
│ │ │ │ │ │ ├── HomeSettingsFragment.kt
│ │ │ │ │ │ ├── NetworkSettingsFragment.kt
│ │ │ │ │ │ ├── PlayerSettingsFragment.kt
│ │ │ │ │ │ └── SharedHKeyframesFragment.kt
│ │ │ │ │ └── video/
│ │ │ │ │ ├── ChildCommentPopupFragment.kt
│ │ │ │ │ ├── CommentFragment.kt
│ │ │ │ │ └── VideoIntroductionFragment.kt
│ │ │ │ ├── popup/
│ │ │ │ │ ├── CoilImageLoader.kt
│ │ │ │ │ ├── HTimePickerPopup.kt
│ │ │ │ │ └── ReplyPopup.kt
│ │ │ │ ├── view/
│ │ │ │ │ ├── BlurTransformation.kt
│ │ │ │ │ ├── CenterLinearLayoutManager.kt
│ │ │ │ │ ├── CollapsibleTags.kt
│ │ │ │ │ ├── HOptionChip.kt
│ │ │ │ │ ├── HanimeSearchBar.kt
│ │ │ │ │ ├── HorizontalNestedScrollView.kt
│ │ │ │ │ ├── LinearSmoothToStartScroller.kt
│ │ │ │ │ ├── PlaylistHeader.kt
│ │ │ │ │ ├── funcbar/
│ │ │ │ │ │ ├── Hanidapter.kt
│ │ │ │ │ │ ├── Hanidock.kt
│ │ │ │ │ │ ├── Hanidokitem.kt
│ │ │ │ │ │ └── Hanidontroller.kt
│ │ │ │ │ ├── pref/
│ │ │ │ │ │ ├── HPrivacyPreference.kt
│ │ │ │ │ │ └── MaterialDialogPreference.kt
│ │ │ │ │ └── video/
│ │ │ │ │ ├── HJzvdStd.kt
│ │ │ │ │ ├── HMediaKernel.kt
│ │ │ │ │ ├── HanimeDataSource.kt
│ │ │ │ │ └── IMedia.kt
│ │ │ │ └── viewmodel/
│ │ │ │ ├── AppViewModel.kt
│ │ │ │ ├── CommentViewModel.kt
│ │ │ │ ├── DownloadViewModel.kt
│ │ │ │ ├── IHCsrfToken.kt
│ │ │ │ ├── MainViewModel.kt
│ │ │ │ ├── MyListViewModel.kt
│ │ │ │ ├── PreviewCommentPrefetcher.kt
│ │ │ │ ├── PreviewViewModel.kt
│ │ │ │ ├── SearchViewModel.kt
│ │ │ │ ├── SettingsViewModel.kt
│ │ │ │ ├── VideoViewModel.kt
│ │ │ │ └── mylist/
│ │ │ │ ├── FavSubViewModel.kt
│ │ │ │ ├── PlaylistSubViewModel.kt
│ │ │ │ ├── SubscriptionSubViewModel.kt
│ │ │ │ └── WatchLaterSubViewModel.kt
│ │ │ ├── util/
│ │ │ │ ├── Adapters.kt
│ │ │ │ ├── AlertDialogs.kt
│ │ │ │ ├── Animations.kt
│ │ │ │ ├── AnimeShaders.kt
│ │ │ │ ├── Colors.kt
│ │ │ │ ├── Cookies.kt
│ │ │ │ ├── Extend.kt
│ │ │ │ ├── Files.kt
│ │ │ │ ├── Firebases.kt
│ │ │ │ ├── GridSpacingDecoration.kt
│ │ │ │ ├── HImageMeower.kt
│ │ │ │ ├── MediaUtils.kt
│ │ │ │ ├── Networks.kt
│ │ │ │ ├── Parcels.kt
│ │ │ │ ├── Permissions.kt
│ │ │ │ ├── Platform.kt
│ │ │ │ ├── Preferences.kt
│ │ │ │ ├── TextViews.kt
│ │ │ │ ├── Versions.kt
│ │ │ │ └── Views.kt
│ │ │ └── worker/
│ │ │ ├── HUpdateWorker.kt
│ │ │ ├── HanimeDownloadManager.kt
│ │ │ ├── HanimeDownloadManagerV2.kt
│ │ │ ├── HanimeDownloadWorker.kt
│ │ │ └── WorkerMixin.kt
│ │ └── res/
│ │ ├── anim/
│ │ │ ├── fade_in.xml
│ │ │ ├── fade_out.xml
│ │ │ ├── slide_in_from_bottom.xml
│ │ │ └── slide_out_to_bottom.xml
│ │ ├── drawable/
│ │ │ ├── baseline_add_24.xml
│ │ │ ├── baseline_add_link_24.xml
│ │ │ ├── baseline_advanced_search_24.xml
│ │ │ ├── baseline_arrow_forward_ios_24.xml
│ │ │ ├── baseline_bug_report_24.xml
│ │ │ ├── baseline_data_usage_24.xml
│ │ │ ├── baseline_dns_24.xml
│ │ │ ├── baseline_edit_24.xml
│ │ │ ├── baseline_error_outline_24.xml
│ │ │ ├── baseline_format_list_bulleted_24.xml
│ │ │ ├── baseline_forum_24.xml
│ │ │ ├── baseline_h_24.xml
│ │ │ ├── baseline_keyboard_arrow_down_24.xml
│ │ │ ├── baseline_keyboard_arrow_up_24.xml
│ │ │ ├── baseline_link_24.xml
│ │ │ ├── baseline_more_horiz_24.xml
│ │ │ ├── baseline_refresh_24.xml
│ │ │ ├── baseline_remove_circle_24.xml
│ │ │ ├── baseline_simp_to_trad_24.xml
│ │ │ ├── baseline_sort_24.xml
│ │ │ ├── gradient_black80_transparent_270.xml
│ │ │ ├── gradient_black_transparent_90.xml
│ │ │ ├── ic_baseline_access_time_24.xml
│ │ │ ├── ic_baseline_arrow_back_24.xml
│ │ │ ├── ic_baseline_arrow_forward_24.xml
│ │ │ ├── ic_baseline_cancel_24.xml
│ │ │ ├── ic_baseline_check_circle_24.xml
│ │ │ ├── ic_baseline_checklist_24.xml
│ │ │ ├── ic_baseline_clear_all_24.xml
│ │ │ ├── ic_baseline_close_24.xml
│ │ │ ├── ic_baseline_comment_24.xml
│ │ │ ├── ic_baseline_delete_24.xml
│ │ │ ├── ic_baseline_download_24.xml
│ │ │ ├── ic_baseline_favorite_24.xml
│ │ │ ├── ic_baseline_favorite_border_24.xml
│ │ │ ├── ic_baseline_help_24.xml
│ │ │ ├── ic_baseline_history_24.xml
│ │ │ ├── ic_baseline_home_24.xml
│ │ │ ├── ic_baseline_info_24.xml
│ │ │ ├── ic_baseline_language_24.xml
│ │ │ ├── ic_baseline_list_24.xml
│ │ │ ├── ic_baseline_menu_24.xml
│ │ │ ├── ic_baseline_more_time_24.xml
│ │ │ ├── ic_baseline_newspaper_24.xml
│ │ │ ├── ic_baseline_pause_24.xml
│ │ │ ├── ic_baseline_pause_24_tintwhite.xml
│ │ │ ├── ic_baseline_play_arrow_24.xml
│ │ │ ├── ic_baseline_play_arrow_24_tintwhite.xml
│ │ │ ├── ic_baseline_play_circle_outline_24.xml
│ │ │ ├── ic_baseline_reply_24.xml
│ │ │ ├── ic_baseline_search_24.xml
│ │ │ ├── ic_baseline_send_24.xml
│ │ │ ├── ic_baseline_settings_24.xml
│ │ │ ├── ic_baseline_share_24.xml
│ │ │ ├── ic_baseline_tag_24.xml
│ │ │ ├── ic_baseline_thumb_down_alt_24.xml
│ │ │ ├── ic_baseline_thumb_down_off_alt_24.xml
│ │ │ ├── ic_baseline_thumb_up_alt_24.xml
│ │ │ ├── ic_baseline_thumb_up_off_alt_24.xml
│ │ │ ├── ic_baseline_update_24.xml
│ │ │ ├── ic_baseline_watch_later_24.xml
│ │ │ ├── ic_launcher_background.xml
│ │ │ ├── ic_outline_watch_later_24.xml
│ │ │ ├── line_divider.xml
│ │ │ ├── menu_24px.xml
│ │ │ ├── open_in_new_24px.xml
│ │ │ ├── outline_home_24.xml
│ │ │ ├── pause_circle_24px.xml
│ │ │ ├── pip_24px.xml
│ │ │ ├── play_circle_24px.xml
│ │ │ ├── scaled_added_time.xml
│ │ │ ├── screenshot_frame_2_24px.xml
│ │ │ ├── search_bar.xml
│ │ │ ├── shape_download_func_bar.xml
│ │ │ ├── shape_preview_button_left.xml
│ │ │ ├── shape_preview_button_right.xml
│ │ │ ├── shape_reply_show_bottom_dialog.xml
│ │ │ ├── shape_tag_selector.xml
│ │ │ ├── shape_title_mask.xml
│ │ │ ├── shape_title_mask_black.xml
│ │ │ └── translated_border.xml
│ │ ├── drawable-v24/
│ │ │ └── ic_launcher_foreground.xml
│ │ ├── layout/
│ │ │ ├── activity_download.xml
│ │ │ ├── activity_login.xml
│ │ │ ├── activity_main.xml
│ │ │ ├── activity_preview.xml
│ │ │ ├── activity_preview_comment.xml
│ │ │ ├── activity_search.xml
│ │ │ ├── activity_settings.xml
│ │ │ ├── activity_video.xml
│ │ │ ├── base_column_title.xml
│ │ │ ├── dialog_apply_deep_links.xml
│ │ │ ├── dialog_login.xml
│ │ │ ├── dialog_modify_h_keyframe.xml
│ │ │ ├── dialog_modify_h_keyframes.xml
│ │ │ ├── dialog_playlist_modify_edit_text.xml
│ │ │ ├── dialog_proxy.xml
│ │ │ ├── fragment_comment.xml
│ │ │ ├── fragment_h_keyframes.xml
│ │ │ ├── fragment_home_page.xml
│ │ │ ├── fragment_list_only.xml
│ │ │ ├── fragment_page_list.xml
│ │ │ ├── fragment_playlist.xml
│ │ │ ├── fragment_tab_view_pager_only.xml
│ │ │ ├── fragment_tag_selector.xml
│ │ │ ├── fragment_video_introduction.xml
│ │ │ ├── item_h_keyframe.xml
│ │ │ ├── item_h_keyframes.xml
│ │ │ ├── item_h_subscription.xml
│ │ │ ├── item_hanidock.xml
│ │ │ ├── item_hanime_downloaded.xml
│ │ │ ├── item_hanime_downloading.xml
│ │ │ ├── item_hanime_preview_news.xml
│ │ │ ├── item_hanime_preview_news_pic.xml
│ │ │ ├── item_hanime_preview_news_v2.xml
│ │ │ ├── item_hanime_updated.xml
│ │ │ ├── item_hanime_updating.xml
│ │ │ ├── item_hanime_video.xml
│ │ │ ├── item_hanime_video_simplified.xml
│ │ │ ├── item_playlist.xml
│ │ │ ├── item_preview_tour_simplified.xml
│ │ │ ├── item_rv_wrapper.xml
│ │ │ ├── item_search_history.xml
│ │ │ ├── item_shared_h_keyframes.xml
│ │ │ ├── item_tag_chip.xml
│ │ │ ├── item_tag_chip_group.xml
│ │ │ ├── item_video_column_title.xml
│ │ │ ├── item_video_comment.xml
│ │ │ ├── item_video_introduction.xml
│ │ │ ├── item_video_tag_chip.xml
│ │ │ ├── item_watch_history.xml
│ │ │ ├── jz_layout_speed.xml
│ │ │ ├── layout_collapsible_tag.xml
│ │ │ ├── layout_empty_view.xml
│ │ │ ├── layout_hanidock.xml
│ │ │ ├── layout_hanime_search_bar.xml
│ │ │ ├── layout_header_h_keyframes.xml
│ │ │ ├── layout_jzvd_with_speed.xml
│ │ │ ├── layout_playlist_header.xml
│ │ │ ├── layout_playlist_header_v2.xml
│ │ │ ├── layout_rv_scrollbars.xml
│ │ │ ├── nav_header_ability.xml
│ │ │ ├── pop_up_ext_h_time_picker.xml
│ │ │ ├── pop_up_fragment_child_comment.xml
│ │ │ ├── pop_up_fragment_search_options.xml
│ │ │ ├── pop_up_hanime_search_tag.xml
│ │ │ ├── pop_up_hanime_time_picker.xml
│ │ │ └── pop_up_reply.xml
│ │ ├── layout-sw600dp/
│ │ │ ├── activity_main.xml
│ │ │ └── fragment_home_page.xml
│ │ ├── menu/
│ │ │ ├── menu_downloaded_toolbar.xml
│ │ │ ├── menu_downloading_toolbar.xml
│ │ │ ├── menu_h_keyframes_toolbar.xml
│ │ │ ├── menu_main_bnv.xml
│ │ │ ├── menu_main_nv.xml
│ │ │ ├── menu_main_rail_nv.xml
│ │ │ ├── menu_main_toolbar.xml
│ │ │ ├── menu_my_list_toolbar.xml
│ │ │ ├── menu_playlist_toolbar.xml
│ │ │ ├── menu_preview_toolbar.xml
│ │ │ ├── menu_search_toolbar.xml
│ │ │ └── menu_watch_history_toolbar.xml
│ │ ├── mipmap-anydpi-v26/
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ ├── navigation/
│ │ │ ├── nav_main.xml
│ │ │ └── nav_settings.xml
│ │ ├── values/
│ │ │ ├── arrays.xml
│ │ │ ├── colors.xml
│ │ │ ├── dimens.xml
│ │ │ ├── ic_launcher_background.xml
│ │ │ ├── ids.xml
│ │ │ ├── strings.xml
│ │ │ └── themes.xml
│ │ ├── values-en/
│ │ │ └── strings.xml
│ │ ├── values-night/
│ │ │ └── themes.xml
│ │ ├── values-zh-rCN/
│ │ │ └── strings.xml
│ │ └── xml/
│ │ ├── backup_rules.xml
│ │ ├── data_extraction_rules.xml
│ │ ├── file_paths.xml
│ │ ├── locales_config.xml
│ │ ├── settings_download.xml
│ │ ├── settings_h_keyframe.xml
│ │ ├── settings_home.xml
│ │ ├── settings_network.xml
│ │ └── settings_player.xml
│ └── test/
│ └── java/
│ └── com/
│ └── yenaly/
│ └── han1meviewer/
│ └── ExampleUnitTest.kt
├── build.gradle.kts
├── buildSrc/
│ ├── build.gradle.kts
│ └── src/
│ └── main/
│ └── java/
│ └── Config.kt
├── gradle/
│ ├── libs.versions.toml
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── settings.gradle.kts
└── yenaly_libs/
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src/
├── androidTest/
│ └── java/
│ └── com/
│ └── yenaly/
│ └── yenaly_libs/
│ └── ExampleInstrumentedTest.kt
├── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ └── com/
│ │ └── yenaly/
│ │ └── yenaly_libs/
│ │ ├── ActivityManager.kt
│ │ ├── SingletonHolder.kt
│ │ ├── base/
│ │ │ ├── IViewBinding.kt
│ │ │ ├── YenalyActivity.kt
│ │ │ ├── YenalyApplication.kt
│ │ │ ├── YenalyBottomSheetDialogFragment.kt
│ │ │ ├── YenalyCrashHandler.kt
│ │ │ ├── YenalyFragment.kt
│ │ │ ├── YenalyInitializer.kt
│ │ │ ├── YenalyViewModel.kt
│ │ │ ├── dialog/
│ │ │ │ └── YenalyCrashDialogActivity.kt
│ │ │ ├── frame/
│ │ │ │ ├── FrameActivity.kt
│ │ │ │ └── FrameFragment.kt
│ │ │ ├── preference/
│ │ │ │ ├── LongClickablePreference.kt
│ │ │ │ ├── LongClickableSwitchPreference.kt
│ │ │ │ └── MaterialSwitchPreference.kt
│ │ │ ├── settings/
│ │ │ │ ├── YenalySettingsActivity.kt
│ │ │ │ └── YenalySettingsFragment.kt
│ │ │ └── view/
│ │ │ ├── NestedScrollableHost.kt
│ │ │ └── RecyclerViewAtViewPager2.kt
│ │ └── utils/
│ │ ├── ActivityResultUtil.kt
│ │ ├── AppUtil.kt
│ │ ├── ArrayUtil.kt
│ │ ├── Base64Util.kt
│ │ ├── ClipboardUtil.kt
│ │ ├── ContextUtil.kt
│ │ ├── DeviceUtil.kt
│ │ ├── FileUtil.kt
│ │ ├── ImageUtil.kt
│ │ ├── LanguageHelper.kt
│ │ ├── LogUtil.kt
│ │ ├── OrientationManager.kt
│ │ ├── ResourceUtil.kt
│ │ ├── ShareUtil.kt
│ │ ├── SharedPreferencesUtil.kt
│ │ ├── SingleFlowLaunch.kt
│ │ ├── SnackBarUtil.kt
│ │ ├── SystemStatusUtil.kt
│ │ ├── TextUtil.kt
│ │ ├── ToastUtil.kt
│ │ ├── UnicodeUtil.kt
│ │ ├── UriUtil.kt
│ │ ├── _AesUtil.kt
│ │ ├── _GsonUtil.kt
│ │ ├── _IntentUtil.kt
│ │ ├── _LazyUtil.kt
│ │ ├── span/
│ │ │ ├── SpannedTextGenerator.kt
│ │ │ ├── YenalyImageSpan.kt
│ │ │ └── YenalyQuoteSpan.kt
│ │ └── view/
│ │ ├── AppBarLayoutStateChangeListener.kt
│ │ ├── BottomNavViewMediator.kt
│ │ ├── BottomNavViewUtil.kt
│ │ ├── BottomNavigationViewMediator.kt
│ │ ├── ClickUtil.kt
│ │ ├── EditTextUtil.kt
│ │ ├── SimpleBottomNavViewMediator.kt
│ │ ├── SimpleFragmentStateAdapter.kt
│ │ ├── TabLayoutUtil.kt
│ │ ├── ViewPagerUtil.kt
│ │ ├── ViewUtil.kt
│ │ └── YenalyHideBottomViewOnScrollBehavior.kt
│ └── res/
│ ├── anim/
│ │ ├── yenaly_bottom_to_top_in.xml
│ │ ├── yenaly_bottom_to_top_out.xml
│ │ ├── yenaly_top_to_bottom_in.xml
│ │ └── yenaly_top_to_bottom_out.xml
│ ├── layout/
│ │ ├── yenaly_activity_crash_dialog.xml
│ │ ├── yenaly_activity_settings.xml
│ │ ├── yenaly_dialog_loading.xml
│ │ └── yenaly_preference_switch_widget.xml
│ ├── values/
│ │ ├── ids.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── xml/
│ └── http_network_config.xml
└── test/
└── java/
└── com/
└── yenaly/
└── yenaly_libs/
└── UtilUnitTest.kt
Condensed preview — 553 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,024K chars).
[
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 1216,
"preview": "name: 🐞 問題回報\ndescription: 回報在 Han1meViewer 中出現的問題\nlabels: [bug]\nbody:\n\n - type: textarea\n id: actual-behavior\n at"
},
{
"path": ".github/ISSUE_TEMPLATE/custom.md",
"chars": 74,
"preview": "---\nname: 自定義問題\nabout: 描述此問題的目的\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n\n"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yml",
"chars": 469,
"preview": "name: ⭐ 功能請求\ndescription: 建議一個功能來改善 Han1meViewer\nlabels: [ good idea | 好主意 ]\nbody:\n\n - type: textarea\n id: feature-d"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE/bug_fix.md",
"chars": 171,
"preview": "---\nname: \"Bug 修復\"\nabout: \"用於提交 Bug 修復的拉取請求\"\ntitle: \"[BUGFIX] <簡短描述>\"\nlabels: \"bug\"\nassignees: \"\"\n---\n\n### 描述\n\n<!-- 請簡短描"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE/feature_addition.md",
"chars": 142,
"preview": "---\nname: \"新功能添加\"\nabout: \"用於提交新功能的拉取請求\"\ntitle: \"[FEATURE] <簡短描述>\"\nlabels: \"good idea | 好主意\"\nassignees: \"\"\n---\n\n### 功能描述\n"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE/submit_h_keyframe.md",
"chars": 139,
"preview": "---\nname: \"提交關鍵H幀\"\nabout: \"分享你的關鍵H幀\"\ntitle: \"[HKeyframe] <簡短描述>\"\nlabels: \"𝐇Keyframe\"\nassignees: \"\"\n---\n\n### 關鍵H幀描述\n\n<!--"
},
{
"path": ".github/dependabot.yml",
"chars": 137,
"preview": "version: 2\nupdates:\n - package-ecosystem: gradle\n directory: \"/\" # Location of package manifests\n schedule:\n "
},
{
"path": ".github/workflows/ci.yml",
"chars": 1656,
"preview": "name: CI\n\non:\n push:\n branches: [ \"master\" ]\n paths-ignore:\n - \"**.md\"\n workflow_dispatch:\n\npermissions:\n "
},
{
"path": ".github/workflows/ci_release.yml",
"chars": 1859,
"preview": "name: CI\n\non:\n push:\n tags:\n - \"v*.*.*\"\n\npermissions:\n contents: write\n actions: write\n\njobs:\n build:\n\n r"
},
{
"path": ".github/workflows/pr_check.yml",
"chars": 699,
"preview": "name: Pull Request Check\n\non:\n pull_request:\n branches: [ \"master\" ]\n paths-ignore:\n - \"**.md\"\n\njobs:\n chec"
},
{
"path": ".gitignore",
"chars": 225,
"preview": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor."
},
{
"path": ".idea/.gitignore",
"chars": 47,
"preview": "# Default ignored files\n/shelf/\n/workspace.xml\n"
},
{
"path": ".idea/.name",
"chars": 12,
"preview": "Han1meViewer"
},
{
"path": ".idea/AndroidProjectSystem.xml",
"chars": 212,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"AndroidProjectSystem\">\n <option name="
},
{
"path": ".idea/appInsightsSettings.xml",
"chars": 1090,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"AppInsightsSettings\">\n <option name=\""
},
{
"path": ".idea/codeStyles/Project.xml",
"chars": 3622,
"preview": "<component name=\"ProjectCodeStyleConfiguration\">\n <code_scheme name=\"Project\" version=\"173\">\n <JetCodeStyleSettings>"
},
{
"path": ".idea/codeStyles/codeStyleConfig.xml",
"chars": 142,
"preview": "<component name=\"ProjectCodeStyleConfiguration\">\n <state>\n <option name=\"USE_PER_PROJECT_SETTINGS\" value=\"true\" />\n "
},
{
"path": ".idea/compiler.xml",
"chars": 169,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"CompilerConfiguration\">\n <bytecodeTar"
},
{
"path": ".idea/dbnavigator.xml",
"chars": 22916,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"DBNavigator.Project.DataEditorManager\">\n"
},
{
"path": ".idea/deploymentTargetDropDown.xml",
"chars": 283,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"deploymentTargetDropDown\">\n <value>\n "
},
{
"path": ".idea/deploymentTargetSelector.xml",
"chars": 613,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"deploymentTargetSelector\">\n <selectio"
},
{
"path": ".idea/dictionaries/wrzg8.xml",
"chars": 84,
"preview": "<component name=\"ProjectDictionaryState\">\n <dictionary name=\"wrzg8\" />\n</component>"
},
{
"path": ".idea/gradle.xml",
"chars": 1257,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"GradleMigrationSettings\" migrationVersio"
},
{
"path": ".idea/inspectionProfiles/Project_Default.xml",
"chars": 397,
"preview": "<component name=\"InspectionProjectProfileManager\">\n <profile version=\"1.0\">\n <option name=\"myName\" value=\"Project De"
},
{
"path": ".idea/kotlinc.xml",
"chars": 284,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"Kotlin2JvmCompilerArguments\">\n <optio"
},
{
"path": ".idea/ktlint-plugin.xml",
"chars": 198,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"KtLint plugin\">\n <ktlintMode>DISABLED"
},
{
"path": ".idea/migrations.xml",
"chars": 254,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"ProjectMigrations\">\n <option name=\"Mi"
},
{
"path": ".idea/misc.xml",
"chars": 18540,
"preview": "<project version=\"4\">\n <component name=\"DesignSurface\">\n <option name=\"filePathToZoomLevelMap\">\n <map>\n "
},
{
"path": ".idea/render.experimental.xml",
"chars": 175,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"RenderSettings\">\n <option name=\"useLi"
},
{
"path": ".idea/runConfigurations.xml",
"chars": 964,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"RunConfigurationProducerService\">\n <o"
},
{
"path": ".idea/studiobot.xml",
"chars": 183,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"StudioBotProjectSettings\">\n <option n"
},
{
"path": ".idea/vcs.xml",
"chars": 314,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"GitSharedSettings\">\n <option name=\"FO"
},
{
"path": "LICENSE",
"chars": 10751,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 1437,
"preview": "# Han1meViewer\n\n\n\nimport Config.Version.createVersion\nimport Config.Version.source\nimport Config.isRel"
},
{
"path": "app/proguard-rules.pro",
"chars": 1110,
"preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
},
{
"path": "app/src/androidTest/java/com/yenaly/han1meviewer/ExampleInstrumentedTest.kt",
"chars": 673,
"preview": "package com.yenaly.han1meviewer\n\nimport androidx.test.platform.app.InstrumentationRegistry\nimport androidx.test.ext.juni"
},
{
"path": "app/src/main/AndroidManifest.xml",
"chars": 5099,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:to"
},
{
"path": "app/src/main/assets/h_keyframes/12444.json",
"chars": 310,
"preview": "{\n \"videoCode\": \"12444\",\n \"group\": \"思春期SEX\",\n \"title\": \"思春期SEX#1\",\n \"episode\": 1,\n \"author\": \"NeKoOuO\",\n \"keyframe"
},
{
"path": "app/src/main/assets/h_keyframes/14463.json",
"chars": 370,
"preview": "{\n \"videoCode\": \"14463\",\n \"group\": \"思春期SEX\",\n \"title\": \"思春期SEX#3\",\n \"episode\": 3,\n \"author\": \"NeKoOuO\",\n \"keyframe"
},
{
"path": "app/src/main/assets/h_keyframes/21806.json",
"chars": 370,
"preview": "{\n \"videoCode\": \"21806\",\n \"group\": \"思春期SEX\",\n \"title\": \"思春期SEX#4\",\n \"episode\": 4,\n \"author\": \"NeKoOuO\",\n \"keyframe"
},
{
"path": "app/src/main/assets/h_keyframes/22068.json",
"chars": 370,
"preview": "{\n \"videoCode\": \"22068\",\n \"group\": \"思春期SEX\",\n \"title\": \"思春期SEX#2\",\n \"episode\": 2,\n \"author\": \"NeKoOuO\",\n \"keyframe"
},
{
"path": "app/src/main/assets/h_keyframes/37176.json",
"chars": 392,
"preview": "{\r\n \"videoCode\": \"37176\",\r\n \"group\": \"援助交配\",\r\n \"title\": \"援助交配#1\",\r\n \"episode\": 1,\r\n \"author\": \"NeKoOuO\",\r\n \"keyfra"
},
{
"path": "app/src/main/assets/h_keyframes/37177.json",
"chars": 584,
"preview": "{\r\n \"videoCode\": \"37177\",\r\n \"group\": \"援助交配\",\r\n \"title\": \"援助交配#2\",\r\n \"episode\": 2,\r\n \"author\": \"NeKoOuO\",\r\n \"keyfra"
},
{
"path": "app/src/main/assets/h_keyframes/37178.json",
"chars": 456,
"preview": "{\r\n \"videoCode\": \"37178\",\r\n \"group\": \"援助交配\",\r\n \"title\": \"援助交配#3\",\r\n \"episode\": 3,\r\n \"author\": \"NeKoOuO\",\r\n \"keyfra"
},
{
"path": "app/src/main/assets/h_keyframes/37179.json",
"chars": 455,
"preview": "{\r\n \"videoCode\": \"37179\",\r\n \"group\": \"援助交配\",\r\n \"title\": \"援助交配#4\",\r\n \"episode\": 4,\r\n \"author\": \"NeKoOuO\",\r\n \"keyfra"
},
{
"path": "app/src/main/assets/h_keyframes/37220.json",
"chars": 565,
"preview": "{\n \"videoCode\": \"37220\",\n \"group\": \"今泉家似乎變成辣妹的聚會所\",\n \"title\": \"今泉家似乎變成辣妹的聚會所#1\",\n \"episode\": 1,\n \"author\": \"NeKoOuO"
},
{
"path": "app/src/main/assets/h_keyframes/37221.json",
"chars": 446,
"preview": "\n{\n \"videoCode\": \"37221\",\n \"group\": \"今泉家似乎變成辣妹的聚會所\",\n \"title\": \"今泉家似乎變成辣妹的聚會所#2\",\n \"episode\": 2,\n \"author\": \"NeKoOu"
},
{
"path": "app/src/main/assets/h_keyframes/38387.json",
"chars": 328,
"preview": "{\r\n \"videoCode\": \"38387\",\r\n \"group\": \"援助交配\",\r\n \"title\": \"援助交配#5\",\r\n \"episode\": 5,\r\n \"author\": \"NeKoOuO\",\r\n \"keyfra"
},
{
"path": "app/src/main/assets/h_keyframes/38389.json",
"chars": 484,
"preview": "{\n \"videoCode\": \"38389\",\n \"group\": \"闇憑村\",\n \"title\": \"闇憑村#1\",\n \"episode\": 1,\n \"author\": \"NeKoOuO\",\n \"keyframes\": [\n"
},
{
"path": "app/src/main/assets/h_keyframes/38457.json",
"chars": 724,
"preview": "{\n \"videoCode\": \"38457\",\n \"group\": \"闇憑村\",\n \"title\": \"闇憑村#2\",\n \"episode\": 2,\n \"author\": \"NeKoOuO\",\n \"keyframes\": [\n"
},
{
"path": "app/src/main/assets/h_keyframes/38461.json",
"chars": 327,
"preview": "{\r\n \"videoCode\": \"38461\",\r\n \"group\": \"援助交配\",\r\n \"title\": \"援助交配#6\",\r\n \"episode\": 6,\r\n \"author\": \"NeKoOuO\",\r\n \"keyfra"
},
{
"path": "app/src/main/assets/h_keyframes/39192.json",
"chars": 520,
"preview": "{\r\n \"videoCode\": \"39192\",\r\n \"group\": \"援助交配\",\r\n \"title\": \"援助交配#7\",\r\n \"episode\": 7,\r\n \"author\": \"NeKoOuO\",\r\n \"keyfra"
},
{
"path": "app/src/main/assets/h_keyframes/39305.json",
"chars": 381,
"preview": "{\n \"videoCode\": \"39305\",\n \"group\": \"到了異世界就拿出性本事\",\n \"title\": \"到了異世界就拿出性本事#1\",\n \"episode\": 1,\n \"author\": \"NeKoOuO\",\n "
},
{
"path": "app/src/main/assets/h_keyframes/39306.json",
"chars": 441,
"preview": "{\n \"videoCode\": \"39306\",\n \"group\": \"到了異世界就拿出性本事\",\n \"title\": \"到了異世界就拿出性本事#2\",\n \"episode\": 2,\n \"author\": \"NeKoOuO\",\n "
},
{
"path": "app/src/main/assets/h_keyframes/39468.json",
"chars": 392,
"preview": "{\r\n \"videoCode\": \"39468\",\r\n \"group\": \"援助交配\",\r\n \"title\": \"援助交配#8\",\r\n \"episode\": 8,\r\n \"author\": \"NeKoOuO\",\r\n \"keyfra"
},
{
"path": "app/src/main/assets/h_keyframes/39811.json",
"chars": 386,
"preview": "\n{\n \"videoCode\": \"39811\",\n \"group\": \"今泉家似乎變成辣妹的聚會所\",\n \"title\": \"今泉家似乎變成辣妹的聚會所#4\",\n \"episode\": 4,\n \"author\": \"NeKoOu"
},
{
"path": "app/src/main/assets/h_keyframes/84717.json",
"chars": 426,
"preview": "{\n \"videoCode\": \"84717\",\n \"group\": \"初戀時間\",\n \"title\": \"初戀時間#1\",\n \"episode\": 1,\n \"author\": \"NeKoOuO\",\n \"keyframes\": "
},
{
"path": "app/src/main/assets/h_keyframes/84718.json",
"chars": 427,
"preview": "{\n \"videoCode\": \"84718\",\n \"group\": \"初戀時間\",\n \"title\": \"初戀時間#2\",\n \"episode\": 2,\n \"author\": \"NeKoOuO\",\n \"keyframes\": "
},
{
"path": "app/src/main/assets/h_keyframes/85926.json",
"chars": 307,
"preview": "{\n \"videoCode\": \"85926\",\n \"group\": \"初戀時間\",\n \"title\": \"初戀時間#3\",\n \"episode\": 3,\n \"author\": \"NeKoOuO\",\n \"keyframes\": "
},
{
"path": "app/src/main/assets/h_keyframes/85927.json",
"chars": 367,
"preview": "{\n \"videoCode\": \"85927\",\n \"group\": \"初戀時間\",\n \"title\": \"初戀時間#4\",\n \"episode\": 4,\n \"author\": \"NeKoOuO\",\n \"keyframes\": "
},
{
"path": "app/src/main/assets/h_keyframes/87968.json",
"chars": 321,
"preview": "{\n \"videoCode\": \"87968\",\n \"group\": \"到了異世界就拿出性本事\",\n \"title\": \"到了異世界就拿出性本事#3\",\n \"episode\": 3,\n \"author\": \"NeKoOuO\",\n "
},
{
"path": "app/src/main/assets/h_keyframes/87969.json",
"chars": 261,
"preview": "{\n \"videoCode\": \"87969\",\n \"group\": \"到了異世界就拿出性本事\",\n \"title\": \"到了異世界就拿出性本事#4\",\n \"episode\": 4,\n \"author\": \"NeKoOuO\",\n "
},
{
"path": "app/src/main/assets/h_keyframes/89087.json",
"chars": 367,
"preview": "{\n \"videoCode\": \"89087\",\n \"group\": \"初戀時間\",\n \"title\": \"初戀時間#5\",\n \"episode\": 5,\n \"author\": \"NeKoOuO\",\n \"keyframes\": "
},
{
"path": "app/src/main/assets/h_keyframes/89088.json",
"chars": 487,
"preview": "{\n \"videoCode\": \"89088\",\n \"group\": \"初戀時間\",\n \"title\": \"初戀時間#6\",\n \"episode\": 6,\n \"author\": \"NeKoOuO\",\n \"keyframes\": "
},
{
"path": "app/src/main/assets/h_keyframes/README.md",
"chars": 3702,
"preview": "# 关键H帧\n\n## 何为关键H帧?\n\n就是影片到达「**顶点**」的那一刻。\n\n还在因为不能和影片内「顶点」同步,而不停地记着「顶点」的时刻然后看进度条卡时间同步吗?\n\n现在你可能不需要了。如果你开启了该功能(默认开启),并且在影片内**"
},
{
"path": "app/src/main/assets/search_options/brands.json",
"chars": 3896,
"preview": "[\n {\n \"name\": \"妄想実現めでぃあ\",\n \"search_key\": \"妄想実現めでぃあ\"\n },\n {\n \"name\": \"メリー・ジェーン\",\n \"search_key\": \"メリー・ジェーン\""
},
{
"path": "app/src/main/assets/search_options/duration.json",
"chars": 1159,
"preview": "[\n {\n \"lang\": {\n \"zh-rCN\": \"全部\",\n \"en\": \"All\",\n \"zh-rTW\": \"全部\"\n },\n \"search_key\": null\n },\n {"
},
{
"path": "app/src/main/assets/search_options/genre.json",
"chars": 1021,
"preview": "[\n {\n \"lang\": {\n \"zh-rCN\": \"全部\",\n \"en\": \"All\",\n \"zh-rTW\": \"全部\"\n },\n \"search_key\": \"全部\"\n },\n {"
},
{
"path": "app/src/main/assets/search_options/sort_option.json",
"chars": 1176,
"preview": "[\n {\n \"lang\": {\n \"zh-rCN\": \"最新上市\",\n \"en\": \"New Arrival\",\n \"zh-rTW\": \"最新上市\"\n },\n \"search_key\": \""
},
{
"path": "app/src/main/assets/search_options/tags.json",
"chars": 28455,
"preview": "{\n \"video_attributes\": [\n {\n \"lang\": {\n \"zh-rCN\": \"无码\",\n \"en\": \"Uncensored\",\n \"zh-rTW\": \"無"
},
{
"path": "app/src/main/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": "app/src/main/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": "app/src/main/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": "app/src/main/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": "app/src/main/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": "app/src/main/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": "app/src/main/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": "app/src/main/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": "app/src/main/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": "app/src/main/java/com/yenaly/han1meviewer/Constants.kt",
"chars": 2502,
"preview": "package com.yenaly.han1meviewer\n\nimport kotlinx.datetime.LocalDate\nimport kotlinx.datetime.LocalDateTime\nimport kotlinx."
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/FirebaseConstants.kt",
"chars": 1044,
"preview": "package com.yenaly.han1meviewer\n\nobject FirebaseConstants {\n // <editor-fold desc=\"Analytics\">\n\n /**\n * 高级搜索使用"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/HAdvancedSearch.kt",
"chars": 996,
"preview": "package com.yenaly.han1meviewer\n\nimport java.io.Serializable\n\n/**\n * 高级搜索的枚举\n *\n * @project Han1meViewer\n * @author Yena"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/HCacheManager.kt",
"chars": 2478,
"preview": "package com.yenaly.han1meviewer\n\nimport androidx.annotation.WorkerThread\nimport com.yenaly.han1meviewer.logic.DatabaseRe"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/HCrashHandler.kt",
"chars": 286,
"preview": "package com.yenaly.han1meviewer\n\nimport com.yenaly.yenaly_libs.ActivityManager\n\nobject HCrashHandler : Thread.UncaughtEx"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/HFileManager.kt",
"chars": 2437,
"preview": "package com.yenaly.han1meviewer\n\nimport android.os.Environment\nimport com.yenaly.yenaly_libs.utils.applicationContext\nim"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/HInitializer.kt",
"chars": 348,
"preview": "package com.yenaly.han1meviewer\n\nimport android.content.Context\nimport com.yenaly.yenaly_libs.base.YenalyInitializer\n\ncl"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/HanimeApplication.kt",
"chars": 3863,
"preview": "package com.yenaly.han1meviewer\n\nimport android.util.Log\nimport androidx.core.app.NotificationChannelCompat\nimport andro"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/HanimeManager.kt",
"chars": 1729,
"preview": "package com.yenaly.han1meviewer\n\nimport android.webkit.CookieManager\nimport androidx.core.text.parseAsHtml\nimport com.ye"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/HanimeResolution.kt",
"chars": 2009,
"preview": "package com.yenaly.han1meviewer\n\nimport kotlinx.serialization.Serializable\nimport okhttp3.MediaType.Companion.toMediaTyp"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/Preferences.kt",
"chars": 7036,
"preview": "package com.yenaly.han1meviewer\n\nimport android.content.SharedPreferences\nimport android.os.Build\nimport androidx.prefer"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/VideoCoverSize.kt",
"chars": 2639,
"preview": "package com.yenaly.han1meviewer\n\nimport android.annotation.SuppressLint\nimport android.view.ViewGroup\nimport androidx.co"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/DatabaseRepo.kt",
"chars": 7627,
"preview": "package com.yenaly.han1meviewer.logic\n\nimport com.yenaly.han1meviewer.Preferences\nimport com.yenaly.han1meviewer.logic.d"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/NetworkRepo.kt",
"chars": 15256,
"preview": "package com.yenaly.han1meviewer.logic\n\nimport android.util.Log\nimport com.yenaly.han1meviewer.EMPTY_STRING\nimport com.ye"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/Parser.kt",
"chars": 41875,
"preview": "package com.yenaly.han1meviewer.logic\n\nimport android.annotation.SuppressLint\nimport android.util.Log\nimport com.yenaly."
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/dao/DownloadDatabase.kt",
"chars": 5125,
"preview": "package com.yenaly.han1meviewer.logic.dao\n\nimport androidx.room.Database\nimport androidx.room.Room\nimport androidx.room."
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/dao/HKeyframeDao.kt",
"chars": 3011,
"preview": "package com.yenaly.han1meviewer.logic.dao\n\nimport androidx.room.Dao\nimport androidx.room.Delete\nimport androidx.room.Ins"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/dao/HistoryDatabase.kt",
"chars": 2150,
"preview": "package com.yenaly.han1meviewer.logic.dao\n\nimport android.database.sqlite.SQLiteDatabase\nimport androidx.core.content.co"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/dao/MiscellanyDatabase.kt",
"chars": 818,
"preview": "package com.yenaly.han1meviewer.logic.dao\n\nimport androidx.room.Database\nimport androidx.room.Room\nimport androidx.room."
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/dao/SearchHistoryDao.kt",
"chars": 1352,
"preview": "package com.yenaly.han1meviewer.logic.dao\n\nimport androidx.room.*\nimport com.yenaly.han1meviewer.logic.entity.SearchHist"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/dao/WatchHistoryDao.kt",
"chars": 1252,
"preview": "package com.yenaly.han1meviewer.logic.dao\n\nimport androidx.room.*\nimport com.yenaly.han1meviewer.logic.entity.WatchHisto"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/dao/download/DownloadCategoryDao.kt",
"chars": 1024,
"preview": "package com.yenaly.han1meviewer.logic.dao.download\n\nimport androidx.room.Dao\nimport androidx.room.Query\nimport androidx."
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/dao/download/HUpdateDao.kt",
"chars": 1109,
"preview": "package com.yenaly.han1meviewer.logic.dao.download\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/dao/download/HanimeDownloadDao.kt",
"chars": 3662,
"preview": "package com.yenaly.han1meviewer.logic.dao.download\n\nimport androidx.room.Dao\nimport androidx.room.Delete\nimport androidx"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/entity/HKeyframeEntity.kt",
"chars": 2174,
"preview": "@file:Suppress(\"PLUGIN_IS_NOT_ENABLED\")\n\npackage com.yenaly.han1meviewer.logic.entity\n\nimport androidx.room.Entity\nimpor"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/entity/SearchHistoryEntity.kt",
"chars": 310,
"preview": "package com.yenaly.han1meviewer.logic.entity\n\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\n\n/**\n * @proje"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/entity/WatchHistoryEntity.kt",
"chars": 517,
"preview": "package com.yenaly.han1meviewer.logic.entity\n\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\n\n/**\n * @proje"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/entity/download/DownloadCategoryEntity.kt",
"chars": 240,
"preview": "package com.yenaly.han1meviewer.logic.entity.download\n\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\n\n@Ent"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/entity/download/HUpdateEntity.kt",
"chars": 1185,
"preview": "package com.yenaly.han1meviewer.logic.entity.download\n\nimport androidx.annotation.IntRange\nimport androidx.room.Entity\ni"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/entity/download/HanimeCategoryCrossRef.kt",
"chars": 297,
"preview": "package com.yenaly.han1meviewer.logic.entity.download\n\nimport androidx.room.Entity\nimport androidx.room.Index\n\n@Entity(\n"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/entity/download/HanimeDownloadEntity.kt",
"chars": 1961,
"preview": "package com.yenaly.han1meviewer.logic.entity.download\n\nimport androidx.annotation.IntRange\nimport androidx.room.Entity\ni"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/entity/download/VideoWithCategories.kt",
"chars": 531,
"preview": "package com.yenaly.han1meviewer.logic.entity.download\n\nimport androidx.room.Embedded\nimport androidx.room.Junction\nimpor"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/exception/CloudFlareBlockedException.kt",
"chars": 481,
"preview": "package com.yenaly.han1meviewer.logic.exception\n\nimport com.yenaly.han1meviewer.R\n\n/**\n * 检测到爬虫被封鎖\n *\n * @project Han1me"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/exception/HanimeNotFoundException.kt",
"chars": 207,
"preview": "package com.yenaly.han1meviewer.logic.exception\n\n/**\n * @project Han1meViewer\n * @author Yenaly Liew\n * @time 2023/08/07"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/exception/IPBlockedException.kt",
"chars": 224,
"preview": "package com.yenaly.han1meviewer.logic.exception\n\n/**\n * IP被封鎖\n *\n * @project Han1meViewer\n * @author Yenaly Liew\n * @tim"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/exception/ParseException.kt",
"chars": 367,
"preview": "package com.yenaly.han1meviewer.logic.exception\n\n/**\n * 解析錯誤\n *\n * @project Han1meViewer\n * @author Yenaly Liew\n * @time"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/model/HanimeInfo.kt",
"chars": 708,
"preview": "package com.yenaly.han1meviewer.logic.model\n\n/**\n * @project Han1meViewer\n * @author Yenaly Liew\n */\ninterface HanimeInf"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/model/HanimePreview.kt",
"chars": 670,
"preview": "package com.yenaly.han1meviewer.logic.model\n\n/**\n * @project Hanime1\n * @author Yenaly Liew\n * @time 2022/06/24 024 15:0"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/model/HanimeVideo.kt",
"chars": 2395,
"preview": "package com.yenaly.han1meviewer.logic.model\n\nimport com.yenaly.han1meviewer.ResolutionLinkMap\nimport com.yenaly.yenaly_l"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/model/HomePage.kt",
"chars": 849,
"preview": "package com.yenaly.han1meviewer.logic.model\n\n/**\n * @project Hanime1\n * @author Yenaly Liew\n * @time 2022/06/08 008 22:4"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/model/MultiItemEntity.kt",
"chars": 182,
"preview": "package com.yenaly.han1meviewer.logic.model\n\n/**\n * @project Han1meViewer\n * @author Yenaly Liew\n * @time 2023/11/26 026"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/model/MyListItems.kt",
"chars": 292,
"preview": "package com.yenaly.han1meviewer.logic.model\n\n/**\n * @project Han1meViewer\n * @author Yenaly Liew\n * @time 2022/07/05 005"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/model/ParamEnum.kt",
"chars": 406,
"preview": "package com.yenaly.han1meviewer.logic.model\n\nimport com.yenaly.han1meviewer.EMPTY_STRING\n\nenum class MyListType(val valu"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/model/Playlists.kt",
"chars": 481,
"preview": "package com.yenaly.han1meviewer.logic.model\n\n/**\n * @project Han1meViewer\n * @author Yenaly Liew\n * @time 2023/08/26 026"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/model/SearchOption.kt",
"chars": 3087,
"preview": "package com.yenaly.han1meviewer.logic.model\n\nimport android.os.Parcelable\nimport android.util.SparseArray\nimport android"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/model/SearchTag.kt",
"chars": 506,
"preview": "package com.yenaly.han1meviewer.logic.model\n\n/**\n * @project Hanime1\n * @author Yenaly Liew\n * @time 2022/06/09 009 21:2"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/model/Subscription.kt",
"chars": 283,
"preview": "package com.yenaly.han1meviewer.logic.model\n\n/**\n * @since 2024/09/11\n */\ndata class Subscription(\n val name: String,"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/model/VideoComments.kt",
"chars": 2394,
"preview": "package com.yenaly.han1meviewer.logic.model\n\n/**\n * @project Hanime1\n * @author Yenaly Liew\n * @time 2022/06/20 020 21:5"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/model/github/Commit.kt",
"chars": 438,
"preview": "package com.yenaly.han1meviewer.logic.model.github\n\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class "
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/model/github/Latest.kt",
"chars": 348,
"preview": "package com.yenaly.han1meviewer.logic.model.github\n\n/**\n * @project Han1meViewer\n * @author Yenaly Liew\n * @time 2024/03"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/model/github/Release.kt",
"chars": 2991,
"preview": "package com.yenaly.han1meviewer.logic.model.github\n\nimport android.os.Build\nimport kotlinx.serialization.SerialName\nimpo"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/model/github/Workflow.kt",
"chars": 1144,
"preview": "package com.yenaly.han1meviewer.logic.model.github\n\nimport android.os.Build\nimport kotlinx.serialization.SerialName\nimpo"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/network/GitHubDns.kt",
"chars": 519,
"preview": "package com.yenaly.han1meviewer.logic.network\n\nimport okhttp3.Dns\nimport java.net.InetAddress\n\n/**\n * @project Han1meVie"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/network/HCookieJar.kt",
"chars": 1000,
"preview": "package com.yenaly.han1meviewer.logic.network\n\nimport com.yenaly.han1meviewer.Preferences\nimport com.yenaly.han1meviewer"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/network/HDns.kt",
"chars": 3096,
"preview": "package com.yenaly.han1meviewer.logic.network\n\nimport android.util.Log\nimport android.widget.Toast\nimport com.yenaly.han"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/network/HProxySelector.kt",
"chars": 3168,
"preview": "package com.yenaly.han1meviewer.logic.network\n\nimport com.yenaly.han1meviewer.Preferences\nimport okhttp3.internal.proxy."
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/network/HUpdater.kt",
"chars": 7255,
"preview": "package com.yenaly.han1meviewer.logic.network\n\nimport android.util.Log\nimport com.google.firebase.Firebase\nimport com.go"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/network/HanimeNetwork.kt",
"chars": 1613,
"preview": "package com.yenaly.han1meviewer.logic.network\n\nimport com.yenaly.han1meviewer.HANIME_BASE_URL\nimport com.yenaly.han1mevi"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/network/ServiceCreator.kt",
"chars": 3054,
"preview": "package com.yenaly.han1meviewer.logic.network\n\nimport com.jakewharton.retrofit2.converter.kotlinx.serialization.asConver"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/network/interceptor/SpeedLimitInterceptor.kt",
"chars": 793,
"preview": "package com.yenaly.han1meviewer.logic.network.interceptor\n\nimport okhttp3.Interceptor\nimport okhttp3.Response\n\nclass Spe"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/network/interceptor/SpeedLimitResponseBody.kt",
"chars": 657,
"preview": "package com.yenaly.han1meviewer.logic.network.interceptor\n\nimport com.yenaly.yenaly_libs.utils.unsafeLazy\nimport okhttp3"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/network/interceptor/UserAgentInterceptor.kt",
"chars": 424,
"preview": "package com.yenaly.han1meviewer.logic.network.interceptor\n\nimport com.yenaly.han1meviewer.USER_AGENT\nimport okhttp3.Inte"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/network/service/HGitHubService.kt",
"chars": 2225,
"preview": "package com.yenaly.han1meviewer.logic.network.service\n\nimport com.yenaly.han1meviewer.logic.model.github.Artifacts\nimpor"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/network/service/HanimeBaseService.kt",
"chars": 1532,
"preview": "package com.yenaly.han1meviewer.logic.network.service\n\nimport androidx.annotation.IntRange\nimport okhttp3.ResponseBody\ni"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/network/service/HanimeCommentService.kt",
"chars": 2211,
"preview": "package com.yenaly.han1meviewer.logic.network.service\n\nimport okhttp3.ResponseBody\nimport retrofit2.Response\nimport retr"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/network/service/HanimeMyListService.kt",
"chars": 2826,
"preview": "package com.yenaly.han1meviewer.logic.network.service\n\nimport androidx.annotation.IntRange\nimport okhttp3.ResponseBody\ni"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/network/service/HanimeSubscriptionService.kt",
"chars": 678,
"preview": "package com.yenaly.han1meviewer.logic.network.service\n\nimport okhttp3.ResponseBody\nimport retrofit2.Response\nimport retr"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/state/DownloadState.kt",
"chars": 1207,
"preview": "package com.yenaly.han1meviewer.logic.state\n\nimport androidx.annotation.IntDef\n\n/**\n * 下载任务状态\n * @project Han1meViewer\n "
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/state/PageLoadingState.kt",
"chars": 422,
"preview": "package com.yenaly.han1meviewer.logic.state\n\n/**\n * @project Hanime1\n * @author Yenaly Liew\n * @time 2022/06/10 010 16:3"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/state/VideoLoadingState.kt",
"chars": 426,
"preview": "package com.yenaly.han1meviewer.logic.state\n\n/**\n * @project Hanime1\n * @author Yenaly Liew\n * @time 2022/06/18 018 18:1"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/logic/state/WebsiteState.kt",
"chars": 349,
"preview": "package com.yenaly.han1meviewer.logic.state\n\n/**\n * @project Hanime1\n * @author Yenaly Liew\n * @time 2022/06/08 008 22:2"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/StateLayoutMixin.kt",
"chars": 891,
"preview": "package com.yenaly.han1meviewer.ui\n\nimport android.annotation.SuppressLint\nimport android.widget.TextView\nimport com.dra"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/activity/DownloadActivity.kt",
"chars": 3393,
"preview": "package com.yenaly.han1meviewer.ui.activity\n\nimport android.os.Build\nimport android.os.Bundle\nimport android.view.Layout"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/activity/LoginActivity.kt",
"chars": 7703,
"preview": "package com.yenaly.han1meviewer.ui.activity\n\nimport android.annotation.SuppressLint\nimport android.graphics.Color\nimport"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/activity/MainActivity.kt",
"chars": 16043,
"preview": "package com.yenaly.han1meviewer.ui.activity\n\nimport android.annotation.SuppressLint\nimport android.content.Intent\nimport"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/activity/PreviewActivity.kt",
"chars": 18979,
"preview": "package com.yenaly.han1meviewer.ui.activity\n\nimport android.annotation.SuppressLint\nimport android.graphics.Color\nimport"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/activity/PreviewCommentActivity.kt",
"chars": 2561,
"preview": "package com.yenaly.han1meviewer.ui.activity\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.view."
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/activity/SearchActivity.kt",
"chars": 15356,
"preview": "package com.yenaly.han1meviewer.ui.activity\n\nimport android.annotation.SuppressLint\nimport android.content.res.Configura"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/activity/SettingsActivity.kt",
"chars": 3326,
"preview": "package com.yenaly.han1meviewer.ui.activity\n\nimport android.graphics.Color\nimport android.os.Build\nimport android.os.Bun"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/activity/SettingsRouter.kt",
"chars": 3017,
"preview": "package com.yenaly.han1meviewer.ui.activity\n\nimport android.content.Context\nimport android.content.Intent\nimport android"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/activity/VideoActivity.kt",
"chars": 17695,
"preview": "package com.yenaly.han1meviewer.ui.activity\n\nimport android.app.PendingIntent\nimport android.app.PictureInPictureParams\n"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/AdapterLikeDataBindingPage.kt",
"chars": 217,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport androidx.databinding.ViewDataBinding\n\n/**\n * 利用 Adapter 性质的页面,同时运用 Da"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/BaseSingleDifferAdapter.kt",
"chars": 2740,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport androidx.recyclerview.widget.AsyncDifferConfig\nimport androidx.recycl"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/FixedGridLayoutManager.kt",
"chars": 423,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport androidx.recyclerview.widget.GridLayou"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/HKeyframesRvAdapter.kt",
"chars": 11959,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport android.util.Base64\nimport android.vie"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/HRvItemAdapter.kt",
"chars": 2906,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/HSearchTagAdapter.kt",
"chars": 1469,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport android.text.TextUtils\nimport android."
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/HSubscriptionAdapter.kt",
"chars": 6261,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport android.view.View\nimport android.view."
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/HanimeDownloadedRvAdapter.kt",
"chars": 7186,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport android.graphics.RenderEffect\nimport a"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/HanimeDownloadingRvAdapter.kt",
"chars": 10051,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.animation.ValueAnimator\nimport android.annotation.SuppressLin"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/HanimeMyListVideoAdapter.kt",
"chars": 2915,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport android.view.View\nimport android.view."
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/HanimePreviewNewsRvAdapter.kt",
"chars": 4266,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport android.view.LayoutInflater\nimport and"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/HanimePreviewTourRvAdapter.kt",
"chars": 1732,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport android.view.ViewGroup\nimport android."
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/HanimeSearchHistoryRvAdapter.kt",
"chars": 2397,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport android.view.View\nimport android.view."
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/HanimeUpdateRvAdapter.kt",
"chars": 8438,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.animation.ValueAnimator\nimport android.annotation.SuppressLin"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/HanimeUpdatedRvAdapter.kt",
"chars": 4823,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport android.graphics.RenderEffect\nimport a"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/HanimeVideoRvAdapter.kt",
"chars": 9139,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport android.content.Intent\nimport android."
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/PlaylistRvAdapter.kt",
"chars": 1639,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport android.view.ViewGroup\nimport androidx"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/RvWrapper.kt",
"chars": 2975,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport android.graphics.Outline\nimport androi"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/SharedHKeyframesRvAdapter.kt",
"chars": 4518,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/SuperResolutionAdapter.kt",
"chars": 1335,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.R\nimport android.content.Context\nimport android.graphics.Colo"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/VideoColumnTitleAdapter.kt",
"chars": 2352,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport android.view.View\nimport android.view."
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/VideoCommentRvAdapter.kt",
"chars": 10541,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport android.view.LayoutInflater\nimport and"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/VideoSpeedAdapter.kt",
"chars": 1341,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport android.graphics.Color\nimport android."
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/adapter/WatchHistoryRvAdapter.kt",
"chars": 3195,
"preview": "package com.yenaly.han1meviewer.ui.adapter\n\nimport android.content.Context\nimport android.view.LayoutInflater\nimport and"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/fragment/IToolbarFragment.kt",
"chars": 341,
"preview": "package com.yenaly.han1meviewer.ui.fragment\n\nimport androidx.appcompat.app.AppCompatActivity\n\n/**\n * 用於 Fragment 要求 Acti"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/fragment/LoginNeededFragmentMixin.kt",
"chars": 551,
"preview": "package com.yenaly.han1meviewer.ui.fragment\n\nimport androidx.fragment.app.Fragment\nimport androidx.navigation.fragment.f"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/fragment/home/DownloadFragment.kt",
"chars": 2150,
"preview": "package com.yenaly.han1meviewer.ui.fragment.home\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport and"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/fragment/home/HomePageFragment.kt",
"chars": 12899,
"preview": "package com.yenaly.han1meviewer.ui.fragment.home\n\nimport android.annotation.SuppressLint\nimport android.content.res.Colo"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/fragment/home/MyFavVideoFragment.kt",
"chars": 6961,
"preview": "package com.yenaly.han1meviewer.ui.fragment.home\n\nimport android.annotation.SuppressLint\nimport android.content.res.Conf"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/fragment/home/MyPlaylistFragment.kt",
"chars": 14575,
"preview": "package com.yenaly.han1meviewer.ui.fragment.home\n\nimport android.annotation.SuppressLint\nimport android.content.res.Conf"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/fragment/home/MyWatchLaterFragment.kt",
"chars": 7069,
"preview": "package com.yenaly.han1meviewer.ui.fragment.home\n\nimport android.annotation.SuppressLint\nimport android.content.res.Conf"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/fragment/home/WatchHistoryFragment.kt",
"chars": 4258,
"preview": "package com.yenaly.han1meviewer.ui.fragment.home\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport and"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/fragment/home/download/DownloadedFragment.kt",
"chars": 4717,
"preview": "package com.yenaly.han1meviewer.ui.fragment.home.download\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\ni"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/fragment/home/download/DownloadingFragment.kt",
"chars": 6162,
"preview": "package com.yenaly.han1meviewer.ui.fragment.home.download\n\nimport android.os.Bundle\nimport android.util.Log\nimport andro"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/fragment/search/HCheckBoxFragment.kt",
"chars": 2393,
"preview": "package com.yenaly.han1meviewer.ui.fragment.search\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport a"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/fragment/search/HMultiChoicesDialog.kt",
"chars": 5083,
"preview": "package com.yenaly.han1meviewer.ui.fragment.search\n\nimport android.annotation.SuppressLint\nimport android.content.Contex"
},
{
"path": "app/src/main/java/com/yenaly/han1meviewer/ui/fragment/search/HTimePickerDialog.kt",
"chars": 5171,
"preview": "package com.yenaly.han1meviewer.ui.fragment.search\n\nimport android.content.Context\nimport android.content.DialogInterfac"
}
]
// ... and 353 more files (download for full content)
About this extraction
This page contains the full source code of the Night-stars-1/Han1meViewer GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 553 files (1.8 MB), approximately 583.4k tokens. 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.