From 5e93dfa190eae0677152ff97d4585373bf6ce7f1 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Mon, 30 Sep 2013 10:44:43 -0700 Subject: [PATCH] Incremental work on update media --- .../Controllers/AdminController.cs | 18 +++---- .../Controllers/ClientStorageController.cs | 21 ++++++-- .../Controllers/OEmbedController.cs | 46 ++++++++++-------- .../Controllers/WebSearchController.cs | 20 ++++++-- .../Drivers/ImagePartDriver.cs | 3 +- .../Factories/AudioFactory.cs | 32 +++++++++++-- .../Factories/DocumentFactory.cs | 32 +++++++++++-- .../Factories/IMediaFactory.cs | 4 +- .../Factories/IMediaFactorySelector.cs | 2 +- .../Factories/ImageFactory.cs | 31 ++++++++++-- .../Factories/VideoFactory.cs | 32 +++++++++++-- .../Orchard.MediaLibrary/Migrations.cs | 35 ++++++++++++++ .../Orchard.MediaLibrary/Models/MediaPart.cs | 17 ++++++- .../Orchard.MediaLibrary.csproj | 4 ++ .../Orchard.MediaLibrary/Placement.info | 2 +- .../Services/IMediaLibraryService.cs | 7 ++- .../Services/MediaLibraryService.cs | 29 +++++++---- .../Orchard.MediaLibrary/Services/Shapes.cs | 22 +++++++-- .../ViewModels/ImportMediaViewModel.cs | 6 +++ .../ViewModels/MediaManagerImportViewModel.cs | 2 + .../ViewModels/MediaManagerIndexViewModel.cs | 3 +- .../ViewModels/OEmbedViewModel.cs | 1 + .../Views/Admin/Import.cshtml | 48 ++++++++++++++++--- .../Views/ClientStorage/Index.cshtml | 5 +- .../Views/OEmbed/Index.cshtml | 1 + .../Views/Parts/MediaLibrary.Actions.cshtml | 2 +- .../Views/WebSearch/Index.cshtml | 9 +++- .../Upgrade/Controllers/MediaController.cs | 4 +- 28 files changed, 343 insertions(+), 95 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/ImportMediaViewModel.cs diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/AdminController.cs index 5405bb9c2..5a9047608 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/AdminController.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Web.Mvc; using Orchard.ContentManagement; +using Orchard.ContentManagement.MetaData.Models; using Orchard.Localization; using Orchard.Logging; using Orchard.MediaLibrary.Models; @@ -40,14 +41,7 @@ namespace Orchard.MediaLibrary.Controllers { public ILogger Logger { get; set; } public ActionResult Index(string folderPath = "", bool dialog = false) { - var mediaTypes = new List(); - - foreach(var contentTypeDefinition in _contentDefinitionManager.ListTypeDefinitions()) { - string stereotype; - if (contentTypeDefinition.Settings.TryGetValue("Stereotype", out stereotype) && stereotype == "Media") - mediaTypes.Add(contentTypeDefinition.Name); - } - + // let other modules enhance the ui by providing custom navigation and actions var explorer = Services.ContentManager.New("MediaLibraryExplorer"); explorer.Weld(new MediaLibraryExplorerPart()); @@ -58,7 +52,7 @@ namespace Orchard.MediaLibrary.Controllers { DialogMode = dialog, Folders = _mediaLibraryService.GetMediaFolders(null).Select(GetFolderHierarchy), FolderPath = folderPath, - MediaTypes = mediaTypes.ToArray(), + MediaTypes = _mediaLibraryService.GetMediaTypes(), CustomActionsShapes = explorerShape.Actions, CustomNavigationShapes = explorerShape.Navigation, }; @@ -75,13 +69,15 @@ namespace Orchard.MediaLibrary.Controllers { } public ActionResult Import(string folderPath) { + var mediaProviderMenu = _navigationManager.BuildMenu("mediaproviders"); var imageSets = _navigationManager.BuildImageSets("mediaproviders"); var viewModel = new MediaManagerImportViewModel { Menu = mediaProviderMenu, ImageSets = imageSets, - FolderPath = folderPath + FolderPath = folderPath, + MediaTypes = _mediaLibraryService.GetMediaTypes() }; return View(viewModel); @@ -94,7 +90,7 @@ namespace Orchard.MediaLibrary.Controllers { var mediaItems = mediaParts.Select(x => new MediaManagerMediaItemViewModel { MediaPart = x, - Shape = Services.ContentManager.BuildDisplay(x, "Thumbnail") + Shape = Services.ContentManager.BuildDisplay(x.ContentItem, "Thumbnail") }).ToList(); var viewModel = new MediaManagerMediaItemsViewModel { diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/ClientStorageController.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/ClientStorageController.cs index b2511f523..7893c5720 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/ClientStorageController.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/ClientStorageController.cs @@ -1,7 +1,10 @@ using System.Collections.Generic; +using System.Dynamic; using System.IO; using System.Web.Mvc; +using Orchard.ContentManagement; using Orchard.MediaLibrary.Services; +using Orchard.MediaLibrary.ViewModels; using Orchard.Themes; using Orchard.UI.Admin; @@ -9,18 +12,25 @@ namespace Orchard.MediaLibrary.Controllers { [Admin, Themed(false)] public class ClientStorageController : Controller { private readonly IMediaLibraryService _mediaLibraryService; + private readonly IContentManager _contentManager; - public ClientStorageController(IMediaLibraryService mediaManagerService) { + public ClientStorageController(IMediaLibraryService mediaManagerService, IContentManager contentManager) { _mediaLibraryService = mediaManagerService; + _contentManager = contentManager; } - public ActionResult Index(string folderPath) { + public ActionResult Index(string folderPath, string type) { - return View((object)folderPath); + var viewModel = new ImportMediaViewModel { + FolderPath = folderPath, + Type = type + }; + + return View(viewModel); } [HttpPost] - public ActionResult Upload(string folderPath) { + public ActionResult Upload(string folderPath, string type) { var statuses = new List(); // Loop through each file in the request @@ -34,7 +44,8 @@ namespace Orchard.MediaLibrary.Controllers { filename = "clipboard.png"; } - var mediaPart = _mediaLibraryService.ImportMedia(file.InputStream, folderPath, filename); + var mediaPart = _mediaLibraryService.ImportMedia(file.InputStream, folderPath, filename, type); + _contentManager.Create(mediaPart); statuses.Add(new { id = mediaPart.Id, diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/OEmbedController.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/OEmbedController.cs index f8f3d671f..f17e95d42 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/OEmbedController.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/OEmbedController.cs @@ -5,7 +5,6 @@ using System.Text.RegularExpressions; using System.Web.Mvc; using System.Xml.Linq; using Orchard.MediaLibrary.Models; -using Orchard.MediaLibrary.Services; using Orchard.MediaLibrary.ViewModels; using Orchard.Themes; using Orchard.UI.Admin; @@ -14,30 +13,28 @@ using Orchard.ContentManagement; namespace Orchard.MediaLibrary.Controllers { [Admin, Themed(false)] public class OEmbedController : Controller { - private readonly IMediaLibraryService _mediaLibraryService; - - public OEmbedController( - IMediaLibraryService mediaManagerService, - IOrchardServices services) { - _mediaLibraryService = mediaManagerService; + public OEmbedController(IOrchardServices services) { Services = services; } public IOrchardServices Services { get; set; } - public ActionResult Index(string folderPath) { + public ActionResult Index(string folderPath, string type) { var viewModel = new OEmbedViewModel { - FolderPath = folderPath + FolderPath = folderPath, + Type = type }; return View(viewModel); } [HttpPost] - public ActionResult Index(string folderPath, string url) { + [ActionName("Index")] + public ActionResult IndexPOST(string folderPath, string url, string type) { var viewModel = new OEmbedViewModel { Url = url, - FolderPath = folderPath + FolderPath = folderPath, + Type = type }; var webClient = new WebClient {Encoding = Encoding.UTF8}; @@ -76,14 +73,20 @@ namespace Orchard.MediaLibrary.Controllers { } [HttpPost, ValidateInput(false)] - public ActionResult MediaPost(string folderPath, string url, string document) { + public ActionResult MediaPost(string folderPath, string url, string document, string type) { var content = XDocument.Parse(document); var oembed = content.Root; - var part = Services.ContentManager.New("OEmbed"); + if (String.IsNullOrEmpty(type)) { + type = "OEmbed"; + } + + var part = Services.ContentManager.New(type); part.MimeType = "text/html"; part.FolderPath = folderPath; + part.LogicalType = "OEmbed"; + if (oembed.Element("title") != null) { part.Title = oembed.Element("title").Value; } @@ -93,18 +96,23 @@ namespace Orchard.MediaLibrary.Controllers { if (oembed.Element("description") != null) { part.Caption = oembed.Element("description").Value; } + var oembedPart = part.As(); - oembedPart.Source = url; + if (oembedPart != null) { - foreach (var element in oembed.Elements()) { - oembedPart[element.Name.LocalName] = element.Value; + oembedPart.Source = url; + + foreach (var element in oembed.Elements()) { + oembedPart[element.Name.LocalName] = element.Value; + } + + Services.ContentManager.Create(oembedPart); } - - Services.ContentManager.Create(oembedPart); var viewModel = new OEmbedViewModel { - FolderPath = folderPath + FolderPath = folderPath, + Type = type }; return View("Index", viewModel); diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/WebSearchController.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/WebSearchController.cs index 87ac76ce4..83154cf9c 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/WebSearchController.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/WebSearchController.cs @@ -2,7 +2,9 @@ using System.IO; using System.Net; using System.Web.Mvc; +using Orchard.ContentManagement; using Orchard.MediaLibrary.Services; +using Orchard.MediaLibrary.ViewModels; using Orchard.Themes; using Orchard.UI.Admin; @@ -10,24 +12,32 @@ namespace Orchard.MediaLibrary.Controllers { [Admin, Themed(false)] public class WebSearchController : Controller { private readonly IMediaLibraryService _mediaLibraryService; + private readonly IContentManager _contentManager; - public WebSearchController(IMediaLibraryService mediaManagerService) { + public WebSearchController(IMediaLibraryService mediaManagerService, IContentManager contentManager) { _mediaLibraryService = mediaManagerService; + _contentManager = contentManager; } - public ActionResult Index(string folderPath) { + public ActionResult Index(string folderPath, string type) { + var viewModel = new ImportMediaViewModel { + FolderPath = folderPath, + Type = type + }; - return View((object)folderPath); + return View(viewModel); } [HttpPost] - public JsonResult ImagePost(string folderPath, string url) { + public JsonResult ImagePost(string folderPath, string type, string url) { try { var buffer = new WebClient().DownloadData(url); var stream = new MemoryStream(buffer); - var mediaPart = _mediaLibraryService.ImportMedia(stream, folderPath, Path.GetFileName(url)); + + var mediaPart = _mediaLibraryService.ImportMedia(stream, folderPath, Path.GetFileName(url), type); + _contentManager.Create(mediaPart); return new JsonResult { Data = new {folderPath, MediaPath = mediaPart.FileName} diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/ImagePartDriver.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/ImagePartDriver.cs index 66497f62b..77163dbf4 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/ImagePartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/ImagePartDriver.cs @@ -1,4 +1,5 @@ -using Orchard.ContentManagement.Drivers; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Drivers; using Orchard.MediaLibrary.Models; namespace Orchard.MediaLibrary.Drivers { diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/AudioFactory.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/AudioFactory.cs index f300c4f80..bfb7e0c58 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/AudioFactory.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/AudioFactory.cs @@ -1,21 +1,33 @@ -using System.IO; +using System; +using System.IO; +using System.Linq; using Orchard.ContentManagement; +using Orchard.ContentManagement.MetaData; using Orchard.MediaLibrary.Models; namespace Orchard.MediaLibrary.Factories { public class AudioFactorySelector : IMediaFactorySelector { private readonly IContentManager _contentManager; + private readonly IContentDefinitionManager _contentDefinitionManager; - public AudioFactorySelector(IContentManager contentManager) { + public AudioFactorySelector(IContentManager contentManager, IContentDefinitionManager contentDefinitionManager) { _contentManager = contentManager; + _contentDefinitionManager = contentDefinitionManager; } - public MediaFactorySelectorResult GetMediaFactory(Stream stream, string mimeType) { + public MediaFactorySelectorResult GetMediaFactory(Stream stream, string mimeType, string contentType) { if (!mimeType.StartsWith("audio/")) { return null; } + if (!String.IsNullOrEmpty(contentType)) { + var contentDefinition = _contentDefinitionManager.GetTypeDefinition(contentType); + if (contentDefinition == null || contentDefinition.Parts.All(x => x.PartDefinition.Name != typeof(AudioPart).Name)) { + return null; + } + } + return new MediaFactorySelectorResult { Priority = -5, MediaFactory = new AudioFactory(_contentManager) @@ -33,13 +45,23 @@ namespace Orchard.MediaLibrary.Factories { _contentManager = contentManager; } - public MediaPart CreateMedia(Stream stream, string path, string mimeType) { - var part = _contentManager.New("Audio"); + public MediaPart CreateMedia(Stream stream, string path, string mimeType, string contentType) { + if (String.IsNullOrEmpty(contentType)) { + contentType = "Audio"; + } + var part = _contentManager.New(contentType); + + part.LogicalType = "Audio"; part.MimeType = mimeType; part.Title = Path.GetFileNameWithoutExtension(path); var audioPart = part.As(); + + if (audioPart == null) { + return null; + } + audioPart.Length = 0; return part; diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/DocumentFactory.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/DocumentFactory.cs index e291d5582..2d3388212 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/DocumentFactory.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/DocumentFactory.cs @@ -1,5 +1,8 @@ -using System.IO; +using System; +using System.IO; +using System.Linq; using Orchard.ContentManagement; +using Orchard.ContentManagement.MetaData; using Orchard.MediaLibrary.Models; namespace Orchard.MediaLibrary.Factories { @@ -10,12 +13,21 @@ namespace Orchard.MediaLibrary.Factories { /// public class DocumentFactorySelector : IMediaFactorySelector { private readonly IContentManager _contentManager; + private readonly IContentDefinitionManager _contentDefinitionManager; - public DocumentFactorySelector(IContentManager contentManager) { + public DocumentFactorySelector(IContentManager contentManager, IContentDefinitionManager contentDefinitionManager) { _contentManager = contentManager; + _contentDefinitionManager = contentDefinitionManager; } - public MediaFactorySelectorResult GetMediaFactory(Stream stream, string mimeType) { + public MediaFactorySelectorResult GetMediaFactory(Stream stream, string mimeType, string contentType) { + if (!String.IsNullOrEmpty(contentType)) { + var contentDefinition = _contentDefinitionManager.GetTypeDefinition(contentType); + if (contentDefinition == null || contentDefinition.Parts.All(x => x.PartDefinition.Name != typeof(DocumentPart).Name)) { + return null; + } + } + return new MediaFactorySelectorResult { Priority = -10, MediaFactory = new DocumentFactory(_contentManager) @@ -30,14 +42,24 @@ namespace Orchard.MediaLibrary.Factories { _contentManager = contentManager; } - public MediaPart CreateMedia(Stream stream, string path, string mimeType) { + public MediaPart CreateMedia(Stream stream, string path, string mimeType, string contentType) { - var part = _contentManager.New("Document"); + if (String.IsNullOrEmpty(contentType)) { + contentType = "Document"; + } + var part = _contentManager.New(contentType); + + part.LogicalType = "Document"; part.MimeType = mimeType; part.Title = Path.GetFileNameWithoutExtension(path); var documentPart = part.As(); + + if (documentPart == null) { + return null; + } + documentPart.Length = stream.Length; return part; diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/IMediaFactory.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/IMediaFactory.cs index 65c4fdc26..d93f8b866 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/IMediaFactory.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/IMediaFactory.cs @@ -4,7 +4,7 @@ using Orchard.MediaLibrary.Models; namespace Orchard.MediaLibrary.Factories { public interface IMediaFactory { - MediaPart CreateMedia(Stream stream, string path, string mimeType); + MediaPart CreateMedia(Stream stream, string path, string mimeType, string contentType); } public class NullMediaFactory : IMediaFactory { @@ -12,7 +12,7 @@ namespace Orchard.MediaLibrary.Factories { get { return new NullMediaFactory(); } } - public MediaPart CreateMedia(Stream stream, string path, string mimeType) { + public MediaPart CreateMedia(Stream stream, string path, string mimeType, string contentType) { return null; } } diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/IMediaFactorySelector.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/IMediaFactorySelector.cs index f21bfb276..e1eb1715f 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/IMediaFactorySelector.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/IMediaFactorySelector.cs @@ -2,6 +2,6 @@ namespace Orchard.MediaLibrary.Factories { public interface IMediaFactorySelector : IDependency { - MediaFactorySelectorResult GetMediaFactory(Stream stream, string mimeType); + MediaFactorySelectorResult GetMediaFactory(Stream stream, string mimeType, string contentType); } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/ImageFactory.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/ImageFactory.cs index 431913729..a8a5d58dc 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/ImageFactory.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/ImageFactory.cs @@ -1,22 +1,35 @@ -using System.Drawing; +using System; using System.IO; +using System.Linq; using Orchard.ContentManagement; +using Orchard.ContentManagement.MetaData; using Orchard.MediaLibrary.Models; +using Image = System.Drawing.Image; namespace Orchard.MediaLibrary.Factories { public class ImageFactorySelector : IMediaFactorySelector { private readonly IContentManager _contentManager; + private readonly IContentDefinitionManager _contentDefinitionManager; - public ImageFactorySelector(IContentManager contentManager) { + public ImageFactorySelector(IContentManager contentManager, IContentDefinitionManager contentDefinitionManager) { _contentManager = contentManager; + _contentDefinitionManager = contentDefinitionManager; } - public MediaFactorySelectorResult GetMediaFactory(Stream stream, string mimeType) { + + public MediaFactorySelectorResult GetMediaFactory(Stream stream, string mimeType, string contentType) { if (!mimeType.StartsWith("image/")) { return null; } + if (!String.IsNullOrEmpty(contentType)) { + var contentDefinition = _contentDefinitionManager.GetTypeDefinition(contentType); + if (contentDefinition == null || contentDefinition.Parts.All(x => x.PartDefinition.Name != typeof (ImagePart).Name)) { + return null; + } + } + return new MediaFactorySelectorResult { Priority = -5, MediaFactory = new ImageFactory(_contentManager) @@ -32,14 +45,22 @@ namespace Orchard.MediaLibrary.Factories { _contentManager = contentManager; } - public MediaPart CreateMedia(Stream stream, string path, string mimeType) { + public MediaPart CreateMedia(Stream stream, string path, string mimeType, string contentType) { + if (String.IsNullOrEmpty(contentType)) { + contentType = "Image"; + } - var part = _contentManager.New("Image"); + var part = _contentManager.New(contentType); + part.LogicalType = "Image"; part.MimeType = mimeType; part.Title = Path.GetFileNameWithoutExtension(path); var imagePart = part.As(); + if (imagePart == null) { + return null; + } + using (var image = Image.FromStream(stream)) { imagePart.Width = image.Width; imagePart.Height = image.Height; diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/VideoFactory.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/VideoFactory.cs index e8447c7ba..0e541e02f 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/VideoFactory.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Factories/VideoFactory.cs @@ -1,21 +1,33 @@ -using System.IO; +using System; +using System.IO; +using System.Linq; using Orchard.ContentManagement; +using Orchard.ContentManagement.MetaData; using Orchard.MediaLibrary.Models; namespace Orchard.MediaLibrary.Factories { public class VideoFactorySelector : IMediaFactorySelector { private readonly IContentManager _contentManager; + private readonly IContentDefinitionManager _contentDefinitionManager; - public VideoFactorySelector(IContentManager contentManager) { + public VideoFactorySelector(IContentManager contentManager, IContentDefinitionManager contentDefinitionManager) { _contentManager = contentManager; + _contentDefinitionManager = contentDefinitionManager; } - public MediaFactorySelectorResult GetMediaFactory(Stream stream, string mimeType) { + public MediaFactorySelectorResult GetMediaFactory(Stream stream, string mimeType, string contentType) { if (!mimeType.StartsWith("video/")) { return null; } + if (!String.IsNullOrEmpty(contentType)) { + var contentDefinition = _contentDefinitionManager.GetTypeDefinition(contentType); + if (contentDefinition == null || contentDefinition.Parts.All(x => x.PartDefinition.Name != typeof(VideoPart).Name)) { + return null; + } + } + return new MediaFactorySelectorResult { Priority = -5, MediaFactory = new VideoFactory(_contentManager) @@ -31,13 +43,23 @@ namespace Orchard.MediaLibrary.Factories { _contentManager = contentManager; } - public MediaPart CreateMedia(Stream stream, string path, string mimeType) { - var part = _contentManager.New("Video"); + public MediaPart CreateMedia(Stream stream, string path, string mimeType, string contentType) { + if (String.IsNullOrEmpty(contentType)) { + contentType = "Video"; + } + var part = _contentManager.New(contentType); + + part.LogicalType = "Video"; part.MimeType = mimeType; part.Title = Path.GetFileNameWithoutExtension(path); var videoPart = part.As(); + + if (videoPart == null) { + return null; + } + videoPart.Length = 0; return part; diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Migrations.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Migrations.cs index 9ded4a0ba..3f05470d5 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Migrations.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Migrations.cs @@ -1,4 +1,5 @@ using Orchard.ContentManagement.MetaData; +using Orchard.Core.Contents.Extensions; using Orchard.Data.Migration; namespace Orchard.MediaLibrary { @@ -86,5 +87,39 @@ namespace Orchard.MediaLibrary { return 3; } + + public int UpdateFrom3() { + ContentDefinitionManager.AlterPartDefinition("MediaPart", part => part + .Attachable() + .WithDescription("Turns a content type into a Media. Note: you need to set the stereotype to \"Media\" as well.") + ); + + ContentDefinitionManager.AlterPartDefinition("ImagePart", part => part + .Attachable() + .WithDescription("Provides common metadata for an Image Media.") + ); + + ContentDefinitionManager.AlterPartDefinition("VideoPart", part => part + .Attachable() + .WithDescription("Provides common metadata for a Video Media.") + ); + + ContentDefinitionManager.AlterPartDefinition("AudioPart", part => part + .Attachable() + .WithDescription("Provides common metadata for an Audio Media.") + ); + + ContentDefinitionManager.AlterPartDefinition("DocumentPart", part => part + .Attachable() + .WithDescription("Provides common metadata for a Document Media.") + ); + + ContentDefinitionManager.AlterPartDefinition("OEmbedPart", part => part + .Attachable() + .WithDescription("Provides common metadata for an OEmbed Media.") + ); + + return 4; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Models/MediaPart.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Models/MediaPart.cs index 2e9605a46..8800bdfbb 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Models/MediaPart.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Models/MediaPart.cs @@ -1,4 +1,6 @@ -using Orchard.ContentManagement; +using System; +using Orchard.ContentManagement; +using Orchard.ContentManagement.FieldStorage.InfosetStorage; using Orchard.ContentManagement.Utilities; using Orchard.Core.Title.Models; @@ -48,7 +50,7 @@ namespace Orchard.MediaLibrary.Models { } /// - /// Gets or set the name of the media when is used + /// Gets or sets the name of the media when is used /// to store the physical media. If null then the media is not associated /// with a local file. /// @@ -63,5 +65,16 @@ namespace Orchard.MediaLibrary.Models { public string MediaUrl { get { return _publicUrl.Value; } } + + /// + /// Get or sets the logical type of the media. For instance a custom type could be rendered as an Image + /// + /// + /// The logical type is used to drive the thumbnails generation in the admin. + /// + public string LogicalType { + get { return Convert.ToString(this.As().Get("LogicalType")); } + set { this.As().Set("LogicalType", value); } + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Orchard.MediaLibrary.csproj b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Orchard.MediaLibrary.csproj index 6057b2307..fd62590d2 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Orchard.MediaLibrary.csproj +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Orchard.MediaLibrary.csproj @@ -167,6 +167,7 @@ + @@ -336,6 +337,9 @@ + + + 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Placement.info b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Placement.info index 5e5e05e3b..feb1cfd6a 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Placement.info +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Placement.info @@ -10,7 +10,7 @@ Parts_OEmbed="Content" /> - + GetMediaTypes(); + IEnumerable GetMediaTypes(); IContentQuery GetMediaContentItems(); IEnumerable GetMediaContentItems(string folderPath, int skip, int count, string order, string mediaType); IEnumerable GetMediaContentItems(int skip, int count, string order, string mediaType); int GetMediaContentItemsCount(string folderPath, string mediaType); int GetMediaContentItemsCount(string mediaType); MediaPart ImportMedia(string relativePath, string filename); + MediaPart ImportMedia(string relativePath, string filename, string contentType); MediaPart ImportMedia(Stream stream, string relativePath, string filename); - IMediaFactory GetMediaFactory(Stream stream, string mimeType); + MediaPart ImportMedia(Stream stream, string relativePath, string filename, string contentType); + IMediaFactory GetMediaFactory(Stream stream, string mimeType, string contentType); /// /// Creates a unique filename to prevent filename collisions. diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Services/MediaLibraryService.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Services/MediaLibraryService.cs index 1aeb331c6..2d8662ab7 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Services/MediaLibraryService.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Services/MediaLibraryService.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Web; using Orchard.ContentManagement; +using Orchard.ContentManagement.MetaData.Models; using Orchard.Core.Common.Models; using Orchard.FileSystems.Media; using Orchard.Localization; @@ -34,10 +35,13 @@ namespace Orchard.MediaLibrary.Services { public Localizer T { get; set; } - public IEnumerable GetMediaTypes() { - return _orchardServices.ContentManager.GetContentTypeDefinitions() + public IEnumerable GetMediaTypes() { + return _orchardServices + .ContentManager + .GetContentTypeDefinitions() .Where(contentTypeDefinition => contentTypeDefinition.Settings.ContainsKey("Stereotype") && contentTypeDefinition.Settings["Stereotype"] == "Media") - .Select(contentTypeDefinition => contentTypeDefinition.Name); + .OrderBy(x => x.DisplayName) + .ToArray(); } public IContentQuery GetMediaContentItems() { @@ -105,10 +109,14 @@ namespace Orchard.MediaLibrary.Services { } public MediaPart ImportMedia(Stream stream, string relativePath, string filename) { + return ImportMedia(stream, relativePath, filename, null); + } + + public MediaPart ImportMedia(Stream stream, string relativePath, string filename, string contentType) { var uniqueFilename = GetUniqueFilename(relativePath, filename); UploadMediaFile(relativePath, uniqueFilename, stream); - return ImportMedia(relativePath, uniqueFilename); + return ImportMedia(relativePath, uniqueFilename, contentType); } public string GetUniqueFilename(string folderPath, string filename) { @@ -123,6 +131,10 @@ namespace Orchard.MediaLibrary.Services { } public MediaPart ImportMedia(string relativePath, string filename) { + return ImportMedia(relativePath, filename, null); + } + + public MediaPart ImportMedia(string relativePath, string filename, string contentType) { var mimeType = _mimeTypeProvider.GetMimeType(filename); @@ -134,21 +146,20 @@ namespace Orchard.MediaLibrary.Services { var mediaFile = BuildMediaFile(relativePath, storageFile); using (var stream = storageFile.OpenRead()) { - var mediaFactory = GetMediaFactory(stream, mimeType); - var mediaPart = mediaFactory.CreateMedia(stream, mediaFile.Name, mimeType); + var mediaFactory = GetMediaFactory(stream, mimeType, contentType); + var mediaPart = mediaFactory.CreateMedia(stream, mediaFile.Name, mimeType, contentType); if (mediaPart != null) { mediaPart.FolderPath = relativePath; mediaPart.FileName = filename; - _orchardServices.ContentManager.Create(mediaPart); } return mediaPart; } } - public IMediaFactory GetMediaFactory(Stream stream, string mimeType) { + public IMediaFactory GetMediaFactory(Stream stream, string mimeType, string contentType) { var requestMediaFactoryResults = _mediaFactorySelectors - .Select(x => x.GetMediaFactory(stream, mimeType)) + .Select(x => x.GetMediaFactory(stream, mimeType, contentType)) .Where(x => x != null) .OrderByDescending(x => x.Priority); diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Services/Shapes.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Services/Shapes.cs index 7e53b606e..473064422 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Services/Shapes.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Services/Shapes.cs @@ -1,5 +1,7 @@ -using Orchard.ContentManagement; +using System; +using Orchard.ContentManagement; using Orchard.DisplayManagement.Descriptors; +using Orchard.MediaLibrary.Models; namespace Orchard.MediaLibrary.Services { public class Shapes : IShapeTableProvider { @@ -12,16 +14,30 @@ namespace Orchard.MediaLibrary.Services { // Display type > content type > specific content > display type for a content type > display type for specific content // BasicShapeTemplateHarvester.Adjust will then adjust the template name + var mediaPart = contentItem.As(); + // Media__[DisplayType] e.g. Media-Summary displaying.ShapeMetadata.Alternates.Add("Media_" + EncodeAlternateElement(displaying.ShapeMetadata.DisplayType)); - // Media__[ContentType] e.g. Media-BlogPost, + if (!String.IsNullOrEmpty(mediaPart.LogicalType)) { + + // Media__[LogicalType] e.g. Media-Image, + displaying.ShapeMetadata.Alternates.Add("Media__" + EncodeAlternateElement(mediaPart.LogicalType)); + + // Media__[Id] e.g. Media-42, + displaying.ShapeMetadata.Alternates.Add("Media__" + contentItem.Id); + + // Media_[DisplayType]__[LogicalType] e.g. Media-Image.Summary + displaying.ShapeMetadata.Alternates.Add("Media_" + displaying.ShapeMetadata.DisplayType + "__" + EncodeAlternateElement(mediaPart.LogicalType)); + } + + // Media__[ContentType] e.g. Media-ProductImage, displaying.ShapeMetadata.Alternates.Add("Media__" + EncodeAlternateElement(contentItem.ContentType)); // Media__[Id] e.g. Media-42, displaying.ShapeMetadata.Alternates.Add("Media__" + contentItem.Id); - // Media_[DisplayType]__[ContentType] e.g. Media-Image.Summary + // Media_[DisplayType]__[ContentType] e.g. Media-ProductImage.Summary displaying.ShapeMetadata.Alternates.Add("Media_" + displaying.ShapeMetadata.DisplayType + "__" + EncodeAlternateElement(contentItem.ContentType)); // Media_[DisplayType]__[Id] e.g. Media-42.Summary diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/ImportMediaViewModel.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/ImportMediaViewModel.cs new file mode 100644 index 000000000..e0916cf5b --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/ImportMediaViewModel.cs @@ -0,0 +1,6 @@ +namespace Orchard.MediaLibrary.ViewModels { + public class ImportMediaViewModel { + public string FolderPath { get; set; } + public string Type { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/MediaManagerImportViewModel.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/MediaManagerImportViewModel.cs index 767e40a49..a4b943e45 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/MediaManagerImportViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/MediaManagerImportViewModel.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using Orchard.ContentManagement.MetaData.Models; using Orchard.UI.Navigation; namespace Orchard.MediaLibrary.ViewModels { @@ -6,5 +7,6 @@ namespace Orchard.MediaLibrary.ViewModels { public IEnumerable Menu { get; set; } public IEnumerable ImageSets { get; set; } public string FolderPath { get; set; } + public IEnumerable MediaTypes { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/MediaManagerIndexViewModel.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/MediaManagerIndexViewModel.cs index 91028a16a..0656aaf7a 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/MediaManagerIndexViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/MediaManagerIndexViewModel.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using Orchard.ContentManagement.MetaData.Models; using Orchard.MediaLibrary.Models; namespace Orchard.MediaLibrary.ViewModels { @@ -6,7 +7,7 @@ namespace Orchard.MediaLibrary.ViewModels { public IEnumerable Folders { get; set; } public string FolderPath { get; set; } public bool DialogMode { get; set; } - public string[] MediaTypes { get; set; } + public IEnumerable MediaTypes { get; set; } public dynamic CustomActionsShapes { get; set; } public dynamic CustomNavigationShapes { get; set; } } diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/OEmbedViewModel.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/OEmbedViewModel.cs index 3a35f26f4..e759b8872 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/OEmbedViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/ViewModels/OEmbedViewModel.cs @@ -6,5 +6,6 @@ namespace Orchard.MediaLibrary.ViewModels { public string Url { get; set; } public XDocument Content { get; set; } public bool Success { get; set; } + public string Type { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Admin/Import.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Admin/Import.cshtml index 7fad8c36a..4f866713c 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Admin/Import.cshtml +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Admin/Import.cshtml @@ -19,10 +19,20 @@
+ + + + @T("Close")
@T("Media Folders") @foreach (var folder in Model.FolderPath.Split(new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar}, StringSplitOptions.RemoveEmptyEntries)) { > @folder} +
@@ -44,19 +54,43 @@ - - - @using (Script.Foot()) { } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/ClientStorage/Index.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/ClientStorage/Index.cshtml index 38646d51a..88f9f552a 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/ClientStorage/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/ClientStorage/Index.cshtml @@ -1,4 +1,4 @@ -@using System.Text +@model Orchard.MediaLibrary.ViewModels.ImportMediaViewModel @@ -87,7 +87,8 @@ url: '@Url.Action("Upload", "ClientStorage")', autoUpload: true, formData: { - folderPath: '@HttpUtility.JavaScriptStringEncode(Model)', + folderPath: '@HttpUtility.JavaScriptStringEncode(Model.FolderPath)', + type: '@HttpUtility.JavaScriptStringEncode(Model.Type)', __RequestVerificationToken: '@Html.AntiForgeryTokenValueOrchard()' }, done: function (e, data) { diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/OEmbed/Index.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/OEmbed/Index.cshtml index a01f4abfa..1569efb97 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/OEmbed/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/OEmbed/Index.cshtml @@ -74,6 +74,7 @@ using (Html.BeginFormAntiForgeryPost(Url.Action("MediaPost"))) { @Html.Hidden("url", Model.Url) @Html.Hidden("folderPath", Model.FolderPath) + @Html.Hidden("type", Model.Type) @Html.Hidden("document", Model.Content.ToString()) diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Parts/MediaLibrary.Actions.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Parts/MediaLibrary.Actions.cshtml index 1104b08f3..7fe01d218 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Parts/MediaLibrary.Actions.cshtml +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/Parts/MediaLibrary.Actions.cshtml @@ -7,7 +7,7 @@ diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/WebSearch/Index.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/WebSearch/Index.cshtml index bcf07f7db..0b0251555 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/WebSearch/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/WebSearch/Index.cshtml @@ -1,4 +1,6 @@ -@using System.Text +@model Orchard.MediaLibrary.ViewModels.ImportMediaViewModel + +@using System.Text @using Orchard.ContentManagement @using Orchard.MediaLibrary.Models @@ -83,7 +85,8 @@ @Html.Hidden("antiforgerytoken", Html.AntiForgeryTokenValueOrchard()) @Html.Hidden("action", Url.Action("ImagePost")) - @Html.Hidden("folderPath", (string)Model) + @Html.Hidden("folderPath", Model.FolderPath) + @Html.Hidden("type", Model.Type) @using(Script.Foot()) {