static IEnumerable <PublishedPackage> GetAllPublishedPackages() { var packagingSource = new PackagingSource { FeedUrl = BlogSettings.Instance.GalleryFeedUrl }; var allPacks = new List <PublishedPackage>(); // gallery has a limit 100 records per call // keep calling till any records returned int cnt; var skip = 0; do { var s = skip; var galleryFeedContext = new GalleryFeedContext(new Uri(BlogSettings.Instance.GalleryFeedUrl)) { IgnoreMissingProperties = true }; // dnbegallery.org overrides feed with additional values in "screenshots" section var pkgs = (new[] { packagingSource }).SelectMany(source => { return(galleryFeedContext.Packages.Expand("Screenshots").OrderBy(p => p.Id).Where(p => p.IsLatestVersion).Skip(s).Take(100)); }); cnt = pkgs.Count(); skip = skip + 100; allPacks.AddRange(pkgs); } while (cnt > 0); return(allPacks); }
/// <summary> /// Json package representing current selected theme /// </summary> /// <param name="themeId">Theme id</param> /// <returns>Json package</returns> public static JsonPackage GetCurrentTheme(string themeId) { // first try to pull theme metadata from manifest file var jp = FileSystem.GetThemeManifest(themeId); if (jp != null) { if (string.IsNullOrEmpty(jp.IconUrl)) { jp.IconUrl = DefaultIconUrl(jp); } return(jp); } // if no manifest file, check themes in online gallery // and if found create manifest file using package info var srs = new PackagingSource { FeedUrl = _feedUrl }; var gPkg = GetPublishedPackages(srs).ToList().Where(p => p.Id == themeId).FirstOrDefault(); if (gPkg != null) { if (gPkg.Screenshots != null && gPkg.Screenshots.Count > 0) { gPkg.IconUrl = string.Format("http://dnbegallery.org{0}", gPkg.Screenshots[0].ScreenshotUri); } jp = FileSystem.WriteThemeManifest(gPkg.Id, gPkg.Description, gPkg.Authors, gPkg.ProjectUrl, gPkg.Version, gPkg.IconUrl); if (jp != null) { return(jp); } } // generate default blank manifest if both methods failed var jpw = FileSystem.WriteThemeManifest(themeId); if (jpw != null) { jp = jpw; } // return default values if theme folder read only if (jp == null) { jp = new JsonPackage { Id = themeId, Authors = "Unknown", IconUrl = Utils.ApplicationRelativeWebRoot + "pics/Theme.png" } } ; return(jp); }
static IEnumerable <PublishedPackage> GetPublishedPackages(PackagingSource packagingSource = null) { return((new[] { packagingSource }) .SelectMany( source => { var galleryFeedContext = new GalleryFeedContext(new Uri(_feedUrl)) { IgnoreMissingProperties = true }; return galleryFeedContext.Packages.Expand("Screenshots"); } )); }
/// <summary> /// /// </summary> /// <param name="pkgType"></param> /// <param name="page"></param> /// <param name="sortOrder"></param> /// <param name="searchVal"></param> /// <returns></returns> public static IQueryable <PublishedPackage> GetPackages(string pkgType, int page = 1, OrderType sortOrder = OrderType.Newest, string searchVal = "") { var srs = new PackagingSource { FeedUrl = _feedUrl }; //TODO: add setting for gallery page size var pageSize = BlogSettings.Instance.PostsPerPage; var cnt = 0; try { var retPackages = new List <PublishedPackage>(); var pkgList = GetPublishedPackages(srs); foreach (var pkg in pkgList.ToList()) { if (pkgType != "all") { if (pkg.PackageType != pkgType) { continue; } } if (!pkg.IsLatestVersion) { continue; } // for themes, get screenshot isetead of icon // also get screenshot if icon is missing for package if ((pkg.PackageType == "Theme" || string.IsNullOrEmpty(pkg.IconUrl)) && pkg.Screenshots != null && pkg.Screenshots.Count > 0) { pkg.IconUrl = pkg.Screenshots[0].ScreenshotUri; } // if both icon and screenshot missing, get default image for package type if (string.IsNullOrEmpty(pkg.IconUrl)) { switch (pkg.PackageType) { case "Theme": pkg.IconUrl = "http://dnbegallery.org/cms/Themes/OrchardGallery/Content/Images/themeDefaultIcon.png"; break; case "Extension": pkg.IconUrl = "http://dnbegallery.org/cms/Themes/OrchardGallery/Content/Images/extensionDefaultIcon.png"; break; case "Widget": pkg.IconUrl = "http://dnbegallery.org/cms/Themes/OrchardGallery/Content/Images/widgetDefaultIcon.png"; break; } } if (!string.IsNullOrEmpty(pkg.IconUrl) && !pkg.IconUrl.StartsWith("http:")) { pkg.IconUrl = "http://dnbegallery.org" + pkg.IconUrl; } if (string.IsNullOrEmpty(searchVal)) { retPackages.Add(pkg); cnt++; } else { if (pkg.Title.IndexOf(searchVal, StringComparison.OrdinalIgnoreCase) != -1 || pkg.Description.IndexOf(searchVal, StringComparison.OrdinalIgnoreCase) != -1 || (!string.IsNullOrWhiteSpace(pkg.Tags) && pkg.Tags.IndexOf(searchVal, StringComparison.OrdinalIgnoreCase) != -1)) { retPackages.Add(pkg); cnt++; } } } GalleryPager = new Pager(page, cnt); if (cnt > 0) { switch (sortOrder) { case OrderType.Downloads: retPackages = retPackages .OrderByDescending(p => p.DownloadCount).ThenBy(p => p.Title) .Skip((page - 1) * pageSize).Take(pageSize).ToList(); break; case OrderType.Rating: retPackages = retPackages .OrderByDescending(p => p.Rating).ThenBy(p => p.Title) .Skip((page - 1) * pageSize).Take(pageSize).ToList(); break; case OrderType.Newest: retPackages = retPackages .OrderByDescending(p => p.LastUpdated).ThenBy(p => p.Title) .Skip((page - 1) * pageSize).Take(pageSize).ToList(); break; case OrderType.Alphanumeric: retPackages = retPackages.OrderBy(p => p.Title) .Skip((page - 1) * pageSize).Take(pageSize).ToList(); break; } } return(retPackages.AsQueryable()); } catch (Exception) { GalleryPager = null; return(null); } }
/// <summary> /// Installed packages /// </summary> /// <param name="pkgType">Package type</param> /// <returns>List of installed packages</returns> public static List <JsonPackage> InstalledPackages(string pkgType) { var installedThemes = new Dictionary <string, JsonPackage>(); var path = HttpContext.Current.Server.MapPath(string.Format("{0}themes/", Utils.ApplicationRelativeWebRoot)); // read themes directory foreach (var d in Directory.GetDirectories(path)) { var index = d.LastIndexOf(Path.DirectorySeparatorChar) + 1; var themeId = d.Substring(index); // first try to pull theme metadata from manifest file var p = FileSystem.GetThemeManifest(themeId); if (p == null) { p = new JsonPackage(); p.Id = themeId; } if (p.Id != BlogSettings.Instance.Theme && p.Id != BlogSettings.Instance.MobileTheme && p.Id != "RazorHost") { if (string.IsNullOrEmpty(p.IconUrl)) { p.IconUrl = DefaultIconUrl(p); } installedThemes.Add(p.Id, p); } } // add package metadata from online repository var srs = new PackagingSource { FeedUrl = _feedUrl }; try { var pkgList = GetPublishedPackages(srs); foreach (var pkg in pkgList.ToList()) { if (pkg.PackageType != pkgType || !pkg.IsLatestVersion) { continue; } if (installedThemes.ContainsKey(pkg.Id)) { installedThemes[pkg.Id].Title = pkg.Title; installedThemes[pkg.Id].Description = pkg.Description; installedThemes[pkg.Id].Tags = pkg.Tags; installedThemes[pkg.Id].Authors = pkg.Authors; installedThemes[pkg.Id].Website = pkg.ProjectUrl; installedThemes[pkg.Id].LastUpdated = pkg.LastUpdated.ToString("dd MMM yyyy"); installedThemes[pkg.Id].Version = pkg.Version; if (pkg.PackageType == "Theme" && pkg.Screenshots != null && pkg.Screenshots.Count > 0) { installedThemes[pkg.Id].IconUrl = string.Format("http://dnbegallery.org{0}", pkg.Screenshots[0].ScreenshotUri); } } } // return combined result return(installedThemes.Select(t => t.Value).ToList()); } catch (Exception) { // no connection - return local return(installedThemes.Select(t => t.Value).ToList()); } }
static IEnumerable<PublishedPackage> GetAllPublishedPackages() { var packagingSource = new PackagingSource { FeedUrl = BlogSettings.Instance.GalleryFeedUrl }; var allPacks = new List<PublishedPackage>(); // gallery has a limit 100 records per call // keep calling till any records returned int cnt; var skip = 0; do { var s = skip; var pkgs = (new[] { packagingSource }) .SelectMany( source => { var galleryFeedContext = new GalleryFeedContext(new Uri(BlogSettings.Instance.GalleryFeedUrl)) { IgnoreMissingProperties = true }; return galleryFeedContext.Packages.Expand("Screenshots").OrderBy(p => p.Id).Where(p => p.IsLatestVersion).Skip(s).Take(100); } ); cnt = pkgs.Count(); skip = skip + 100; allPacks.AddRange(pkgs); } while (cnt > 0); return allPacks; }
/// <summary> /// Json package representing current selected theme /// </summary> /// <param name="themeId">Theme id</param> /// <returns>Json package</returns> public static JsonPackage GetCurrentTheme(string themeId) { // first try to pull theme metadata from manifest file var jp = FileSystem.GetThemeManifest(themeId); if (jp != null) { if (string.IsNullOrEmpty(jp.IconUrl)) jp.IconUrl = DefaultIconUrl(jp); return jp; } // if no manifest file, check themes in online gallery // and if found create manifest file using package info var srs = new PackagingSource { FeedUrl = _feedUrl }; var gPkg = GetPublishedPackages(srs).ToList().Where(p => p.Id == themeId).FirstOrDefault(); if(gPkg != null) { if (gPkg.Screenshots != null && gPkg.Screenshots.Count > 0) gPkg.IconUrl = string.Format("http://dnbegallery.org{0}", gPkg.Screenshots[0].ScreenshotUri); jp = FileSystem.WriteThemeManifest(gPkg.Id, gPkg.Description, gPkg.Authors, gPkg.ProjectUrl, gPkg.Version, gPkg.IconUrl); if (jp != null) return jp; } // generate default blank manifest if both methods failed var jpw = FileSystem.WriteThemeManifest(themeId); if (jpw != null) jp = jpw; // return default values if theme folder read only if (jp == null) jp = new JsonPackage {Id = themeId, Authors = "Unknown", IconUrl = Utils.ApplicationRelativeWebRoot + "pics/Theme.png" }; return jp; }
static IEnumerable<PublishedPackage> GetPublishedPackages(PackagingSource packagingSource = null) { return (new[] { packagingSource }) .SelectMany( source => { var galleryFeedContext = new GalleryFeedContext(new Uri(_feedUrl)) { IgnoreMissingProperties = true }; return galleryFeedContext.Packages.Expand("Screenshots"); } ); }
/// <summary> /// Installed packages /// </summary> /// <param name="pkgType">Package type</param> /// <returns>List of installed packages</returns> public static List<JsonPackage> InstalledPackages(string pkgType) { var installedThemes = new Dictionary<string, JsonPackage>(); var path = HttpContext.Current.Server.MapPath(string.Format("{0}themes/", Utils.ApplicationRelativeWebRoot)); // read themes directory foreach (var d in Directory.GetDirectories(path)) { var index = d.LastIndexOf(Path.DirectorySeparatorChar) + 1; var themeId = d.Substring(index); // first try to pull theme metadata from manifest file var p = FileSystem.GetThemeManifest(themeId); if(p == null) { p = new JsonPackage(); p.Id = themeId; } if (p.Id != BlogSettings.Instance.Theme && p.Id != BlogSettings.Instance.MobileTheme && p.Id != "RazorHost") { if(string.IsNullOrEmpty(p.IconUrl)) p.IconUrl = DefaultIconUrl(p); installedThemes.Add(p.Id, p); } } // add package metadata from online repository var srs = new PackagingSource { FeedUrl = _feedUrl }; try { var pkgList = GetPublishedPackages(srs); foreach (var pkg in pkgList.ToList()) { if (pkg.PackageType != pkgType || !pkg.IsLatestVersion) continue; if(installedThemes.ContainsKey(pkg.Id)) { installedThemes[pkg.Id].Title = pkg.Title; installedThemes[pkg.Id].Description = pkg.Description; installedThemes[pkg.Id].Tags = pkg.Tags; installedThemes[pkg.Id].Authors = pkg.Authors; installedThemes[pkg.Id].Website = pkg.ProjectUrl; installedThemes[pkg.Id].LastUpdated = pkg.LastUpdated.ToString("dd MMM yyyy"); installedThemes[pkg.Id].Version = pkg.Version; if (pkg.PackageType == "Theme" && pkg.Screenshots != null && pkg.Screenshots.Count > 0) installedThemes[pkg.Id].IconUrl = string.Format("http://dnbegallery.org{0}", pkg.Screenshots[0].ScreenshotUri); } } // return combined result return installedThemes.Select(t => t.Value).ToList(); } catch (Exception) { // no connection - return local return installedThemes.Select(t => t.Value).ToList(); } }
/// <summary> /// /// </summary> /// <param name="pkgType"></param> /// <param name="page"></param> /// <param name="sortOrder"></param> /// <param name="searchVal"></param> /// <returns></returns> public static IQueryable<PublishedPackage> GetPackages(string pkgType, int page = 1, OrderType sortOrder = OrderType.Newest, string searchVal = "") { var srs = new PackagingSource {FeedUrl = _feedUrl}; //TODO: add setting for gallery page size var pageSize = BlogSettings.Instance.PostsPerPage; var cnt = 0; try { var retPackages = new List<PublishedPackage>(); var pkgList = GetPublishedPackages(srs); foreach (var pkg in pkgList.ToList()) { if(pkgType != "all"){ if (pkg.PackageType != pkgType) continue; } if (!pkg.IsLatestVersion) continue; // for themes, get screenshot isetead of icon // also get screenshot if icon is missing for package if ((pkg.PackageType == "Theme" || string.IsNullOrEmpty(pkg.IconUrl)) && pkg.Screenshots != null && pkg.Screenshots.Count > 0) pkg.IconUrl = pkg.Screenshots[0].ScreenshotUri; // if both icon and screenshot missing, get default image for package type if(string.IsNullOrEmpty(pkg.IconUrl)) { switch (pkg.PackageType) { case "Theme": pkg.IconUrl = "http://dnbegallery.org/cms/Themes/OrchardGallery/Content/Images/themeDefaultIcon.png"; break; case "Extension": pkg.IconUrl = "http://dnbegallery.org/cms/Themes/OrchardGallery/Content/Images/extensionDefaultIcon.png"; break; case "Widget": pkg.IconUrl = "http://dnbegallery.org/cms/Themes/OrchardGallery/Content/Images/widgetDefaultIcon.png"; break; } } if (!string.IsNullOrEmpty(pkg.IconUrl) && !pkg.IconUrl.StartsWith("http:")) pkg.IconUrl = "http://dnbegallery.org" + pkg.IconUrl; if(string.IsNullOrEmpty(searchVal)) { retPackages.Add(pkg); cnt++; } else { if(pkg.Title.IndexOf(searchVal, StringComparison.OrdinalIgnoreCase) != -1 || pkg.Description.IndexOf(searchVal, StringComparison.OrdinalIgnoreCase) != -1 || (!string.IsNullOrWhiteSpace(pkg.Tags) && pkg.Tags.IndexOf(searchVal, StringComparison.OrdinalIgnoreCase) != -1)) { retPackages.Add(pkg); cnt++; } } } GalleryPager = new Pager(page, cnt); if (cnt > 0) { switch (sortOrder) { case OrderType.Downloads: retPackages = retPackages .OrderByDescending(p => p.DownloadCount).ThenBy(p => p.Title) .Skip((page - 1) * pageSize).Take(pageSize).ToList(); break; case OrderType.Rating: retPackages = retPackages .OrderByDescending(p => p.Rating).ThenBy(p => p.Title) .Skip((page - 1) * pageSize).Take(pageSize).ToList(); break; case OrderType.Newest: retPackages = retPackages .OrderByDescending(p => p.LastUpdated).ThenBy(p => p.Title) .Skip((page - 1) * pageSize).Take(pageSize).ToList(); break; case OrderType.Alphanumeric: retPackages = retPackages.OrderBy(p => p.Title) .Skip((page - 1) * pageSize).Take(pageSize).ToList(); break; } } return retPackages.AsQueryable(); } catch (Exception) { GalleryPager = null; return null; } }