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 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 QueryMovies(string term, string langCode, int? year, int? page, int count) { using (var db = new MovieFinderEntities()) { try { IQueryable 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 { } }); } } }