tesses-cms/Tesses.CMS/LiteDbContentProvider.cs

132 lines
4.7 KiB
C#

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<UserAccount> UserAccounts => db.GetCollection<UserAccount>("users");
private ILiteCollection<Movie> Movies => db.GetCollection<Movie>("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<ExtraDataStream> 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<Movie> GetMovies(string user)
{
var userId = GetUserAccount(user).Id;
return GetMovies(userId);
}
public IEnumerable<Movie> GetMovies(long user)
{
return Movies.Find(e=>e.UserId==user);
}
public UserAccount GetUserAccount(string user)
{
return UserAccounts.FindOne(e=>e.Username == user);
}
public IEnumerable<UserAccount> 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);
}
}
}