using System; using System.Collections.Generic; using System.IO; using System.Linq; using LiteDB; namespace Tesses.CMS { public class LiteDBContentProvider : IContentProvider { string dir; ILiteDatabase db; public LiteDBContentProvider(string dir) { this.dir = dir; db=new LiteDatabase(Path.Combine(dir,"tesses-cms.db")); } public Movie CreateMovie(string user, string movie, string properName, string description) { var userId=GetUserAccount(user).Id; Movie _movie = new Movie(){UserId = userId,Name = movie,ProperName=properName,Description = description}; _movie.Id=Movies.Insert(_movie); return _movie; } private ILiteCollection UserAccounts => db.GetCollection("users"); private ILiteCollection Movies => db.GetCollection("movies"); public UserAccount GetFirstUser() { return GetUsers().First(); } public Movie GetMovie(string user, string movie) { var userId=GetUserAccount(user).Id; return Movies.FindOne(e=>e.Name == movie && e.UserId == userId); } public MovieContentMetaData GetMovieContentMetaData(CMSConfiguration configuration, string user, string movie) { var _movie= new MovieContentMetaData(){ PosterUrl = $"{configuration.Root.TrimEnd('/')}/content/{user}/movie/{movie}/poster.jpg", ThumbnailUrl = $"{configuration.Root.TrimEnd('/')}/content/{user}/movie/{movie}/thumbnail.jpg", BrowserStream = $"{configuration.Root.TrimEnd('/')}/content/{user}/movie/{movie}/browser.mp4", DownloadStream = $"{configuration.Root.TrimEnd('/')}/content/{user}/movie/{movie}/{movie}.mp4", MovieTorrentUrl = $"{configuration.Root.TrimEnd('/')}/content/{user}/movie/{movie}/{movie}.torrent", MovieWithExtrasTorrentUrl=$"{configuration.Root.TrimEnd('/')}/content/{user}/movie/{movie}/{movie}_withextras.torrent" }; string subDir=Path.Combine(dir,"content", user, "movie",movie,"subtitles"); if(Directory.Exists(subDir)) foreach(var language in Directory.GetDirectories(subDir)) { string languageCode=Path.GetFileName(language); //en-US for english _movie.SubtitlesStreams.Add(new SubtitleStream(){LanguageCode=languageCode, SubtitleUrl = $"{configuration.Root.TrimEnd('/')}/content/{user}/movie/{movie}/subtitles/{languageCode}/{movie}.srt"}); } string extrasPath = Path.Combine(dir,"content", user, "movie",movie,"extras"); if(Directory.Exists(extrasPath)) FindExtras( $"{configuration.Root.TrimEnd('/')}/content/{user}/movie/{movie}/extras/",extrasPath,_movie.ExtraStreams); return _movie; } private void FindExtras(string extras,string v, List extraStreams) { foreach(var d in Directory.GetDirectories(v)) { var dirname = Path.GetFileName(d); string url = $"{extras}{dirname}/"; ExtraDataStream dataStream=new ExtraDataStream(); dataStream.IsDir=true; dataStream.Name = dirname; dataStream.Url = url; FindExtras(url,d,dataStream.Items); extraStreams.Add(dataStream); } foreach(var f in Directory.GetFiles(v)) { var filename = Path.GetFileName(f); var url = $"{extras}{filename}"; ExtraDataStream dataStream=new ExtraDataStream(); dataStream.IsDir=false; dataStream.Name = filename; dataStream.Url = url; extraStreams.Add(dataStream); } } public IEnumerable GetMovies(string user) { var userId = GetUserAccount(user).Id; return GetMovies(userId); } public IEnumerable GetMovies(long user) { return Movies.Find(e=>e.UserId==user); } public UserAccount GetUserAccount(string user) { return UserAccounts.FindOne(e=>e.Username == user); } public IEnumerable GetUsers() { return UserAccounts.FindAll(); } public void CreateUser(CMSConfiguration configuration,string user,string properName,string email,string password) { bool isOwner = UserAccounts.Count() == 0; UserAccount account=new UserAccount(); account.IsAdmin=isOwner; account.IsVerified = isOwner; account.Username = user; account.ProperName= properName; account.NewSalt(); account.PasswordHash=account.GetPasswordHash(password); account.Email = email; UserAccounts.Insert(account); } public void UpdateMovie(Movie movie) { Movies.Update(movie); } } }