diff --git a/.gitignore b/.gitignore index 7c43ecd..902c202 100644 --- a/.gitignore +++ b/.gitignore @@ -484,4 +484,4 @@ $RECYCLE.BIN/ *.swp help.txt data/ -out/ \ No newline at end of file +out/ diff --git a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/App.axaml.cs b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/App.axaml.cs index 8d63468..42971f3 100644 --- a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/App.axaml.cs +++ b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/App.axaml.cs @@ -93,6 +93,26 @@ public partial class App : Application return title; } + internal static (string loginButtonText,LoggedInUserAccount? login) LoginData() + { + LoggedInUserAccount? login=null; + string loginText="Offline"; + Task.Run(async()=>{ + try { + Client.Users.LoginToken = Platform.Configuration.LoginToken; + login = await Client.Users.GetLoggedInUserAccountAsync(); + loginText = login.LoggedIn ? login.ProperName : "Login"; + } catch(Exception ex) + { + _=ex; + } + }).Wait(); + + return (loginText,login); + } + + + internal static async Task GetMovieThumbnailAsync(string username, string name) { //we need to cache the resource @@ -249,6 +269,15 @@ public partial class App : Application } } + internal static bool HasDownloaded(UserAccount account,Movie movie) + { + UnixPath dir = Special.Root / "Downloads" / account.Username / "Movies" / movie.Name; + UnixPath filename = dir / movie.ProperName + ".mp4"; + var fs = Platform.DownloadFilesystem; + if(fs is null) return false; + return fs.FileExists(filename); + } + internal static void StartDownload(UserAccount account, Movie movie) { string username = account.Username; diff --git a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia.sln b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia.sln new file mode 100644 index 0000000..c814439 --- /dev/null +++ b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.002.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tesses.CMS.Avalonia", "Tesses.CMS.Avalonia.csproj", "{36061BA4-CB71-4B6C-8C0A-6482635EB893}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {36061BA4-CB71-4B6C-8C0A-6482635EB893}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36061BA4-CB71-4B6C-8C0A-6482635EB893}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36061BA4-CB71-4B6C-8C0A-6482635EB893}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36061BA4-CB71-4B6C-8C0A-6482635EB893}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B5F29959-050C-43EB-A56F-C7760E27834E} + EndGlobalSection +EndGlobal diff --git a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/AccountViewModel.cs b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/AccountViewModel.cs new file mode 100644 index 0000000..03477e0 --- /dev/null +++ b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/AccountViewModel.cs @@ -0,0 +1,40 @@ +namespace Tesses.CMS.Avalonia.ViewModels; + +using System; +using System.Collections.ObjectModel; +using System.Linq; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using Tesses.CMS.Avalonia.Models; +using System.Threading.Tasks; +using ReactiveUI; +using Tesses.CMS.Avalonia.Views.HomePages; +using Tesses.CMS.Avalonia.ViewModels.HomePages; + +public partial class AccountViewModel : ViewModelBase +{ + + + MainViewModel m; + + public AccountViewModel(MainViewModel m) + { + this.m = m; + this.LogoutCommand = ReactiveCommand.CreateFromTask(LogoutAsync); + } + + + public IReactiveCommand LogoutCommand {get;init;} + + public async Task LogoutAsync() + { + App.Client.Users.LoginToken = App.Platform.Configuration.LoginToken; + + + await App.Client.Users.LogoutAsync(); + + (m.LoginText,_) = App.LoginData(); + m.CurrentPage = new HomePageViewModel(); + } +} \ No newline at end of file diff --git a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/HomePageViewModel.cs b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/HomePageViewModel.cs index 1b9b626..657adc1 100644 --- a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/HomePageViewModel.cs +++ b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/HomePageViewModel.cs @@ -16,6 +16,7 @@ public partial class HomePageViewModel : ViewModelBase public HomePageViewModel() { _curPage = new HomeUserListPageViewModel(this); + } private ViewModelBase _curPage; public ViewModelBase CurrentPage diff --git a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/HomePages/HomeAboutMePageViewModel.cs b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/HomePages/HomeAboutMePageViewModel.cs new file mode 100644 index 0000000..40b9725 --- /dev/null +++ b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/HomePages/HomeAboutMePageViewModel.cs @@ -0,0 +1,41 @@ +namespace Tesses.CMS.Avalonia.ViewModels.HomePages; + +using System; +using System.Collections.ObjectModel; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using global::Avalonia.Controls; +using Tesses.CMS.Avalonia.Models; +using Tesses.CMS.Avalonia.Views.HomePages; +using Tesses.CMS.Client; + +public partial class HomeAboutMePageViewModel : ViewModelBase, IBackable +{ + HomePageViewModel homePage; + HomeUserPageViewModel userPage; + + [ObservableProperty] + private string _aboutMe; + + [ObservableProperty] + private string _properName; + + public HomeAboutMePageViewModel(HomePageViewModel homePage,HomeUserPageViewModel userPage) + { + App.Log("In HomeAboutMePageViewModel::ctor block begin"); + this.homePage = homePage; + this.userPage = userPage; + this.AboutMe = userPage.Account.AboutMe; + this.ProperName = $"About {userPage.Account.ProperName}"; + + App.Log("In HomeAboutMePageViewModel::ctor block end"); + + } + + public ViewModelBase Back() + { + return userPage; + } +} \ No newline at end of file diff --git a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/HomePages/HomeMoviePageViewModel.cs b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/HomePages/HomeMoviePageViewModel.cs index 17e529d..ae1aaaa 100644 --- a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/HomePages/HomeMoviePageViewModel.cs +++ b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/HomePages/HomeMoviePageViewModel.cs @@ -44,12 +44,17 @@ public partial class HomeMoviePageViewModel : ViewModelBase, IBackable [ObservableProperty] private bool _canWatch=false; + [ObservableProperty] private bool _canDownload=false; [ObservableProperty] private string _addOrRemoveFromFavorites=""; + + [ObservableProperty] + private string _downloadButtonText="Download"; + private bool _favoriteExists=false; public bool FavoriteExists { get=>_favoriteExists; @@ -66,6 +71,7 @@ public partial class HomeMoviePageViewModel : ViewModelBase, IBackable public HomeMoviePageViewModel(HomePageViewModel home,HomeMovieListPageViewModel movieList,UserAccount account,MovieItem movie) { + this.DownloadCommand = ReactiveCommand.CreateFromTask(DownloadAsync); this.account = account; username = account.Username; this.home = home; @@ -89,19 +95,30 @@ public partial class HomeMoviePageViewModel : ViewModelBase, IBackable Media = JObject.FromObject(movie.Movie) }; FavoriteExists = App.FavoritesExists(fav); + if(App.HasDownloaded(account,movie.Movie)) + { + CanDownload = true; + DownloadButtonText = "Watch Downloaded"; + } Task.Run(async()=>{ var res=await App.Client.Movies.GetMovieContentMetadataAsync(username,movie.Movie.Name); if(res.HasBrowserStream) watchUrl = res.BrowserStream; CanWatch = res.HasBrowserStream; - - CanDownload = res.HasDownloadStream; + + if(!App.HasDownloaded(account,movie.Movie)) + { + CanDownload = res.HasDownloadStream; + + } }).Wait(0); } + + public ViewModelBase Back() { @@ -116,11 +133,18 @@ public partial class HomeMoviePageViewModel : ViewModelBase, IBackable home.CurrentPage = new HomeMovieVideoPlayerViewModel(home,this,watchUrl); } } - [RelayCommand] - public void Download() + public IReactiveCommand DownloadCommand {get;init;} + public async Task DownloadAsync() { - if(CanDownload) - App.StartDownload(account,movie); + if(App.HasDownloaded(account,movie)) + { + await this.home.PlayDownloadedAsync(fav); + } + else + { + if(CanDownload) + App.StartDownload(account,movie); + } } [RelayCommand] diff --git a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/HomePages/HomeUserPageViewModel.cs b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/HomePages/HomeUserPageViewModel.cs index a7693e0..af24d67 100644 --- a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/HomePages/HomeUserPageViewModel.cs +++ b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/HomePages/HomeUserPageViewModel.cs @@ -41,6 +41,7 @@ public partial class HomeUserPageViewModel : ViewModelBase, IBackable this.account = account; UserItems.Add(new UserPageItem("Movies",new HomeMovieListPageViewModel(homePage,this))); UserItems.Add(new UserPageItem("Shows",new HomeShowListPageViewModel(homePage,this))); + UserItems.Add(new UserPageItem("About",new HomeAboutMePageViewModel(homePage,this))); } [ObservableProperty] private UserPageItem? _selectedListItem; diff --git a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/LoginViewModel.cs b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/LoginViewModel.cs new file mode 100644 index 0000000..6ef1b82 --- /dev/null +++ b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/LoginViewModel.cs @@ -0,0 +1,53 @@ +namespace Tesses.CMS.Avalonia.ViewModels; + +using System; +using System.Collections.ObjectModel; +using System.Linq; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using Tesses.CMS.Avalonia.Models; +using System.Threading.Tasks; +using ReactiveUI; +using Tesses.CMS.Avalonia.Views.HomePages; +using Tesses.CMS.Avalonia.ViewModels.HomePages; + +public partial class LoginViewModel : ViewModelBase +{ + [ObservableProperty] + private string _email=""; + + [ObservableProperty] + private string _password=""; + + [ObservableProperty] + private bool _failed=false; + + MainViewModel m; + + public LoginViewModel(MainViewModel m) + { + this.m = m; + this.LoginCommand = ReactiveCommand.CreateFromTask(LoginAsync); + } + + + public IReactiveCommand LoginCommand {get;init;} + + public async Task LoginAsync() + { + Failed=false; + var tkn= await App.Client.Users.CreateTokenAsync(Email,Password); + if(tkn.Success) + { + App.Platform.Configuration.LoginToken = tkn.Cookie; + await App.Platform.WriteConfigurationAsync(); + (m.LoginText,_) = App.LoginData(); + m.CurrentPage = new HomePageViewModel(); + } + else + { + Failed=true; + } + } +} \ No newline at end of file diff --git a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/MainViewModel.cs b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/MainViewModel.cs index 7a6dd4b..1ef5a96 100644 --- a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/MainViewModel.cs +++ b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/ViewModels/MainViewModel.cs @@ -7,6 +7,8 @@ using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using Tesses.CMS.Avalonia.Models; +using Tesses.CMS.Avalonia.Views; +using Tesses.CMS.Client; public partial class MainViewModel : ViewModelBase { @@ -21,6 +23,8 @@ public partial class MainViewModel : ViewModelBase SelectedListItem = Pages.First(); this.Title = title; + (LoginText,_)= App.LoginData(); + if(Environment.GetCommandLineArgs().Length > 1) { string path = Environment.GetCommandLineArgs()[1]; @@ -55,7 +59,7 @@ public partial class MainViewModel : ViewModelBase [ObservableProperty] private Page? _selectedListItem; [ObservableProperty] - private string _loginText="Login"; + private string _loginText=""; [ObservableProperty] private string _title; @@ -81,6 +85,20 @@ public partial class MainViewModel : ViewModelBase private void LoginAccount() { App.Log("Login button"); + LoggedInUserAccount? data=null; + (LoginText,data)= App.LoginData(); + + if(data is not null) + { + if(data.LoggedIn) + { + CurrentPage = new AccountViewModel(this); + } + else + { + CurrentPage = new LoginViewModel(this); + } + } } internal void SetHome() diff --git a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/AccountView.axaml b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/AccountView.axaml new file mode 100644 index 0000000..9bd51ad --- /dev/null +++ b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/AccountView.axaml @@ -0,0 +1,18 @@ + + + + + + + + + diff --git a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/AccountView.axaml.cs b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/AccountView.axaml.cs new file mode 100644 index 0000000..c0311da --- /dev/null +++ b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/AccountView.axaml.cs @@ -0,0 +1,16 @@ +using System.Threading.Tasks; +using Avalonia.Controls; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; + +namespace Tesses.CMS.Avalonia.Views; + +public partial class AccountView : UserControl +{ + public AccountView() + { + InitializeComponent(); + } + + +} \ No newline at end of file diff --git a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/HomeAboutMePageView.axaml b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/HomeAboutMePageView.axaml new file mode 100644 index 0000000..854cd8b --- /dev/null +++ b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/HomeAboutMePageView.axaml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + diff --git a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/HomeAboutMePageView.axaml.cs b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/HomeAboutMePageView.axaml.cs new file mode 100644 index 0000000..c413159 --- /dev/null +++ b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/HomeAboutMePageView.axaml.cs @@ -0,0 +1,11 @@ +using Avalonia.Controls; + +namespace Tesses.CMS.Avalonia.Views.HomePages; + +public partial class HomeAboutMePageView : UserControl +{ + public HomeAboutMePageView() + { + InitializeComponent(); + } +} \ No newline at end of file diff --git a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/HomeMoviePageView.axaml b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/HomeMoviePageView.axaml index 157e4c0..3199b89 100644 --- a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/HomeMoviePageView.axaml +++ b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/HomeMoviePageView.axaml @@ -25,7 +25,7 @@ + + diff --git a/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/LoginView.axaml.cs b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/LoginView.axaml.cs new file mode 100644 index 0000000..2410b0a --- /dev/null +++ b/Tesses.CMS.Avalonia/Tesses.CMS.Avalonia/Views/LoginView.axaml.cs @@ -0,0 +1,16 @@ +using System.Threading.Tasks; +using Avalonia.Controls; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; + +namespace Tesses.CMS.Avalonia.Views; + +public partial class LoginView : UserControl +{ + public LoginView() + { + InitializeComponent(); + } + + +} \ No newline at end of file diff --git a/Tesses.CMS.Client/Class1.cs b/Tesses.CMS.Client/Class1.cs index 5e1c2e1..bcf7d68 100644 --- a/Tesses.CMS.Client/Class1.cs +++ b/Tesses.CMS.Client/Class1.cs @@ -256,7 +256,12 @@ namespace Tesses.CMS.Client public async Task LogoutAsync() { - (await client.client.GetAsync("/logout")).Dispose(); + (await client.client.GetAsync($"{client.rooturl}/logout")).Dispose(); + } + + public async Task GetLoggedInUserAccountAsync() + { + return JsonConvert.DeserializeObject(await client.client.GetStringAsync($"{client.rooturl}/api/v1/LoggedInUserAccount")); } @@ -280,11 +285,10 @@ namespace Tesses.CMS.Client return ""; } set{ - if(string.IsNullOrWhiteSpace(value)) - if(client.client.DefaultRequestHeaders.Contains("Authorization")) + if(client.client.DefaultRequestHeaders.Contains("Authorization")) client.client.DefaultRequestHeaders.Remove("Authorization"); - else - client.client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer",value); + if(!string.IsNullOrWhiteSpace(value)) + client.client.DefaultRequestHeaders.Add("Authorization",$"Bearer {value}"); } } @@ -297,6 +301,26 @@ namespace Tesses.CMS.Client } } + public class LoggedInUserAccount + { + [JsonProperty("logged_in")] + public bool LoggedIn {get;set;}=false; + + [JsonProperty("username")] + public string UserName {get;set;}=""; + + [JsonProperty("proper_name")] + public string ProperName {get;set;}=""; + [JsonProperty("is_admin")] + public bool IsAdmin {get;set;}=false; + + [JsonProperty("is_invited")] + public bool IsInvited {get;set;}=false; + + [JsonProperty("is_verified")] + public bool IsVerified {get;set;}=false; + } + public class LoginToken { [JsonProperty("success")] diff --git a/Tesses.CMS.Client/Tesses.CMS.Client.sln b/Tesses.CMS.Client/Tesses.CMS.Client.sln new file mode 100644 index 0000000..31c4b99 --- /dev/null +++ b/Tesses.CMS.Client/Tesses.CMS.Client.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.002.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tesses.CMS.Client", "Tesses.CMS.Client.csproj", "{887B0982-1D90-413D-BFEE-72065D115DE0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {887B0982-1D90-413D-BFEE-72065D115DE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {887B0982-1D90-413D-BFEE-72065D115DE0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {887B0982-1D90-413D-BFEE-72065D115DE0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {887B0982-1D90-413D-BFEE-72065D115DE0}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {17F92768-0843-4A4F-B369-22B8120B4996} + EndGlobalSection +EndGlobal diff --git a/Tesses.CMS.Providers.LiteDb/Tesses.CMS.Providers.LiteDb.sln b/Tesses.CMS.Providers.LiteDb/Tesses.CMS.Providers.LiteDb.sln new file mode 100644 index 0000000..f7a5046 --- /dev/null +++ b/Tesses.CMS.Providers.LiteDb/Tesses.CMS.Providers.LiteDb.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.002.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tesses.CMS.Providers.LiteDb", "Tesses.CMS.Providers.LiteDb.csproj", "{D0D6C7FF-2B46-4909-9741-77DBDFD52D4D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D0D6C7FF-2B46-4909-9741-77DBDFD52D4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D0D6C7FF-2B46-4909-9741-77DBDFD52D4D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D0D6C7FF-2B46-4909-9741-77DBDFD52D4D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D0D6C7FF-2B46-4909-9741-77DBDFD52D4D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {45074933-DBC8-4448-B846-2287DFF81409} + EndGlobalSection +EndGlobal diff --git a/Tesses.CMS/Assets/EditEpisodeDetails.html b/Tesses.CMS/Assets/EditEpisodeDetails.html index 6f6d17f..d9d28a3 100644 --- a/Tesses.CMS/Assets/EditEpisodeDetails.html +++ b/Tesses.CMS/Assets/EditEpisodeDetails.html @@ -1,5 +1,5 @@ -

Change movie metadata

-
+

Change episode metadata

+
@@ -12,7 +12,7 @@

Upload episode files

-
+

You should do these in order (not required but recomended because you can only upload one at a time, that is in one tab at least)

@@ -13,7 +13,7 @@

Add episode

-
+
@@ -38,7 +38,7 @@

Upload asset files

-
+

You should do these in order (not required but recomended because you can only upload one at a time, that is in one tab at least)

@@ -13,7 +13,7 @@

Add season

-
+
@@ -32,7 +32,7 @@

Upload asset files

-
+

You should do these in order (not required but recomended because you can only upload one at a time, that is in one tab at least)