From dcd6d64191e7e92a998429a78adff5c62580d07c Mon Sep 17 00:00:00 2001 From: Mike Nolan Date: Tue, 4 Oct 2022 05:44:09 -0500 Subject: [PATCH] Initial commit --- .gitignore | 398 +++++++ TYTD.Common/Class1.cs | 1046 +++++++++++++++++ TYTD.Common/Resources/drawable/dns_48px.xml | 10 + TYTD.Common/TYTD.Common.csproj | 17 + TYTD.Common/TYTDReceiver.cs | 27 + TYTD.Common/TYTDService.cs | 65 + TYTD.Mobile/AndroidManifest.xml | 8 + TYTD.Mobile/Extensions.cs | 12 + TYTD.Mobile/MainActivity.cs | 184 +++ TYTD.Mobile/Preference.cs | 56 + TYTD.Mobile/RecylerViewSharp.cs | 77 ++ TYTD.Mobile/Resources/1024.png | Bin 0 -> 113504 bytes TYTD.Mobile/Resources/AboutResources.txt | 44 + .../Resources/drawable-v21/ic_menu_camera.xml | 12 + .../drawable-v21/ic_menu_gallery.xml | 9 + .../Resources/drawable-v21/ic_menu_manage.xml | 9 + .../Resources/drawable-v21/ic_menu_send.xml | 9 + .../Resources/drawable-v21/ic_menu_share.xml | 9 + .../drawable-v21/ic_menu_slideshow.xml | 9 + TYTD.Mobile/Resources/drawable/add_48px.xml | 10 + .../Resources/drawable/side_nav_bar.xml | 9 + .../Resources/layout/activity_main.xml | 25 + .../Resources/layout/activity_servers.xml | 34 + TYTD.Mobile/Resources/layout/add_item.xml | 13 + TYTD.Mobile/Resources/layout/app_bar_main.xml | 34 + TYTD.Mobile/Resources/layout/content_main.xml | 16 + .../Resources/layout/content_servers.xml | 16 + TYTD.Mobile/Resources/layout/edit_server.xml | 31 + .../Resources/layout/edit_ssh_server.xml | 55 + .../Resources/layout/nav_header_main.xml | 24 + .../Resources/layout/settings_layout.xml | 26 + .../Resources/menu/activity_main_drawer.xml | 38 + TYTD.Mobile/Resources/menu/menu_main.xml | 14 + .../Resources/menu/menu_server_editable.xml | 17 + .../menu/menu_server_not_editable.xml | 11 + TYTD.Mobile/Resources/menu/menu_servers.xml | 9 + .../mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../Resources/mipmap-hdpi/ic_launcher.png | Bin 0 -> 5156 bytes .../mipmap-hdpi/ic_launcher_adaptive_back.png | Bin 0 -> 4403 bytes .../mipmap-hdpi/ic_launcher_adaptive_fore.png | Bin 0 -> 5219 bytes .../Resources/mipmap-mdpi/ic_launcher.png | Bin 0 -> 3082 bytes .../mipmap-mdpi/ic_launcher_adaptive_back.png | Bin 0 -> 2577 bytes .../mipmap-mdpi/ic_launcher_adaptive_fore.png | Bin 0 -> 3430 bytes .../Resources/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 7057 bytes .../ic_launcher_adaptive_back.png | Bin 0 -> 6616 bytes .../ic_launcher_adaptive_fore.png | Bin 0 -> 7420 bytes .../Resources/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 11643 bytes .../ic_launcher_adaptive_back.png | Bin 0 -> 11572 bytes .../ic_launcher_adaptive_fore.png | Bin 0 -> 12101 bytes .../Resources/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 16226 bytes .../ic_launcher_adaptive_back.png | Bin 0 -> 17575 bytes .../ic_launcher_adaptive_fore.png | Bin 0 -> 18028 bytes TYTD.Mobile/Resources/play_store_512.png | Bin 0 -> 38921 bytes TYTD.Mobile/Resources/values/colors.xml | 10 + TYTD.Mobile/Resources/values/dimens.xml | 8 + TYTD.Mobile/Resources/values/drawables.xml | 8 + .../values/ic_launcher_background.xml | 4 + TYTD.Mobile/Resources/values/strings.xml | 46 + TYTD.Mobile/Resources/values/styles.xml | 20 + .../Resources/xml/preference_screen.xml | 41 + TYTD.Mobile/Servers.cs | 441 +++++++ TYTD.Mobile/TYTD.Mobile.csproj | 24 + 63 files changed, 2995 insertions(+) create mode 100644 .gitignore create mode 100644 TYTD.Common/Class1.cs create mode 100644 TYTD.Common/Resources/drawable/dns_48px.xml create mode 100644 TYTD.Common/TYTD.Common.csproj create mode 100644 TYTD.Common/TYTDReceiver.cs create mode 100644 TYTD.Common/TYTDService.cs create mode 100644 TYTD.Mobile/AndroidManifest.xml create mode 100644 TYTD.Mobile/Extensions.cs create mode 100644 TYTD.Mobile/MainActivity.cs create mode 100644 TYTD.Mobile/Preference.cs create mode 100644 TYTD.Mobile/RecylerViewSharp.cs create mode 100644 TYTD.Mobile/Resources/1024.png create mode 100644 TYTD.Mobile/Resources/AboutResources.txt create mode 100644 TYTD.Mobile/Resources/drawable-v21/ic_menu_camera.xml create mode 100644 TYTD.Mobile/Resources/drawable-v21/ic_menu_gallery.xml create mode 100644 TYTD.Mobile/Resources/drawable-v21/ic_menu_manage.xml create mode 100644 TYTD.Mobile/Resources/drawable-v21/ic_menu_send.xml create mode 100644 TYTD.Mobile/Resources/drawable-v21/ic_menu_share.xml create mode 100644 TYTD.Mobile/Resources/drawable-v21/ic_menu_slideshow.xml create mode 100644 TYTD.Mobile/Resources/drawable/add_48px.xml create mode 100644 TYTD.Mobile/Resources/drawable/side_nav_bar.xml create mode 100644 TYTD.Mobile/Resources/layout/activity_main.xml create mode 100644 TYTD.Mobile/Resources/layout/activity_servers.xml create mode 100644 TYTD.Mobile/Resources/layout/add_item.xml create mode 100644 TYTD.Mobile/Resources/layout/app_bar_main.xml create mode 100644 TYTD.Mobile/Resources/layout/content_main.xml create mode 100644 TYTD.Mobile/Resources/layout/content_servers.xml create mode 100644 TYTD.Mobile/Resources/layout/edit_server.xml create mode 100644 TYTD.Mobile/Resources/layout/edit_ssh_server.xml create mode 100644 TYTD.Mobile/Resources/layout/nav_header_main.xml create mode 100644 TYTD.Mobile/Resources/layout/settings_layout.xml create mode 100644 TYTD.Mobile/Resources/menu/activity_main_drawer.xml create mode 100644 TYTD.Mobile/Resources/menu/menu_main.xml create mode 100644 TYTD.Mobile/Resources/menu/menu_server_editable.xml create mode 100644 TYTD.Mobile/Resources/menu/menu_server_not_editable.xml create mode 100644 TYTD.Mobile/Resources/menu/menu_servers.xml create mode 100644 TYTD.Mobile/Resources/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 TYTD.Mobile/Resources/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 TYTD.Mobile/Resources/mipmap-hdpi/ic_launcher.png create mode 100644 TYTD.Mobile/Resources/mipmap-hdpi/ic_launcher_adaptive_back.png create mode 100644 TYTD.Mobile/Resources/mipmap-hdpi/ic_launcher_adaptive_fore.png create mode 100644 TYTD.Mobile/Resources/mipmap-mdpi/ic_launcher.png create mode 100644 TYTD.Mobile/Resources/mipmap-mdpi/ic_launcher_adaptive_back.png create mode 100644 TYTD.Mobile/Resources/mipmap-mdpi/ic_launcher_adaptive_fore.png create mode 100644 TYTD.Mobile/Resources/mipmap-xhdpi/ic_launcher.png create mode 100644 TYTD.Mobile/Resources/mipmap-xhdpi/ic_launcher_adaptive_back.png create mode 100644 TYTD.Mobile/Resources/mipmap-xhdpi/ic_launcher_adaptive_fore.png create mode 100644 TYTD.Mobile/Resources/mipmap-xxhdpi/ic_launcher.png create mode 100644 TYTD.Mobile/Resources/mipmap-xxhdpi/ic_launcher_adaptive_back.png create mode 100644 TYTD.Mobile/Resources/mipmap-xxhdpi/ic_launcher_adaptive_fore.png create mode 100644 TYTD.Mobile/Resources/mipmap-xxxhdpi/ic_launcher.png create mode 100644 TYTD.Mobile/Resources/mipmap-xxxhdpi/ic_launcher_adaptive_back.png create mode 100644 TYTD.Mobile/Resources/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png create mode 100644 TYTD.Mobile/Resources/play_store_512.png create mode 100644 TYTD.Mobile/Resources/values/colors.xml create mode 100644 TYTD.Mobile/Resources/values/dimens.xml create mode 100644 TYTD.Mobile/Resources/values/drawables.xml create mode 100644 TYTD.Mobile/Resources/values/ic_launcher_background.xml create mode 100644 TYTD.Mobile/Resources/values/strings.xml create mode 100644 TYTD.Mobile/Resources/values/styles.xml create mode 100644 TYTD.Mobile/Resources/xml/preference_screen.xml create mode 100644 TYTD.Mobile/Servers.cs create mode 100644 TYTD.Mobile/TYTD.Mobile.csproj diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8a30d25 --- /dev/null +++ b/.gitignore @@ -0,0 +1,398 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml diff --git a/TYTD.Common/Class1.cs b/TYTD.Common/Class1.cs new file mode 100644 index 0000000..1b0947e --- /dev/null +++ b/TYTD.Common/Class1.cs @@ -0,0 +1,1046 @@ +namespace Tesses.YouTubeDownloader.Droid; +using Tesses.YouTubeDownloader; +using Tesses.YouTubeDownloader.Server; +using Tesses.WebServer; +using Tesses.WebServer.Swagme; +using Android.Content; +using Android.Net; +using Android.Database; +using Android.OS; +using Tesses.YouTubeDownloader.SFTP; +using Renci.SshNet; +using System.Net; +using Android.Preferences; +using AndroidX.Preference; +using Android.Runtime; +using Java.Interop; + +public class TYTDPreferences : PreferenceDataStore +{ + + public override bool GetBoolean(string? key, bool defValue) + { + if(key == TYTDCommon.TYTD_SERVER_ACCESSABLE) + { + return TYTDCommon.ServerAccessable; + } + if(key == TYTDCommon.TYTD_NO_EXTERNAL_INFO_THUMB) + { + //no scanning server for info or thumb + return TYTDCommon.NoExtenalInfoThumbnail; + } + if(key == TYTDCommon.TYTD_CACHE_THUMBNAILS_ON_START) + { + return TYTDCommon.CacheThumbnailsFromServersOnStartup; + } + if(key == TYTDCommon.TYTD_CACHE_INFO_ON_START) + { + return TYTDCommon.CacheInfoFromServersOnStartup; + } + if(key == TYTDCommon.TYTD_CACHE_LAZY) + { + return TYTDCommon.CacheLazy; + } + if(key == TYTDCommon.TYTD_FETCH_THUMB_YOUTUBE) + { + return TYTDCommon.FetchThumbYouTube; + } + return defValue; + } + + public override float GetFloat(string? key, float defValue) + { + return defValue; + } + + + + public override int GetInt(string? key, int defValue) + { + if(key == TYTDCommon.TYTD_SERVER_PORT) + { + return TYTDCommon.ServerPort; + } + return defValue; + } + + public override long GetLong(string? key, long defValue) + { + return defValue; + } + + public override string? GetString(string? key, string? defValue) + { + if(key == TYTDCommon.TYTD_SERVER_PORT) + { + return TYTDCommon.ServerPort.ToString(); + } + if(key == TYTDCommon.TYTD_TAG) + { + return TYTDCommon.Tag; + } + return defValue; + } + + public override ICollection? GetStringSet(string? key, ICollection? defValues) + { + return defValues; + } + + public override void PutBoolean(string? key, bool value) + { + if(key == TYTDCommon.TYTD_SERVER_ACCESSABLE) + { + TYTDCommon.ServerAccessable=value; + } + if(key == TYTDCommon.TYTD_NO_EXTERNAL_INFO_THUMB) + { + //no scanning server for info or thumb + TYTDCommon.NoExtenalInfoThumbnail = value; + } + if(key == TYTDCommon.TYTD_CACHE_THUMBNAILS_ON_START) + { + TYTDCommon.CacheThumbnailsFromServersOnStartup=value; + } + if(key == TYTDCommon.TYTD_CACHE_INFO_ON_START) + { + TYTDCommon.CacheInfoFromServersOnStartup=value; + } + if(key == TYTDCommon.TYTD_CACHE_LAZY) + { + TYTDCommon.CacheLazy=value; + } + if(key == TYTDCommon.TYTD_FETCH_THUMB_YOUTUBE) + { + TYTDCommon.FetchThumbYouTube=value; + } + + } + + public override void PutFloat(string? key, float value) + { + + } + + public override void PutInt(string? key, int value) + { + if(key == TYTDCommon.TYTD_SERVER_PORT) + { + if(value <= ushort.MaxValue) + { + TYTDCommon.ServerPort=(ushort)value; + } + } + } + + public override void PutLong(string? key, long value) + { + base.PutLong(key, value); + } + + public override void PutString(string? key, string? value) + { + if(key == TYTDCommon.TYTD_SERVER_PORT) + { + ushort value2; + if(ushort.TryParse(value,out value2)) + { + TYTDCommon.ServerPort=value2; + } + } + if(key == TYTDCommon.TYTD_TAG) + { + if(!string.IsNullOrWhiteSpace(value)){ + TYTDCommon.Tag = value; + }else{ + TYTDCommon.Tag="UnknownPC"; + } + } + } + + public override void PutStringSet(string? key, ICollection? values) + { + + } + + +} + +public static class CastExtensions +{ + public static async Task CopyThumbnailsFromYouTubeAsync(this IStorage storage,string id) + { + if(id.Length == 11) + { + storage.CreateDirectoryIfNotExist($"Thumbnails/{id}"); + await storage.CopyThumbnailFromYouTubeAsync(id,"default"); + await storage.CopyThumbnailFromYouTubeAsync(id,"hqdefault"); + await storage.CopyThumbnailFromYouTubeAsync(id,"maxresdefault"); + await storage.CopyThumbnailFromYouTubeAsync(id,"mqdefault"); + await storage.CopyThumbnailFromYouTubeAsync(id,"sddefault"); + } + } + private static async Task CopyThumbnailFromYouTubeAsync(this IStorage storage,string id,string thumbnail) + { + string name=$"Thumbnails/{id}/{thumbnail}.jpg"; + if(!storage.FileExists(name)) + { + try{ + using(var src=await storage.HttpClient.GetStreamAsync($"https://i.ytimg.com/vi/{id}/{thumbnail}.jpg")){ + using(var dest=await storage.CreateAsync(name)) + { + await src.CopyToAsync(dest); + } + }}catch(Exception ex) + { + _=ex; + } + } + } + private static async Task CopyThumbnailAsync(this ITYTDBase baseCtl,string id,string thumbnail,IStorage storage) + { + string name=$"Thumbnails/{id}/{thumbnail}.jpg"; + if(!storage.FileExists(name) && baseCtl.FileExists(name)) + { + using(var src=await baseCtl.OpenReadAsync(name)){ + using(var dest=await storage.CreateAsync(name)) + { + await src.CopyToAsync(dest); + } + } + } + } + public static async Task CopyThumbnailsAsync(this ITYTDBase baseCtl,string id,IStorage storage) + { + storage.CreateDirectoryIfNotExist($"Thumbnails/{id}"); + await baseCtl.CopyThumbnailAsync(id,"default",storage); + await baseCtl.CopyThumbnailAsync(id,"hqdefault",storage); + await baseCtl.CopyThumbnailAsync(id,"maxresdefault",storage); + await baseCtl.CopyThumbnailAsync(id,"mqdefault",storage); + await baseCtl.CopyThumbnailAsync(id,"sddefault",storage); + await baseCtl.CopyThumbnailAsync(id,"900x900",storage); + } + public static async Task CastIfAsync(this T1? src,Func cb) where T2 : class + { + var type = src as T2; + if(type != null && cb != null) + { + await cb(type); + } + } + public static void CastIf(this T1? src,Action cb) where T2 : class + { + var type = src as T2; + if(type != null && cb != null) + { + cb(type); + } + } +} +public static class TYTDCommon +{ + + + #region PREFENCES + public static string Tag { + get{ + if(ctx==null) return "UnknownPC"; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.GetString(TYTD_TAG,"UnknownPC"); + if(!string.IsNullOrWhiteSpace(res2)) + { + return res2; + } + } + return ""; + } + set{ + if(ctx==null) return; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.Edit(); + if(res2 != null) + { + res2.PutString(TYTD_TAG,value); + + if(res2.Commit()) + { + Restart(); + + } + } + + } + + } + } + public static bool ServerAccessable + { + get{ + if(ctx==null) return false; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.GetBoolean(TYTD_SERVER_ACCESSABLE,false); + return res2; + } + return false; + } + set{ + if(ctx==null) return; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.Edit(); + if(res2 != null) + { + res2.PutBoolean(TYTD_SERVER_ACCESSABLE,value); + + if(res2.Commit()) + { + Restart(); + + } + } + + } + + } + } + public static bool CacheLazy + { + get{ + if(ctx==null) return false; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.GetBoolean(TYTD_CACHE_LAZY,false); + return res2; + } + return false; + } + set{ + if(ctx==null) return; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.Edit(); + if(res2 != null) + { + res2.PutBoolean(TYTD_CACHE_LAZY,value); + + res2.Apply(); + } + + } + + } + } + public static bool CacheThumbnailsFromServersOnStartup + { + get{ + if(ctx==null) return false; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.GetBoolean(TYTD_CACHE_THUMBNAILS_ON_START,false); + return res2; + } + return false; + } + set{ + if(ctx==null) return; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.Edit(); + if(res2 != null) + { + res2.PutBoolean(TYTD_CACHE_THUMBNAILS_ON_START,value); + + res2.Apply(); + } + + } + + } + + } + + public static bool CacheInfoFromServersOnStartup + { + get{ + if(ctx==null) return false; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.GetBoolean(TYTD_CACHE_INFO_ON_START,false); + return res2; + } + return false; + } + set{ + if(ctx==null) return; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.Edit(); + if(res2 != null) + { + res2.PutBoolean(TYTD_CACHE_INFO_ON_START,value); + + res2.Apply(); + } + + } + + } + + } + public static bool NoExtenalInfoThumbnail + { + get{ + if(ctx==null) return false; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.GetBoolean(TYTD_NO_EXTERNAL_INFO_THUMB,false); + return res2; + } + return false; + } + set{ + if(ctx==null) return; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.Edit(); + if(res2 != null) + { + res2.PutBoolean(TYTD_NO_EXTERNAL_INFO_THUMB,value); + + res2.Apply(); + } + + } + + } + + } + public static bool FetchThumbYouTube + { + get{ + if(ctx==null) return false; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.GetBoolean(TYTD_FETCH_THUMB_YOUTUBE,false); + return res2; + } + return false; + } + set{ + if(ctx==null) return; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.Edit(); + if(res2 != null) + { + res2.PutBoolean(TYTD_FETCH_THUMB_YOUTUBE,value); + + res2.Apply(); + } + + } + + } + + } + + public static ushort ServerPort + { + get{ + if(ctx==null) return 3252; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.GetInt(TYTD_SERVER_PORT,3252); + if(res2 < 1025 || res2 > ushort.MaxValue) + return 1025; + + return (ushort)res2; + } + return 3252; + } + set{ + if(ctx==null) return; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.Edit(); + if(res2 != null) + { + res2.PutInt(TYTD_SERVER_PORT,value); + + if(res2.Commit()) + { + Restart(); + + } + } + + } + + } + } + + public static string AppDownloadLocation + { + get{ + if(ctx==null) return ""; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.GetString(TYTD_DOWNLOAD_LOCATION,""); + if(!string.IsNullOrWhiteSpace(res2)) + { + return res2; + } + } + return ""; + } + set{ + if(ctx==null) return; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.Edit(); + if(res2 != null) + { + res2.PutString(TYTD_DOWNLOAD_LOCATION,value); + + if(res2.Commit()) + { + Restart(); + + } + } + + } + + } + } + public static string AppStorageLocation + { + get{ + if(ctx==null) return ""; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.GetString(TYTD_STORE_LOCATION,""); + if(!string.IsNullOrWhiteSpace(res2)) + { + return res2; + } + } + return ""; + } + set{ + if(ctx==null) return; + var res=ctx.GetSharedPreferences(TYTD_CONFIG,FileCreationMode.Private); + if(res != null) + { + var res2=res.Edit(); + if(res2 != null) + { + res2.PutString(TYTD_STORE_LOCATION,value); + if(res2.Commit()) + { + Restart(); + + } + } + + } + } + } + + #endregion + #region CONSTANTS + public const string TYTD_CONFIG="tytdConfig"; + public const string TYTD_TAG = "tytdTag"; + public const string TYTD_STORE_LOCATION = "tytdStorageLocation"; + public const string TYTD_DOWNLOAD_LOCATION = "tytdDownloadLocation"; + + public const string TYTD_SERVER_ACCESSABLE = "tytdServerAccessable"; + public const string TYTD_SERVER_PORT= "tytdServerPort"; + public const string TYTD_NO_EXTERNAL_INFO_THUMB= "tytdNoExternalInfoThumb"; + public const string TYTD_CACHE_THUMBNAILS_ON_START="tytdCacheThumbnailsOnStart"; + public const string TYTD_CACHE_INFO_ON_START = "tytdCacheInfoOnStart"; + + public const string TYTD_FETCH_THUMB_YOUTUBE = "tytdFetchThumbYouTube"; + + public const string TYTD_CACHE_LAZY="tytdCacheLazy"; + #endregion + #region PRIVATE_FIELDS + private static string data_dir_internal=""; + private static CancellationTokenSource? src=null; + private static Context? ctx=null; + private static CancellationToken token=default(CancellationToken); + private static string server_url_file=""; + private static List privateKeys=new List(); + + private static Dictionary svrs=new Dictionary(); + #endregion + #region PUBLIC_PROPERTIES + + public static Type? MainActivity {get;set;} + public static Type? SettingsActivity {get;set;} + public static ITYTDBase? TYTD {get;private set;} + public static Context? Context {get{return ctx;}} + + public static ITYTDBase? LocalStorage {get;private set;} + public static bool HasContext {get{return ctx != null;}} + #endregion + + #region PUBLIC_METHODS + + public static Dictionary GetServers() + { + Dictionary servers=new Dictionary(); + if(File.Exists(server_url_file)){ + var lines=File.ReadAllLines(server_url_file); + foreach(var line in lines) + { + string[] item=line.Split(':',2,StringSplitOptions.RemoveEmptyEntries); + if(item.Length ==2) + { + servers.Add(item[0],item[1]); + } + } + } + return servers; + } + public static void SaveServers(Dictionary servers) + { + List servers_list=new List(); + foreach(var svr in servers) + { + servers_list.Add($"{svr.Key.Replace(":","").Replace("\n","").Replace("\r","")}:{svr.Value.Replace("\n","").Replace("\r","")}"); + } + File.WriteAllLines(server_url_file,servers_list); + } + public static async Task GetBestThumbnailArrayAsync(string id,string thumbRes) + { + string thumb = $"Thumbnails/{id}/{thumbRes}.jpg"; + if(LocalStorage!= null && LocalStorage.FileExists(thumb)) return await LocalStorage.ReadAllBytesAsync(thumb); + + if(TYTD != null && TYTD.FileExists(thumb)) { + + + var bytes=await TYTD.ReadAllBytesAsync(thumb); + + if(CacheLazy && LocalStorage != null) + { + await LocalStorage.CastIfAsync(async(e)=>{ + using(var f = await e.CreateAsync(thumb)) + { + await f.WriteAsync(bytes,0,bytes.Length); + } + }); + } + return bytes; + } + + + return Convert.FromBase64String("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"); + } + public static byte[] GetBestThumbnailArray(string id,string thumbRes) + { + return GetBestThumbnailArrayAsync(id,thumbRes).Result; + } + public static async IAsyncEnumerable EnumerateVideos() + { + + if(NoExtenalInfoThumbnail) + { + if(LocalStorage == null) yield break; + await foreach(var item in LocalStorage.GetVideosAsync()) + { + if(FetchThumbYouTube) + { + await LocalStorage.CastIfAsync(async(e)=>{ + + await e.CopyThumbnailsFromYouTubeAsync(item.Id); + }); + } + yield return await Task.FromResult(item); + } + }else{ + if(TYTD != null){ + await foreach(var item in TYTD.GetVideosAsync()) + { + if(CacheLazy && LocalStorage != null && !LocalStorage.VideoInfoExists(item.Id)) + { + await LocalStorage.CastIfAsync(async(e)=>{ + await e.WriteVideoInfoAsync(item); + }); + } + yield return await Task.FromResult(item); + } + }else{ + + if(LocalStorage == null) yield break; + await foreach(var item in LocalStorage.GetVideosAsync()) + { + if(FetchThumbYouTube || CacheLazy) + { + await LocalStorage.CastIfAsync(async(e)=>{ + + await e.CopyThumbnailsFromYouTubeAsync(item.Id); + }); + } + yield return await Task.FromResult(item); + } + } + } + } + + public static void StartBootCache(Func startCacheCb,Action stopCacheCb) + { + if(CacheThumbnailsFromServersOnStartup || CacheInfoFromServersOnStartup) + { + T t = startCacheCb(); + Thread thd=new Thread(async()=>{ + if(LocalStorage != null ){ + foreach(var server in GetServers()) + { + try{ + + var tytddb = getTYTDBase(server.Value,Path.Combine(data_dir_internal,"working"),privateKeys); + await foreach(var item in tytddb.GetVideoIdsAsync()) + { + + if(!LocalStorage.VideoInfoExists(item) && CacheInfoFromServersOnStartup) + { + await LocalStorage.CastIfAsync(async (e)=>{ + await e.WriteVideoInfoAsync(await tytddb.GetVideoInfoAsync(item)); + }); + } + if(CacheThumbnailsFromServersOnStartup) + { + await LocalStorage.CastIfAsync(async (e)=>{ + + await tytddb.CopyThumbnailsAsync(item,e); + }); + } + + } + await foreach(var item in tytddb.GetPlaylistIdsAsync()) + { + if(!LocalStorage.PlaylistInfoExists(item) && CacheInfoFromServersOnStartup) + { + await LocalStorage.CastIfAsync(async (e)=>{ + await e.WritePlaylistInfoAsync(await tytddb.GetPlaylistInfoAsync(item)); + }); + } + + if(LocalStorage.PlaylistInfoExists(item)) + { + var pl=await LocalStorage.GetPlaylistInfoAsync(item); + foreach(var id in pl.Videos) + { + if(!LocalStorage.VideoInfoExists(id) && tytddb.VideoInfoExists(id) && CacheInfoFromServersOnStartup) + { + await LocalStorage.CastIfAsync(async (e)=>{ + await e.WriteVideoInfoAsync(await tytddb.GetVideoInfoAsync(id)); + }); + } + if(CacheThumbnailsFromServersOnStartup) + { + await LocalStorage.CastIfAsync(async (e)=>{ + + await tytddb.CopyThumbnailsAsync(id,e); + }); + } + } + } + } + + await foreach(var channel in tytddb.GetChannelIdsAsync()) + { + if(!LocalStorage.ChannelInfoExists(channel) && CacheInfoFromServersOnStartup) + { + await LocalStorage.CastIfAsync(async (e)=>{ + await e.WriteChannelInfoAsync(await tytddb.GetChannelInfoAsync(channel)); + }); + } + if(CacheThumbnailsFromServersOnStartup) + { + await LocalStorage.CastIfAsync(async (e)=>{ + + await tytddb.CopyThumbnailsAsync(channel,e); + }); + } + } + + }catch(Exception ex) + { + _=ex; + } + } + } + stopCacheCb(t); + }); + thd.Start(); + } + } + + public static List<(string Label,string Path)> GetStorageDevices() + { + List<(string Label,string Path)> paths=new List<(string Label, string Path)>(); + if(ctx != null){ + var dirs=ctx.GetExternalFilesDirs(null); + if(dirs != null) + foreach(var item in dirs) + { + string path=item.ToString(); + if(path.StartsWith("/storage/emulated/")) + { + paths.Add(("Internal Storage",path)); + }else{ + if(path.StartsWith("/storage/")) + { + string[] path0=path.Split('/',3,StringSplitOptions.RemoveEmptyEntries); + if(path0.Length >= 2) + { + paths.Add((path0[1],path)); + + }else{ + paths.Add((path,path)); + + } + }else{ + paths.Add((path,path)); + + } + } + } + } + return paths; + } + public static void Close() + { + if(src != null) + { + src.Cancel(); + src=null; + } + } + public static void Restart() + { + + if(ctx != null) + reInit(ctx); + } + + public static void Init(Android.Content.Context ctx) + { + if(!HasContext) + { + reInit(ctx); + } + + } + +#endregion + #region PRIVATE_METHODS + private static void reInit(Android.Content.Context ctx) + { + + Close(); + src=new CancellationTokenSource(); + var dir=ctx.GetExternalFilesDir(null); + + var token = src.Token; + + + if(dir == null) return; + TYTDCommon.ctx=ctx; + + TYTDCommon.token = token; + data_dir_internal=dir.ToString(); + server_url_file = Path.Combine(data_dir_internal,"servers.txt"); + + + string applocationInternal = Path.Combine(data_dir_internal, "working"); + string privKeyDir = Path.Combine(data_dir_internal,"privkeys"); + Directory.CreateDirectory(privKeyDir); + foreach(var priv in Directory.GetFiles(privKeyDir)) + { + privateKeys.Add(new PrivateKeyFile(priv)); + } + + Directory.CreateDirectory(applocationInternal); + System.Environment.CurrentDirectory = applocationInternal; + + + string appStorageLocation = AppStorageLocation; + string appDownloadLocation = AppDownloadLocation; + + + + + TYTDStorage.SetTYTDTag(Tag); + MountableServer svr=new MountableServer(new StaticServer(Path.Combine(data_dir_internal,"site"))); + svr.Mount("/serveradmin/",getServerApi(data_dir_internal)); + LocalStorage=getTYTDBase("",applocationInternal,privateKeys); + var storage=getTYTDBase(appStorageLocation,applocationInternal,privateKeys); + var downloader = getTYTDBase(appDownloadLocation,applocationInternal,privateKeys); + ITYTDBase baseCtl=storage; + + if(storage != downloader) + { + var proxy = new TYTDDownloaderStorageProxy(); + proxy.Storage = storage; + downloader.CastIf((dl)=>{ + proxy.Downloader = dl; + }); + + baseCtl=proxy; + } + + TYTD=baseCtl; + + TYTDServer server=new TYTDServer(baseCtl); + server.RootServer.Server = svr; + + var svrCtl = baseCtl as IStorage; + + if(svrCtl != null){ + ExtensionLoader.Loader loader=new ExtensionLoader.Loader(svrCtl); + loader.SetServer(server); + + } + HttpServerListener listener = new HttpServerListener(new IPEndPoint(ServerAccessable ? IPAddress.Any : IPAddress.Loopback,ServerPort),server.InnerServer); + listener.ListenAsync(token).Wait(0); + + SetupChannels(); + Intent intent=new Intent(ctx,typeof(TYTDServerService)); + ctx.StartForegroundService(intent); + } + private static void SetupChannels() + { + if (Build.VERSION.SdkInt < BuildVersionCodes.O || ctx == null) + { + // Notification channels are new in API 26 (and not a part of the + // support library). There is no need to create a notification + // channel on older versions of Android. + return; + } + NotificationChannel serverChannel = new NotificationChannel(TYTDServerService.SERVER_CHANNEL_ID, "TYTD Server", NotificationImportance.Default); + + NotificationManager? manager = (NotificationManager?)ctx.GetSystemService(Context.NotificationService); + if (manager != null) + { + manager.CreateNotificationChannel(serverChannel); + + } + } + private static IServer getServerApi(string appDir) + { + StaticServer ssvr=new StaticServer(Path.Combine(appDir,"adminpanel")); + MountableServer svr=new MountableServer(ssvr); + SwagmeServer swagme = new SwagmeServer(); + svr.Mount("/api/",swagme); + + return svr; + } + private static ITYTDBase getTYTDBase(string url,string internalUrl,IEnumerable privKeys) + { + if(!string.IsNullOrWhiteSpace(url)){ + if(url.StartsWith('/')) + { + //file + if(svrs.ContainsKey(url)) return svrs[url]; + var item=new TYTDPathDirectory(url); + + item.CreateDirectories(); + item.StartLoop(token); + svrs.Add(url,item); + return item; + }else{ + System.Uri uri = new(url); + if(uri.Scheme == "http" || uri.Scheme == "https") + { + if(svrs.ContainsKey(url)) return svrs[url]; + var item = new TYTDClient(url); + svrs.Add(url,item); + return item; + } + if(uri.Scheme == "sftp") + { + //sftp + //we need to get username password + string username = "root"; + string? password = null; + string userInfo=uri.UserInfo; + + if(!string.IsNullOrWhiteSpace(userInfo)) + { + string[] userInfoSplit = userInfo.Split(':',2,StringSplitOptions.RemoveEmptyEntries); + if(userInfoSplit.Length == 2) + { + //username:password + username = userInfoSplit[0]; + password = userInfoSplit[1]; + }else if(userInfoSplit.Length == 1) + { + //username only + username = userInfoSplit[0]; + } + } + if(string.IsNullOrWhiteSpace(password)) + { + try{ + var item= new SSHFS(url,username,privKeys.ToArray()); + item.CreateDirectories(); + item.StartLoop(token); + svrs.Add(url,item); + return item; + }catch(Exception ex) + { + _=ex; + } + + }else{ + try{ + var item= new SSHFS(url,username,password); + item.CreateDirectories(); + item.StartLoop(token); + svrs.Add(url,item); + return item; + }catch(Exception ex) + { + _=ex; + } + + } + //SSHFS ssh=new SSHFS(url,); + } + } + } + if(svrs.ContainsKey(internalUrl)) return svrs[internalUrl]; + var item2= new TYTDPathDirectory(internalUrl); + item2.CreateDirectories(); + item2.StartLoop(token); + svrs.Add(internalUrl,item2); + return item2; + } + + #endregion +} diff --git a/TYTD.Common/Resources/drawable/dns_48px.xml b/TYTD.Common/Resources/drawable/dns_48px.xml new file mode 100644 index 0000000..158b1b8 --- /dev/null +++ b/TYTD.Common/Resources/drawable/dns_48px.xml @@ -0,0 +1,10 @@ + + + diff --git a/TYTD.Common/TYTD.Common.csproj b/TYTD.Common/TYTD.Common.csproj new file mode 100644 index 0000000..d99f5a4 --- /dev/null +++ b/TYTD.Common/TYTD.Common.csproj @@ -0,0 +1,17 @@ + + + net6.0-android + 21 + enable + enable + Tesses.YouTubeDownloader.Droid + + + + + + + + + + diff --git a/TYTD.Common/TYTDReceiver.cs b/TYTD.Common/TYTDReceiver.cs new file mode 100644 index 0000000..09ab6e2 --- /dev/null +++ b/TYTD.Common/TYTDReceiver.cs @@ -0,0 +1,27 @@ +using Android.Content; + +namespace Tesses.YouTubeDownloader.Droid; +[BroadcastReceiver] + public class TYTDReceiver : BroadcastReceiver + { + public const string RECEIVER_KEY="tytdRequest"; + + public const int COMMAND_CLOSE_SERVER = 0; + public override void OnReceive(Context? context, Intent? intent) + { + if(intent == null) return; + int reqId = intent.GetIntExtra(RECEIVER_KEY,-1); + if(reqId == -1) return; + + switch(reqId) + { + case COMMAND_CLOSE_SERVER: + TYTDCommon.Close(); + if(context != null){ + Intent? intent1= new Intent(context,typeof(TYTDServerService)); + context.StopService(intent1); + } + break; + } + } + } \ No newline at end of file diff --git a/TYTD.Common/TYTDService.cs b/TYTD.Common/TYTDService.cs new file mode 100644 index 0000000..502cd1a --- /dev/null +++ b/TYTD.Common/TYTDService.cs @@ -0,0 +1,65 @@ + +using Android.App; +using Android.Content; +using Android.Graphics; +using Android.OS; +using Android.Provider; +using Android.Runtime; +using Java.Security; +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Net.NetworkInformation; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Tesses.YouTubeDownloader.Droid; + +namespace Tesses.YouTubeDownloader.Droid +{ + [Service] + public class TYTDServerService : Service + { + public override IBinder? OnBind(Intent? intent) + { + + return null; + } + public const int SERVER_NOTIFICATION_ID = 42; + public const string SERVER_CHANNEL_ID = "TYTDServerNotificationChannel"; + public override void OnCreate() + { + if(TYTDCommon.MainActivity == null || TYTDCommon.SettingsActivity == null || TYTDCommon.Context == null) return; + + Intent mainIntent = new Intent(TYTDCommon.Context, TYTDCommon.MainActivity); + PendingIntent? mainPendingIntent = PendingIntent.GetActivity(TYTDCommon.Context, 0, mainIntent, PendingIntentFlags.Immutable); + + Intent settingsIntent = new Intent(TYTDCommon.Context,TYTDCommon.SettingsActivity); + PendingIntent? settingsPendingIntent = PendingIntent.GetActivity(TYTDCommon.Context,0,settingsIntent,PendingIntentFlags.Immutable); + + Intent shutdownServerIntent = new Intent(TYTDCommon.Context,typeof(TYTDReceiver)); + PendingIntent? shutdownServerPendingIntent =PendingIntent.GetBroadcast(this,0,shutdownServerIntent,PendingIntentFlags.Immutable); + shutdownServerIntent.PutExtra(TYTDReceiver.RECEIVER_KEY,TYTDReceiver.COMMAND_CLOSE_SERVER); + + + Notification notification = new Notification.Builder(TYTDCommon.Context, SERVER_CHANNEL_ID).SetContentTitle("TYTD Server").SetSmallIcon(Resource.Drawable.dns_48px).SetContentText($"TYTD Server is bound to:\nhttp://{(TYTDCommon.ServerAccessable ? "0.0.0.0" : "127.0.0.1")}:{TYTDCommon.ServerPort}/").AddAction(new Notification.Action(-1, "Shutdown Server", shutdownServerPendingIntent)).AddAction(new Notification.Action(-1,"Settings",settingsPendingIntent)).SetContentIntent(mainPendingIntent).Build(); + + StartForeground(SERVER_NOTIFICATION_ID, notification); + + } + [return: GeneratedEnum] + public override StartCommandResult OnStartCommand(Intent? intent, [GeneratedEnum] StartCommandFlags flags, int startId) + { + + + return StartCommandResult.Sticky; + + } + + public override void OnDestroy() + { + + } + + } +} \ No newline at end of file diff --git a/TYTD.Mobile/AndroidManifest.xml b/TYTD.Mobile/AndroidManifest.xml new file mode 100644 index 0000000..6c980e6 --- /dev/null +++ b/TYTD.Mobile/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/TYTD.Mobile/Extensions.cs b/TYTD.Mobile/Extensions.cs new file mode 100644 index 0000000..1a4d253 --- /dev/null +++ b/TYTD.Mobile/Extensions.cs @@ -0,0 +1,12 @@ +namespace TYTD.Mobile +{ + public static class Extensions{ + public static string GetValOrDefault(this string? str) + { + if(string.IsNullOrWhiteSpace(str)) + return ""; + + return str; + } + } +} \ No newline at end of file diff --git a/TYTD.Mobile/MainActivity.cs b/TYTD.Mobile/MainActivity.cs new file mode 100644 index 0000000..eb92071 --- /dev/null +++ b/TYTD.Mobile/MainActivity.cs @@ -0,0 +1,184 @@ +using System; +using Android.App; +using Android.Content; +using Android.OS; +using Android.Runtime; +using Android.Views; +using AndroidX.AppCompat.App; +using AndroidX.AppCompat.Widget; +using AndroidX.Core.View; +using AndroidX.DrawerLayout.Widget; +using Google.Android.Material.FloatingActionButton; +using Google.Android.Material.Navigation; +using Google.Android.Material.Snackbar; +using Tesses.YouTubeDownloader; +using Tesses.YouTubeDownloader.Droid; +using Toolbar = AndroidX.AppCompat.Widget.Toolbar; + +namespace TYTD.Mobile +{ + [Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true)] + public class MainActivity : AppCompatActivity, NavigationView.IOnNavigationItemSelectedListener + { + + protected override void OnCreate(Bundle? savedInstanceState) + { + + + base.OnCreate(savedInstanceState); + Xamarin.Essentials.Platform.Init(this, savedInstanceState); + SetContentView(Resource.Layout.activity_main); + TYTDCommon.MainActivity = typeof(MainActivity); + TYTDCommon.SettingsActivity = typeof(PrefenceActivity); + TYTDCommon.Init(this); + + Toolbar? toolbar = FindViewById(Resource.Id.toolbar); + if(toolbar != null) + SetSupportActionBar(toolbar); + + FloatingActionButton? fab = FindViewById(Resource.Id.fab); + + if(fab != null) + fab.Click += FabOnClick; + + DrawerLayout? drawer = FindViewById(Resource.Id.drawer_layout); + if(drawer != null) + { + ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, Resource.String.navigation_drawer_open, Resource.String.navigation_drawer_close); + drawer.AddDrawerListener(toggle); + toggle.SyncState(); + } + + NavigationView? navigationView = FindViewById(Resource.Id.nav_view); + if(navigationView != null) + navigationView.SetNavigationItemSelectedListener(this); + + TYTDCommon.StartBootCache(()=>{ + var dlg=new ProgressDialog(this); + dlg.SetTitle("TYTD Cache"); + dlg.SetMessage("Please wait, caching"); + dlg.Show(); + return dlg; + },(e)=>{ + this.RunOnUiThread(()=>{ + e.Dismiss(); + }); + }); + } + + public override void OnBackPressed() + { + DrawerLayout? drawer = FindViewById(Resource.Id.drawer_layout); + if (drawer != null && drawer.IsDrawerOpen(GravityCompat.Start)) + { + drawer.CloseDrawer(GravityCompat.Start); + } + else + { + base.OnBackPressed(); + } + } + + public override bool OnCreateOptionsMenu(IMenu? menu) + { + MenuInflater.Inflate(Resource.Menu.menu_main, menu); + return true; + } + + public override bool OnOptionsItemSelected(IMenuItem item) + { + int id = item.ItemId; + if (id == Resource.Id.action_settings) + { + Intent intent=new Intent(this,typeof(PrefenceActivity)); + StartActivity(intent); + return true; + } + if(id == Resource.Id.action_servers) + { + Intent servers=new Intent(this,typeof(ServersActivity)); + StartActivity(servers); + return true; + } + + return base.OnOptionsItemSelected(item); + } + + private void FabOnClick(object? sender, EventArgs eventArgs) + { + /* View? view = (View?)sender; + if(view != null) + Snackbar.Make(view, "Replace with your own action", Snackbar.LengthLong) + .SetAction("Action",(e)=>{}).Show();*/ + + var builder=new AndroidX.AppCompat.App.AlertDialog.Builder(this); + builder.SetView(Resource.Layout.add_item); + builder.SetTitle(Resource.String.add_item_text); + EditText? video_id = null; //you would put https://www.youtube.com/watch?v=PzUKeGZiEl0 in here + builder.SetNegativeButton(Resource.String.cancel_text,(sender0,e)=>{ + + }); + builder.SetPositiveButton(Resource.String.add_text,(sender0,e)=>{ + if(video_id!= null) + { + string? id=video_id.Text; + if(TYTDCommon.TYTD != null && !string.IsNullOrWhiteSpace(id)) + { + Task.Factory.StartNew(async()=>{ + await TYTDCommon.TYTD.CastIfAsync(async (e2)=>{ + await e2.AddItemAsync(id,Resolution.PreMuxed); + + }); + }).Wait(0); + } + } + }); + var res=builder.Show(); + if(res!= null) + { + video_id=res.FindViewById(Resource.Id.video_url); + } + } + + public bool OnNavigationItemSelected(IMenuItem item) + { + int id = item.ItemId; + + if (id == Resource.Id.nav_camera) + { + // Handle the camera action + } + else if (id == Resource.Id.nav_gallery) + { + + } + else if (id == Resource.Id.nav_slideshow) + { + + } + else if (id == Resource.Id.nav_manage) + { + + } + else if (id == Resource.Id.nav_share) + { + + } + else if (id == Resource.Id.nav_send) + { + + } + + DrawerLayout? drawer = FindViewById(Resource.Id.drawer_layout); + if(drawer != null) + drawer.CloseDrawer(GravityCompat.Start); + return true; + } + public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) + { + Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); + + base.OnRequestPermissionsResult(requestCode, permissions, grantResults); + } + } +} \ No newline at end of file diff --git a/TYTD.Mobile/Preference.cs b/TYTD.Mobile/Preference.cs new file mode 100644 index 0000000..44a4119 --- /dev/null +++ b/TYTD.Mobile/Preference.cs @@ -0,0 +1,56 @@ + +using AndroidX.AppCompat.App; +using AndroidX.Preference; +using Tesses.YouTubeDownloader.Droid; +using Toolbar = AndroidX.AppCompat.Widget.Toolbar; +namespace TYTD.Mobile; + +[Activity(Theme = "@style/AppTheme.NoActionBar",Label ="@string/action_settings")] +class PrefenceActivity : AppCompatActivity, PreferenceFragmentCompat.IOnPreferenceStartFragmentCallback +{ + public bool OnPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) + { + throw new NotImplementedException(); + } + + protected override void OnCreate(Bundle? savedInstanceState) + { + + base.OnCreate(savedInstanceState); + + SetContentView(Resource.Layout.settings_layout); + + + SupportFragmentManager.BeginTransaction().Replace(Resource.Id.settings,new MainPreference()).Commit(); + + Toolbar? toolbar = FindViewById(Resource.Id.toolbar_settings); + if(toolbar != null){ + SetSupportActionBar(toolbar); + SupportActionBar?.SetDisplayHomeAsUpEnabled(true); + SupportActionBar?.SetDisplayShowHomeEnabled(true); + + } + } + public override bool OnSupportNavigateUp() + { + OnBackPressed(); + return true; + } + + public class MainPreference : PreferenceFragmentCompat + { + public MainPreference() + { + } + public override void OnCreatePreferences(Bundle? savedInstanceState, string? rootKey) + { + if(this.PreferenceManager != null) + this.PreferenceManager.PreferenceDataStore = new TYTDPreferences(); + SetPreferencesFromResource(Resource.Xml.preference_screen,rootKey); + + + + } + + } +} \ No newline at end of file diff --git a/TYTD.Mobile/RecylerViewSharp.cs b/TYTD.Mobile/RecylerViewSharp.cs new file mode 100644 index 0000000..5e76b0d --- /dev/null +++ b/TYTD.Mobile/RecylerViewSharp.cs @@ -0,0 +1,77 @@ +using System.Collections; +using Android.Views; +using System.ComponentModel; +using System.Collections.ObjectModel; + +namespace TYTD.Mobile; + +public class ObservableCollectionRecyclerViewAdapter : IList +{ + private ObservableCollection _coll=new ObservableCollection(); + public int Count {get{return _coll.Count;}} + + public bool IsReadOnly {get{return false;}} + + public T this[int index] { get {return _coll[index];} set {_coll[index]=value;} } + + public ObservableCollectionRecyclerViewAdapter(RecylerView,Action viewCb) + { + + } + public void Add(T item) + { + _coll.Add(item); + } + public void Clear() + { + _coll.Clear(); + } + public void AddRange(IEnumerable items) + { + foreach(var item in items) + { + _coll.Add(item); + } + } + + public int IndexOf(T item) + { + return _coll.IndexOf(item); + } + + public void Insert(int index, T item) + { + _coll.Insert(index,item); + } + + public void RemoveAt(int index) + { + _coll.RemoveAt(index); + } + + public bool Contains(T item) + { + return _coll.Contains(item); + } + + public void CopyTo(T[] array, int arrayIndex) + { + _coll.CopyTo(array,arrayIndex); + } + + public bool Remove(T item) + { + _coll.Remove(item); + throw new NotImplementedException(); + } + + public IEnumerator GetEnumerator() + { + return _coll.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _coll.GetEnumerator(); + } +} \ No newline at end of file diff --git a/TYTD.Mobile/Resources/1024.png b/TYTD.Mobile/Resources/1024.png new file mode 100644 index 0000000000000000000000000000000000000000..2063470cc1a61cabed73d373ad79090940357a4b GIT binary patch literal 113504 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

kdjx?(Psxd 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

)sXmozt6G6V_ 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 + + + diff --git a/TYTD.Mobile/Resources/drawable-v21/ic_menu_gallery.xml b/TYTD.Mobile/Resources/drawable-v21/ic_menu_gallery.xml new file mode 100644 index 0000000..f5cd6f4 --- /dev/null +++ b/TYTD.Mobile/Resources/drawable-v21/ic_menu_gallery.xml @@ -0,0 +1,9 @@ + + + diff --git a/TYTD.Mobile/Resources/drawable-v21/ic_menu_manage.xml b/TYTD.Mobile/Resources/drawable-v21/ic_menu_manage.xml new file mode 100644 index 0000000..72bec87 --- /dev/null +++ b/TYTD.Mobile/Resources/drawable-v21/ic_menu_manage.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/TYTD.Mobile/Resources/drawable-v21/ic_menu_send.xml b/TYTD.Mobile/Resources/drawable-v21/ic_menu_send.xml new file mode 100644 index 0000000..23c9f3c --- /dev/null +++ b/TYTD.Mobile/Resources/drawable-v21/ic_menu_send.xml @@ -0,0 +1,9 @@ + + + diff --git a/TYTD.Mobile/Resources/drawable-v21/ic_menu_share.xml b/TYTD.Mobile/Resources/drawable-v21/ic_menu_share.xml new file mode 100644 index 0000000..778f184 --- /dev/null +++ b/TYTD.Mobile/Resources/drawable-v21/ic_menu_share.xml @@ -0,0 +1,9 @@ + + + diff --git a/TYTD.Mobile/Resources/drawable-v21/ic_menu_slideshow.xml b/TYTD.Mobile/Resources/drawable-v21/ic_menu_slideshow.xml new file mode 100644 index 0000000..924c60a --- /dev/null +++ b/TYTD.Mobile/Resources/drawable-v21/ic_menu_slideshow.xml @@ -0,0 +1,9 @@ + + + diff --git a/TYTD.Mobile/Resources/drawable/add_48px.xml b/TYTD.Mobile/Resources/drawable/add_48px.xml new file mode 100644 index 0000000..91d406d --- /dev/null +++ b/TYTD.Mobile/Resources/drawable/add_48px.xml @@ -0,0 +1,10 @@ + + + diff --git a/TYTD.Mobile/Resources/drawable/side_nav_bar.xml b/TYTD.Mobile/Resources/drawable/side_nav_bar.xml new file mode 100644 index 0000000..38234ec --- /dev/null +++ b/TYTD.Mobile/Resources/drawable/side_nav_bar.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/TYTD.Mobile/Resources/layout/activity_main.xml b/TYTD.Mobile/Resources/layout/activity_main.xml new file mode 100644 index 0000000..b6e480d --- /dev/null +++ b/TYTD.Mobile/Resources/layout/activity_main.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/TYTD.Mobile/Resources/layout/activity_servers.xml b/TYTD.Mobile/Resources/layout/activity_servers.xml new file mode 100644 index 0000000..274744f --- /dev/null +++ b/TYTD.Mobile/Resources/layout/activity_servers.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + diff --git a/TYTD.Mobile/Resources/layout/add_item.xml b/TYTD.Mobile/Resources/layout/add_item.xml new file mode 100644 index 0000000..444b50e --- /dev/null +++ b/TYTD.Mobile/Resources/layout/add_item.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/TYTD.Mobile/Resources/layout/app_bar_main.xml b/TYTD.Mobile/Resources/layout/app_bar_main.xml new file mode 100644 index 0000000..0b868bd --- /dev/null +++ b/TYTD.Mobile/Resources/layout/app_bar_main.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + diff --git a/TYTD.Mobile/Resources/layout/content_main.xml b/TYTD.Mobile/Resources/layout/content_main.xml new file mode 100644 index 0000000..7096ea3 --- /dev/null +++ b/TYTD.Mobile/Resources/layout/content_main.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/TYTD.Mobile/Resources/layout/content_servers.xml b/TYTD.Mobile/Resources/layout/content_servers.xml new file mode 100644 index 0000000..3a7d478 --- /dev/null +++ b/TYTD.Mobile/Resources/layout/content_servers.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/TYTD.Mobile/Resources/layout/edit_server.xml b/TYTD.Mobile/Resources/layout/edit_server.xml new file mode 100644 index 0000000..427556e --- /dev/null +++ b/TYTD.Mobile/Resources/layout/edit_server.xml @@ -0,0 +1,31 @@ + + + + + +