gitextract_w3ol9anw/ ├── .babelrc ├── .editorconfig ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yaml │ │ ├── config.yml │ │ └── feature_request.yaml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── auto-merge.yml │ ├── dependabot.yml │ ├── issue-labeler.yml │ ├── pr-labeler.yml │ └── workflows/ │ ├── autoMerge.yml │ ├── build.yml │ ├── calibreapp-image-actions.yml │ ├── codeql.yml │ ├── conflicts.yml │ ├── flatpak.yml │ ├── label-issue.yml │ ├── label-pr.yml │ ├── linter.yml │ ├── no-response.yml │ ├── release.yml │ ├── remove-outdated-labels.yml │ ├── stale.yml │ └── updateSite.yml ├── .gitignore ├── .stylelintignore ├── .vscode/ │ ├── extensions.json │ ├── launch.json │ └── settings.json ├── .whitesource ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── _icons/ │ └── iconMac.icns ├── _scripts/ │ ├── ProcessLocalesPlugin.js │ ├── _undefinedDefaultExport.mjs │ ├── build.mjs │ ├── clean.mjs │ ├── dev-runner.js │ ├── ebuilder.config.mjs │ ├── eslint-rules/ │ │ ├── plugin.mjs │ │ └── prefer-use-i18n-polyfill-rule.mjs │ ├── findMissingTemplates.mjs │ ├── getInstances.js │ ├── getRegions.mjs │ ├── getShakaLocales.js │ ├── injectAllowedPaths.mjs │ ├── mime-db-shrinking-loader.js │ ├── patch-shaka-player-loader.js │ ├── sigFrameConfig.js │ ├── webpack.botGuardScript.config.js │ ├── webpack.main.config.js │ ├── webpack.preload.config.js │ ├── webpack.renderer.config.js │ └── webpack.web.config.js ├── eslint.config.mjs ├── jsconfig.json ├── lefthook-local.yml.example ├── lefthook.yml ├── package.json ├── src/ │ ├── botGuardScript.js │ ├── constants.js │ ├── data/ │ │ └── .gitkeep │ ├── datastores/ │ │ ├── handlers/ │ │ │ ├── base.js │ │ │ ├── electron.js │ │ │ ├── index.js │ │ │ └── web.js │ │ └── index.js │ ├── index.ejs │ ├── main/ │ │ ├── ImageCache.js │ │ ├── externalPlayer.js │ │ ├── index.js │ │ ├── poTokenGenerator.js │ │ └── utils.js │ ├── preload/ │ │ ├── interface.js │ │ ├── main.js │ │ └── preload-interface.d.ts │ └── renderer/ │ ├── App.css │ ├── App.vue │ ├── components/ │ │ ├── ChannelAbout/ │ │ │ ├── ChannelAbout.css │ │ │ └── ChannelAbout.vue │ │ ├── ChannelDetails/ │ │ │ ├── ChannelDetails.css │ │ │ └── ChannelDetails.vue │ │ ├── ChannelHome/ │ │ │ ├── ChannelHome.css │ │ │ └── ChannelHome.vue │ │ ├── CommentSection/ │ │ │ ├── CommentSection.css │ │ │ └── CommentSection.vue │ │ ├── DataSettings/ │ │ │ ├── DataSettings.css │ │ │ └── DataSettings.vue │ │ ├── DistractionSettings/ │ │ │ ├── DistractionSettings.css │ │ │ └── DistractionSettings.vue │ │ ├── ExperimentalSettings/ │ │ │ ├── ExperimentalSettings.css │ │ │ └── ExperimentalSettings.vue │ │ ├── ExternalPlayerSettings.vue │ │ ├── FtAgeRestricted/ │ │ │ ├── FtAgeRestricted.css │ │ │ └── FtAgeRestricted.vue │ │ ├── FtAutoGrid/ │ │ │ ├── FtAutoGrid.css │ │ │ └── FtAutoGrid.vue │ │ ├── FtAutoLoadNextPageWrapper.vue │ │ ├── FtButton/ │ │ │ ├── FtButton.css │ │ │ └── FtButton.vue │ │ ├── FtChannelBubble/ │ │ │ ├── FtChannelBubble.css │ │ │ └── FtChannelBubble.vue │ │ ├── FtCheckboxList/ │ │ │ ├── FtCheckboxList.css │ │ │ └── FtCheckboxList.vue │ │ ├── FtCommunityPoll/ │ │ │ ├── FtCommunityPoll.css │ │ │ └── FtCommunityPoll.vue │ │ ├── FtCommunityPost/ │ │ │ ├── FtCommunityPost.scss │ │ │ └── FtCommunityPost.vue │ │ ├── FtCreatePlaylistPrompt/ │ │ │ ├── FtCreatePlaylistPrompt.css │ │ │ └── FtCreatePlaylistPrompt.vue │ │ ├── FtElementList/ │ │ │ ├── FtElementList.css │ │ │ └── FtElementList.vue │ │ ├── FtIconButton/ │ │ │ ├── FtIconButton.scss │ │ │ └── FtIconButton.vue │ │ ├── FtInput/ │ │ │ ├── FtInput.css │ │ │ └── FtInput.vue │ │ ├── FtInputTags/ │ │ │ ├── FtInputTags.css │ │ │ └── FtInputTags.vue │ │ ├── FtKeyboardShortcutPrompt/ │ │ │ ├── FtKeyboardShortcutPrompt.css │ │ │ └── FtKeyboardShortcutPrompt.vue │ │ ├── FtListChannel/ │ │ │ ├── FtListChannel.scss │ │ │ └── FtListChannel.vue │ │ ├── FtListHashtag/ │ │ │ ├── FtListHashtag.scss │ │ │ └── FtListHashtag.vue │ │ ├── FtListLazyWrapper/ │ │ │ ├── FtListLazyWrapper.css │ │ │ └── FtListLazyWrapper.vue │ │ ├── FtListPlaylist/ │ │ │ ├── FtListPlaylist.scss │ │ │ └── FtListPlaylist.vue │ │ ├── FtListVideoLazy.vue │ │ ├── FtListVideoNumbered/ │ │ │ ├── FtListVideoNumbered.css │ │ │ └── FtListVideoNumbered.vue │ │ ├── FtLoader/ │ │ │ ├── FtLoader.css │ │ │ └── FtLoader.vue │ │ ├── FtLogoFull/ │ │ │ ├── FtLogoFull.css │ │ │ └── FtLogoFull.vue │ │ ├── FtNotificationBanner/ │ │ │ ├── FtNotificationBanner.css │ │ │ └── FtNotificationBanner.vue │ │ ├── FtPlaylistAddVideoPrompt/ │ │ │ ├── FtPlaylistAddVideoPrompt.css │ │ │ └── FtPlaylistAddVideoPrompt.vue │ │ ├── FtPlaylistSelector/ │ │ │ ├── FtPlaylistSelector.scss │ │ │ └── FtPlaylistSelector.vue │ │ ├── FtProfileBubble/ │ │ │ ├── FtProfileBubble.css │ │ │ └── FtProfileBubble.vue │ │ ├── FtProfileChannelList/ │ │ │ ├── FtProfileChannelList.css │ │ │ └── FtProfileChannelList.vue │ │ ├── FtProfileEdit/ │ │ │ ├── FtProfileEdit.css │ │ │ └── FtProfileEdit.vue │ │ ├── FtProfileFilterChannelsList/ │ │ │ ├── FtProfileFilterChannelsList.css │ │ │ └── FtProfileFilterChannelsList.vue │ │ ├── FtProfileSelector/ │ │ │ ├── FtProfileSelector.css │ │ │ └── FtProfileSelector.vue │ │ ├── FtProgressBar/ │ │ │ ├── FtProgressBar.css │ │ │ └── FtProgressBar.vue │ │ ├── FtPrompt/ │ │ │ ├── FtPrompt.css │ │ │ └── FtPrompt.vue │ │ ├── FtRadioButton/ │ │ │ ├── FtRadioButton.css │ │ │ └── FtRadioButton.vue │ │ ├── FtRefreshWidget/ │ │ │ ├── FtRefreshWidget.scss │ │ │ └── FtRefreshWidget.vue │ │ ├── FtSearchFilters/ │ │ │ ├── FtSearchFilters.css │ │ │ └── FtSearchFilters.vue │ │ ├── FtSelect/ │ │ │ ├── FtSelect.css │ │ │ └── FtSelect.vue │ │ ├── FtSettingsMenu/ │ │ │ ├── FtSettingsMenu.css │ │ │ └── FtSettingsMenu.vue │ │ ├── FtSettingsSection/ │ │ │ ├── FtSettingsSection.scss │ │ │ └── FtSettingsSection.vue │ │ ├── FtShareButton/ │ │ │ ├── FtShareButton.css │ │ │ └── FtShareButton.vue │ │ ├── FtSlider/ │ │ │ ├── FtSlider.css │ │ │ └── FtSlider.vue │ │ ├── FtSponsorBlockCategory/ │ │ │ ├── FtSponsorBlockCategory.css │ │ │ └── FtSponsorBlockCategory.vue │ │ ├── FtSubscribeButton/ │ │ │ ├── FtSubscribeButton.css │ │ │ └── FtSubscribeButton.vue │ │ ├── FtTimestampCatcher.vue │ │ ├── FtToast/ │ │ │ ├── FtToast.css │ │ │ └── FtToast.vue │ │ ├── FtToggleSwitch/ │ │ │ ├── FtToggleSwitch.scss │ │ │ └── FtToggleSwitch.vue │ │ ├── FtTooltip/ │ │ │ ├── FtTooltip.css │ │ │ └── FtTooltip.vue │ │ ├── GeneralSettings/ │ │ │ ├── GeneralSettings.css │ │ │ └── GeneralSettings.vue │ │ ├── ParentalControlSettings.vue │ │ ├── PasswordDialog/ │ │ │ ├── PasswordDialog.css │ │ │ └── PasswordDialog.vue │ │ ├── PasswordSettings/ │ │ │ ├── PasswordSettings.css │ │ │ └── PasswordSettings.vue │ │ ├── PlayerSettings/ │ │ │ ├── PlayerSettings.css │ │ │ └── PlayerSettings.vue │ │ ├── PlaylistInfo/ │ │ │ ├── PlaylistInfo.scss │ │ │ └── PlaylistInfo.vue │ │ ├── PrivacySettings.vue │ │ ├── ProxySettings/ │ │ │ ├── ProxySettings.css │ │ │ └── ProxySettings.vue │ │ ├── SideNav/ │ │ │ ├── SideNav.css │ │ │ └── SideNav.vue │ │ ├── SideNavMoreOptions/ │ │ │ ├── SideNavMoreOptions.css │ │ │ └── SideNavMoreOptions.vue │ │ ├── SponsorBlockSettings.vue │ │ ├── SubscriptionSettings/ │ │ │ ├── SubscriptionSettings.css │ │ │ └── SubscriptionSettings.vue │ │ ├── SubscriptionsLive.vue │ │ ├── SubscriptionsPosts.vue │ │ ├── SubscriptionsShorts.vue │ │ ├── SubscriptionsTabUi/ │ │ │ ├── SubscriptionsTabUi.css │ │ │ └── SubscriptionsTabUi.vue │ │ ├── SubscriptionsVideos.vue │ │ ├── ThemeSettings.vue │ │ ├── TopNav/ │ │ │ ├── TopNav.scss │ │ │ └── TopNav.vue │ │ ├── WatchVideoChapters/ │ │ │ ├── WatchVideoChapters.css │ │ │ └── WatchVideoChapters.vue │ │ ├── WatchVideoDescription/ │ │ │ ├── WatchVideoDescription.css │ │ │ └── WatchVideoDescription.vue │ │ ├── WatchVideoInfo/ │ │ │ ├── WatchVideoInfo.css │ │ │ └── WatchVideoInfo.vue │ │ ├── WatchVideoLiveChat/ │ │ │ ├── WatchVideoLiveChat.css │ │ │ └── WatchVideoLiveChat.vue │ │ ├── WatchVideoRecommendations/ │ │ │ ├── WatchVideoRecommendations.css │ │ │ └── WatchVideoRecommendations.vue │ │ ├── ft-card/ │ │ │ ├── ft-card.css │ │ │ ├── ft-card.js │ │ │ └── ft-card.vue │ │ ├── ft-flex-box/ │ │ │ ├── ft-flex-box.css │ │ │ ├── ft-flex-box.js │ │ │ └── ft-flex-box.vue │ │ ├── ft-list-video/ │ │ │ ├── ft-list-video.js │ │ │ ├── ft-list-video.scss │ │ │ └── ft-list-video.vue │ │ ├── ft-shaka-video-player/ │ │ │ ├── ft-shaka-video-player.css │ │ │ ├── ft-shaka-video-player.js │ │ │ ├── ft-shaka-video-player.vue │ │ │ └── player-components/ │ │ │ ├── AudioTrackSelection.js │ │ │ ├── AutoplayToggle.js │ │ │ ├── FullWindowButton.js │ │ │ ├── LegacyQualitySelection.js │ │ │ ├── ScreenshotButton.js │ │ │ ├── SkipButton.js │ │ │ ├── StatsButton.js │ │ │ └── TheatreModeButton.js │ │ └── watch-video-playlist/ │ │ ├── watch-video-playlist.css │ │ ├── watch-video-playlist.js │ │ └── watch-video-playlist.vue │ ├── composables/ │ │ ├── colors.js │ │ └── use-i18n-polyfill.js │ ├── directives/ │ │ └── vSaferHtml.js │ ├── fontawesome-minimal.js │ ├── helpers/ │ │ ├── api/ │ │ │ ├── PlayerCache.js │ │ │ ├── invidious.js │ │ │ └── local.js │ │ ├── channels.js │ │ ├── colors.js │ │ ├── player/ │ │ │ ├── EbmlParser.js │ │ │ ├── Mp4SegmentIndexParser.js │ │ │ ├── SabrManifestParser.js │ │ │ ├── SabrSchemePlugin.js │ │ │ ├── WebmSegmentIndexParser.js │ │ │ └── utils.js │ │ ├── playlists.js │ │ ├── sponsorblock.js │ │ ├── strings.js │ │ ├── subscriptions.js │ │ └── utils.js │ ├── i18n/ │ │ └── index.js │ ├── main.js │ ├── router/ │ │ └── index.js │ ├── scss-partials/ │ │ ├── _ft-list-item.scss │ │ └── _utils.scss │ ├── sigFrameScript.js │ ├── store/ │ │ ├── index.js │ │ └── modules/ │ │ ├── history.js │ │ ├── invidious.js │ │ ├── player.js │ │ ├── playlists.js │ │ ├── profiles.js │ │ ├── search-history.js │ │ ├── settings.js │ │ ├── subscription-cache.js │ │ └── utils.js │ ├── themes.css │ └── views/ │ ├── About/ │ │ ├── About.css │ │ └── About.vue │ ├── Channel/ │ │ ├── Channel.css │ │ └── Channel.vue │ ├── Hashtag/ │ │ ├── Hashtag.css │ │ └── Hashtag.vue │ ├── History/ │ │ ├── History.css │ │ └── History.vue │ ├── Playlist/ │ │ ├── Playlist.scss │ │ └── Playlist.vue │ ├── Popular/ │ │ ├── Popular.css │ │ └── Popular.vue │ ├── Post.vue │ ├── ProfileSettings/ │ │ ├── ProfileSettings.css │ │ └── ProfileSettings.vue │ ├── SearchPage/ │ │ ├── SearchPage.css │ │ └── SearchPage.vue │ ├── Settings/ │ │ ├── Settings.css │ │ └── Settings.vue │ ├── SubscribedChannels/ │ │ ├── SubscribedChannels.css │ │ └── SubscribedChannels.vue │ ├── Subscriptions/ │ │ ├── Subscriptions.css │ │ └── Subscriptions.vue │ ├── Trending/ │ │ ├── Trending.css │ │ └── Trending.vue │ ├── UserPlaylists/ │ │ ├── UserPlaylists.css │ │ └── UserPlaylists.vue │ └── Watch/ │ ├── Watch.js │ ├── Watch.scss │ └── Watch.vue ├── static/ │ ├── .gitkeep │ ├── external-player-map.json │ ├── geolocations/ │ │ ├── ar.json │ │ ├── be.json │ │ ├── bg.json │ │ ├── ca.json │ │ ├── cs.json │ │ ├── da.json │ │ ├── de-DE.json │ │ ├── el.json │ │ ├── en-GB.json │ │ ├── en-US.json │ │ ├── es-AR.json │ │ ├── es-MX.json │ │ ├── es.json │ │ ├── et.json │ │ ├── eu.json │ │ ├── fa.json │ │ ├── fi.json │ │ ├── fr-FR.json │ │ ├── gl.json │ │ ├── he.json │ │ ├── hr.json │ │ ├── hu.json │ │ ├── id.json │ │ ├── is.json │ │ ├── it.json │ │ ├── ja.json │ │ ├── ko.json │ │ ├── lt.json │ │ ├── nb-NO.json │ │ ├── nl.json │ │ ├── nn.json │ │ ├── pl.json │ │ ├── pt-BR.json │ │ ├── pt-PT.json │ │ ├── pt.json │ │ ├── ro.json │ │ ├── ru.json │ │ ├── sk.json │ │ ├── sl.json │ │ ├── sr.json │ │ ├── sv.json │ │ ├── ta.json │ │ ├── tr.json │ │ ├── uk.json │ │ ├── vi.json │ │ ├── zh-CN.json │ │ └── zh-TW.json │ ├── invidious-instances.json │ ├── locales/ │ │ ├── activeLocales.json │ │ ├── af.yaml │ │ ├── ar.yaml │ │ ├── as.yaml │ │ ├── awa.yaml │ │ ├── az.yaml │ │ ├── be.yaml │ │ ├── bg.yaml │ │ ├── bn.yaml │ │ ├── br.yaml │ │ ├── bs.yaml │ │ ├── ca.yaml │ │ ├── ckb.yaml │ │ ├── cs.yaml │ │ ├── cy.yaml │ │ ├── da.yaml │ │ ├── de-DE.yaml │ │ ├── el.yaml │ │ ├── en-GB.yaml │ │ ├── en-US.yaml │ │ ├── eo.yaml │ │ ├── es-AR.yaml │ │ ├── es-MX.yaml │ │ ├── es.yaml │ │ ├── et.yaml │ │ ├── eu.yaml │ │ ├── fa.yaml │ │ ├── fi.yaml │ │ ├── fil.yaml │ │ ├── fr-FR.yaml │ │ ├── gl.yaml │ │ ├── gsw.yaml │ │ ├── he.yaml │ │ ├── hi.yaml │ │ ├── hr.yaml │ │ ├── hu.yaml │ │ ├── id.yaml │ │ ├── is.yaml │ │ ├── it.yaml │ │ ├── ja.yaml │ │ ├── ka.yaml │ │ ├── km.yaml │ │ ├── ko.yaml │ │ ├── ku.yaml │ │ ├── la.yaml │ │ ├── lt.yaml │ │ ├── lv.yaml │ │ ├── ms.yaml │ │ ├── my.yaml │ │ ├── nb-NO.yaml │ │ ├── ne.yaml │ │ ├── nl.yaml │ │ ├── nn.yaml │ │ ├── or.yaml │ │ ├── pl.yaml │ │ ├── pt-BR.yaml │ │ ├── pt-PT.yaml │ │ ├── pt.yaml │ │ ├── ro.yaml │ │ ├── ru.yaml │ │ ├── sat.yaml │ │ ├── si.yaml │ │ ├── sk.yaml │ │ ├── sl.yaml │ │ ├── sm.yaml │ │ ├── sq.yaml │ │ ├── sr.yaml │ │ ├── sv.yaml │ │ ├── ta.yaml │ │ ├── ti.yaml │ │ ├── tok.yaml │ │ ├── tr.yaml │ │ ├── uk.yaml │ │ ├── ur.yaml │ │ ├── uz.yaml │ │ ├── vi.yaml │ │ ├── vls.yaml │ │ ├── xh.yaml │ │ ├── zh-CN.yaml │ │ └── zh-TW.yaml │ ├── manifest.json │ └── pwabuilder-sw.js └── stylelint.config.mjs