├── .gitattributes ├── .github └── ISSUE_TEMPLATE │ ├── 1-bug_report.yml │ ├── 2-feature_request.yml │ ├── 3-documentation_issue.yml │ └── config.yml ├── .gitignore ├── .gitlab-ci.yml ├── .gitmodules ├── Grayjay.ClientServer ├── AppVersion.json ├── Browser │ └── BrowserSimulatorBuilder.cs ├── Casting │ ├── AirPlayCastingDevice.cs │ ├── CastConnectionState.cs │ ├── CastProtocolType.cs │ ├── CastingDevice.cs │ ├── CastingDeviceInfo.cs │ ├── ChromecastCastingDevice.cs │ ├── FCastCastingDevice.cs │ └── FCastSession.cs ├── Changelogs │ ├── 3.txt │ ├── 4.txt │ ├── 5.txt │ ├── 6.txt │ └── 7.txt ├── Constants │ ├── App.cs │ ├── Directories.cs │ └── Language.cs ├── Controllers │ ├── BuyController.cs │ ├── CastingController.cs │ ├── ChannelController.cs │ ├── DetailsController.cs │ ├── DeveloperController.cs │ ├── DialogController.cs │ ├── DownloadController.cs │ ├── HandleController.cs │ ├── HistoryController.cs │ ├── HomeController.cs │ ├── ImagesController.cs │ ├── ImportController.cs │ ├── LocalController.cs │ ├── PlaylistController.cs │ ├── PlaylistsController.cs │ ├── ProxyController.cs │ ├── SearchController.cs │ ├── SettingsController.cs │ ├── SourcesController.cs │ ├── SubscriptionsController.cs │ ├── SyncController.cs │ ├── WatchLaterController.cs │ └── WindowController.cs ├── Crypto │ ├── EncryptionProvider.cs │ ├── FileKeyring.cs │ ├── IKeyring.cs │ ├── Keyring.cs │ ├── LinuxKeyring.cs │ ├── MacOSKeyring.cs │ └── WindowsKeyring.cs ├── Database │ ├── DatabaseCollection.cs │ ├── DatabaseConnection.cs │ └── Indexes │ │ ├── DBHistoryIndex.cs │ │ ├── DBIndex.cs │ │ └── DBSubscriptionCacheIndex.cs ├── Debouncer.cs ├── Developer │ ├── DevGrayjayPlugin.cs │ ├── Embed │ │ ├── dev_bridge.js │ │ └── index.html │ └── V8RemoteObject.cs ├── Dialogs │ ├── ImportPlaylistsDialog.cs │ ├── ImportStructureDialog.cs │ ├── ImportSubscriptionsDialog.cs │ ├── RemoteDialog.cs │ ├── SyncConfirmDialog.cs │ └── SyncStatusDialog.cs ├── ExceptionHandlers │ └── ScriptExceptionHandler.cs ├── Exceptions │ ├── DialogException.cs │ ├── DownloadException.cs │ └── NoPlatformClientException.cs ├── Extensions.cs ├── ExtensionsContent.cs ├── Grayjay.ClientServer.csproj ├── GrayjayCastingServer.cs ├── GrayjayLogger.cs ├── GrayjayServer.cs ├── Helpers │ └── VideoHelper.cs ├── IWindowProvider.cs ├── Logger.cs ├── Models │ ├── Comments │ │ └── RefComment.cs │ ├── Downloads │ │ ├── PlaylistDownload.cs │ │ ├── SpeedMonitor.cs │ │ ├── StorageInfo.cs │ │ └── VideoDownload.cs │ ├── ExceptionModel.cs │ ├── History │ │ └── HistoryVideo.cs │ ├── PagerResult.cs │ ├── Playlist.cs │ ├── Sources │ │ └── PluginConfigState.cs │ ├── Subscriptions │ │ └── SubscriptionGroup.cs │ └── ToastDescriptor.cs ├── OSHelper.cs ├── Pagers │ ├── ConvertPager.cs │ └── RefPager.cs ├── Parsers │ └── HLS.cs ├── Payment │ ├── Constants.cs │ └── LicenseValidator.cs ├── PluginEncryptionProvider.cs ├── Pooling │ ├── PlatformClientPool.cs │ └── PlatformMultiClientPool.cs ├── Program.cs ├── Properties │ └── launchSettings.json ├── Protobuffers │ ├── Chromecast.cs │ └── Chromecast.proto ├── Proxy │ ├── HttpProxy.cs │ ├── HttpProxyRegistry.cs │ ├── HttpProxyRequest.cs │ ├── HttpProxyResponse.cs │ ├── HttpProxySession.cs │ └── HttpProxyStream.cs ├── RequestLoggingMiddleware.cs ├── Serializers │ ├── GJsonSerializer.cs │ ├── PlatformContentConverter.cs │ ├── RatingConverter.cs │ ├── SourceConverter.cs │ ├── SubtitleSourceConverter.cs │ └── UnixDateTimeConverter.cs ├── Settings │ ├── GrayjayDevSettings.cs │ ├── GrayjaySettings.cs │ └── SettingsInstanced.cs ├── States │ ├── StateApp.cs │ ├── StateBackup.cs │ ├── StateCache.cs │ ├── StateCasting.cs │ ├── StateDeveloper.cs │ ├── StateDownloads.cs │ ├── StateHistory.cs │ ├── StateImages.cs │ ├── StatePlatform.cs │ ├── StatePlaylists.cs │ ├── StatePlugins.cs │ ├── StateSearch.cs │ ├── StateSubscriptions.cs │ ├── StateSync.cs │ ├── StateTelemetry.cs │ ├── StateUI.cs │ ├── StateWatchLater.cs │ ├── StateWebsocket.cs │ └── StateWindow.cs ├── Store │ ├── ManagedDBStore.cs │ ├── ManagedStore.cs │ ├── RawUniqueStore.cs │ └── RawValueStore.cs ├── SubsExchange │ ├── ChannelRequest.cs │ ├── ChannelResolve.cs │ ├── ChannelResult.cs │ ├── ExchangeContract.cs │ ├── ExchangeContractResolve.cs │ └── SubsExchangeClient.cs ├── Subscriptions │ ├── Algorithms │ │ ├── CachedSubscriptionAlgorithm.cs │ │ ├── SmartSubscriptionAlgorithm.cs │ │ ├── SubscriptionFetchAlgorithm.cs │ │ ├── SubscriptionFetchAlgorithms.cs │ │ └── SubscriptionsTaskFetchAlgorithm.cs │ └── Subscription.cs ├── Sync │ ├── GrayjaySyncHandlers.cs │ ├── Internal │ │ ├── SyncDevice.cs │ │ └── SyncHandlers.cs │ ├── Models │ │ ├── SendToDevicePackage.cs │ │ ├── SyncPlaylistsPackage.cs │ │ ├── SyncSubscriptionGroupsPackage.cs │ │ ├── SyncSubscriptionsPackage.cs │ │ └── SyncWatchLaterPackage.cs │ ├── SyncExtensions.cs │ └── SyncSessionData.cs ├── Threading │ └── ManagedThreadPool.cs ├── Transcoding │ └── FFMPEG.cs ├── Updater.cs ├── UpdaterConfig.json ├── UpdaterOSConfig.json ├── UpdaterVersion.json ├── Utilities.cs ├── WebSockets │ └── WebSocketEndpoint.cs ├── buildprotos.sh ├── deps │ ├── linux-arm64 │ │ ├── FUTO.Updater.Client │ │ └── ffmpeg │ ├── linux-x64 │ │ ├── FUTO.Updater.Client │ │ └── ffmpeg │ ├── osx-arm64 │ │ └── ffmpeg │ ├── osx-x64 │ │ └── ffmpeg │ └── win-x64 │ │ ├── FUTO.Updater.Client.Old.exe │ │ ├── FUTO.Updater.Client.exe │ │ └── ffmpeg.exe ├── logo.ico ├── logo.svg └── wwwroot │ └── web │ ├── assets │ ├── Inter-Black-jiII8dog.woff2 │ ├── Inter-BlackItalic-1413vuen.woff2 │ ├── Inter-Bold-srYz_-1B.woff2 │ ├── Inter-BoldItalic-dE_gZyur.woff2 │ ├── Inter-ExtraBold-TduDdwUu.woff2 │ ├── Inter-ExtraBoldItalic-BJafRE5I.woff2 │ ├── Inter-ExtraLight-w5HAp5iF.woff2 │ ├── Inter-ExtraLightItalic-ZptecSuc.woff2 │ ├── Inter-Italic-f6M78thn.woff2 │ ├── Inter-Light-DFhX0qo-.woff2 │ ├── Inter-LightItalic-fu56_DRc.woff2 │ ├── Inter-Medium-dDRaJ8tM.woff2 │ ├── Inter-MediumItalic-zr3roggP.woff2 │ ├── Inter-Regular-dEFHw1tF.woff2 │ ├── Inter-SemiBold-PyS8DO2L.woff2 │ ├── Inter-SemiBoldItalic-uIDb7hsH.woff2 │ ├── Inter-Thin-eKObIkJC.woff2 │ ├── Inter-ThinItalic-L6uBn3RP.woff2 │ ├── InterDisplay-Black-zNXy5how.woff2 │ ├── InterDisplay-BlackItalic-ctjAXTNK.woff2 │ ├── InterDisplay-Bold-lyciZXwF.woff2 │ ├── InterDisplay-BoldItalic-z1tWVfao.woff2 │ ├── InterDisplay-ExtraBold-7FjIASTA.woff2 │ ├── InterDisplay-ExtraBoldItalic-7s95LJPU.woff2 │ ├── InterDisplay-ExtraLight-pK3Gdjgs.woff2 │ ├── InterDisplay-ExtraLightItalic-jszRt-K3.woff2 │ ├── InterDisplay-Italic-nmpKuD-N.woff2 │ ├── InterDisplay-Light-wdUe6n9K.woff2 │ ├── InterDisplay-LightItalic-4NttoRVe.woff2 │ ├── InterDisplay-Medium-UQWkFYZQ.woff2 │ ├── InterDisplay-MediumItalic-Z9X8iGLu.woff2 │ ├── InterDisplay-Regular-tJpmyP7a.woff2 │ ├── InterDisplay-SemiBold-Cenj7EW4.woff2 │ ├── InterDisplay-SemiBoldItalic-B8KqP0Rn.woff2 │ ├── InterDisplay-Thin-zBb1wzjL.woff2 │ ├── InterDisplay-ThinItalic-xh-Q83Do.woff2 │ ├── InterVariable-Italic-Heil4Hbz.woff2 │ ├── InterVariable-lovs5kQ3.woff2 │ ├── SF-Pro-Display-Black-jf1EDuNk.otf │ ├── SF-Pro-Display-Bold-wgzmQnuu.otf │ ├── SF-Pro-Display-Heavy-suqXuEOu.otf │ ├── SF-Pro-Display-Light-zyO-Ze74.otf │ ├── SF-Pro-Display-Medium-WDgtw3zp.otf │ ├── SF-Pro-Display-Regular-H25UrEQ-.otf │ ├── SF-Pro-Display-Semibold-gZ5fp-as.otf │ ├── SF-Pro-Display-Thin-B9efhlep.otf │ ├── SF-Pro-Display-Ultralight-nuOvl-Cs.otf │ ├── SF-Pro-Text-Black-TBtR_zhU.otf │ ├── SF-Pro-Text-Bold-ity8cyh-.otf │ ├── SF-Pro-Text-Heavy-HGYkPe4Y.otf │ ├── SF-Pro-Text-Light-5UxMdtBN.otf │ ├── SF-Pro-Text-Medium-JQmFyxY2.otf │ ├── SF-Pro-Text-Regular-XP2m1yXu.otf │ ├── SF-Pro-Text-Semibold-NP5nJO8O.otf │ ├── SF-Pro-Text-Thin-Pk0GKNmg.otf │ ├── SF-Pro-Text-Ultralight-yRKLp3Zd.otf │ ├── favicon-yPpYq1C3.png │ ├── index-9_NBoS_3.css │ ├── index-Ds9X7Y6o.js │ ├── index-Kogui2v2.js │ ├── index-Tg9vHuMa.js │ ├── index-czkvzm2i.css │ ├── index-gCVYv3jZ.js │ ├── index-lBDFJbXq.css │ ├── index-mibvxLKs.css │ ├── index-trxVhThd.js │ ├── index-zDiZRWM2.js │ ├── sen1-N8cpdq92.woff2 │ ├── sen2-TyCf64LB.woff2 │ └── streams-v3NnepLr.svg │ └── index.html ├── Grayjay.Desktop.CEF ├── CEFWindowProvider.cs ├── Entitlements │ ├── Entitlements.plist │ ├── cef-helper-alerts.entitlements │ ├── cef-helper-gpu.entitlements │ ├── cef-helper-plugin.entitlements │ ├── cef-helper-renderer.entitlements │ ├── cef-helper.entitlements │ ├── cef-inherit.entitlements │ └── cef.entitlements ├── Grayjay.Desktop.CEF.csproj ├── Info │ ├── Info-Cef.plist │ ├── Info-Helper-Alerts.plist │ ├── Info-Helper-GPU.plist │ ├── Info-Helper-Plugin.plist │ ├── Info-Helper-Renderer.plist │ ├── Info-Helper.plist │ └── Info.plist ├── Portable ├── Program.cs ├── Resources │ └── MacOS │ │ ├── English.lproj │ │ ├── .DS_Store │ │ ├── InfoPlist.strings │ │ └── MainMenu.nib │ │ │ ├── keyedobjects-101300.nib │ │ │ └── keyedobjects.nib │ │ ├── Keychain.framework │ │ ├── .DS_Store │ │ ├── Headers │ │ │ ├── Keychain-Swift.h │ │ │ └── Keychain.h │ │ ├── Keychain │ │ ├── Modules │ │ │ ├── .DS_Store │ │ │ ├── Keychain.swiftmodule │ │ │ │ ├── arm64-apple-macos.abi.json │ │ │ │ ├── arm64-apple-macos.swiftdoc │ │ │ │ ├── arm64-apple-macos.swiftmodule │ │ │ │ ├── x86_64-apple-macos.abi.json │ │ │ │ ├── x86_64-apple-macos.swiftdoc │ │ │ │ └── x86_64-apple-macos.swiftmodule │ │ │ └── module.modulemap │ │ ├── Resources │ │ │ └── Info.plist │ │ └── _CodeSignature │ │ │ └── CodeResources │ │ ├── MainMenu.xib │ │ ├── PkgInfo │ │ ├── grayjay.icns │ │ └── keychain-framework-entitlements.plist ├── SuppressingTextWriter.cs ├── WindowsAPI.cs ├── bundle-self-distributed-separate-justcef.sh ├── bundle-self-distributed.sh ├── grayjay.png ├── logo.ico └── sign-macos.sh ├── Grayjay.Desktop.Installer ├── Files │ ├── FUTO.Updater.Client.exe │ ├── UpdaterConfig.json │ ├── UpdaterOSConfig.json │ └── launch ├── Grayjay.wxs ├── Metadata │ ├── LICENSE.rtf │ ├── grayjay.png │ ├── grayjay_background.png │ └── grayjay_banner.png ├── Package.wixpdb └── build.sh ├── Grayjay.Desktop.Tests ├── DatabaseTests.cs ├── EncryptionProviderTests.cs ├── GlobalUsings.cs ├── Grayjay.Desktop.Tests.csproj ├── KeyringTests.cs ├── LicenseValidatorTests.cs ├── Plugins │ └── RumblePluginTests.cs ├── ProxyTests.cs ├── SyncTests.cs └── Utility.cs ├── Grayjay.Desktop.Web ├── .DS_Store ├── .babelrc ├── .gitignore ├── index.html ├── package-lock.json ├── package.json ├── pnpm-lock.yaml ├── src │ ├── .DS_Store │ ├── Menus.tsx │ ├── animation.tsx │ ├── assets │ │ ├── .DS_Store │ │ ├── favicon.png │ │ ├── fonts │ │ │ ├── inter │ │ │ │ ├── Inter-Black.woff2 │ │ │ │ ├── Inter-BlackItalic.woff2 │ │ │ │ ├── Inter-Bold.woff2 │ │ │ │ ├── Inter-BoldItalic.woff2 │ │ │ │ ├── Inter-ExtraBold.woff2 │ │ │ │ ├── Inter-ExtraBoldItalic.woff2 │ │ │ │ ├── Inter-ExtraLight.woff2 │ │ │ │ ├── Inter-ExtraLightItalic.woff2 │ │ │ │ ├── Inter-Italic.woff2 │ │ │ │ ├── Inter-Light.woff2 │ │ │ │ ├── Inter-LightItalic.woff2 │ │ │ │ ├── Inter-Medium.woff2 │ │ │ │ ├── Inter-MediumItalic.woff2 │ │ │ │ ├── Inter-Regular.woff2 │ │ │ │ ├── Inter-SemiBold.woff2 │ │ │ │ ├── Inter-SemiBoldItalic.woff2 │ │ │ │ ├── Inter-Thin.woff2 │ │ │ │ ├── Inter-ThinItalic.woff2 │ │ │ │ ├── InterDisplay-Black.woff2 │ │ │ │ ├── InterDisplay-BlackItalic.woff2 │ │ │ │ ├── InterDisplay-Bold.woff2 │ │ │ │ ├── InterDisplay-BoldItalic.woff2 │ │ │ │ ├── InterDisplay-ExtraBold.woff2 │ │ │ │ ├── InterDisplay-ExtraBoldItalic.woff2 │ │ │ │ ├── InterDisplay-ExtraLight.woff2 │ │ │ │ ├── InterDisplay-ExtraLightItalic.woff2 │ │ │ │ ├── InterDisplay-Italic.woff2 │ │ │ │ ├── InterDisplay-Light.woff2 │ │ │ │ ├── InterDisplay-LightItalic.woff2 │ │ │ │ ├── InterDisplay-Medium.woff2 │ │ │ │ ├── InterDisplay-MediumItalic.woff2 │ │ │ │ ├── InterDisplay-Regular.woff2 │ │ │ │ ├── InterDisplay-SemiBold.woff2 │ │ │ │ ├── InterDisplay-SemiBoldItalic.woff2 │ │ │ │ ├── InterDisplay-Thin.woff2 │ │ │ │ ├── InterDisplay-ThinItalic.woff2 │ │ │ │ ├── InterVariable-Italic.woff2 │ │ │ │ ├── InterVariable.woff2 │ │ │ │ └── inter.css │ │ │ └── sen │ │ │ │ ├── sen.css │ │ │ │ ├── sen1.woff2 │ │ │ │ └── sen2.woff2 │ │ ├── grayjay.svg │ │ ├── icons │ │ │ ├── .DS_Store │ │ │ ├── add_to_query.svg │ │ │ ├── airplay.svg │ │ │ ├── arrow_upward.svg │ │ │ ├── checkboxcheck.svg │ │ │ ├── chromecast.svg │ │ │ ├── close_FILL0_wght300_GRAD0_opsz24.svg │ │ │ ├── close_FILL0_wght400_GRAD0_opsz24.svg │ │ │ ├── collapse.svg │ │ │ ├── copy.svg │ │ │ ├── dislike_active.svg │ │ │ ├── dislike_inactive.svg │ │ │ ├── faded_chevron_down.svg │ │ │ ├── fcast.svg │ │ │ ├── help_blue.svg │ │ │ ├── ic_airplay_active.svg │ │ │ ├── ic_airplay_inactive.svg │ │ │ ├── ic_audio.svg │ │ │ ├── ic_buy.svg │ │ │ ├── ic_chromecast_active.svg │ │ │ ├── ic_chromecast_inactive.svg │ │ │ ├── ic_circles.svg │ │ │ ├── ic_device.svg │ │ │ ├── ic_device_unknown.svg │ │ │ ├── ic_document_detailed.svg │ │ │ ├── ic_fail_small.svg │ │ │ ├── ic_fcast_active.svg │ │ │ ├── ic_fcast_inactive.svg │ │ │ ├── ic_internet.svg │ │ │ ├── ic_local.svg │ │ │ ├── ic_mute.svg │ │ │ ├── ic_newpipe.svg │ │ │ ├── ic_offline.svg │ │ │ ├── ic_plugin_settings.svg │ │ │ ├── ic_qr.svg │ │ │ ├── ic_settings_color.svg │ │ │ ├── ic_sources_detailed.svg │ │ │ ├── ic_success_small.svg │ │ │ ├── ic_sync.svg │ │ │ ├── ic_volume.svg │ │ │ ├── ic_zip_encrypted_detailed.svg │ │ │ ├── icon16_chevron_down.svg │ │ │ ├── icon24_IconFilledShare.svg │ │ │ ├── icon24_Share.svg │ │ │ ├── icon24_add.svg │ │ │ ├── icon24_add_people.svg │ │ │ ├── icon24_add_to_playlist.svg │ │ │ ├── icon24_back.svg │ │ │ ├── icon24_back10s.svg │ │ │ ├── icon24_cast.svg │ │ │ ├── icon24_chevron_down.svg │ │ │ ├── icon24_chevron_right.svg │ │ │ ├── icon24_close.svg │ │ │ ├── icon24_cloud_upload.svg │ │ │ ├── icon24_comment.svg │ │ │ ├── icon24_donate.svg │ │ │ ├── icon24_download.svg │ │ │ ├── icon24_edit.svg │ │ │ ├── icon24_faq.svg │ │ │ ├── icon24_feedback.svg │ │ │ ├── icon24_fs_enter.svg │ │ │ ├── icon24_fs_exit.svg │ │ │ ├── icon24_hide.svg │ │ │ ├── icon24_logout.svg │ │ │ ├── icon24_not_interested_.svg │ │ │ ├── icon24_play.svg │ │ │ ├── icon24_play_feed.svg │ │ │ ├── icon24_profile.svg │ │ │ ├── icon24_queue.svg │ │ │ ├── icon24_search.svg │ │ │ ├── icon24_settings.svg │ │ │ ├── icon24_skip10s.svg │ │ │ ├── icon24_sources.svg │ │ │ ├── icon24_store.svg │ │ │ ├── icon24_thumbsdown.svg │ │ │ ├── icon24_thumbsup.svg │ │ │ ├── icon24_tutorials.svg │ │ │ ├── icon24_user.svg │ │ │ ├── icon24_watch_later.svg │ │ │ ├── icon32_pause.svg │ │ │ ├── icon_32_cast.svg │ │ │ ├── icon_32_fullscreen.svg │ │ │ ├── icon_32_minimize.svg │ │ │ ├── icon_32_play.svg │ │ │ ├── icon_32_settings.svg │ │ │ ├── icon_32_volume.svg │ │ │ ├── icon_add_to_playlist.svg │ │ │ ├── icon_add_to_queue.svg │ │ │ ├── icon_button_more.svg │ │ │ ├── icon_checkmark.svg │ │ │ ├── icon_chevron_right.svg │ │ │ ├── icon_chrevron_down.svg │ │ │ ├── icon_code_edit_blue.svg │ │ │ ├── icon_download_completed.svg │ │ │ ├── icon_download_ongoing.svg │ │ │ ├── icon_download_queued.svg │ │ │ ├── icon_drag.svg │ │ │ ├── icon_error.svg │ │ │ ├── icon_error_warning.svg │ │ │ ├── icon_folder.svg │ │ │ ├── icon_grid_active.svg │ │ │ ├── icon_grid_inactive.svg │ │ │ ├── icon_import_filled.svg │ │ │ ├── icon_link.svg │ │ │ ├── icon_link_blue.svg │ │ │ ├── icon_list_active.svg │ │ │ ├── icon_list_inactive.svg │ │ │ ├── icon_loop_active.svg │ │ │ ├── icon_loop_inactive.svg │ │ │ ├── icon_nav_buy.svg │ │ │ ├── icon_nav_creators.svg │ │ │ ├── icon_nav_history.svg │ │ │ ├── icon_nav_home.svg │ │ │ ├── icon_nav_playlists.svg │ │ │ ├── icon_nav_settings.svg │ │ │ ├── icon_nav_subscriptions.svg │ │ │ ├── icon_player_active.svg │ │ │ ├── icon_player_inactive.svg │ │ │ ├── icon_reload_temp.png │ │ │ ├── icon_reload_temp.svg │ │ │ ├── icon_shuffle.svg │ │ │ ├── icon_shuffle_active.svg │ │ │ ├── icon_shuffle_inactive.svg │ │ │ ├── icon_storage.svg │ │ │ ├── icon_theatre.svg │ │ │ ├── icon_thumb.svg │ │ │ ├── icon_trash.svg │ │ │ ├── icon_warning.svg │ │ │ ├── icon_zip_detailed.svg │ │ │ ├── iconfilters.svg │ │ │ ├── like_active.svg │ │ │ ├── like_inactive.svg │ │ │ ├── more_horiz_FILL0_wght400_GRAD0_opsz24.svg │ │ │ ├── nodevicesfound.svg │ │ │ ├── notifications.svg │ │ │ ├── pinned-fill.svg │ │ │ ├── pinned.svg │ │ │ ├── plus.svg │ │ │ ├── polycentric_xs.png │ │ │ ├── search.svg │ │ │ ├── sidebar-close.svg │ │ │ ├── sidebar-open.svg │ │ │ ├── streams.svg │ │ │ ├── tube-spinner.svg │ │ │ └── videos.svg │ │ └── no_videos_in_history.svg │ ├── backend │ │ ├── Backend.ts │ │ ├── BuyBackend.ts │ │ ├── CastingBackend.ts │ │ ├── ChannelBackend.ts │ │ ├── DetailsBackend.ts │ │ ├── DeveloperBackend.ts │ │ ├── DialogBackend.ts │ │ ├── DownloadBackend.ts │ │ ├── HandlingBackend.ts │ │ ├── HistoryBackend.ts │ │ ├── HomeBackend.ts │ │ ├── ImagesBackend.ts │ │ ├── ImportBackend.ts │ │ ├── LocalBackend.ts │ │ ├── PlatformBackend.ts │ │ ├── PlaylistBackend.ts │ │ ├── PlaylistsBackend.ts │ │ ├── SearchBackend.ts │ │ ├── SettingsBackend.ts │ │ ├── SourcesBackend.ts │ │ ├── SubscriptionsBackend.ts │ │ ├── SyncBackend.ts │ │ ├── WatchLaterBackend.ts │ │ ├── WindowBackend.ts │ │ ├── exceptions │ │ │ └── ExceptionModel.ts │ │ └── models │ │ │ ├── ContentType.ts │ │ │ ├── IPlatformAuthorLink.ts │ │ │ ├── IPlatformID.ts │ │ │ ├── IPlaylist.ts │ │ │ ├── IRating.ts │ │ │ ├── IThumbnails.ts │ │ │ ├── RefItem.ts │ │ │ ├── channels │ │ │ └── ISerializedChannel.ts │ │ │ ├── comments │ │ │ ├── ILiveChatWindowDescriptor.ts │ │ │ └── ISerializedComment.ts │ │ │ ├── content │ │ │ ├── IHistoryVideo.ts │ │ │ ├── IPlatformContent.ts │ │ │ ├── IPlatformContentPlaceholder.ts │ │ │ ├── IPlatformLockedContent.ts │ │ │ ├── IPlatformNestedMedia.ts │ │ │ ├── IPlatformPlaylist.ts │ │ │ ├── IPlatformPlaylistDetails.ts │ │ │ ├── IPlatformPost.ts │ │ │ ├── IPlatformPostDetails.ts │ │ │ └── IPlatformVideo.ts │ │ │ ├── contentDetails │ │ │ ├── IChapter.ts │ │ │ └── IPlatformVideoDetails.ts │ │ │ ├── downloads │ │ │ ├── IDownloadSources.ts │ │ │ ├── IPlaylistDownload.ts │ │ │ ├── IStorageInfo.ts │ │ │ ├── IVideoDownload.ts │ │ │ └── IVideoLocal.ts │ │ │ ├── pagers │ │ │ ├── Pager.ts │ │ │ ├── PagerResult.ts │ │ │ ├── PlaceholderPager.ts │ │ │ └── RefreshPager.ts │ │ │ ├── plugin │ │ │ ├── IPluginPrompt.ts │ │ │ ├── ISourceConfig.ts │ │ │ └── ISourceConfigState.ts │ │ │ ├── settings │ │ │ ├── SettingsObject.ts │ │ │ └── fields │ │ │ │ ├── SettingsFieldButton.ts │ │ │ │ ├── SettingsFieldDropDown.ts │ │ │ │ ├── SettingsFieldGroup.ts │ │ │ │ ├── SettingsFieldGroupFlat.ts │ │ │ │ ├── SettingsFieldReadOnly.ts │ │ │ │ └── SettingsFieldToggle.ts │ │ │ ├── socket │ │ │ └── WebSocketPacket.ts │ │ │ ├── subscriptions │ │ │ └── ISubscription.ts │ │ │ └── sync │ │ │ └── SyncDevice.ts │ ├── components │ │ ├── ButtonGroup │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── CommentView │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── EmptyContentView │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── GlobalContextMenu │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── LiveChatRemoteWindow │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── PlaybackQueue │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── PlaylistDetailView │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── PlaylistItemView │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── RatingView │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── RemotePlaylistDetailView │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── RepliesOverlay │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── ToggleButtonGroup │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── ToggleItemBigButtonGroupMulti │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── ToggleItemButtonGroup │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── ToggleItemButtonGroupMulti │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── basics │ │ │ ├── AnimatedImage │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── DragArea │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── ResizeHandle │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── ViewTypeToggles │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── inputs │ │ │ │ ├── Checkbox │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── CheckboxFlex │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── Dropdown │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── InputText │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── InputTextArea │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── SettingsDropdown │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── Toggle │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ └── TogglePill │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ └── loaders │ │ │ │ ├── CenteredLoader │ │ │ │ └── index.tsx │ │ │ │ ├── CircleLoader │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ │ ├── Loader │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ │ ├── LoaderContainer │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ │ ├── LoaderGrid │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ │ ├── LoaderSmall │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ │ └── SkeletonDiv │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ ├── buttons │ │ │ ├── BorderButton │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── Button │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── ButtonFlex │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── CustomButton │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── DescriptorButton │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── IconButton │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── LoadingButton │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── PillButton │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── PillButtonSmall │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── SubscribeButton │ │ │ │ └── index.tsx │ │ │ └── TransparentIconButton │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ ├── casting │ │ │ └── OverlayCasting │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ ├── containers │ │ │ ├── ContentGrid │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── DataTable │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── FlexibleArrayList │ │ │ │ └── index.tsx │ │ │ ├── HorizontalFlexibleArrayList │ │ │ │ └── index.tsx │ │ │ ├── HorizontalScrollContainer │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── ScrollContainer │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── SettingsContainer │ │ │ │ ├── fields │ │ │ │ │ ├── Field │ │ │ │ │ │ ├── index.module.css │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── FieldDropDown │ │ │ │ │ │ ├── index.module.css │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── FieldGroup │ │ │ │ │ │ ├── index.module.css │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── FieldKey │ │ │ │ │ │ ├── index.module.css │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── FieldReadOnly │ │ │ │ │ │ ├── index.module.css │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── FieldToggle │ │ │ │ │ │ ├── index.module.css │ │ │ │ │ │ └── index.tsx │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── ShrinkOnScrollContainer │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── StickyShrinkOnScrollContainer │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── VirtualDragDropList │ │ │ │ └── index.tsx │ │ │ ├── VirtualFlexibleArrayList │ │ │ │ └── index.tsx │ │ │ ├── VirtualFlexibleList │ │ │ │ └── index.tsx │ │ │ ├── VirtualGrid │ │ │ │ └── index.tsx │ │ │ └── VirtualList │ │ │ │ └── index.tsx │ │ ├── content │ │ │ ├── CreatorView │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── LockedContentThumbnailView │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── NestedMediaThumbnailView │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── PlaceholderThumbnailView │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── PlaylistView │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── PostThumbnailView │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ └── VideoThumbnailView │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ ├── contentDetails │ │ │ ├── PostDetailsView │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ └── VideoDetailView │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ ├── downloads │ │ │ ├── DownloadedView │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ └── DownloadingView │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ ├── menus │ │ │ ├── Overlays │ │ │ │ └── SettingsMenu │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ ├── SideBar │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── SideBarButton │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ └── SideBarCreator │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ ├── player │ │ │ ├── PlayerControlsView │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ └── VideoPlayerView │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ ├── tooltip │ │ │ └── index.tsx │ │ └── topbars │ │ │ ├── NavigationBar │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ │ └── SearchBar │ │ │ ├── index.module.css │ │ │ └── index.tsx │ ├── contexts │ │ ├── Casting.tsx │ │ ├── ShrinkProgress.tsx │ │ └── VideoProvider.tsx │ ├── globals.ts │ ├── index.css │ ├── index.tsx │ ├── overlays │ │ ├── OverlayCustomDialog │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlayDialog │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlayDialogLoader │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlayDownloadDialog │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlayDownloadMultipleDialog │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlayImage │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlayImageSelector │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlayImportDialog │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlayImportOldDialog │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlayImportPlaylistsDialog │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlayImportSelectDialog │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlayImportSubscriptionsDialog │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlayModals │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlayOfficialPluginsDialog │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlayRoot │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlaySelectOnlineSyncDevice │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlaySettings │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlayShareDialog │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlaySourceInstall │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlaySubscriptionGroupEdit │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlaySubscriptionsSelector │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlaySyncConfirmDialog │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlaySyncNewDeviceDialog │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── OverlaySyncStatusDialog │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ └── OverlayToasts │ │ │ ├── index.module.css │ │ │ └── index.tsx │ ├── pages │ │ ├── BuyPage │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── Channel │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── Creators │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── Downloads │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── History │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── Home │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── Playlist │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── Playlists │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── RemotePlaylist │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── Search │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── Settings │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── Sources │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── Subscriptions │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── Sync │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── VirtualExamplePage │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ ├── WatchLater │ │ │ ├── index.module.css │ │ │ └── index.tsx │ │ └── subpages │ │ │ └── SourceDetails │ │ │ ├── index.module.css │ │ │ └── index.tsx │ ├── state │ │ ├── StateGlobal.tsx │ │ ├── StateSync.tsx │ │ ├── StateWebsocket.tsx │ │ └── UIOverlay.tsx │ ├── utility.ts │ └── utility │ │ ├── Anchor.ts │ │ └── Event.ts ├── tsconfig.json └── vite.config.ts ├── Grayjay.Desktop.sln ├── Grayjay.Windows.Tests ├── Grayjay.Windows.Tests.csproj └── KeyringTest.cs ├── Keychain.MacOS └── Keychain │ ├── Keychain.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ ├── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ │ └── xcuserdata │ │ │ └── koen.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── Keychain.xcscheme │ └── xcuserdata │ │ └── koen.xcuserdatad │ │ └── xcschemes │ │ └── xcschememanagement.plist │ └── Keychain │ ├── Keychain.h │ └── KeychainManager.swift ├── LICENSE.md ├── README.md ├── app.grayjay.Grayjay.desktop ├── app.grayjay.Grayjay.metainfo.xml ├── build.sh ├── build_linux.sh ├── deploy_linux.sh ├── deploy_macos.sh ├── deploy_windows.sh ├── deploy_windows_installer.sh ├── imgs ├── channel.PNG ├── detail1.PNG ├── detail2.PNG ├── download.PNG ├── home.PNG └── sources.PNG ├── rcedit-x64.exe ├── run.sh └── sign_windows.sh /.gitattributes: -------------------------------------------------------------------------------- 1 | prebuilt/** filter=lfs diff=lfs merge=lfs -text 2 | native/third_party/cef/** filter=lfs diff=lfs merge=lfs -text 3 | Grayjay.ClientServer/deps/** filter=lfs diff=lfs merge=lfs -text -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Need a Grayjay License? 4 | url: https://pay.futo.org/api/PaymentPortal 5 | about: Purchase a Grayjay license with FutoPay 6 | - name: Plugin Building, Usage, or other Questions 7 | url: https://chat.futo.org/#narrow/stream/46-Grayjay 8 | about: Grayjays Community Chat -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "DotCef"] 2 | path = DotCef 3 | url = ../dotcef.git 4 | [submodule "Grayjay.Engine.Temp"] 5 | path = Grayjay.Engine 6 | url = ../Grayjay.Engine.git 7 | [submodule "FUTO.MDNS"] 8 | path = FUTO.MDNS 9 | url = ../FUTO.MDNS.git 10 | [submodule "Grayjay.Engine"] 11 | path = Grayjay.Engine 12 | url = ../Grayjay.Engine.git 13 | [submodule "JustCef"] 14 | path = JustCef 15 | url = ../JustCef.git 16 | [submodule "SyncServer"] 17 | path = SyncServer 18 | url = ../syncserver.git 19 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/AppVersion.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 7 3 | } -------------------------------------------------------------------------------- /Grayjay.ClientServer/Casting/CastConnectionState.cs: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer.Casting; 2 | 3 | public enum CastConnectionState 4 | { 5 | Disconnected, 6 | Connecting, 7 | Connected 8 | } -------------------------------------------------------------------------------- /Grayjay.ClientServer/Casting/CastProtocolType.cs: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer.Casting; 2 | 3 | public enum CastProtocolType 4 | { 5 | Chromecast, 6 | Airplay, 7 | FCast 8 | } -------------------------------------------------------------------------------- /Grayjay.ClientServer/Constants/App.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | 3 | namespace Grayjay.ClientServer.Constants 4 | { 5 | public static class App 6 | { 7 | public static int Version { get; } = Assembly.GetExecutingAssembly()?.GetName()?.Version?.Minor ?? -1; 8 | public static string VersionType { get; } = "stable"; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Constants/Language.cs: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer.Constants 2 | { 3 | public static class Language 4 | { 5 | public const string UNKNOWN = "Unknown"; 6 | public const string ARABIC = "ar"; 7 | public const string SPANISH = "es"; 8 | public const string FRENCH = "fr"; 9 | public const string HINDI = "hi"; 10 | public const string INDONESIAN = "id"; 11 | public const string KOREAN = "ko"; 12 | public const string PORTBRAZIL = "pt"; 13 | public const string RUSSIAN = "ru"; 14 | public const string THAI = "th"; 15 | public const string TURKISH = "tr"; 16 | public const string VIETNAMESE = "vi"; 17 | public const string ENGLISH = "en"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Crypto/IKeyring.cs: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer.Crypto; 2 | 3 | public interface IKeyring 4 | { 5 | void SaveKey(string keyName, byte[] key); 6 | byte[]? RetrieveKey(string keyName); 7 | void DeleteKey(string keyName); 8 | } -------------------------------------------------------------------------------- /Grayjay.ClientServer/Debouncer.cs: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer; 2 | 3 | public class Debouncer 4 | { 5 | private CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource(); 6 | private readonly TimeSpan _delay; 7 | private readonly Action _action; 8 | 9 | public Debouncer(TimeSpan delay, Action action) 10 | { 11 | this._delay = delay; 12 | this._action = action; 13 | } 14 | 15 | public void Call() 16 | { 17 | _cancellationTokenSource.Cancel(); 18 | _cancellationTokenSource = new CancellationTokenSource(); 19 | 20 | Task.Delay(_delay, _cancellationTokenSource.Token) 21 | .ContinueWith(t => 22 | { 23 | if (t.IsCompletedSuccessfully) 24 | { 25 | _action(); 26 | } 27 | }, TaskScheduler.Default); 28 | } 29 | } -------------------------------------------------------------------------------- /Grayjay.ClientServer/Dialogs/SyncStatusDialog.cs: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer.Dialogs 2 | { 3 | public class SyncStatusDialog : RemoteDialog 4 | { 5 | public string? Message { get; set; } 6 | 7 | public SyncStatusDialog(): base("syncStatus") 8 | { 9 | Status = "pairing"; 10 | } 11 | 12 | public async override Task Show() 13 | { 14 | await base.Show(); 15 | } 16 | 17 | public void SetPairing(string message) 18 | { 19 | Message = message; 20 | Status = "pairing"; 21 | Update(); 22 | } 23 | 24 | public void SetSuccess() 25 | { 26 | Status = "success"; 27 | Update(); 28 | } 29 | 30 | public void SetError(string message) 31 | { 32 | Message = message; 33 | Status = "error"; 34 | Update(); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Exceptions/DownloadException.cs: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer.Exceptions 2 | { 3 | public class DownloadException: Exception 4 | { 5 | public bool IsRetryable { get; set; } 6 | 7 | public DownloadException(string message, bool retryable): base(message) 8 | { 9 | IsRetryable = retryable; 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Exceptions/NoPlatformClientException.cs: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer.Exceptions 2 | { 3 | public class NoPlatformClientException: Exception 4 | { 5 | public NoPlatformClientException(string message) : base(message) 6 | { 7 | 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/ExtensionsContent.cs: -------------------------------------------------------------------------------- 1 | using Grayjay.ClientServer.Helpers; 2 | using Grayjay.Engine.Models.Detail; 3 | using Grayjay.Engine.Models.Video.Sources; 4 | 5 | namespace Grayjay.ClientServer 6 | { 7 | public static class ExtensionsContent 8 | { 9 | 10 | public static bool IsDownloadable(this PlatformVideoDetails details) 11 | => VideoHelper.IsDownloadable(details); 12 | public static bool IsDownloadable(this IVideoSource videoSource) 13 | => VideoHelper.IsDownloadable(videoSource); 14 | public static bool IsDownloadable(this IAudioSource audioSource) 15 | => VideoHelper.IsDownloadable(audioSource); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Models/Comments/RefComment.cs: -------------------------------------------------------------------------------- 1 | using Grayjay.Engine; 2 | using Grayjay.Engine.Models.Comments; 3 | 4 | namespace Grayjay.ClientServer.Models.Comments 5 | { 6 | public class RefComment: PlatformComment 7 | { 8 | public string RefID { get; set; } 9 | 10 | public RefComment(GrayjayPlugin plugin, PlatformComment comment, string id): base(plugin) 11 | { 12 | RefID = id; 13 | ContextUrl = comment.ContextUrl; 14 | Author = comment.Author; 15 | Message = comment.Message; 16 | Rating = comment.Rating; 17 | Date = comment.Date; 18 | ReplyCount = comment.ReplyCount; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Models/History/HistoryVideo.cs: -------------------------------------------------------------------------------- 1 | using Grayjay.Engine.Models.Feed; 2 | 3 | namespace Grayjay.ClientServer.Models.History 4 | { 5 | public class HistoryVideo 6 | { 7 | public PlatformVideo Video { get; set; } 8 | public long Position { get; set; } 9 | public DateTime Date { get; set; } 10 | 11 | 12 | public static HistoryVideo FromVideo(PlatformVideo video, long position, DateTime watchDate) 13 | { 14 | return new HistoryVideo() 15 | { 16 | Video = video, 17 | Position = position, 18 | Date = watchDate 19 | }; 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Models/PagerResult.cs: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer.Models 2 | { 3 | public class PagerResult 4 | { 5 | public string PagerID { get; set; } 6 | public T[] Results { get; set; } 7 | public bool HasMore { get; set; } 8 | public string Exception { get; set; } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Models/Subscriptions/SubscriptionGroup.cs: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer.Models.Subscriptions 2 | { 3 | public class SubscriptionGroup 4 | { 5 | public string ID { get; set; } 6 | public string Name { get; set; } 7 | public ImageVariable Image { get; set; } 8 | public List Urls { get; set; } 9 | public int Priority { get; set; } 10 | 11 | public DateTime LastChange { get; set; } = DateTime.MinValue; 12 | public DateTime CreationTime { get; set; } = DateTime.Now; 13 | } 14 | 15 | public class ImageVariable 16 | { 17 | public string Url { get; set; } 18 | public int ResId { get; set; } 19 | public string SubscriptionUrl { get; set; } 20 | public string PresetName { get; set; } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Models/ToastDescriptor.cs: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer.Models 2 | { 3 | public class ToastDescriptor 4 | { 5 | public string Title { get; set; } 6 | public string Text { get; set; } 7 | public ToastDescriptor(string title, string text) 8 | { 9 | Title = title; 10 | Text = text; 11 | } 12 | public ToastDescriptor(string text) 13 | { 14 | Text = text; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/PluginEncryptionProvider.cs: -------------------------------------------------------------------------------- 1 | using Grayjay.ClientServer.Crypto; 2 | using Grayjay.Engine; 3 | using System.Text; 4 | 5 | namespace Grayjay.ClientServer 6 | { 7 | public class PluginEncryptionProvider : IPluginEncryptionProvider 8 | { 9 | public string Decrypt(string data) 10 | { 11 | return EncryptionProvider.Instance.Decrypt(data); 12 | } 13 | 14 | public string Encrypt(string data) 15 | { 16 | return EncryptionProvider.Instance.Encrypt(data); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Program.cs: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer 2 | { 3 | public class Program 4 | { 5 | public static void Main(string[] args) 6 | { 7 | 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "Grayjay.ClientServer": { 4 | "commandName": "Project", 5 | "environmentVariables": { 6 | "ASPNETCORE_ENVIRONMENT": "Development" 7 | }, 8 | "applicationUrl": "https://localhost:57249;http://localhost:57250" 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /Grayjay.ClientServer/Protobuffers/Chromecast.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | option optimize_for = LITE_RUNTIME; 3 | option csharp_namespace = "Grayjay.ClientServer.Protobuffers"; 4 | 5 | message CastMessage { 6 | enum ProtocolVersion { CASTV2_1_0 = 0; } 7 | required ProtocolVersion protocol_version = 1; 8 | required string source_id = 2; 9 | required string destination_id = 3; 10 | required string namespace = 4; 11 | enum PayloadType { 12 | STRING = 0; 13 | BINARY = 1; 14 | } 15 | required PayloadType payload_type = 5; 16 | optional string payload_utf8 = 6; 17 | optional bytes payload_binary = 7; 18 | } -------------------------------------------------------------------------------- /Grayjay.ClientServer/Settings/GrayjayDevSettings.cs: -------------------------------------------------------------------------------- 1 | using Grayjay.ClientServer.States; 2 | using Grayjay.Desktop.POC; 3 | using Grayjay.Engine; 4 | using Grayjay.Engine.Setting; 5 | using Microsoft.AspNetCore.Authentication.Cookies; 6 | 7 | namespace Grayjay.ClientServer.Settings 8 | { 9 | public class GrayjayDevSettings : SettingsInstanced 10 | { 11 | public override string FileName => "settings.json"; 12 | 13 | [SettingsField("Developer Mode", SettingsField.TOGGLE, "Developer mode allows access to development features, may not be as secure.", 1)] 14 | public bool DeveloperMode { get; set; } = true; 15 | 16 | 17 | 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/SubsExchange/ChannelRequest.cs: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer.SubsExchange 2 | { 3 | public class ChannelRequest 4 | { 5 | public string ChannelUrl { get; set; } 6 | 7 | 8 | public ChannelRequest(string channelUrl) 9 | { 10 | ChannelUrl = channelUrl; 11 | } 12 | public ChannelRequest() { } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/SubsExchange/ChannelResolve.cs: -------------------------------------------------------------------------------- 1 | using Grayjay.Engine.Models.Channel; 2 | using Grayjay.Engine.Models.Feed; 3 | 4 | namespace Grayjay.ClientServer.SubsExchange 5 | { 6 | public class ChannelResolve 7 | { 8 | public string ChannelUrl { get; set; } 9 | public PlatformChannel Channel { get; set; } 10 | public PlatformContent[] Content { get; set; } 11 | 12 | public ChannelResolve() { } 13 | public ChannelResolve(string channelUrl, PlatformContent[] content, PlatformChannel channel = null) 14 | { 15 | ChannelUrl = channelUrl; 16 | Content = content; 17 | Channel = channel; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/SubsExchange/ChannelResult.cs: -------------------------------------------------------------------------------- 1 | using Grayjay.Engine.Models.Channel; 2 | using Grayjay.Engine.Models.Feed; 3 | using System.Text.Json.Serialization; 4 | 5 | namespace Grayjay.ClientServer.SubsExchange 6 | { 7 | public class ChannelResult 8 | { 9 | [JsonPropertyName("dateTime")] 10 | [JsonConverter(typeof(UnixSupportedDateTimeConverter))] 11 | public DateTime DateTime { get; set; } 12 | [JsonPropertyName("channelUrl")] 13 | public string ChannelUrl { get; set; } 14 | [JsonPropertyName("channel")] 15 | public PlatformChannel Channel { get; set; } 16 | [JsonPropertyName("content")] 17 | public PlatformContent[] Content { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/SubsExchange/ExchangeContract.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics.Contracts; 2 | 3 | namespace Grayjay.ClientServer.SubsExchange 4 | { 5 | public class ExchangeContract 6 | { 7 | public string ID { get; set; } 8 | public ChannelRequest[] Requests { get; set; } 9 | 10 | public string[] Provided { get; set; } 11 | public string[] Required { get; set; } 12 | 13 | public DateTime Expire { get; set; } 14 | 15 | public int ContractVersion { get; set; } = 1; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/SubsExchange/ExchangeContractResolve.cs: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer.SubsExchange 2 | { 3 | public class ExchangeContractResolve 4 | { 5 | public string PublicKey { get; set; } 6 | public string Signature { get; set; } 7 | public string Data { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Subscriptions/Algorithms/CachedSubscriptionAlgorithm.cs: -------------------------------------------------------------------------------- 1 | using Grayjay.ClientServer.States; 2 | using Grayjay.Engine; 3 | using Grayjay.Engine.Pagers; 4 | 5 | namespace Grayjay.ClientServer.Subscriptions.Algorithms 6 | { 7 | public class CachedSubscriptionAlgorithm : SubscriptionFetchAlgorithm 8 | { 9 | private int _pageSize; 10 | 11 | public CachedSubscriptionAlgorithm(int pageSize) 12 | { 13 | _pageSize = pageSize; 14 | } 15 | 16 | 17 | public override Dictionary CountRequests(Dictionary> subs) 18 | { 19 | return new Dictionary(); 20 | } 21 | 22 | public override Result GetSubscriptions(Dictionary> subs) 23 | { 24 | return new Result(new DedupContentPager(StateCache.GetChannelCachePager(subs.SelectMany(x => x.Value).Distinct(), _pageSize)), new List()); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Subscriptions/Algorithms/SubscriptionFetchAlgorithms.cs: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer.Subscriptions.Algorithms 2 | { 3 | public enum SubscriptionFetchAlgorithms: int 4 | { 5 | Cache = 1, 6 | Simple = 2, 7 | Smart = 3 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Sync/Internal/SyncDevice.cs: -------------------------------------------------------------------------------- 1 | using static Microsoft.ClearScript.V8.V8CpuProfile; 2 | 3 | namespace Grayjay.ClientServer.Sync.Internal 4 | { 5 | public class SyncDevice 6 | { 7 | public string PublicKey { get; set; } 8 | public string? DisplayName { get; set; } 9 | public string Metadata { get; set; } 10 | public int LinkType { get; set; } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Sync/Models/SendToDevicePackage.cs: -------------------------------------------------------------------------------- 1 | using System.Text.Json.Serialization; 2 | 3 | namespace Grayjay.ClientServer.Sync.Models 4 | { 5 | public class SendToDevicePackage 6 | { 7 | [JsonPropertyName("url")] 8 | public string Url { get; set; } 9 | [JsonPropertyName("position")] 10 | public int Position { get; set; } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Sync/Models/SyncPlaylistsPackage.cs: -------------------------------------------------------------------------------- 1 | using Grayjay.ClientServer.Models; 2 | using Grayjay.ClientServer.Models.Subscriptions; 3 | using Grayjay.ClientServer.Subscriptions; 4 | using Grayjay.Engine.Models.Channel; 5 | using System.Text.Json.Serialization; 6 | 7 | namespace Grayjay.ClientServer.Sync.Models 8 | { 9 | public class SyncPlaylistsPackage 10 | { 11 | [JsonPropertyName("playlists")] 12 | public List Playlists { get; set; } = new List(); 13 | [JsonPropertyName("playlistRemovals")] 14 | public Dictionary PlaylistRemovals { get; set; } = new Dictionary(); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Sync/Models/SyncSubscriptionGroupsPackage.cs: -------------------------------------------------------------------------------- 1 | using Grayjay.ClientServer.Models.Subscriptions; 2 | using Grayjay.ClientServer.Subscriptions; 3 | using Grayjay.Engine.Models.Channel; 4 | using System.Text.Json.Serialization; 5 | 6 | namespace Grayjay.ClientServer.Sync.Models 7 | { 8 | public class SyncSubscriptionGroupsPackage 9 | { 10 | [JsonPropertyName("groups")] 11 | public List Groups { get; set; } = new List(); 12 | [JsonPropertyName("groupRemovals")] 13 | public Dictionary GroupRemovals { get; set; } = new Dictionary(); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Sync/Models/SyncSubscriptionsPackage.cs: -------------------------------------------------------------------------------- 1 | using Grayjay.ClientServer.Subscriptions; 2 | using Grayjay.Engine.Models.Channel; 3 | using System.Text.Json.Serialization; 4 | 5 | namespace Grayjay.ClientServer.Sync.Models 6 | { 7 | public class SyncSubscriptionsPackage 8 | { 9 | [JsonPropertyName("subscriptions")] 10 | public List Subscriptions { get; set; } = new List(); 11 | [JsonPropertyName("subscriptionRemovals")] 12 | public Dictionary SubscriptionRemovals { get; set; } = new Dictionary(); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Sync/SyncExtensions.cs: -------------------------------------------------------------------------------- 1 | using Grayjay.ClientServer.Serializers; 2 | using SyncClient; 3 | using SyncShared; 4 | using System.Text; 5 | 6 | namespace Grayjay.ClientServer.Sync 7 | { 8 | public static class SyncExtensions 9 | { 10 | public static Task SendJsonDataAsync(this SyncSession session, byte subOpcode, object data, CancellationToken cancellationToken = default) 11 | => session.SendAsync(Opcode.DATA, subOpcode, Encoding.UTF8.GetBytes(GJsonSerializer.AndroidCompatible.SerializeObj(data)), contentEncoding: ContentEncoding.Gzip, cancellationToken: cancellationToken); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/Sync/SyncSessionData.cs: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer.Sync 2 | { 3 | public class SyncSessionData 4 | { 5 | public string PublicKey { get; set; } 6 | 7 | public DateTime LastHistory { get; set; } = DateTime.MinValue; 8 | 9 | 10 | public SyncSessionData() { } 11 | public SyncSessionData(string publicKey) { PublicKey = publicKey; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/UpdaterConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "Server": "https://updater.grayjay.app/Apps/Grayjay.Desktop" 3 | } -------------------------------------------------------------------------------- /Grayjay.ClientServer/UpdaterOSConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | 3 | "Linux": { 4 | "Executables": [ 5 | "Grayjay", 6 | "cef/dotcefnative", 7 | "ffmpeg" 8 | ], 9 | "Ignore": [ 10 | "Portable" 11 | ] 12 | }, 13 | "Windows": { 14 | "Executables": [], 15 | "Ignore": [ 16 | "Portable" 17 | ] 18 | }, 19 | "MacOS": { 20 | "Executables": [], 21 | "Ignore": [ 22 | "Portable" 23 | ] 24 | } 25 | } -------------------------------------------------------------------------------- /Grayjay.ClientServer/UpdaterVersion.json: -------------------------------------------------------------------------------- 1 | 2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/buildprotos.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | protoc -I=./Protobuffers --csharp_out=./Protobuffers ./Protobuffers/Chromecast.proto 3 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/deps/linux-arm64/FUTO.Updater.Client: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a6cf02884ea58762ba4957eaad87bd34c65fefb478cbdf851639bdf935c9ec30 3 | size 9303704 4 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/deps/linux-arm64/ffmpeg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:753879c887d7213bdb4423db5bb38b6760a4533e63f699353ce1626dd05a1809 3 | size 31974832 4 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/deps/linux-x64/FUTO.Updater.Client: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:65c4adb12c855f8d006906bbae5dc5d0dd7b6f71ef892d0da415fbf42e7b1d76 3 | size 9081528 4 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/deps/linux-x64/ffmpeg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e7e7fb30477f717e6f55f9180a70386c62677ef8a4d4d1a5d948f4098aa3eb99 3 | size 79826272 4 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/deps/osx-arm64/ffmpeg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3ad052e5c24b83283cbed8ef165b926c2bf03ea72961e0733af8c96ee8e37d41 3 | size 58498664 4 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/deps/osx-x64/ffmpeg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:227a0dcc5f104ce881c9520fe28668dafb1ce95709338346d53b1b830e7ad505 3 | size 79820840 4 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/deps/win-x64/FUTO.Updater.Client.Old.exe: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:89590da3412f5427cb44351d28529f6b359e8e569b3eebc3993b0a174dfb0ced 3 | size 7438512 4 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/deps/win-x64/FUTO.Updater.Client.exe: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:763759957413cc92565c980c0669ff3f01bde6defa7c1389d8ab2162798b679e 3 | size 7464448 4 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/deps/win-x64/ffmpeg.exe: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8e2fc7af4260217cc833e167beecf68bc1a617c96f9a7fd3c1ad5f60a7a7c50e 3 | size 87464960 4 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/logo.ico -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-Black-jiII8dog.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-Black-jiII8dog.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-BlackItalic-1413vuen.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-BlackItalic-1413vuen.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-Bold-srYz_-1B.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-Bold-srYz_-1B.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-BoldItalic-dE_gZyur.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-BoldItalic-dE_gZyur.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-ExtraBold-TduDdwUu.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-ExtraBold-TduDdwUu.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-ExtraBoldItalic-BJafRE5I.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-ExtraBoldItalic-BJafRE5I.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-ExtraLight-w5HAp5iF.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-ExtraLight-w5HAp5iF.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-ExtraLightItalic-ZptecSuc.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-ExtraLightItalic-ZptecSuc.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-Italic-f6M78thn.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-Italic-f6M78thn.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-Light-DFhX0qo-.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-Light-DFhX0qo-.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-LightItalic-fu56_DRc.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-LightItalic-fu56_DRc.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-Medium-dDRaJ8tM.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-Medium-dDRaJ8tM.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-MediumItalic-zr3roggP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-MediumItalic-zr3roggP.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-Regular-dEFHw1tF.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-Regular-dEFHw1tF.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-SemiBold-PyS8DO2L.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-SemiBold-PyS8DO2L.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-SemiBoldItalic-uIDb7hsH.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-SemiBoldItalic-uIDb7hsH.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-Thin-eKObIkJC.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-Thin-eKObIkJC.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/Inter-ThinItalic-L6uBn3RP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/Inter-ThinItalic-L6uBn3RP.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-Black-zNXy5how.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-Black-zNXy5how.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-BlackItalic-ctjAXTNK.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-BlackItalic-ctjAXTNK.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-Bold-lyciZXwF.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-Bold-lyciZXwF.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-BoldItalic-z1tWVfao.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-BoldItalic-z1tWVfao.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-ExtraBold-7FjIASTA.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-ExtraBold-7FjIASTA.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-ExtraBoldItalic-7s95LJPU.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-ExtraBoldItalic-7s95LJPU.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-ExtraLight-pK3Gdjgs.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-ExtraLight-pK3Gdjgs.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-ExtraLightItalic-jszRt-K3.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-ExtraLightItalic-jszRt-K3.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-Italic-nmpKuD-N.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-Italic-nmpKuD-N.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-Light-wdUe6n9K.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-Light-wdUe6n9K.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-LightItalic-4NttoRVe.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-LightItalic-4NttoRVe.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-Medium-UQWkFYZQ.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-Medium-UQWkFYZQ.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-MediumItalic-Z9X8iGLu.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-MediumItalic-Z9X8iGLu.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-Regular-tJpmyP7a.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-Regular-tJpmyP7a.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-SemiBold-Cenj7EW4.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-SemiBold-Cenj7EW4.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-SemiBoldItalic-B8KqP0Rn.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-SemiBoldItalic-B8KqP0Rn.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-Thin-zBb1wzjL.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-Thin-zBb1wzjL.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-ThinItalic-xh-Q83Do.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterDisplay-ThinItalic-xh-Q83Do.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterVariable-Italic-Heil4Hbz.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterVariable-Italic-Heil4Hbz.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/InterVariable-lovs5kQ3.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/InterVariable-lovs5kQ3.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Black-jf1EDuNk.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Black-jf1EDuNk.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Bold-wgzmQnuu.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Bold-wgzmQnuu.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Heavy-suqXuEOu.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Heavy-suqXuEOu.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Light-zyO-Ze74.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Light-zyO-Ze74.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Medium-WDgtw3zp.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Medium-WDgtw3zp.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Regular-H25UrEQ-.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Regular-H25UrEQ-.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Semibold-gZ5fp-as.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Semibold-gZ5fp-as.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Thin-B9efhlep.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Thin-B9efhlep.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Ultralight-nuOvl-Cs.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Display-Ultralight-nuOvl-Cs.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Black-TBtR_zhU.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Black-TBtR_zhU.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Bold-ity8cyh-.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Bold-ity8cyh-.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Heavy-HGYkPe4Y.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Heavy-HGYkPe4Y.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Light-5UxMdtBN.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Light-5UxMdtBN.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Medium-JQmFyxY2.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Medium-JQmFyxY2.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Regular-XP2m1yXu.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Regular-XP2m1yXu.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Semibold-NP5nJO8O.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Semibold-NP5nJO8O.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Thin-Pk0GKNmg.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Thin-Pk0GKNmg.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Ultralight-yRKLp3Zd.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/SF-Pro-Text-Ultralight-yRKLp3Zd.otf -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/favicon-yPpYq1C3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/favicon-yPpYq1C3.png -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/index-gCVYv3jZ.js: -------------------------------------------------------------------------------- 1 | import{t}from"./index-Tg9vHuMa.js";var a=t("
Playlists");const s=()=>a();export{s as default}; 2 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/index-lBDFJbXq.css: -------------------------------------------------------------------------------- 1 | ._container_b4h52_1{display:flex;flex-direction:column;margin-top:30px;height:calc(100% - 30px)}._topBar_b4h52_8{display:flex;flex-direction:row;margin-left:30px;margin-bottom:30px}._searchBar_b4h52_15{width:40%}._grid_b4h52_19{margin-top:30px;margin-left:30px;position:relative;height:100%;overflow:hidden} 2 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/index-mibvxLKs.css: -------------------------------------------------------------------------------- 1 | ._containerCreator_e6ml6_1{display:flex;flex-direction:column;justify-content:center;align-items:center;border-radius:8px;background:#1b1b1b;margin-right:12px;margin-bottom:12px;padding:12px}._thumbnail_e6ml6_27{width:116px;height:116px;border-radius:50%}._name_e6ml6_39{overflow:hidden;color:#f0f0f0;text-align:center;text-wrap:nowrap;text-overflow:ellipsis;font-family:Inter;font-size:18px;font-style:normal;font-weight:700;line-height:normal;margin-top:16px;width:100%}._metadata_e6ml6_69{color:#8c8c8c;text-align:center;font-feature-settings:"clig" off,"liga" off;font-family:Inter;font-size:12px;font-style:normal;font-weight:500;line-height:140%;margin-top:12px}._containerCreators_g4lv4_1{display:flex;flex-direction:column;margin-top:30px;height:calc(100% - 30px)}._containerFilters_g4lv4_15{display:flex;flex-direction:row;align-items:center;margin-left:12px;margin-right:12px;width:calc(100% - 24px)} 2 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/index-zDiZRWM2.js: -------------------------------------------------------------------------------- 1 | import{B as t,P as s,R as n,c,i as o,a as r,N as h,C as i,S as m,b as g,d,t as u}from"./index-Tg9vHuMa.js";const l="_container_b4h52_1",P="_topBar_b4h52_8",_="_searchBar_b4h52_15",y="_grid_b4h52_19",L={container:l,topBar:P,searchBar:_,grid:y};class B{static async homeLoad(){return await t.GET("/home/HomeLoad")}static async homeLoadLazy(){return await t.GET("/home/HomeLoadLazy")}static async homeNextPage(){return await t.GET("/home/HomeNextPage")}static async homePager(){const e=s.fromMethods(this.homeLoad,this.homeNextPage);return(await e).nextPage(),e}static async homePagerLazy(){const e=n.fromMethodsRefresh("home",this.homeLoadLazy,this.homeNextPage);return(await e).nextPage(),e}}var p=u("
");const w=()=>{const[a]=c(async()=>await B.homePagerLazy());return(()=>{var e=p();return o(e,r(h,{isRoot:!0}),null),o(e,r(m,{get when(){return a.state=="ready"},get children(){return r(i,{get pager(){return a()}})}}),null),g(()=>d(e,L.container)),e})()};export{w as default}; 2 | -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/sen1-N8cpdq92.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/sen1-N8cpdq92.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/assets/sen2-TyCf64LB.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.ClientServer/wwwroot/web/assets/sen2-TyCf64LB.woff2 -------------------------------------------------------------------------------- /Grayjay.ClientServer/wwwroot/web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Grayjay 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Entitlements/cef-helper-alerts.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.allow-jit 6 | 7 | 8 | -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Entitlements/cef-helper-gpu.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.allow-jit 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Entitlements/cef-helper-plugin.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.allow-unsigned-executable-memory 6 | 7 | com.apple.security.cs.disable-library-validation 8 | 9 | 10 | -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Entitlements/cef-helper-renderer.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.allow-jit 6 | 7 | 8 | -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Entitlements/cef-helper.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.allow-jit 6 | 7 | 8 | -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Entitlements/cef-inherit.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.inherit 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Entitlements/cef.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.allow-jit 6 | 7 | com.apple.security.network.client 8 | 9 | com.apple.security.network.server 10 | 11 | com.apple.security.cs.allow-unsigned-executable-memory 12 | 13 | com.apple.security.files.user-selected.read-write 14 | 15 | com.apple.security.application-groups 16 | 2W7AC6T8T5.com.futo.grayjay.desktop 17 | com.apple.security.keychain-access-groups 18 | 2W7AC6T8T5.com.futo.grayjay.desktop 19 | 20 | -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Portable: -------------------------------------------------------------------------------- 1 | namespace Grayjay.ClientServer 2 | { 3 | public class Portable 4 | { 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/English.lproj/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.CEF/Resources/MacOS/English.lproj/.DS_Store -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/English.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | NSHumanReadableCopyright = "© FUTO, 2024"; 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/English.lproj/MainMenu.nib/keyedobjects-101300.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.CEF/Resources/MacOS/English.lproj/MainMenu.nib/keyedobjects-101300.nib -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/English.lproj/MainMenu.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.CEF/Resources/MacOS/English.lproj/MainMenu.nib/keyedobjects.nib -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/.DS_Store -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/Headers/Keychain.h: -------------------------------------------------------------------------------- 1 | // 2 | // Keychain.h 3 | // Keychain 4 | // 5 | // Created by Koen on 01/03/2024. 6 | // 7 | 8 | #import 9 | 10 | //! Project version number for Keychain. 11 | FOUNDATION_EXPORT double KeychainVersionNumber; 12 | 13 | //! Project version string for Keychain. 14 | FOUNDATION_EXPORT const unsigned char KeychainVersionString[]; 15 | 16 | // In this header, you should import all the public headers of your framework using statements like #import 17 | 18 | 19 | -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/Keychain: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/Keychain -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/Modules/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/Modules/.DS_Store -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/Modules/Keychain.swiftmodule/arm64-apple-macos.abi.json: -------------------------------------------------------------------------------- 1 | { 2 | "ABIRoot": { 3 | "kind": "Root", 4 | "name": "NO_MODULE", 5 | "printedName": "NO_MODULE", 6 | "json_format_version": 8 7 | }, 8 | "ConstValues": [] 9 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/Modules/Keychain.swiftmodule/arm64-apple-macos.swiftdoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/Modules/Keychain.swiftmodule/arm64-apple-macos.swiftdoc -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/Modules/Keychain.swiftmodule/arm64-apple-macos.swiftmodule: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/Modules/Keychain.swiftmodule/arm64-apple-macos.swiftmodule -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/Modules/Keychain.swiftmodule/x86_64-apple-macos.abi.json: -------------------------------------------------------------------------------- 1 | { 2 | "ABIRoot": { 3 | "kind": "Root", 4 | "name": "NO_MODULE", 5 | "printedName": "NO_MODULE", 6 | "json_format_version": 8 7 | }, 8 | "ConstValues": [] 9 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/Modules/Keychain.swiftmodule/x86_64-apple-macos.swiftdoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/Modules/Keychain.swiftmodule/x86_64-apple-macos.swiftdoc -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/Modules/Keychain.swiftmodule/x86_64-apple-macos.swiftmodule: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/Modules/Keychain.swiftmodule/x86_64-apple-macos.swiftmodule -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/Keychain.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module Keychain { 2 | umbrella header "Keychain.h" 3 | export * 4 | 5 | module * { export * } 6 | } 7 | 8 | module Keychain.Swift { 9 | header "Keychain-Swift.h" 10 | requires objc 11 | } 12 | -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/PkgInfo: -------------------------------------------------------------------------------- 1 | APPL???? -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/grayjay.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.CEF/Resources/MacOS/grayjay.icns -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/Resources/MacOS/keychain-framework-entitlements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.disable-library-validation 6 | 7 | keychain-access-groups 8 | 9 | $(AppIdentifierPrefix)com.futo.grayjay 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/SuppressingTextWriter.cs: -------------------------------------------------------------------------------- 1 | using System.Text; 2 | 3 | public class SuppressingTextWriter : TextWriter 4 | { 5 | private readonly TextWriter _originalWriter; 6 | private DateTime? _writeFailTime = null; 7 | 8 | public SuppressingTextWriter(TextWriter originalWriter) 9 | { 10 | _originalWriter = originalWriter; 11 | } 12 | 13 | public override Encoding Encoding => Encoding.UTF8; 14 | 15 | public override void Write(char value) 16 | { 17 | Try(() => _originalWriter.Write(value)); 18 | } 19 | 20 | private void Try(Action act) 21 | { 22 | if (_writeFailTime != null) 23 | { 24 | var now = DateTime.UtcNow; 25 | if (now - _writeFailTime < TimeSpan.FromSeconds(10)) 26 | return; 27 | 28 | _writeFailTime = null; 29 | } 30 | 31 | try 32 | { 33 | act(); 34 | } 35 | catch 36 | { 37 | _writeFailTime = DateTime.UtcNow; 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/WindowsAPI.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Runtime.InteropServices; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace Grayjay.Desktop.CEF 9 | { 10 | public static class WindowsAPI 11 | { 12 | [DllImport("kernel32.dll", SetLastError = true)] 13 | [return: MarshalAs(UnmanagedType.Bool)] 14 | public static extern bool AllocConsole(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/grayjay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.CEF/grayjay.png -------------------------------------------------------------------------------- /Grayjay.Desktop.CEF/logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.CEF/logo.ico -------------------------------------------------------------------------------- /Grayjay.Desktop.Installer/Files/FUTO.Updater.Client.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Installer/Files/FUTO.Updater.Client.exe -------------------------------------------------------------------------------- /Grayjay.Desktop.Installer/Files/UpdaterConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "Server": "https://updater.grayjay.app/Apps/Grayjay.Desktop" 3 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Installer/Files/UpdaterOSConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | 3 | "Linux": { 4 | "Executables": [ 5 | "Grayjay", 6 | "cef/dotcefnative", 7 | "ffmpeg" 8 | ], 9 | "Ignore": [ 10 | "Portable" 11 | ] 12 | }, 13 | "Windows": { 14 | "Executables": [], 15 | "Ignore": [ 16 | "Portable" 17 | ] 18 | }, 19 | "MacOS": { 20 | "Executables": [], 21 | "Ignore": [ 22 | "Portable" 23 | ] 24 | } 25 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Installer/Files/launch: -------------------------------------------------------------------------------- 1 | ../Grayjay.exe -------------------------------------------------------------------------------- /Grayjay.Desktop.Installer/Metadata/grayjay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Installer/Metadata/grayjay.png -------------------------------------------------------------------------------- /Grayjay.Desktop.Installer/Metadata/grayjay_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Installer/Metadata/grayjay_background.png -------------------------------------------------------------------------------- /Grayjay.Desktop.Installer/Metadata/grayjay_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Installer/Metadata/grayjay_banner.png -------------------------------------------------------------------------------- /Grayjay.Desktop.Installer/Package.wixpdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Installer/Package.wixpdb -------------------------------------------------------------------------------- /Grayjay.Desktop.Installer/build.sh: -------------------------------------------------------------------------------- 1 | wix build -ext WixToolset.UI.wixext -ext WixToolset.Util.wixext Grayjay.wxs -out Result/Grayjay.msi -------------------------------------------------------------------------------- /Grayjay.Desktop.Tests/EncryptionProviderTests.cs: -------------------------------------------------------------------------------- 1 | using System.Security.Cryptography; 2 | using Grayjay.ClientServer.Crypto; 3 | 4 | namespace Grayjay.Desktop.Tests 5 | { 6 | [TestClass] 7 | public class EncryptionProviderTests 8 | { 9 | private byte[] GenerateRandomBytes(int size) 10 | { 11 | byte[] rnd = new byte[size]; 12 | using RandomNumberGenerator rng = RandomNumberGenerator.Create(); 13 | rng.GetBytes(rnd); 14 | return rnd; 15 | } 16 | 17 | [TestMethod] 18 | public void Test_Roundtrip() 19 | { 20 | var data = GenerateRandomBytes(32); 21 | var encrypted = EncryptionProvider.Instance.Encrypt(data); 22 | var decrypted = EncryptionProvider.Instance.Decrypt(encrypted); 23 | CollectionAssert.AreEqual(data, decrypted); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Tests/GlobalUsings.cs: -------------------------------------------------------------------------------- 1 | global using Microsoft.VisualStudio.TestTools.UnitTesting; -------------------------------------------------------------------------------- /Grayjay.Desktop.Tests/Grayjay.Desktop.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net9.0 5 | enable 6 | enable 7 | 8 | false 9 | true 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/.DS_Store -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["solid"] 3 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Grayjay 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "grayjay", 3 | "version": "0.0.0", 4 | "description": "", 5 | "scripts": { 6 | "start": "vite", 7 | "dev": "vite", 8 | "build": "vite build", 9 | "serve": "vite preview" 10 | }, 11 | "devDependencies": { 12 | "@types/dompurify": "^3.0.5", 13 | "@types/luxon": "^3.4.2", 14 | "@types/qrcode": "^1.5.5", 15 | "@types/video.js": "^7.3.56", 16 | "babel-preset-solid": "^1.8.9", 17 | "solid-devtools": "^0.29.2", 18 | "solid-js": "^1.8.11", 19 | "typescript": "^5.3.3", 20 | "vite": "^5.0.11", 21 | "vite-plugin-solid": "^2.8.2" 22 | }, 23 | "dependencies": { 24 | "@solid-primitives/websocket": "^1.1.1", 25 | "@solidjs/router": "^0.10.9", 26 | "dashjs": "^4.7.4", 27 | "dompurify": "^3.1.5", 28 | "hls.js": "^1.5.8", 29 | "html-entities": "^2.5.2", 30 | "jdenticon": "^3.2.0", 31 | "luxon": "^3.4.4", 32 | "qrcode": "^1.5.4", 33 | "video.js": "^8.10.0" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/.DS_Store -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/animation.tsx: -------------------------------------------------------------------------------- 1 | export function easeInOutQuad(x: number): number { 2 | return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2; 3 | } 4 | 5 | export function easeOutCubic(x: number): number { 6 | return 1 - Math.pow(1 - x, 3); 7 | } 8 | 9 | export function easeOutExpo(x: number): number { 10 | return x === 1 ? 1 : 1 - Math.pow(2, -10 * x); 11 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/.DS_Store -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/favicon.png -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-Black.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-BlackItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-BlackItalic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-Bold.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-BoldItalic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-ExtraBold.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-ExtraBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-ExtraBoldItalic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-ExtraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-ExtraLight.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-ExtraLightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-ExtraLightItalic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-Italic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-Light.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-LightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-LightItalic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-Medium.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-MediumItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-MediumItalic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-Regular.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-SemiBold.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-SemiBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-SemiBoldItalic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-Thin.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-ThinItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/Inter-ThinItalic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-Black.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-BlackItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-BlackItalic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-Bold.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-BoldItalic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-ExtraBold.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-ExtraBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-ExtraBoldItalic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-ExtraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-ExtraLight.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-ExtraLightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-ExtraLightItalic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-Italic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-Light.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-LightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-LightItalic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-Medium.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-MediumItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-MediumItalic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-Regular.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-SemiBold.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-SemiBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-SemiBoldItalic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-Thin.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-ThinItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterDisplay-ThinItalic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterVariable-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterVariable-Italic.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/inter/InterVariable.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/inter/InterVariable.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/sen/sen.css: -------------------------------------------------------------------------------- 1 | /* latin-ext */ 2 | @font-face { 3 | font-family: 'Sen'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: url(sen1.woff2) format('woff2'); 7 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; 8 | } 9 | /* latin */ 10 | @font-face { 11 | font-family: 'Sen'; 12 | font-style: normal; 13 | font-weight: 400; 14 | src: url(sen2.woff2) format('woff2'); 15 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 16 | } 17 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/sen/sen1.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/sen/sen1.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/fonts/sen/sen2.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/fonts/sen/sen2.woff2 -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/icons/.DS_Store -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/add_to_query.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/airplay.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/arrow_upward.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/checkboxcheck.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/close_FILL0_wght300_GRAD0_opsz24.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/close_FILL0_wght400_GRAD0_opsz24.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/collapse.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/copy.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/dislike_active.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/faded_chevron_down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/ic_airplay_active.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/ic_airplay_inactive.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/ic_audio.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/ic_device.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/ic_qr.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/ic_success_small.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/ic_sync.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon16_chevron_down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_IconFilledShare.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_Share.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_add_people.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_add_to_playlist.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_back.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_cast.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_chevron_down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_chevron_right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_cloud_upload.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_comment.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_edit.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_feedback.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_not_interested_.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_play.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_play_feed.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_sources.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_thumbsup.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_tutorials.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_user.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon24_watch_later.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon32_pause.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_32_cast.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_32_fullscreen.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_32_minimize.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_32_play.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_32_volume.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_add_to_playlist.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_checkmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_chevron_right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_chrevron_down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_download_queued.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_drag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_error.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_folder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_link_blue.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_nav_home.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_reload_temp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/icons/icon_reload_temp.png -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_reload_temp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_theatre.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/icon_thumb.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/iconfilters.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/like_active.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/like_inactive.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/more_horiz_FILL0_wght400_GRAD0_opsz24.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/notifications.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/polycentric_xs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/assets/icons/polycentric_xs.png -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/sidebar-close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/tube-spinner.svg: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/assets/icons/videos.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/DeveloperBackend.ts: -------------------------------------------------------------------------------- 1 | import { Backend } from "./Backend"; 2 | import { IPlatformVideo } from "./models/content/IPlatformVideo"; 3 | import { Pager } from "./models/pagers/Pager"; 4 | import { RefreshPager } from "./models/pagers/RefreshPager"; 5 | 6 | export abstract class DeveloperBackend { 7 | 8 | static async isDeveloper(): Promise { 9 | return await Backend.GET("/Developer/IsDeveloper") as boolean; 10 | } 11 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/DialogBackend.ts: -------------------------------------------------------------------------------- 1 | import { IDialogOutput } from "../overlays/OverlayDialog"; 2 | import { Backend } from "./Backend"; 3 | import { ISettingsObject } from "./models/settings/SettingsObject"; 4 | 5 | 6 | 7 | export abstract class DialogBackend { 8 | 9 | 10 | static async dialogRespond(id: string, dialog: IDialogOutput): Promise { 11 | return await Backend.POST("/dialog/DialogRespond?id=" + id, JSON.stringify(dialog), "application/json") as boolean; 12 | } 13 | static async dialogRespondCustom(id: string, action: string, obj: any): Promise { 14 | return await Backend.POST("/dialog/DialogRespondCustom?id=" + id + "&actionName=" + action, JSON.stringify(obj), "application/json") as boolean; 15 | } 16 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/HandlingBackend.ts: -------------------------------------------------------------------------------- 1 | import { IDialogOutput } from "../overlays/OverlayDialog"; 2 | import { Backend } from "./Backend"; 3 | import { ISettingsObject } from "./models/settings/SettingsObject"; 4 | 5 | 6 | export interface IHandlePlan { 7 | type: string, 8 | data: string 9 | } 10 | 11 | export abstract class HandlingBackend { 12 | 13 | static async handlePlan(url: string): Promise { 14 | return await Backend.GET("/handle/GetHandlePlan?url=" + url); 15 | } 16 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/ImagesBackend.ts: -------------------------------------------------------------------------------- 1 | import { Duration } from "luxon"; 2 | import { CastingDeviceInfo } from "../contexts/Casting"; 3 | import { Backend } from "./Backend"; 4 | import { SourceSelected } from "../components/contentDetails/VideoDetailView"; 5 | 6 | 7 | export abstract class ImagesBackend { 8 | 9 | static async images(): Promise { 10 | return await Backend.GET("/Images/Images") as string[] 11 | } 12 | 13 | static async imageUpload(file: File): Promise { 14 | const formData = new FormData(); 15 | formData.append("file", file, file.name); 16 | return await Backend.POSTFormData("/Images/ImageUpload", formData); 17 | } 18 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/LocalBackend.ts: -------------------------------------------------------------------------------- 1 | import { Backend } from "./Backend"; 2 | 3 | export abstract class LocalBackend { 4 | static async open(uri: string): Promise { 5 | await Backend.GET("/local/Open?uri=" + encodeURIComponent(uri)); 6 | } 7 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/PlatformBackend.ts: -------------------------------------------------------------------------------- 1 | import { Backend } from "./Backend"; 2 | import { Pager } from "./models/pagers/Pager"; 3 | 4 | 5 | export abstract class PlatformBackend { 6 | 7 | static async channel(url: string): Promise { 8 | return await Backend.GET("/platform/Home?url=" + url) as ISerializedChannel; 9 | } 10 | 11 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/WindowBackend.ts: -------------------------------------------------------------------------------- 1 | import { Backend } from "./Backend"; 2 | import { IPlatformVideo } from "./models/content/IPlatformVideo"; 3 | 4 | export interface IOrderedPlatformVideo extends IPlatformVideo { 5 | index: number; 6 | } 7 | 8 | export abstract class WindowBackend { 9 | static async startWindow(): Promise { 10 | return await Backend.GET("/window/startWindow") 11 | } 12 | 13 | static async ready(): Promise { 14 | return await Backend.GET("/window/Ready"); 15 | } 16 | 17 | static async delay(ms: number): Promise { 18 | return await Backend.GET("/window/Delay?ms=" + ms); 19 | } 20 | 21 | static async echo(str: string): Promise { 22 | await Backend.GET("/window/Echo?str=" + str); 23 | return true; 24 | } 25 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/ContentType.ts: -------------------------------------------------------------------------------- 1 | export enum ContentType { 2 | UNKNOWN = 0, 3 | MEDIA = 1, 4 | POST = 2, 5 | ARTICLE = 3, 6 | PLAYLIST = 4, 7 | 8 | URL = 9, 9 | 10 | NESTED_VIDEO = 11, 11 | 12 | CHANNEL = 60, 13 | 14 | LOCKED = 70, 15 | 16 | PLACEHOLDER = 90, 17 | DEFERRED = 91 18 | }; -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/IPlatformAuthorLink.ts: -------------------------------------------------------------------------------- 1 | export interface IPlatformAuthorLink { 2 | id: IPlatformID; 3 | name: string; 4 | url: string; 5 | thumbnail: string;//? 6 | subscribers: number;//? 7 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/IPlatformID.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | interface IPlatformID { 4 | platform: string; 5 | value: string;//? 6 | pluginID: string;//? 7 | claimType: number; 8 | claimFieldType: number; 9 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/IPlaylist.ts: -------------------------------------------------------------------------------- 1 | import { IPlatformVideo } from "./content/IPlatformVideo"; 2 | 3 | export interface IPlaylist { 4 | id: string; 5 | name: string; 6 | videos: IPlatformVideo[]; 7 | dateCreated?: string; 8 | dateUpdate?: string; 9 | datePlayed?: string; 10 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/IRating.ts: -------------------------------------------------------------------------------- 1 | export enum RatingTypes { 2 | Likes = 1, 3 | LikesDislikes = 2, 4 | Scaler = 3 5 | } 6 | 7 | export interface IRating { 8 | type: RatingTypes; 9 | } 10 | 11 | export interface IRatingLikes extends IRating { 12 | type: RatingTypes.Likes; 13 | likes: number; 14 | } 15 | 16 | export interface IRatingLikesDislikes extends IRating { 17 | type: RatingTypes.LikesDislikes; 18 | likes: number; 19 | dislikes: number; 20 | } 21 | 22 | export interface IRatingScaler extends IRating { 23 | type: RatingTypes.Scaler; 24 | value: number; 25 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/IThumbnails.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | interface IThumbnails { 4 | sources: Array; 5 | } 6 | 7 | interface IThumbnail { 8 | url: string; 9 | quality: number; 10 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/RefItem.ts: -------------------------------------------------------------------------------- 1 | 2 | export interface RefItem { 3 | refID: string, 4 | object: T 5 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/channels/ISerializedChannel.ts: -------------------------------------------------------------------------------- 1 | 2 | interface ISerializedChannel { 3 | id: IPlatformID; 4 | name: string; 5 | thumbnail: string; //? 6 | banner: string; //? 7 | subscribers: number; //? 8 | url: string; //? 9 | links: any; //? 10 | urlAlternatives: string[]; // 11 | description?: string; 12 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/comments/ILiveChatWindowDescriptor.ts: -------------------------------------------------------------------------------- 1 | 2 | export interface ILiveChatWindowDescriptor { 3 | url: string, 4 | removeElements?: string[], 5 | removeElementsInternal?: string[] 6 | error?: string 7 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/comments/ISerializedComment.ts: -------------------------------------------------------------------------------- 1 | import { IPlatformAuthorLink } from "../IPlatformAuthorLink"; 2 | import { IRating } from "../IRating"; 3 | 4 | export interface ISerializedComment { 5 | contextUrl: string; 6 | author: IPlatformAuthorLink; 7 | message: string; 8 | rating: IRating; 9 | date: string; 10 | replyCount: number; 11 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/content/IHistoryVideo.ts: -------------------------------------------------------------------------------- 1 | import { IPlatformVideo } from "./IPlatformVideo"; 2 | 3 | export interface IHistoryVideo { 4 | video: IPlatformVideo; 5 | position: number; 6 | date: string; 7 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/content/IPlatformContent.ts: -------------------------------------------------------------------------------- 1 | import { IPlatformAuthorLink } from "../IPlatformAuthorLink"; 2 | 3 | export interface IPlatformContent { 4 | contentType: number; 5 | id: IPlatformID; 6 | name: string; 7 | author: IPlatformAuthorLink; 8 | dateTime: string; 9 | url: string; 10 | shareUrl: string; 11 | backendUrl?: string; 12 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/content/IPlatformContentPlaceholder.ts: -------------------------------------------------------------------------------- 1 | import { IPlatformContent } from "./IPlatformContent" 2 | 3 | export interface IPlatformContentPlaceholder extends IPlatformContent { 4 | error: string, 5 | errorPluginID: string, 6 | placeholderIcon: string 7 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/content/IPlatformLockedContent.ts: -------------------------------------------------------------------------------- 1 | import { IPlatformContent } from "./IPlatformContent"; 2 | 3 | 4 | export interface IPlatformLockedContent extends IPlatformContent { 5 | contentType: 70, 6 | contentName: string, 7 | contentThumbnails: IThumbnails, 8 | unlockUrl: string, 9 | lockDescription: string 10 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/content/IPlatformNestedMedia.ts: -------------------------------------------------------------------------------- 1 | import { IPlatformContent } from "./IPlatformContent"; 2 | 3 | 4 | export interface IPlatformNestedMedia extends IPlatformContent { 5 | contentType: 11, 6 | contentUrl: string, 7 | contentName: string, 8 | contentDescription: string, 9 | contentProvider: string, 10 | contentThumbnails: IThumbnails, 11 | 12 | pluginId?: string, 13 | pluginName?: string, 14 | pluginThumbnail?: string 15 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/content/IPlatformPlaylist.ts: -------------------------------------------------------------------------------- 1 | import { Pager } from "../pagers/Pager"; 2 | import { IPlatformContent } from "./IPlatformContent"; 3 | import { IPlatformVideo } from "./IPlatformVideo"; 4 | 5 | 6 | export interface IPlatformPlaylist extends IPlatformContent { 7 | thumbnail?: string; 8 | videoCount: number; 9 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/content/IPlatformPlaylistDetails.ts: -------------------------------------------------------------------------------- 1 | import { RefItem } from "../RefItem"; 2 | import { IPlatformPlaylist } from "./IPlatformPlaylist"; 3 | import { IPlatformVideo } from "./IPlatformVideo"; 4 | 5 | 6 | export interface IPlatformPlaylistDetails extends IPlatformPlaylist { 7 | contents?: PagerResult>; 8 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/content/IPlatformPost.ts: -------------------------------------------------------------------------------- 1 | import { IPlatformContent } from "./IPlatformContent"; 2 | 3 | 4 | export interface IPlatformPost extends IPlatformContent { 5 | contentType: 2, 6 | thumbnails: IThumbnails[], 7 | images: string[], 8 | description: string 9 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/content/IPlatformPostDetails.ts: -------------------------------------------------------------------------------- 1 | import { IRating } from "../IRating"; 2 | import { IPlatformContent } from "./IPlatformContent"; 3 | import { IPlatformPost } from "./IPlatformPost"; 4 | 5 | 6 | export interface IPlatformPostDetails extends IPlatformPost { 7 | rating: IRating, 8 | textType: number, 9 | content: string 10 | } 11 | export enum TextType { 12 | RAW = 0, 13 | HTML = 1, 14 | MARKUP = 2 15 | }; -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/content/IPlatformVideo.ts: -------------------------------------------------------------------------------- 1 | import { IPlatformContent } from "./IPlatformContent"; 2 | 3 | 4 | export interface IPlatformVideo extends IPlatformContent { 5 | contentType: 1, 6 | thumbnails: IThumbnails; 7 | duration: number; 8 | viewCount: number; 9 | 10 | isLive: boolean; 11 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/contentDetails/IChapter.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | export interface IChapter { 4 | name: string, 5 | type: ChapterType, 6 | timeStart: number, 7 | timeEnd: number 8 | } 9 | export enum ChapterType { 10 | NORMAL = 0, 11 | 12 | SKIPPABLE = 5, 13 | SKIP = 6, 14 | SKIPONCE = 7 15 | }; -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/contentDetails/IPlatformVideoDetails.ts: -------------------------------------------------------------------------------- 1 | import { IPlatformVideo } from "../content/IPlatformVideo"; 2 | 3 | export interface IPlatformVideoDetails extends IPlatformVideo { 4 | rating: any; 5 | description: string; 6 | video: any; 7 | subtitles: any[]; 8 | //preview 9 | isLive: boolean; 10 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/downloads/IDownloadSources.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | interface IDownloadSources { 5 | id: string, 6 | videoSources: any[], 7 | audioSources: any[], 8 | subtitleSources: any[], 9 | manifestSources: any 10 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/downloads/IPlaylistDownload.ts: -------------------------------------------------------------------------------- 1 | import { IPlaylist } from "../IPlaylist"; 2 | 3 | 4 | 5 | export interface IVideoDownload { 6 | playlistId: string, 7 | targetPixelCount: number, 8 | targetBitrate: number, 9 | playlist?: IPlaylist 10 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/downloads/IStorageInfo.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | export interface IStorageInfo { 5 | storageLocation: string, 6 | usedBytes: number, 7 | availableBytes: number, 8 | totalBytes: number 9 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/downloads/IVideoDownload.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | export interface IVideoDownload { 5 | state: number, 6 | video: IPlatformVideo, 7 | videoDetails: IPlatformVideoDetails, 8 | 9 | progress: number, 10 | 11 | downloadSpeedVideo: number, 12 | downloadSpeedAudio: number, 13 | downloadSpeed: number, 14 | 15 | error: string, 16 | 17 | groupType?: string, 18 | groupID?: string, 19 | 20 | 21 | videoSource: any, 22 | audioSource: any, 23 | 24 | videoFileSize: number, 25 | audioFileSize: number 26 | 27 | 28 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/downloads/IVideoLocal.ts: -------------------------------------------------------------------------------- 1 | import { IPlatformContent } from "../content/IPlatformContent"; 2 | import { IPlatformVideoDetails } from "../contentDetails/IPlatformVideoDetails"; 3 | 4 | export interface IVideoLocal extends IPlatformContent { 5 | videoDetails: IPlatformVideoDetails, 6 | 7 | videoSources: any[], 8 | audioSources: any[], 9 | subtitleSources: any[], 10 | 11 | groupID: string, 12 | groupType: string 13 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/pagers/PagerResult.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | interface PagerResult { 4 | pagerID?: string; 5 | results: T[]; 6 | hasMore: boolean, 7 | error?: any 8 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/pagers/PlaceholderPager.ts: -------------------------------------------------------------------------------- 1 | import { Pager } from "./Pager"; 2 | 3 | 4 | export class PlaceholderPager extends Pager { 5 | items: IPlatformContentPlaceholder[] = []; 6 | 7 | constructor(count: number = 10) { 8 | super(); 9 | for(let i = 0; i < count; i++) { 10 | this.items.push({ 11 | contentType: 90, 12 | placeholderIcon: "", 13 | error: null 14 | } as IPlatformContentPlaceholder) 15 | } 16 | } 17 | 18 | 19 | fetchLoad(): Promise> { 20 | return new Promise((resolve)=>resolve({ 21 | results: this.items, 22 | hasMore: false 23 | } as PagerResult)); 24 | } 25 | protected fetchNextPage(): Promise> { 26 | throw new Error("Method not implemented."); 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/plugin/IPluginPrompt.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | export default interface IPluginPrompt { 4 | config: ISourceConfig, 5 | warnings: IPluginWarning[], 6 | alreadyInstalled: boolean 7 | } 8 | 9 | export interface IPluginWarning { 10 | title: string, 11 | description: string 12 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/plugin/ISourceConfig.ts: -------------------------------------------------------------------------------- 1 | import { ISourceConfig, ISourceConfigState } from "./ISourceConfigState"; 2 | 3 | export interface ISourceDetails { 4 | config: ISourceConfig, 5 | state: ISourceConfigState, 6 | hasLoggedIn: boolean, 7 | hasCaptcha: boolean, 8 | hasUpdate: boolean 9 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/settings/SettingsObject.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | export interface ISettingsField { 5 | type: string, 6 | title: string, 7 | property: string, 8 | description: string, 9 | dependency?: string, 10 | warningDialog?: string 11 | } 12 | 13 | export interface ISettingsObject { 14 | fields: ISettingsField[], 15 | id?: string, 16 | object: any, 17 | onFieldChanged?: (field: ISettingsField, newVal: any)=>void; 18 | onSave?: ()=>Promise 19 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/settings/fields/SettingsFieldButton.ts: -------------------------------------------------------------------------------- 1 | import { ISettingsField } from "../SettingsObject"; 2 | 3 | 4 | export interface ISettingsFieldButton extends ISettingsField { 5 | icon: string 6 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/settings/fields/SettingsFieldDropDown.ts: -------------------------------------------------------------------------------- 1 | import { ISettingsField } from "../SettingsObject"; 2 | 3 | 4 | export interface ISettingsFieldDropDown extends ISettingsField { 5 | options: string[] 6 | value: number 7 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/settings/fields/SettingsFieldGroup.ts: -------------------------------------------------------------------------------- 1 | import { ISettingsField } from "../SettingsObject"; 2 | 3 | export interface ISettingsFieldGroup extends ISettingsField { 4 | fields: ISettingsField[] 5 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/settings/fields/SettingsFieldGroupFlat.ts: -------------------------------------------------------------------------------- 1 | import { ISettingsField } from "../SettingsObject"; 2 | 3 | export interface ISettingsFieldGroupFlat extends ISettingsField { 4 | fields: ISettingsField[] 5 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/settings/fields/SettingsFieldReadOnly.ts: -------------------------------------------------------------------------------- 1 | import { ISettingsField } from "../SettingsObject"; 2 | 3 | 4 | export interface ISettingsFieldReadOnly extends ISettingsField { 5 | text: string 6 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/settings/fields/SettingsFieldToggle.ts: -------------------------------------------------------------------------------- 1 | import { ISettingsField } from "../SettingsObject"; 2 | 3 | 4 | export interface ISettingsFieldToggle extends ISettingsField { 5 | value: boolean 6 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/socket/WebSocketPacket.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | export interface WebSocketPacket { 4 | id: string, 5 | type: string, 6 | payload: any 7 | }; -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/subscriptions/ISubscription.ts: -------------------------------------------------------------------------------- 1 | interface ISubscription { 2 | channel: ISerializedChannel; 3 | lastVideo: number; 4 | lastVideoUpdate: number; 5 | uploadInterval: number; 6 | 7 | doNotifications: boolean; 8 | doFetchLive: boolean; 9 | doFetchStreams: boolean; 10 | doFetchVideos: boolean; 11 | doFetchPosts: boolean; 12 | 13 | playbackSeconds: number; 14 | playbackViews: number; 15 | } 16 | 17 | interface ISubscriptionSettings { 18 | doNotifications: boolean, 19 | doFetchLive: boolean, 20 | doFetchStreams: boolean, 21 | doFetchVideos: boolean, 22 | doFetchPosts: boolean 23 | } 24 | 25 | interface ISubscriptionGroup { 26 | id: string, 27 | name: string, 28 | image?: IImageVariable, 29 | urls: string[], 30 | priority: number 31 | } 32 | 33 | interface IImageVariable { 34 | url?: string, 35 | resId?: number, 36 | presetName?: string, 37 | subscriptionUrl?: string 38 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/backend/models/sync/SyncDevice.ts: -------------------------------------------------------------------------------- 1 | export interface SyncDevice { 2 | publicKey: string, 3 | displayName: string, 4 | metadata: string, 5 | linkType: number 6 | }; -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/ButtonGroup/index.module.css: -------------------------------------------------------------------------------- 1 | .containerGroup { 2 | display: flex; 3 | width: 100%; 4 | align-items: flex-start; 5 | gap: 10px; 6 | } 7 | 8 | .containerButton { 9 | display: flex; 10 | flex-direction: row; 11 | align-items: center; 12 | justify-content: center; 13 | height: 44px; 14 | min-width: 145px; 15 | padding: 0px 8px; 16 | gap: 4px; 17 | border-radius: 99px; 18 | border: 1px solid rgba(255, 255, 255, 0.07); 19 | background: rgba(99, 101, 240, 0.00); 20 | color: #8C8C8C; 21 | font-feature-settings: 'clig' off, 'liga' off; 22 | font-family: Inter; 23 | font-size: 16px; 24 | font-style: normal; 25 | font-weight: 400; 26 | line-height: 140%; 27 | } 28 | 29 | .containerButton:hover { 30 | cursor: pointer; 31 | } 32 | 33 | .containerButton.active { 34 | background: rgba(255, 255, 255, 0.06); 35 | color: #FFF; 36 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/EmptyContentView/index.module.css: -------------------------------------------------------------------------------- 1 | 2 | .noSubs { 3 | text-align: center; 4 | height: 400px; 5 | margin-top: calc(50vh - 200px); 6 | width: 100%; 7 | } 8 | .noSubs .title { 9 | margin-top: 16px; 10 | color: #FFF; 11 | 12 | text-align: center; 13 | font-family: Inter; 14 | font-size: 28px; 15 | font-style: normal; 16 | font-weight: 500; 17 | line-height: normal; 18 | } 19 | .noSubs .description { 20 | margin-top: 8px; 21 | color: #575757; 22 | text-align: center; 23 | font-family: Inter; 24 | font-size: 18px; 25 | font-style: normal; 26 | font-weight: 400; 27 | line-height: normal; 28 | } 29 | .noSubs .buttons { 30 | margin-top: 24px; 31 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/GlobalContextMenu/index.module.css: -------------------------------------------------------------------------------- 1 | .menu{ 2 | background-color: #141414; 3 | padding: 12px; 4 | border-radius: 10px; 5 | border-radius: 10px; 6 | border: 1px solid #2E2E2E; 7 | box-shadow: 0px 1.852px 3.148px 0px rgba(0, 0, 0, 0.06), 0px 8.148px 6.519px 0px rgba(0, 0, 0, 0.10), 0px 20px 13px 0px rgba(0, 0, 0, 0.13), 0px 38.519px 25.481px 0px rgba(0, 0, 0, 0.15), 0px 64.815px 46.852px 0px rgba(0, 0, 0, 0.19), 0px 100px 80px 0px rgba(0, 0, 0, 0.25); 8 | } 9 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/LiveChatRemoteWindow/index.module.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | .container { 4 | width: 100%; 5 | height: 640px; 6 | max-height: calc(100vh - 40px); 7 | } 8 | 9 | .window { 10 | height: 100%; 11 | padding: 10px; 12 | background-color: #111; 13 | border-radius: 10px; 14 | border: 2px solid #222; 15 | box-sizing: border-box; 16 | } 17 | .window iframe { 18 | width: 100%; 19 | height: 100%; 20 | border: 1px solid black; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/PlaylistDetailView/index.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | display: flex; 3 | flex-direction: column; 4 | margin-top: 24px; 5 | height: calc(100% - 24px); 6 | } 7 | 8 | .header { 9 | color: #FFF; 10 | font-family: Inter; 11 | font-size: 29px; 12 | font-style: normal; 13 | font-weight: 700; 14 | line-height: normal; 15 | } 16 | 17 | .containerFilters { 18 | display: flex; 19 | flex-direction: row; 20 | align-items: center; 21 | margin-left: 12px; 22 | margin-right: 12px; 23 | width: calc(100% - 24px); 24 | gap: 12px; 25 | margin-top: 24px; 26 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/RatingView/index.module.css: -------------------------------------------------------------------------------- 1 | .containerRating { 2 | } 3 | 4 | .containerLikeDislike { 5 | display: flex; 6 | flex-direction: row; 7 | align-items: center; 8 | height: 100%; 9 | } 10 | 11 | .containerLikeDislike.editable { 12 | cursor: pointer; 13 | } 14 | 15 | .text { 16 | margin-left: 4px; 17 | color: #FFF; 18 | font-family: Inter; 19 | font-size: 14px; 20 | font-style: normal; 21 | font-weight: 500; 22 | line-height: normal; 23 | } 24 | 25 | .text.active { 26 | color: #019BE7; 27 | } 28 | 29 | .text.editable { 30 | cursor: pointer; 31 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/RemotePlaylistDetailView/index.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | display: flex; 3 | flex-direction: column; 4 | margin-top: 24px; 5 | height: calc(100% - 24px); 6 | } 7 | 8 | .header { 9 | color: #FFF; 10 | font-family: Inter; 11 | font-size: 29px; 12 | font-style: normal; 13 | font-weight: 700; 14 | line-height: normal; 15 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/ToggleButtonGroup/index.module.css: -------------------------------------------------------------------------------- 1 | .containerGroup { 2 | display: flex; 3 | align-items: flex-start; 4 | justify-content: center; 5 | border-radius: 8px; 6 | border: 1px solid #454545; 7 | overflow: hidden; 8 | height: 40px; 9 | } 10 | 11 | .containerButton { 12 | text-align: center; 13 | leading-trim: both; 14 | text-edge: cap; 15 | font-feature-settings: 'clig' off, 'liga' off; 16 | font-family: Inter; 17 | font-size: 14px; 18 | font-style: normal; 19 | font-weight: 600; 20 | line-height: 140%; /* 19.6px */ 21 | flex-grow: 1; 22 | height: 100%; 23 | display: flex; 24 | justify-content: center; 25 | align-items: center; 26 | color: #8C8C8C; 27 | } 28 | 29 | .containerButton.active { 30 | background: rgba(255, 255, 255, 0.06); 31 | color: #FFF; 32 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/ToggleItemBigButtonGroupMulti/index.module.css: -------------------------------------------------------------------------------- 1 | .containerGroup { 2 | display: flex; 3 | align-items: center; 4 | justify-content: flex-start; 5 | flex-wrap: wrap; 6 | overflow: hidden; 7 | gap: 8px; 8 | width: 100%; 9 | } 10 | 11 | .containerButton { 12 | text-align: center; 13 | font-feature-settings: 'clig' off, 'liga' off; 14 | font-family: Inter; 15 | font-size: 12px; 16 | font-style: normal; 17 | font-weight: 500; 18 | line-height: 140%; /* 16.8px */ 19 | flex-shrink: 0; 20 | height: 100px; 21 | width: 80px; 22 | display: flex; 23 | justify-content: center; 24 | align-items: center; 25 | color: #FFF; 26 | gap: 4px; 27 | padding: 10px; 28 | flex-direction: column; 29 | text-overflow: ellipsis; 30 | overflow: hidden; 31 | white-space: nowrap; 32 | 33 | border-radius: 6px; 34 | box-sizing: border-box; 35 | background: #1B1B1B; 36 | } 37 | 38 | .containerButton.active { 39 | background: #2E2E2E; 40 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/ToggleItemButtonGroup/index.module.css: -------------------------------------------------------------------------------- 1 | .containerGroup { 2 | display: flex; 3 | align-items: flex-start; 4 | justify-content: center; 5 | border-radius: 8px; 6 | border: 1px solid #353535; 7 | overflow: hidden; 8 | height: 44px; 9 | width: fit-content; 10 | } 11 | 12 | .containerButton { 13 | text-align: center; 14 | leading-trim: both; 15 | text-edge: cap; 16 | font-feature-settings: 'clig' off, 'liga' off; 17 | font-family: Inter; 18 | font-size: 15px; 19 | font-style: normal; 20 | font-weight: 400; 21 | line-height: 140%; /* 19.6px */ 22 | height: 100%; 23 | display: flex; 24 | justify-content: center; 25 | align-items: center; 26 | color: #8C8C8C; 27 | gap: 12px; 28 | padding-left: 24px; 29 | padding-right: 24px; 30 | } 31 | 32 | .containerButton.active { 33 | background: rgba(255, 255, 255, 0.06); 34 | color: #FFF; 35 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/AnimatedImage/index.module.css: -------------------------------------------------------------------------------- 1 | .visual { 2 | background-color: black; 3 | } 4 | 5 | .transitionanim.visible { 6 | transition: opacity var(--fade-duration, 200ms) ease-in; 7 | opacity: 1; 8 | } 9 | 10 | .transitionanim.hidden { 11 | opacity: 0; 12 | } 13 | 14 | .errorText { 15 | color: white; 16 | width: 100%; 17 | height: 100%; 18 | display: flex; 19 | align-items: center; 20 | justify-content: center; 21 | } 22 | 23 | .notloaded { 24 | display: none; 25 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/DragArea/index.module.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/components/basics/DragArea/index.module.css -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/ResizeHandle/index.module.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/components/basics/ResizeHandle/index.module.css -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/ViewTypeToggles/index.module.css: -------------------------------------------------------------------------------- 1 | .toggleViewTypes { 2 | height: 36px; 3 | margin: 4px; 4 | border-radius: 6px; 5 | border: 1px solid #2E2E2E; 6 | overflow: hidden; 7 | flex-shrink: 0; 8 | } 9 | .toggleViewType { 10 | height:auto; 11 | display: inline-block; 12 | align-items: center; 13 | justify-content: center; 14 | background-color: #1B1B1B; 15 | } 16 | .toggleViewType.enabled { 17 | background-color: #262626 !important; 18 | } 19 | 20 | .toggleViewType img { 21 | padding: 10px; 22 | width: 16px; 23 | height: 16px; 24 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/inputs/CheckboxFlex/index.module.css: -------------------------------------------------------------------------------- 1 | .checkbox { 2 | border-color: #8C8C8C; 3 | border-radius: 8px; 4 | border-width: 3.6px; 5 | width: 22px; 6 | height: 22px; 7 | border-style: solid; 8 | 9 | transition: border-color 0.15s ease, background-color 0.15s ease; 10 | 11 | display: flex; 12 | align-items: center; 13 | justify-content: center; 14 | } 15 | 16 | .checkbox.checked { 17 | border-color: #019BE7; 18 | background-color: #019BE7; 19 | border-radius: 8px; 20 | border-width: 3.6px; 21 | width: 22px; 22 | height: 22px; 23 | border-style: solid; 24 | } 25 | 26 | .checkbox .check { 27 | width: 16px; 28 | height: 16px; 29 | 30 | transition: opacity 0.15s ease; 31 | opacity: 0; 32 | } 33 | 34 | .checkbox.checked .check { 35 | opacity: 1; 36 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/inputs/Toggle/index.module.css: -------------------------------------------------------------------------------- 1 | .toggle { 2 | border-radius: 30px; 3 | width: 52px; 4 | height: 32px; 5 | background-color: #ffffff22; 6 | display: inline-block; 7 | transition: background-color 0.5s; 8 | cursor: pointer; 9 | } 10 | .toggle .thumb { 11 | width: 22px; 12 | height: 22px; 13 | margin-top: 5px; 14 | margin-left: 5px; 15 | background-color: #FFF; 16 | border-radius: 25px; 17 | transition: margin-left 0.5s; 18 | } 19 | 20 | .toggle.enabled .thumb { 21 | margin-left:25px; 22 | } 23 | 24 | .toggle.enabled { 25 | background-color: #019BE7; 26 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/inputs/Toggle/index.tsx: -------------------------------------------------------------------------------- 1 | import { Component, createEffect, createSignal } from 'solid-js' 2 | 3 | import styles from './index.module.css'; 4 | 5 | interface ToggleProps { 6 | value: boolean; 7 | onToggle: (value: boolean) => void; 8 | } 9 | 10 | const Toggle: Component = (props) => { 11 | const [toggle, setToggle] = createSignal(props.value); 12 | createEffect(() => { 13 | setToggle(props.value); 14 | }); 15 | 16 | function handleToggle(ev: MouseEvent) { 17 | const newValue = !toggle(); 18 | setToggle(newValue); 19 | props.onToggle(newValue); 20 | ev.preventDefault(); 21 | ev.stopPropagation(); 22 | } 23 | 24 | return ( 25 |
handleToggle(ev)}> 26 |
27 |
28 | ); 29 | }; 30 | 31 | export default Toggle; -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/inputs/TogglePill/index.module.css: -------------------------------------------------------------------------------- 1 | .togglePill { 2 | width: 100px; 3 | border-radius: 6px; 4 | border: 1px solid #444343; 5 | padding-top: 8px; 6 | padding-bottom: 8px; 7 | text-align: center; 8 | color: #BFBFBF; 9 | background: transparant; 10 | display: inline-block; 11 | 12 | text-align: center; 13 | font-family: Inter; 14 | font-size: 14px; 15 | font-style: normal; 16 | font-weight: 500; 17 | line-height: 140%; /* 19.6px */ 18 | margin: 4px; 19 | cursor: pointer; 20 | } 21 | .togglePill.enabled { 22 | border: 1px solid #02C6E7; 23 | color: white; 24 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/inputs/TogglePill/index.tsx: -------------------------------------------------------------------------------- 1 | import { Component, createEffect, createSignal } from 'solid-js' 2 | 3 | import styles from './index.module.css'; 4 | 5 | interface TogglePillProps { 6 | name: string; 7 | value: boolean; 8 | onToggle: (value: boolean) => void; 9 | } 10 | 11 | const TogglePill: Component = (props) => { 12 | const [toggle, setToggle] = createSignal(props.value); 13 | createEffect(() => { 14 | setToggle(props.value); 15 | }); 16 | 17 | function handleToggle(ev: MouseEvent) { 18 | const newValue = !toggle(); 19 | setToggle(newValue); 20 | props.onToggle(newValue); 21 | ev.preventDefault(); 22 | ev.stopPropagation(); 23 | } 24 | 25 | return ( 26 |
handleToggle(ev)}> 27 | {props.name} 28 |
29 | ); 30 | }; 31 | 32 | export default TogglePill; -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/loaders/CenteredLoader/index.tsx: -------------------------------------------------------------------------------- 1 | import { Component, JSX, Show } from "solid-js"; 2 | import Loader from "../Loader"; 3 | 4 | export interface LoaderProps { 5 | size?: string; 6 | text?: string; 7 | style?: JSX.CSSProperties; 8 | } 9 | 10 | const CenteredLoader: Component = (props) => { 11 | return ( 12 |
21 | 22 | 23 |
24 | {props.text} 25 |
26 |
27 |
28 | ); 29 | }; 30 | 31 | export default CenteredLoader; -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/loaders/CircleLoader/index.module.css: -------------------------------------------------------------------------------- 1 | .loader { 2 | width: 48px; 3 | height: 48px; 4 | border: 3px solid #FFF; 5 | border-bottom-color: transparent; 6 | border-radius: 50%; 7 | display: inline-block; 8 | box-sizing: border-box; 9 | animation: rotation 1s linear infinite; 10 | } 11 | 12 | @keyframes rotation { 13 | 0% { 14 | transform: rotate(0deg); 15 | } 16 | 17 | 100% { 18 | transform: rotate(360deg); 19 | } 20 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/loaders/CircleLoader/index.tsx: -------------------------------------------------------------------------------- 1 | import { Component, createSignal, onCleanup, onMount, For, JSX, createMemo, Show, Switch, Match } from "solid-js"; 2 | import styles from './index.module.css'; 3 | 4 | export interface CircleLoaderProps { 5 | style?: JSX.CSSProperties; 6 | }; 7 | 8 | const CircleLoader: Component = (props) => { 9 | return ( 10 | 11 | ); 12 | }; 13 | 14 | export default CircleLoader; 15 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/loaders/Loader/index.tsx: -------------------------------------------------------------------------------- 1 | import { Component } from "solid-js"; 2 | import styles from './index.module.css'; 3 | 4 | export interface LoaderProps { 5 | size?: string; 6 | } 7 | 8 | const Loader: Component = (props) => { 9 | return ( 10 | 11 | ); 12 | }; 13 | 14 | export default Loader; -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/loaders/LoaderContainer/index.module.css: -------------------------------------------------------------------------------- 1 | .containerLoader { 2 | height: 100%; 3 | width: 100%; 4 | position: relative; 5 | 6 | scrollbar-width: 8px; 7 | scrollbar-color: #555 #333; 8 | } 9 | 10 | 11 | .loaderWrapper { 12 | width: 100%; 13 | height: 100%; 14 | display: grid; 15 | justify-content: center; 16 | align-content: center; 17 | } 18 | 19 | .loadingText { 20 | position: absolute; 21 | font-size: 18px; 22 | top: calc(50% + 70px); 23 | left: 50%; 24 | transform: translateX(-50%); 25 | } 26 | 27 | .loadingSubText { 28 | position: absolute; 29 | font-size: 12px; 30 | top: calc(50% + 95px); 31 | left: 50%; 32 | transform: translateX(-50%); 33 | color: #AAA; 34 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/loaders/LoaderGrid/index.module.css: -------------------------------------------------------------------------------- 1 | .loaderGrid { 2 | overflow-y: auto; 3 | height: 100%; 4 | position: relative; 5 | scrollbar-width: 8px; 6 | scrollbar-color: #555 #333; 7 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/loaders/LoaderSmall/index.module.css: -------------------------------------------------------------------------------- 1 | .containerLoader { 2 | height: 100%; 3 | width: 100%; 4 | position: relative; 5 | 6 | scrollbar-width: 8px; 7 | scrollbar-color: #555 #333; 8 | } 9 | 10 | /* HTML:
*/ 11 | .loader { 12 | width: 25px; 13 | aspect-ratio: 1; 14 | border-radius: 50%; 15 | border: 4px solid; 16 | border-color: #FFF #0000; 17 | animation: l1 1s infinite; 18 | } 19 | @keyframes l1 {to{transform: rotate(.5turn)}} -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/loaders/LoaderSmall/index.tsx: -------------------------------------------------------------------------------- 1 | import { Component, createSignal, onCleanup, onMount, For, JSX, createMemo, Show, Switch, Match } from "solid-js"; 2 | import styles from './index.module.css'; 3 | 4 | export interface LoaderContainerProps { 5 | background?: string, 6 | style?: JSX.CSSProperties 7 | }; 8 | 9 | const LoaderSmall: Component = (props) => { 10 | return ( 11 |
12 | 13 |
14 | ); 15 | }; 16 | 17 | export default LoaderSmall; 18 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/basics/loaders/SkeletonDiv/index.tsx: -------------------------------------------------------------------------------- 1 | import { Component, createSignal, onCleanup, onMount, For, JSX, createMemo, Show, Switch, Match } from "solid-js"; 2 | import styles from './index.module.css'; 3 | 4 | export interface SkeletonProps { 5 | children?: JSX.Element | undefined; 6 | style?: JSX.CSSProperties; 7 | }; 8 | 9 | const SkeletonDiv: Component = (props) => { 10 | 11 | return ( 12 |
13 | {props.children} 14 |
15 | ); 16 | }; 17 | 18 | export default SkeletonDiv; 19 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/buttons/BorderButton/index.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | border-radius: 6px; 3 | border: 1px solid #2E2E2E; 4 | 5 | display: flex; 6 | height: 56px; 7 | align-items: center; 8 | width: fit-content; 9 | text-align: center; 10 | flex-direction: row; 11 | justify-content: center; 12 | box-sizing: border-box; 13 | 14 | color: #D9D9D9; 15 | text-align: center; 16 | font-feature-settings: 'clig' off, 'liga' off; 17 | font-family: Inter; 18 | font-size: 20px; 19 | font-style: normal; 20 | font-weight: 600; 21 | line-height: 140%; /* 19.6px */ 22 | } 23 | 24 | .container.small { 25 | height: 42px; 26 | font-size: 14px; 27 | padding-left: 20px; 28 | padding-right: 20px; 29 | } 30 | 31 | .container:hover { 32 | cursor: pointer; 33 | } 34 | 35 | .icon { 36 | height: 22px; 37 | width: 22px; 38 | margin-right: 10px; 39 | } 40 | 41 | .container.small .icon { 42 | height: 16px; 43 | width: 16px; 44 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/buttons/BorderButton/index.tsx: -------------------------------------------------------------------------------- 1 | import { Component, JSX, Show } from 'solid-js' 2 | 3 | import styles from './index.module.css'; 4 | 5 | interface BorderButtonProps { 6 | icon?: string; 7 | text: string; 8 | color?: string; 9 | onClick?: (event: MouseEvent) => void; 10 | small?: boolean; 11 | style?: JSX.CSSProperties; 12 | } 13 | 14 | const BorderButton: Component = (props) => { 15 | const handleClick = (event: MouseEvent) => { 16 | if (props.onClick) { 17 | props.onClick(event); 18 | } 19 | }; 20 | 21 | return ( 22 |
23 | 24 | {props.text} 25 | 26 | {props.text} 27 |
28 | ); 29 | }; 30 | 31 | export default BorderButton; -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/buttons/ButtonFlex/index.module.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/components/buttons/ButtonFlex/index.module.css -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/buttons/ButtonFlex/index.tsx: -------------------------------------------------------------------------------- 1 | import { Component, JSX, Show } from 'solid-js' 2 | 3 | import styles from './index.module.css'; 4 | import Button from '../Button'; 5 | 6 | interface ButtonProps { 7 | icon?: string; 8 | text: string; 9 | color?: string; 10 | onClick?: (event: MouseEvent) => void; 11 | small?: boolean; 12 | style?: JSX.CSSProperties; 13 | } 14 | 15 | const ButtonFlex: Component = (props) => { 16 | const style = props.style ?? {}; 17 | style.display = "flex"; 18 | style["align-items"] = "center"; 19 | style["flex-direction"] = "row"; 20 | style["justify-content"] = "center"; 21 | 22 | return ( 23 | 24 | ); 25 | }; 26 | 27 | export default ButtonFlex; -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/buttons/CustomButton/index.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | border-radius: 8px; 3 | display: flex; 4 | height: 48px; 5 | padding-left: 20px; 6 | padding-right: 20px; 7 | font-weight: 300; 8 | font-size: 16px; 9 | font-family: "Inter"; 10 | align-items: center; 11 | width: fit-content; 12 | border: #ff0000b1; 13 | } 14 | 15 | .container:hover { 16 | cursor: pointer; 17 | } 18 | 19 | .icon { 20 | height: 18px; 21 | width: 18px; 22 | margin-right: 10px; 23 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/buttons/IconButton/index.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | width: 24px; 3 | height: 24px; 4 | background-color: #212122; 5 | border-radius: 50%; 6 | display: flex; 7 | flex-shrink: 0; 8 | } 9 | 10 | .container:hover { 11 | cursor: pointer; 12 | } 13 | 14 | .icon { 15 | width: calc(100% - 8px); 16 | height: calc(100% - 8px); 17 | margin: 4px; 18 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/buttons/PillButton/index.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | display: flex; 3 | height: 48px; 4 | justify-content: center; 5 | align-items: center; 6 | gap: 6px; 7 | 8 | border-radius: 26px; 9 | background-color: #212122; 10 | padding-left: 16px; 11 | padding-right: 16px; 12 | } 13 | 14 | .container:hover { 15 | cursor: pointer; 16 | } 17 | 18 | .icon { 19 | width: 24px; 20 | height: 24px; 21 | } 22 | 23 | .text { 24 | color: #FFF; 25 | font-family: Inter; 26 | font-size: 14px; 27 | font-style: normal; 28 | font-weight: 600; 29 | line-height: normal; 30 | margin-left: 2px; 31 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/buttons/PillButton/index.tsx: -------------------------------------------------------------------------------- 1 | import { Component, Show } from 'solid-js' 2 | 3 | import styles from './index.module.css'; 4 | 5 | interface PillButtonProps { 6 | icon: string; 7 | text: string; 8 | onClick?: (event: MouseEvent) => void; 9 | } 10 | 11 | const PillButton: Component = (props) => { 12 | const handleClick = (event: MouseEvent) => { 13 | if (props.onClick) { 14 | props.onClick(event); 15 | } 16 | }; 17 | 18 | return ( 19 |
20 | {props.text} 25 | 26 |
{props.text}
27 |
28 | ); 29 | }; 30 | 31 | export default PillButton; -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/buttons/PillButtonSmall/index.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | display: flex; 3 | height: 44px; 4 | justify-content: center; 5 | align-items: center; 6 | gap: 6px; 7 | 8 | border-radius: 22px; 9 | background-color: #212122; 10 | padding-left: 20px; 11 | padding-right: 20px; 12 | } 13 | 14 | .container:hover { 15 | cursor: pointer; 16 | } 17 | 18 | .icon { 19 | width: 24px; 20 | height: 24px; 21 | } 22 | 23 | .text { 24 | color: #FFF; 25 | font-family: "Inter"; 26 | font-size: 16px; 27 | font-weight: 500; 28 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/buttons/PillButtonSmall/index.tsx: -------------------------------------------------------------------------------- 1 | import { Component, Show } from 'solid-js' 2 | 3 | import styles from './index.module.css'; 4 | 5 | interface PillButtonSmallProps { 6 | icon: string; 7 | text: string; 8 | onClick?: (event: MouseEvent) => void; 9 | } 10 | 11 | const PillButtonSmall: Component = (props) => { 12 | const handleClick = (event: MouseEvent) => { 13 | if (props.onClick) { 14 | props.onClick(event); 15 | } 16 | }; 17 | 18 | return ( 19 |
20 | {props.text} 25 | 26 |
{props.text}
27 |
28 | ); 29 | }; 30 | 31 | export default PillButtonSmall; -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/buttons/TransparentIconButton/index.module.css: -------------------------------------------------------------------------------- 1 | .containerTransparentButton { 2 | width: 24px; 3 | height: 24px; 4 | background-color: #24242400; 5 | border-radius: 6px; 6 | background: rgba(255, 255, 255, 0.065); 7 | display: flex; 8 | flex-shrink: 0; 9 | } 10 | 11 | .containerTransparentButton:hover { 12 | cursor: pointer; 13 | } 14 | 15 | .icon { 16 | width: calc(100% - 24px); 17 | height: calc(100% - 24px); 18 | margin: 12px; 19 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/containers/ContentGrid/index.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 100%; 3 | position: relative; 4 | padding-left: 24px; 5 | padding-right: 24px; 6 | padding-bottom: 24px; 7 | } 8 | 9 | .container::-webkit-scrollbar { 10 | width: 10px; 11 | } 12 | 13 | .container::-webkit-scrollbar-thumb { 14 | background-color: #555; 15 | border-radius: 5px; 16 | } 17 | 18 | .container::-webkit-scrollbar-thumb:hover { 19 | background-color: #888; 20 | } 21 | 22 | .container::-webkit-scrollbar-track { 23 | background-color: #333; 24 | } 25 | 26 | .container::-webkit-scrollbar-corner { 27 | background-color: transparent; 28 | } 29 | 30 | .grid { 31 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/containers/HorizontalScrollContainer/index.tsx: -------------------------------------------------------------------------------- 1 | import { Component, JSX } from "solid-js"; 2 | import styles from './index.module.css'; 3 | 4 | export interface HorizontalScrollContainerProps { 5 | ref?: HTMLDivElement; 6 | children: JSX.Element; 7 | style?: JSX.CSSProperties; 8 | subtle?: boolean; 9 | }; 10 | 11 | const ScrollContainer: Component = (props) => { 12 | //TODO: Should this use const c = children(() => props.children); ? 13 | return ( 14 | <> 15 |
16 | {props.children} 17 |
18 | 19 | ); 20 | }; 21 | 22 | export default ScrollContainer; 23 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/containers/ScrollContainer/index.module.css: -------------------------------------------------------------------------------- 1 | .containerScroll { 2 | overflow-y: auto; 3 | overflow-x: hidden; 4 | height: 100%; 5 | position: relative; 6 | scrollbar-width: 8px; 7 | scrollbar-color: #555 #333; 8 | scrollbar-width: thin; 9 | } 10 | 11 | .containerScroll::-webkit-scrollbar { 12 | width: 10px; 13 | } 14 | 15 | .containerScroll::-webkit-scrollbar-thumb { 16 | background-color: #555; 17 | border-radius: 5px; 18 | } 19 | 20 | .containerScroll::-webkit-scrollbar-thumb:hover { 21 | background-color: #888; 22 | } 23 | 24 | .containerScroll::-webkit-scrollbar-track { 25 | background-color: #333; 26 | } 27 | 28 | .containerScroll::-webkit-scrollbar-corner { 29 | background-color: transparent; 30 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/containers/SettingsContainer/fields/Field/index.module.css: -------------------------------------------------------------------------------- 1 | 2 | .container { 3 | width: 100%; 4 | position: relative; 5 | } 6 | .key { 7 | float: left; 8 | width: 60%; 9 | } 10 | .value { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/containers/SettingsContainer/fields/FieldGroup/index.module.css: -------------------------------------------------------------------------------- 1 | 2 | .container { 3 | width: 100%; 4 | border-top: 1px solid #363636; 5 | border-bottom: 1px solid #363636; 6 | padding-top: 24px; 7 | padding-bottom: 8px; 8 | } 9 | 10 | .header { 11 | color: #FFF; 12 | font-family: Inter; 13 | font-size: 20px; 14 | font-style: normal; 15 | font-weight: 600; 16 | line-height: 24px; /* 109.091% */ 17 | } 18 | .description { 19 | color: #8C8C8C; 20 | font-family: Inter; 21 | font-size: 14px; 22 | font-style: normal; 23 | font-weight: 300; 24 | line-height: 16px; /* 114.286% */ 25 | margin-top: 4px; 26 | margin-bottom: 12px; 27 | } 28 | 29 | .key { 30 | float: left; 31 | width: 60%; 32 | } 33 | .value { 34 | 35 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/containers/SettingsContainer/fields/FieldReadOnly/index.module.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | .container { 4 | width: 100%; 5 | padding-top: 20px; 6 | padding-bottom: 20px; 7 | position: relative; 8 | display: flex; 9 | flex-direction: row; 10 | flex-wrap: nowrap; 11 | } 12 | .descriptor { 13 | 14 | } 15 | .descriptor .title { 16 | color: #FFF; 17 | leading-trim: both; 18 | text-edge: cap; 19 | font-family: Inter; 20 | font-size: 18px; 21 | font-style: normal; 22 | font-weight: 500; 23 | line-height: 24px; /* 133.333% */ 24 | } 25 | .descriptor .description { 26 | color: #8C8C8C; 27 | leading-trim: both; 28 | text-edge: cap; 29 | font-family: Inter; 30 | font-size: 14px; 31 | font-style: normal; 32 | font-weight: 300; 33 | line-height: 16px; /* 114.286% */ 34 | } 35 | .value { 36 | flex-grow: 1; 37 | vertical-align: middle; 38 | text-align: left; 39 | align-self: center; 40 | text-align: right; 41 | margin-right: 10px; 42 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/containers/SettingsContainer/index.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | position: relative; 3 | } 4 | 5 | .container::-webkit-scrollbar { 6 | width: 10px; 7 | } 8 | 9 | .container::-webkit-scrollbar-thumb { 10 | background-color: #555; 11 | border-radius: 5px; 12 | } 13 | 14 | .container::-webkit-scrollbar-thumb:hover { 15 | background-color: #888; 16 | } 17 | 18 | .container::-webkit-scrollbar-track { 19 | background-color: #333; 20 | } 21 | 22 | .container::-webkit-scrollbar-corner { 23 | background-color: transparent; 24 | } 25 | 26 | .grid { 27 | } 28 | 29 | .settingsMenu { 30 | position: absolute; 31 | left: 0px; 32 | top: 0px; 33 | height: 100%; 34 | width: 200px; 35 | } 36 | .settingsContainer { 37 | position: absolute; 38 | right: 0px; 39 | top: 0px; 40 | height: 100%; 41 | width: calc(100% - 200px); 42 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/containers/ShrinkOnScrollContainer/index.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | top: 0; 3 | width: 100%; 4 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/containers/StickyShrinkOnScrollContainer/index.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | top: 0; 3 | z-index: 1; 4 | width: 100%; 5 | pointer-events: none; 6 | } 7 | 8 | .container > * { 9 | pointer-events: auto; 10 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/menus/SideBarCreator/index.tsx: -------------------------------------------------------------------------------- 1 | import { Show, type Component } from 'solid-js'; 2 | 3 | import styles from './index.module.css'; 4 | 5 | interface SideBarCreatorProps { 6 | icon?: string; 7 | name: string; 8 | selected?: boolean; 9 | collapsed?: boolean; 10 | onClick?: (event: MouseEvent) => void; 11 | } 12 | 13 | const SideBarCreator: Component = (props) => { 14 | const handleClick = (event: MouseEvent) => { 15 | if (props.onClick) { 16 | props.onClick(event); 17 | } 18 | }; 19 | 20 | return ( 21 |
22 | 23 | logo 24 | 25 |
{props.name}
26 |
27 | ); 28 | }; 29 | 30 | export default SideBarCreator; 31 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/components/topbars/NavigationBar/index.module.css: -------------------------------------------------------------------------------- 1 | .containerTopBar { 2 | display: flex; 3 | flex-direction: row; 4 | align-items: center; 5 | width: 100%; 6 | flex-shrink: 0; 7 | margin: 24px; 8 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/contexts/ShrinkProgress.tsx: -------------------------------------------------------------------------------- 1 | import { Accessor, createContext, useContext } from "solid-js"; 2 | 3 | export const ShrinkProgressContext = createContext(); 4 | export const useShrinkProgress = () => useContext(ShrinkProgressContext) as Accessor; -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/overlays/OverlayModals/index.module.css: -------------------------------------------------------------------------------- 1 | 2 | .root { 3 | position: fixed; 4 | top: 0px; 5 | left: 0px; 6 | width: 100%; 7 | height: 100%; 8 | background-color: rgba(0,0,0, .5); 9 | display: grid; 10 | align-items: center; 11 | justify-content: center; 12 | z-index: 5; 13 | } 14 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/overlays/OverlayRoot/index.module.css: -------------------------------------------------------------------------------- 1 | 2 | .root { 3 | position: fixed; 4 | top: 80px; 5 | left: 50%; 6 | transform: translateX(-50%); 7 | display: grid; 8 | align-items: center; 9 | justify-content: center; 10 | z-index: 5; 11 | transition: display 0.5s; 12 | animation: fadeIn 0.5s; 13 | } 14 | @keyframes fadeIn { 15 | 0% {opacity: 0;} 16 | 100% {opacity: 1;} 17 | } 18 | 19 | .toast { 20 | background-color: rgba(20,20,20,.95); 21 | padding-top: 10px; 22 | padding-bottom: 10px; 23 | padding-left: 20px; 24 | padding-right: 20px; 25 | border-radius: 10px; 26 | text-align: center; 27 | border: 1px solid #2b2a2a; 28 | z-index: 999; 29 | } 30 | .toastText { 31 | font-size: 22px; 32 | font-weight: lighter; 33 | } 34 | .toastTitle { 35 | font-weight: 400; 36 | font-size: 26px; 37 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/pages/BuyPage/index.module.css: -------------------------------------------------------------------------------- 1 | 2 | .buyContainer { 3 | 4 | text-align: center; 5 | } 6 | 7 | 8 | .grayjay { 9 | display: flex; 10 | flex-direction: row; 11 | align-items: center; 12 | flex-shrink: 0; 13 | gap: 8px; 14 | width: 100%; 15 | margin-left: 4px; 16 | margin-bottom: 8px; 17 | color: #FFF; 18 | font-family: Sen; 19 | font-size: 20px; 20 | font-style: normal; 21 | font-weight: 700; 22 | line-height: normal; 23 | position: relative; 24 | } 25 | 26 | .descriptionShared { 27 | color: orange; 28 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/pages/Creators/index.module.css: -------------------------------------------------------------------------------- 1 | .containerCreators { 2 | display: flex; 3 | flex-direction: column; 4 | 5 | height: 100%; 6 | } 7 | 8 | .containerFilters { 9 | display: flex; 10 | flex-direction: row; 11 | align-items: center; 12 | margin-left: 24px; 13 | margin-right: 24px; 14 | width: calc(100% - 48px); 15 | gap: 12px; 16 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/pages/Home/index.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | display: flex; 3 | flex-direction: column; 4 | 5 | height: 100%; 6 | } 7 | 8 | .topBar { 9 | display: flex; 10 | flex-direction: row; 11 | margin-left: 32px; 12 | margin-bottom: 32px; 13 | } 14 | 15 | .searchBar { 16 | width: 40%; 17 | } 18 | 19 | .grid { 20 | margin-top: 24px; 21 | margin-left: 24px; 22 | position: relative; 23 | height: 100%; 24 | overflow: hidden; 25 | } -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/src/pages/VirtualExamplePage/index.module.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Grayjay.Desktop.Web/src/pages/VirtualExamplePage/index.module.css -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "target": "ESNext", 5 | "module": "ESNext", 6 | "moduleResolution": "node", 7 | "allowSyntheticDefaultImports": true, 8 | "esModuleInterop": true, 9 | "jsx": "preserve", 10 | "jsxImportSource": "solid-js", 11 | "types": ["vite/client"], 12 | "noEmit": true, 13 | "isolatedModules": true 14 | }, 15 | } 16 | -------------------------------------------------------------------------------- /Grayjay.Desktop.Web/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import solidPlugin from 'vite-plugin-solid'; 3 | // import devtools from 'solid-devtools/vite'; 4 | 5 | export default defineConfig({ 6 | base: '/web', 7 | plugins: [ 8 | /* 9 | Uncomment the following line to enable solid-devtools. 10 | For more info see https://github.com/thetarnav/solid-devtools/tree/main/packages/extension#readme 11 | */ 12 | // devtools(), 13 | solidPlugin(), 14 | ], 15 | server: { 16 | port: 3000, 17 | hmr: { 18 | host: "localhost", 19 | port: 3000, 20 | protocol: "ws" 21 | } 22 | }, 23 | build: { 24 | target: 'esnext', 25 | } 26 | }); 27 | -------------------------------------------------------------------------------- /Grayjay.Windows.Tests/Grayjay.Windows.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net9.0 5 | enable 6 | enable 7 | 8 | false 9 | true 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Keychain.MacOS/Keychain/Keychain.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Keychain.MacOS/Keychain/Keychain.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Keychain.MacOS/Keychain/Keychain.xcodeproj/project.xcworkspace/xcuserdata/koen.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/Keychain.MacOS/Keychain/Keychain.xcodeproj/project.xcworkspace/xcuserdata/koen.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Keychain.MacOS/Keychain/Keychain.xcodeproj/xcuserdata/koen.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Keychain.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 5D5F1FAE2B92397900C39985 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Keychain.MacOS/Keychain/Keychain/Keychain.h: -------------------------------------------------------------------------------- 1 | // 2 | // Keychain.h 3 | // Keychain 4 | // 5 | // Created by Koen on 01/03/2024. 6 | // 7 | 8 | #import 9 | 10 | //! Project version number for Keychain. 11 | FOUNDATION_EXPORT double KeychainVersionNumber; 12 | 13 | //! Project version string for Keychain. 14 | FOUNDATION_EXPORT const unsigned char KeychainVersionString[]; 15 | 16 | // In this header, you should import all the public headers of your framework using statements like #import 17 | 18 | 19 | -------------------------------------------------------------------------------- /app.grayjay.Grayjay.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Version=1.0 3 | Type=Application 4 | 5 | Name=Grayjay 6 | Comment=Universal media aggregator 7 | Categories=AudioVideo;Player; 8 | 9 | Icon=app.grayjay.Grayjay 10 | Exec=Grayjay 11 | Terminal=false 12 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Remove old files 4 | rm -f GrayjayDesktop-linux-x64.zip 5 | rm -f GrayjayDesktop-win-x64.zip 6 | 7 | # Build front-end 8 | cd Grayjay.Desktop.Web 9 | npm install 10 | rm -rf dist 11 | npm run build 12 | cd .. 13 | 14 | runtimes=("win-x64" "linux-x64") 15 | 16 | # Loop over each runtime 17 | for runtime in "${runtimes[@]}" 18 | do 19 | echo "Building for $runtime" 20 | 21 | # Publish CEF 22 | cd Grayjay.Desktop.CEF 23 | rm -rf bin 24 | dotnet publish -r $runtime -c Release 25 | cd ../Users/koen/projects/Grayjay.Desktop/deploy_linux.sh 26 | 27 | # Copy wwwroot 28 | mkdir -p Grayjay.Desktop.CEF/bin/Release/net8.0/$runtime/publish/wwwroot 29 | cp -r Grayjay.Desktop.Web/dist Grayjay.Desktop.CEF/bin/Release/net8.0/$runtime/publish/wwwroot/web 30 | 31 | # Create zip 32 | cd Grayjay.Desktop.CEF/bin/Release/net8.0/$runtime/publish 33 | zip -r ../../../../../../GrayjayDesktop-$runtime.zip * 34 | cd ../../../../../.. 35 | done -------------------------------------------------------------------------------- /build_linux.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | 4 | if [[ "$1" != "" ]]; then 5 | version="$1" 6 | else 7 | echo -n "Version:" 8 | read version 9 | fi 10 | 11 | runtime="linux-x64" 12 | 13 | 14 | printf "Version to deploy: $version\n" 15 | 16 | # Build front-end 17 | cd Grayjay.Desktop.Web 18 | npm install 19 | rm -rf dist 20 | npm run build 21 | cd .. 22 | 23 | 24 | # Loop over each runtime 25 | rm -rf Grayjay.Desktop.CEF/bin/Release 26 | 27 | 28 | # Publish CEF 29 | cd Grayjay.Desktop.CEF 30 | dotnet publish -r $runtime -c Release -p:AssemblyVersion=1.$version.0.0 31 | cd .. 32 | 33 | # Copy wwwroot 34 | mkdir -p Grayjay.Desktop.CEF/bin/Release/net9.0/$runtime/publish/wwwroot 35 | cp -r Grayjay.Desktop.Web/dist Grayjay.Desktop.CEF/bin/Release/net9.0/$runtime/publish/wwwroot/web 36 | 37 | cd Grayjay.Desktop.CEF/bin/Release/net9.0/$runtime/publish 38 | 39 | chmod u=rwx Grayjay 40 | chmod u=rwx cef/dotcefnative 41 | chmod u=rwx FUTO.Updater.Client 42 | chmod u=rwx ffmpeg 43 | 44 | cd ../../../../../.. -------------------------------------------------------------------------------- /imgs/channel.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/imgs/channel.PNG -------------------------------------------------------------------------------- /imgs/detail1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/imgs/detail1.PNG -------------------------------------------------------------------------------- /imgs/detail2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/imgs/detail2.PNG -------------------------------------------------------------------------------- /imgs/download.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/imgs/download.PNG -------------------------------------------------------------------------------- /imgs/home.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/imgs/home.PNG -------------------------------------------------------------------------------- /imgs/sources.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/imgs/sources.PNG -------------------------------------------------------------------------------- /rcedit-x64.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futo-org/Grayjay.Desktop/298e042b5c9b7a9d8ce2ed8529193d043430d02b/rcedit-x64.exe -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cleanup() { 4 | echo "Terminating background processes..." 5 | kill $NPM_PID $DOTNET_PID 6 | } 7 | 8 | trap cleanup SIGINT 9 | 10 | git pull origin master 11 | git submodule update --recursive 12 | 13 | cd Grayjay.Desktop.Web 14 | npm install 15 | npm run start & 16 | NPM_PID=$! 17 | cd .. 18 | 19 | cd Grayjay.Desktop.Headless 20 | dotnet run & 21 | DOTNET_PID=$! 22 | cd .. 23 | 24 | echo "Open your browser at http://127.0.0.1:8080/web" 25 | wait $NPM_PID $DOTNET_PID -------------------------------------------------------------------------------- /sign_windows.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | AWS_USE_FIPS_ENDPOINT=true 4 | jsign --storetype AWS --keystore us-east-1 --alias "FUTO-EV-signing-key" --tsaurl http://timestamp.globalsign.com/tsa/r6advanced1 --tsmode RFC3161 --certfile /c/cert/fullchain.pem $1 --------------------------------------------------------------------------------