VideoSearch / MovieTube.Web /Repository /MovieRepository.cs
niobures's picture
VideoSearch
e26fba6 verified
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MovieTube.Web.Models;
using MovieFinder.Data;
using System.Data.Entity;
using MovieTube.Client.Scraper;
using System.IO;
using MovieTube.Web.Services;
using MovieTube.Web.Repository;
using System.Threading.Tasks;
namespace MovieTube.Web.Repository
{
public class MovieRepository : IMovieRepository
{
private readonly int ThumbsPerPage = 20;
private readonly int ThumbsPerLang = 6;
private readonly IConfigProvider confProvider;
private readonly IImageUrlBuilder imgUrlBuilder;
public MovieRepository()
{
this.confProvider = new ConfigProvider();
this.imgUrlBuilder = new ImageUrlBuilder();
}
public ThumbNailVm List(string term, string language, int? year, int? page)
{
year = !year.HasValue ? 0 : year;
page = (!page.HasValue || page < 0) ? 0 : page;
List<MovieThumbnailVm> movies = null;
if (String.IsNullOrWhiteSpace(term) &&
String.IsNullOrWhiteSpace(language))
{
movies = QueryMovies(term, "ml", year, page, ThumbsPerLang);
movies.AddRange(QueryMovies(term, "hi", year, page, ThumbsPerLang));
movies.AddRange(QueryMovies(term, "ta", year, page, ThumbsPerLang));
movies.AddRange(QueryMovies(term, "te", year, page, ThumbsPerLang));
}
else
movies = QueryMovies(term, language, year.Value, page, ThumbsPerPage);
return new ThumbNailVm
{
Thumbnails = movies,
NextPage = movies.Count < ThumbsPerPage ? -1 : page.Value + 1
};
}
public List<MovieThumbnailVm> QueryMovies(string term, string langCode, int? year, int? page, int count)
{
using (var db = new MovieFinderEntities())
{
try
{
IQueryable<Movie> movies = null;
if (!String.IsNullOrWhiteSpace(langCode))
movies = db.Movies.Where(x => x.LanguageCode == langCode);
if (!String.IsNullOrWhiteSpace(term))
movies = (movies == null ? db.Movies : movies).Where(x => x.Name.StartsWith(term));
if (year != 0)
movies = (movies == null ? db.Movies : movies).Where(x => x.ReleaseDate.Year == year);
if (movies == null)
movies = db.Movies;
var m = movies.OrderByDescending(x => x.ReleaseDate)
.ThenByDescending(x => x.CreateDate)
.Skip(page.Value * count)
.Take(count)
.ToList()
.Select(x => new MovieThumbnailVm
{
ImageUrl = String.IsNullOrWhiteSpace(x.ImageLocalUrl) ? x.ImageUrl : imgUrlBuilder.Build(x.ImageLocalUrl),
PostedBy = "Admin",
PostedDate = x.CreateDate.ToShortDateString(),
Title = x.Name,
Language = GetLanguage(x.LanguageCode),
ReleasedYear = x.ReleaseDate.Year,
Id = x.UniqueID,
Url = String.Format("{0}/Watch/{1}/{2}/{3}/{4}",confProvider.RootUrl,
GetLanguage(x.LanguageCode), x.ReleaseDate.Year, x.UniqueID, x.Name),
ViewCount = x.ViewCount,
LikeCount = x.LikeCount
}).ToList();
return m;
}
catch
{
return null;
}
}
}
public MovieVm QueryMovie(string id, bool updateStat = false)
{
using (var db = new MovieFinderEntities())
{
try
{
var movie = db.Movies
.Include(x => x.MovieLinks)
.Where(x => x.UniqueID == id &&
x.MovieLinks.Any(y => y.FailedAttempts < 5))
.ToList()
.Select(x => new MovieVm{
ImageUrl = String.IsNullOrWhiteSpace(x.ImageLocalUrl) ? x.ImageUrl : imgUrlBuilder.Build(x.ImageLocalUrl),
PostedBy = "Admin",
Description = x.Description,
PostedDate = x.CreateDate.ToShortDateString(),
Title = x.Name,
Language = GetLanguage(x.LanguageCode),
ReleasedYear = x.ReleaseDate.Year,
Id = x.UniqueID,
Url = String.Format("{0}/Watch/{1}/{2}/{3}/{4}", confProvider.RootUrl,
GetLanguage(x.LanguageCode), x.ReleaseDate.Year, x.UniqueID, x.Name),
ViewCount = x.ViewCount,
LikeCount = x.LikeCount,
Links = x.MovieLinks.Where(z => z.IsWebSupported).Select(y => new VideoLinkVm{
HostSite = y.DownloadSiteID,
Title = ShortenLinkTitle(y.LinkTitle),
Url = VideoScraperBase.GetScraper(y.DowloadUrl).GetFlashUrl(y.DowloadUrl),
ID = y.ID,
PartID = y.PartID,
PartIndex = y.PartIndex
}).ToList()
}).FirstOrDefault();
movie.Links.Sort();
if (updateStat)
{
var m = db.Movies.Single(x => x.UniqueID == id);
m.ViewCount++;
db.SaveChanges();
}
return movie;
}
catch
{
return null;
}
}
}
private string ShortenLinkTitle(string title)
{
if (String.IsNullOrWhiteSpace(title))
return title;
title = title.ToLower();
var text = ScraperBase.Substring(title, "part");
if (String.IsNullOrWhiteSpace(text))
return " Full Movie";
return "Part - " + text;
}
private string GetLanguage(string langCode)
{
switch (langCode)
{
case "hi":
return "Hindi";
case "ml":
return "Malayalam";
case "te":
return "Telugu";
case "ta":
return "Tamil";
default:
return "Unknown";
}
}
public void RemoveLink(string link)
{
Task.Factory.StartNew(() =>
{
try
{
using (var db = new MovieFinderEntities())
{
var ml = db.MovieLinks.FirstOrDefault(x => x.DowloadUrl == link && x.FailedAttempts <= 3);
if (ml != null)
{
if (VideoScraperBase.ValidateUrl(ml.DowloadUrl) == MovieTube.Client.Scraper.ScraperResult.VideoDoesNotExist)
{
ml.FailedAttempts = 5;
ml.LastValidatedBy = new Guid();
db.SaveChanges();
}
}
}
}
catch { }
});
}
}
}