From 89c562c50216498ecf3b0a87d7ca8832005b4cdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mil=C3=A1n=20Keszthelyi?= Date: Thu, 4 Jul 2019 21:04:35 +0200 Subject: [PATCH] MediaLibrary: Refactoring web search API (Lombiq Technologies: ORCH-206), fixes #7118 (#8229) Fixes #7118 --- .../Controllers/Api/IBingApi.cs | 10 + .../Controllers/Api/IGoogleApi.cs | 10 + .../Controllers/Api/IPixabayApi.cs | 10 + .../Controllers/Api/WebSearchApiController.cs | 32 +++ .../Controllers/WebSearchController.cs | 4 +- .../Extensions/WebSearchProviderExtensions.cs | 10 + .../BingWebSearchSettingsPartHandler.cs | 13 ++ .../GoogleWebSearchSettingsPartHandler.cs | 13 ++ .../PixabayWebSearchSettingsPartHandler.cs | 13 ++ .../Handlers/WebSearchSettingsPartHandler.cs | 17 ++ .../Models/BingWebSearchSettingsPart.cs | 6 + .../Models/GoogleWebSearchSettingsPart.cs | 12 ++ .../Models/IWebSearchSettings.cs | 5 + .../Models/PixabayWebSearchSettingsPart.cs | 6 + .../Models/WebSearchSettingsBase.cs | 10 + .../Orchard.MediaLibrary.WebSearch/Module.txt | 27 +++ .../Orchard.MediaLibrary.WebSearch.csproj | 201 ++++++++++++++++++ .../Permissions.cs | 30 +++ .../Properties/AssemblyInfo.cs | 37 ++++ .../Providers/BingWebSearchProvider.cs | 55 +++++ .../Providers/GoogleWebSearchProvider.cs | 55 +++++ .../Providers/IWebSearchProvider.cs | 11 + .../Providers/PixabayWebSearchProvider.cs | 53 +++++ .../Providers/WebSearchMenu.cs | 9 +- .../Styles/Images/ajax-loader.gif | Bin 0 -> 847 bytes .../Styles/Web.config | 12 ++ .../Styles/menu.websearch-mediaproviders.css | 0 .../Styles/orchard-websearch-admin.css | 31 ++- .../ViewModels/WebSearchResult.cs | 10 + .../WebSearch.BingWebSearchSettings.cshtml | 11 + .../WebSearch.GoogleWebSearchSettings.cshtml | 14 ++ .../WebSearch.PixabayWebSearchSettings.cshtml | 11 + .../Views/WebSearch/Index.cshtml | 124 ++++++----- .../Orchard.MediaLibrary.WebSearch/Web.config | 67 ++++++ .../packages.config | 10 + .../Handlers/WebSearchSettingsPartHandler.cs | 23 -- .../Models/WebSearchSettingsPart.cs | 12 -- .../Orchard.MediaLibrary.csproj | 12 -- .../Parts/WebSearch.WebSearchSettings.cshtml | 11 - src/Orchard.sln | 14 ++ 40 files changed, 889 insertions(+), 122 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/Api/IBingApi.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/Api/IGoogleApi.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/Api/IPixabayApi.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/Api/WebSearchApiController.cs rename src/Orchard.Web/Modules/{Orchard.MediaLibrary => Orchard.MediaLibrary.WebSearch}/Controllers/WebSearchController.cs (97%) create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Extensions/WebSearchProviderExtensions.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Handlers/BingWebSearchSettingsPartHandler.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Handlers/GoogleWebSearchSettingsPartHandler.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Handlers/PixabayWebSearchSettingsPartHandler.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Handlers/WebSearchSettingsPartHandler.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/BingWebSearchSettingsPart.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/GoogleWebSearchSettingsPart.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/IWebSearchSettings.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/PixabayWebSearchSettingsPart.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/WebSearchSettingsBase.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Module.txt create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Orchard.MediaLibrary.WebSearch.csproj create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Permissions.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Properties/AssemblyInfo.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/BingWebSearchProvider.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/GoogleWebSearchProvider.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/IWebSearchProvider.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/PixabayWebSearchProvider.cs rename src/Orchard.Web/Modules/{Orchard.MediaLibrary => Orchard.MediaLibrary.WebSearch}/Providers/WebSearchMenu.cs (65%) create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Styles/Images/ajax-loader.gif create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Styles/Web.config rename src/Orchard.Web/Modules/{Orchard.MediaLibrary => Orchard.MediaLibrary.WebSearch}/Styles/menu.websearch-mediaproviders.css (100%) rename src/Orchard.Web/Modules/{Orchard.MediaLibrary => Orchard.MediaLibrary.WebSearch}/Styles/orchard-websearch-admin.css (91%) create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/ViewModels/WebSearchResult.cs create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Views/EditorTemplates/Parts/WebSearch.BingWebSearchSettings.cshtml create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Views/EditorTemplates/Parts/WebSearch.GoogleWebSearchSettings.cshtml create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Views/EditorTemplates/Parts/WebSearch.PixabayWebSearchSettings.cshtml rename src/Orchard.Web/Modules/{Orchard.MediaLibrary => Orchard.MediaLibrary.WebSearch}/Views/WebSearch/Index.cshtml (72%) create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Web.config create mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/packages.config delete mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary/Handlers/WebSearchSettingsPartHandler.cs delete mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary/Models/WebSearchSettingsPart.cs delete mode 100644 src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/EditorTemplates/Parts/WebSearch.WebSearchSettings.cshtml diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/Api/IBingApi.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/Api/IBingApi.cs new file mode 100644 index 000000000..4a5ec4bba --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/Api/IBingApi.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using RestEase; + +namespace Orchard.MediaLibrary.WebSearch.Controllers.Api { + [Header("User-Agent", "RestEase")] + public interface IBingApi { + [Get("bing/v7.0/images/search")] + Task GetImagesAsync([Header("Ocp-Apim-Subscription-Key")] string apiKey, string q); + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/Api/IGoogleApi.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/Api/IGoogleApi.cs new file mode 100644 index 000000000..9d0f5794d --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/Api/IGoogleApi.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using RestEase; + +namespace Orchard.MediaLibrary.WebSearch.Controllers.Api { + [Header("User-Agent", "RestEase")] + public interface IGoogleApi { + [Get("customsearch/v1")] + Task GetImagesAsync(string key, string cx, string q, string searchType = "image"); + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/Api/IPixabayApi.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/Api/IPixabayApi.cs new file mode 100644 index 000000000..12da6742f --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/Api/IPixabayApi.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using RestEase; + +namespace Orchard.MediaLibrary.WebSearch.Controllers.Api { + [Header("User-Agent", "RestEase")] + public interface IPixabayApi { + [Get("api/")] + Task GetImagesAsync(string key, string q); + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/Api/WebSearchApiController.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/Api/WebSearchApiController.cs new file mode 100644 index 000000000..aa486ebe3 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/Api/WebSearchApiController.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Web.Http; +using Orchard.MediaLibrary.WebSearch.Providers; +using Orchard.Security; + +namespace Orchard.MediaLibrary.WebSearch.Controllers.Api { + public class WebSearchApiController : ApiController { + private readonly IAuthorizer _authorizer; + private readonly IEnumerable _wsp; + + public WebSearchApiController(IAuthorizer authorizer, IEnumerable wsp) { + _authorizer = authorizer; + _wsp = wsp; + } + + [HttpGet] + public IHttpActionResult GetImages(string query, string providerType) { + if (!_authorizer.Authorize(Permissions.AccessMediaWebSearch)) { + return StatusCode(HttpStatusCode.Unauthorized); + } + + var selectedProvider = _wsp.FirstOrDefault(provider => provider.Name == providerType); + if (selectedProvider == null || !selectedProvider.IsValid()) { + return NotFound(); + } + + return Json(selectedProvider.GetImages(query)); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/WebSearchController.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/WebSearchController.cs similarity index 97% rename from src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/WebSearchController.cs rename to src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/WebSearchController.cs index 84802dc9a..50791e65c 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/WebSearchController.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Controllers/WebSearchController.cs @@ -3,6 +3,7 @@ using System.IO; using System.Net; using System.Web.Mvc; using Orchard.ContentManagement; +using Orchard.Environment.Extensions; using Orchard.FileSystems.Media; using Orchard.Localization; using Orchard.MediaLibrary.Models; @@ -13,6 +14,7 @@ using Orchard.UI.Admin; namespace Orchard.MediaLibrary.Controllers { [Admin, Themed(false)] + [OrchardFeature("Orchard.MediaLibrary.WebSearch")] public class WebSearchController : Controller { private readonly IMediaLibraryService _mediaLibraryService; private readonly IContentManager _contentManager; @@ -103,7 +105,7 @@ namespace Orchard.MediaLibrary.Controllers { return HttpNotFound(); // Check permission - if (!(_mediaLibraryService.CheckMediaFolderPermission(Permissions.EditMediaContent, replaceMedia.FolderPath) && _mediaLibraryService.CheckMediaFolderPermission(Permissions.ImportMediaContent, replaceMedia.FolderPath)) + if (!(_mediaLibraryService.CheckMediaFolderPermission(Permissions.EditMediaContent, replaceMedia.FolderPath) && _mediaLibraryService.CheckMediaFolderPermission(Permissions.ImportMediaContent, replaceMedia.FolderPath)) && !_mediaLibraryService.CanManageMediaFolder(replaceMedia.FolderPath)) { return new HttpUnauthorizedResult(); } diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Extensions/WebSearchProviderExtensions.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Extensions/WebSearchProviderExtensions.cs new file mode 100644 index 000000000..56d78c062 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Extensions/WebSearchProviderExtensions.cs @@ -0,0 +1,10 @@ +using System; +using Orchard.MediaLibrary.WebSearch.Providers; + +namespace Orchard.MediaLibrary.WebSearch { + public static class WebSearchProviderExtensions { + public static string GetApiKey(this IWebSearchProvider provider) => provider.Settings.ApiKey; + + public static bool IsValid(this IWebSearchProvider provider) => !String.IsNullOrEmpty(provider.GetApiKey()); + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Handlers/BingWebSearchSettingsPartHandler.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Handlers/BingWebSearchSettingsPartHandler.cs new file mode 100644 index 000000000..efeef4704 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Handlers/BingWebSearchSettingsPartHandler.cs @@ -0,0 +1,13 @@ +using Orchard.ContentManagement.Handlers; +using Orchard.Environment.Extensions; +using Orchard.MediaLibrary.WebSearch.Models; + +namespace Orchard.MediaLibrary.WebSearch.Handlers { + [OrchardFeature("Orchard.MediaLibrary.WebSearch.Bing")] + public class BingWebSearchSettingsPartHandler : ContentHandler { + public BingWebSearchSettingsPartHandler() { + Filters.Add(new ActivatingFilter("Site")); + Filters.Add(new TemplateFilterForPart("BingWebSearchSettings", "Parts/WebSearch.BingWebSearchSettings", "media")); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Handlers/GoogleWebSearchSettingsPartHandler.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Handlers/GoogleWebSearchSettingsPartHandler.cs new file mode 100644 index 000000000..2a168af04 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Handlers/GoogleWebSearchSettingsPartHandler.cs @@ -0,0 +1,13 @@ +using Orchard.ContentManagement.Handlers; +using Orchard.Environment.Extensions; +using Orchard.MediaLibrary.WebSearch.Models; + +namespace Orchard.MediaLibrary.WebSearch.Handlers { + [OrchardFeature("Orchard.MediaLibrary.WebSearch.Google")] + public class GoogleWebSearchSettingsPartHandler : ContentHandler { + public GoogleWebSearchSettingsPartHandler() { + Filters.Add(new ActivatingFilter("Site")); + Filters.Add(new TemplateFilterForPart("GoogleWebSearchSettings", "Parts/WebSearch.GoogleWebSearchSettings", "media")); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Handlers/PixabayWebSearchSettingsPartHandler.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Handlers/PixabayWebSearchSettingsPartHandler.cs new file mode 100644 index 000000000..758d07a52 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Handlers/PixabayWebSearchSettingsPartHandler.cs @@ -0,0 +1,13 @@ +using Orchard.ContentManagement.Handlers; +using Orchard.Environment.Extensions; +using Orchard.MediaLibrary.WebSearch.Models; + +namespace Orchard.MediaLibrary.WebSearch.Handlers { + [OrchardFeature("Orchard.MediaLibrary.WebSearch.Pixabay")] + public class PixabayWebSearchSettingsPartHandler : ContentHandler { + public PixabayWebSearchSettingsPartHandler() { + Filters.Add(new ActivatingFilter("Site")); + Filters.Add(new TemplateFilterForPart("PixabayWebSearchSettings", "Parts/WebSearch.PixabayWebSearchSettings", "media")); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Handlers/WebSearchSettingsPartHandler.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Handlers/WebSearchSettingsPartHandler.cs new file mode 100644 index 000000000..c6356e924 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Handlers/WebSearchSettingsPartHandler.cs @@ -0,0 +1,17 @@ +using Orchard.ContentManagement; +using Orchard.ContentManagement.Handlers; +using Orchard.Environment.Extensions; +using Orchard.Localization; + +namespace Orchard.MediaLibrary.WebSearch.Handlers { + [OrchardFeature("Orchard.MediaLibrary.WebSearch")] + public class WebSearchSettingsPartHandler : ContentHandler { + public Localizer T { get; set; } + + protected override void GetItemMetadata(GetContentItemMetadataContext context) { + if (context.ContentItem.ContentType != "Site") return; + base.GetItemMetadata(context); + context.Metadata.EditorGroupInfo.Add(new GroupInfo(T("Media"))); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/BingWebSearchSettingsPart.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/BingWebSearchSettingsPart.cs new file mode 100644 index 000000000..1a041577f --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/BingWebSearchSettingsPart.cs @@ -0,0 +1,6 @@ +using Orchard.Environment.Extensions; + +namespace Orchard.MediaLibrary.WebSearch.Models { + [OrchardFeature("Orchard.MediaLibrary.WebSearch.Bing")] + public class BingWebSearchSettingsPart : WebSearchSettingsBase { } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/GoogleWebSearchSettingsPart.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/GoogleWebSearchSettingsPart.cs new file mode 100644 index 000000000..db1ce6d44 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/GoogleWebSearchSettingsPart.cs @@ -0,0 +1,12 @@ +using Orchard.ContentManagement; +using Orchard.Environment.Extensions; + +namespace Orchard.MediaLibrary.WebSearch.Models { + [OrchardFeature("Orchard.MediaLibrary.WebSearch.Google")] + public class GoogleWebSearchSettingsPart : WebSearchSettingsBase { + public string SearchEngineId { + get => this.Retrieve(x => x.SearchEngineId); + set => this.Store(x => x.SearchEngineId, value); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/IWebSearchSettings.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/IWebSearchSettings.cs new file mode 100644 index 000000000..183e054f9 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/IWebSearchSettings.cs @@ -0,0 +1,5 @@ +namespace Orchard.MediaLibrary.WebSearch.Models { + public interface IWebSearchSettings { + string ApiKey { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/PixabayWebSearchSettingsPart.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/PixabayWebSearchSettingsPart.cs new file mode 100644 index 000000000..2b3c72868 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/PixabayWebSearchSettingsPart.cs @@ -0,0 +1,6 @@ +using Orchard.Environment.Extensions; + +namespace Orchard.MediaLibrary.WebSearch.Models { + [OrchardFeature("Orchard.MediaLibrary.WebSearch.Pixabay")] + public class PixabayWebSearchSettingsPart : WebSearchSettingsBase { } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/WebSearchSettingsBase.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/WebSearchSettingsBase.cs new file mode 100644 index 000000000..1649fd3d5 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Models/WebSearchSettingsBase.cs @@ -0,0 +1,10 @@ +using Orchard.ContentManagement; + +namespace Orchard.MediaLibrary.WebSearch.Models { + public abstract class WebSearchSettingsBase : ContentPart, IWebSearchSettings { + public string ApiKey { + get => this.Retrieve(x => x.ApiKey); + set => this.Store(x => x.ApiKey, value); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Module.txt b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Module.txt new file mode 100644 index 000000000..44a56fcfd --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Module.txt @@ -0,0 +1,27 @@ +Name: Orchard.MediaLibrary.WebSearch +AntiForgery: enabled +Author: The Orchard Team, Lombiq Technologies Ltd. +Website: https://orchardproject.net +Version: 1.0 +OrchardVersion: 1.10.3 +Features: + Orchard.MediaLibrary.WebSearch: + Description: Base functionality for Orchard to be able import images from web search results to the Media Library. + Category: Media + Name: Media Library Web Search + Dependencies: Orchard.MediaLibrary + Orchard.MediaLibrary.WebSearch.Bing: + Description: Bing web search provider for importing images to the Media Library. + Category: Media + Name: Media Library Web Search - Bing + Dependencies: Orchard.MediaLibrary.WebSearch + Orchard.MediaLibrary.WebSearch.Pixabay: + Description: Pixabay web search provider for importing images to the Media Library. + Category: Media + Name: Media Library Web Search - Pixabay + Dependencies: Orchard.MediaLibrary.WebSearch + Orchard.MediaLibrary.WebSearch.Google: + Description: Google web search provider for importing images to the Media Library. + Category: Media + Name: Media Library Web Search - Google + Dependencies: Orchard.MediaLibrary.WebSearch diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Orchard.MediaLibrary.WebSearch.csproj b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Orchard.MediaLibrary.WebSearch.csproj new file mode 100644 index 000000000..e3c8201dc --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Orchard.MediaLibrary.WebSearch.csproj @@ -0,0 +1,201 @@ + + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {8EE141BE-7217-4F5B-8214-3146BEFA07E3} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + Orchard.MediaLibrary.WebSearch + Orchard.MediaLibrary.WebSearch + v4.5.2 + false + + + 4.0 + + + false + + + + + + + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + latest + ..\..\..\OrchardBasicCorrectness.ruleset + false + + + pdbonly + true + bin\ + TRACE + prompt + 4 + latest + AllRules.ruleset + false + + + + ..\..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll + True + + + + ..\..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll + True + + + ..\..\..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll + + + ..\..\..\packages\RestEase.1.4.9\lib\net45\RestEase.dll + + + + 3.5 + + + + + + + + + + ..\..\..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll + True + + + False + ..\..\..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll + + + ..\..\..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll + True + + + ..\..\..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll + True + + + ..\..\..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll + True + + + ..\..\..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Deployment.dll + True + + + ..\..\..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Razor.dll + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {2D1D92BB-4555-4CBE-8D0E-63563D6CE4C6} + Orchard.Framework + $(MvcBuildViews) + + + {9916839C-39FC-4CEB-A5AF-89CA7E87119F} + Orchard.Core + $(MvcBuildViews) + + + {73a7688a-5bd3-4f7e-adfa-ce36c5a10e3b} + Orchard.MediaLibrary + + + + + + + + + + + + + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + + + + + + + + False + True + 45979 + / + + + False + True + https://github.com/OrchardCMS/Orchard + False + + + + + \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Permissions.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Permissions.cs new file mode 100644 index 000000000..ca663e74d --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Permissions.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using Orchard.Environment.Extensions.Models; +using Orchard.Security.Permissions; + +namespace Orchard.MediaLibrary.WebSearch { + public class Permissions : IPermissionProvider { + public static readonly Permission AccessMediaWebSearch = + new Permission { Description = "Access Media Web Search", Name = nameof(AccessMediaWebSearch), ImpliedBy = new[] { MediaLibrary.Permissions.ManageMediaContent } }; + + public virtual Feature Feature { get; set; } + + public IEnumerable GetPermissions() => + new[] { + AccessMediaWebSearch + }; + + public IEnumerable GetDefaultStereotypes() => + new[] { + new PermissionStereotype { + Name = "Administrator", + Permissions = new[] { AccessMediaWebSearch } + }, + new PermissionStereotype { + Name = "Editor", + Permissions = new[] { AccessMediaWebSearch } + }, + }; + + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Properties/AssemblyInfo.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..ba39db590 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Properties/AssemblyInfo.cs @@ -0,0 +1,37 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Orchard.MediaLibrary.WebSearch")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyProduct("Orchard")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("e4d2186b-4697-44bf-8454-9183b9df6700")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.10.3")] +[assembly: AssemblyFileVersion("1.10.3")] + diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/BingWebSearchProvider.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/BingWebSearchProvider.cs new file mode 100644 index 000000000..509be815a --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/BingWebSearchProvider.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; +using System.Linq; +using Orchard.ContentManagement; +using Orchard.Environment.Extensions; +using Orchard.MediaLibrary.WebSearch.Controllers.Api; +using Orchard.MediaLibrary.WebSearch.Models; +using Orchard.MediaLibrary.WebSearch.ViewModels; +using Orchard.Services; +using Orchard.Settings; +using RestEase; + +namespace Orchard.MediaLibrary.WebSearch.Providers { + [OrchardFeature("Orchard.MediaLibrary.WebSearch.Bing")] + public class BingWebSearchProvider : IWebSearchProvider { + private const string BingBaseUrl = "https://api.cognitive.microsoft.com"; + + private readonly ISiteService _siteService; + private readonly IJsonConverter _jsonConverter; + + public BingWebSearchProvider(ISiteService siteService, IJsonConverter jsonConverter) { + _siteService = siteService; + _jsonConverter = jsonConverter; + } + + private BingWebSearchSettingsPart _settings => + _siteService.GetSiteSettings().As(); + + public IWebSearchSettings Settings => _settings; + + public string Name => "Bing"; + + public IEnumerable GetImages(string query) { + var client = RestClient.For(BingBaseUrl); + + var apiResponse = client.GetImagesAsync(this.GetApiKey(), query); + var apiResult = _jsonConverter.Deserialize(apiResponse.Result); + var webSearchResult = new List(); + + foreach (var hit in apiResult.value) { + string imageSize = hit.contentSize; + + webSearchResult.Add(new WebSearchResult() { + ThumbnailUrl = hit.thumbnailUrl, + Width = hit.width, + Height = hit.height, + ImageUrl = hit.contentUrl, + Size = int.Parse(imageSize.Substring(0, imageSize.Length - 2)), + PageUrl = hit.hostPageUrl + }); + } + + return webSearchResult.Any() ? webSearchResult : Enumerable.Empty(); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/GoogleWebSearchProvider.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/GoogleWebSearchProvider.cs new file mode 100644 index 000000000..d2357394c --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/GoogleWebSearchProvider.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; +using System.Linq; +using Orchard.ContentManagement; +using Orchard.Environment.Extensions; +using Orchard.MediaLibrary.WebSearch.Controllers.Api; +using Orchard.MediaLibrary.WebSearch.Models; +using Orchard.MediaLibrary.WebSearch.ViewModels; +using Orchard.Services; +using Orchard.Settings; +using RestEase; + +namespace Orchard.MediaLibrary.WebSearch.Providers { + [OrchardFeature("Orchard.MediaLibrary.WebSearch.Google")] + public class GoogleWebSearchProvider : IWebSearchProvider { + private const string GoogleBaseUrl = "https://www.googleapis.com"; + + private readonly ISiteService _siteService; + private readonly IJsonConverter _jsonConverter; + + public GoogleWebSearchProvider(ISiteService siteService, IJsonConverter jsonConverter) { + _siteService = siteService; + _jsonConverter = jsonConverter; + } + + private GoogleWebSearchSettingsPart _settings => + _siteService.GetSiteSettings().As(); + + public IWebSearchSettings Settings => _settings; + + public string Name => "Google"; + + public IEnumerable GetImages(string query) { + var client = RestClient.For(GoogleBaseUrl); + + var apiResponse = client.GetImagesAsync(this.GetApiKey(), _settings.SearchEngineId, query); + var apiResult = _jsonConverter.Deserialize(apiResponse.Result); + var webSearchResult = new List(); + + foreach (var hit in apiResult.items) { + string imageSize = hit.contentSize; + + webSearchResult.Add(new WebSearchResult() { + ThumbnailUrl = hit.image.thumbnailLink, + Width = hit.image.width, + Height = hit.image.height, + ImageUrl = hit.link, + Size = hit.image.byteSize, + PageUrl = hit.image.contextLink + }); + } + + return webSearchResult.Any() ? webSearchResult : Enumerable.Empty(); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/IWebSearchProvider.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/IWebSearchProvider.cs new file mode 100644 index 000000000..eac27e4c5 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/IWebSearchProvider.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using Orchard.MediaLibrary.WebSearch.Models; +using Orchard.MediaLibrary.WebSearch.ViewModels; + +namespace Orchard.MediaLibrary.WebSearch.Providers { + public interface IWebSearchProvider : IDependency { + string Name { get; } + IWebSearchSettings Settings { get; } + IEnumerable GetImages(string query); + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/PixabayWebSearchProvider.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/PixabayWebSearchProvider.cs new file mode 100644 index 000000000..047328133 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/PixabayWebSearchProvider.cs @@ -0,0 +1,53 @@ +using System.Collections.Generic; +using System.Linq; +using Orchard.ContentManagement; +using Orchard.Environment.Extensions; +using Orchard.MediaLibrary.WebSearch.Controllers.Api; +using Orchard.MediaLibrary.WebSearch.Models; +using Orchard.MediaLibrary.WebSearch.ViewModels; +using Orchard.Services; +using Orchard.Settings; +using RestEase; + +namespace Orchard.MediaLibrary.WebSearch.Providers { + [OrchardFeature("Orchard.MediaLibrary.WebSearch.Pixabay")] + public class PixabayWebSearchProvider : IWebSearchProvider { + private const string PixabayBaseUrl = "https://pixabay.com"; + + private readonly ISiteService _siteService; + private readonly IJsonConverter _jsonConverter; + + public PixabayWebSearchProvider(ISiteService siteService, IJsonConverter jsonConverter) { + _siteService = siteService; + _jsonConverter = jsonConverter; + } + + public string Name => "Pixabay"; + + private PixabayWebSearchSettingsPart _settings => + _siteService.GetSiteSettings().As(); + + public IWebSearchSettings Settings => _settings; + + public IEnumerable GetImages(string query) { + var client = RestClient.For(PixabayBaseUrl); + + var apiResponse = client.GetImagesAsync(this.GetApiKey(), query); + var apiResult = _jsonConverter.Deserialize(apiResponse.Result); + var webSearchResult = new List(); + + foreach (var hit in apiResult.hits) { + webSearchResult.Add(new WebSearchResult() { + ThumbnailUrl = hit.previewURL, + Width = hit.imageWidth, + Height = hit.imageHeight, + ImageUrl = hit.largeImageURL, + Size = hit.imageSize, + PageUrl = hit.pageURL + }); + } + + return webSearchResult.Any() ? webSearchResult : Enumerable.Empty(); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Providers/WebSearchMenu.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/WebSearchMenu.cs similarity index 65% rename from src/Orchard.Web/Modules/Orchard.MediaLibrary/Providers/WebSearchMenu.cs rename to src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/WebSearchMenu.cs index ab0b04cf8..8bf342000 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Providers/WebSearchMenu.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Providers/WebSearchMenu.cs @@ -1,7 +1,7 @@ using Orchard.Localization; using Orchard.UI.Navigation; -namespace Orchard.MediaLibrary.Providers { +namespace Orchard.MediaLibrary.WebSearch.Providers { public class WebSearchMenu : INavigationProvider { public Localizer T { get; set; } @@ -13,10 +13,9 @@ namespace Orchard.MediaLibrary.Providers { public void GetNavigation(NavigationBuilder builder) { builder.AddImageSet("websearch") - .Add(T("Web Search"), "7", - menu => menu.Action("Index", "WebSearch", new { area = "Orchard.MediaLibrary" }) - .Permission(Permissions.ManageOwnMedia) - .Permission(Permissions.ImportMediaContent)); + .Add(T("Web Search"), "7", + menu => menu.Action("Index", "WebSearch", new { area = "Orchard.MediaLibrary.WebSearch" }) + .Permission(Permissions.AccessMediaWebSearch)); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Styles/Images/ajax-loader.gif b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Styles/Images/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..a177ac30387a1d6446d027c90ef0e5f1030f7c98 GIT binary patch literal 847 zcmZ?wbhEHb6krfw_`(1J|NsAIV`DpZ>{wM*)sG)PZrr$`p`j5L7WU%Bi;j+t88c=` zNlB%prCC^5Y}>YN#flYRO~ew4|D>FYQWHy3QxwWGOEMG^vl1(E@)J|^GV{{%85DoA zFmM5lQvA>D=Nc01>=@u`q-Vg)2o%x**#L4R18abSLSIVeyrl*rIf_~>39Hu55IHtc z%CzAF+s%%K=w22Zrp(rWi2|*Rovn-d)@bT9ct-tLq>}Vum&c?D7A-4G)nqF=O|unj zghf78${u~+?*z4%5!sRq1%)p6OFbD{Qb!-GSmB`JT6^HY!D~mEIC`cuq-KZ+@f|KlI$B?E`RzKdsAZ)9=nHHN!5+~JF4SY+VADb}iE(C2i8t1nx? z>)BhLPr!xSeU=1ZCGIiz=tUh=%0dxr@rUg_IU5ygalxp)sM2H`HyJWYHZ-zNH1PH9x2Q zZ-80Df@}@QZ@}1F;lSf+C~)YcL~g9a@tqPLJr~+;Xs`=(v6wI^JlD{XSmvgf=)n*X zJcFY#*L2BN#v~VyEo=;{b|xn2aP_G+6c~#oA5q?*{)6|861$0+d4QT$gnolYPp=Bh zQdVS3z+soy%IayL(jn0+=WV`;*F%T>V5e?L zvsP2HtCWbqlEbVA#nav0=JHKcBOC28X^OOB!p8W_OR8B7-$3d4d4| D%;E!Y literal 0 HcmV?d00001 diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Styles/Web.config b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Styles/Web.config new file mode 100644 index 000000000..176fe49cd --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Styles/Web.config @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Styles/menu.websearch-mediaproviders.css b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Styles/menu.websearch-mediaproviders.css similarity index 100% rename from src/Orchard.Web/Modules/Orchard.MediaLibrary/Styles/menu.websearch-mediaproviders.css rename to src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Styles/menu.websearch-mediaproviders.css diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Styles/orchard-websearch-admin.css b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Styles/orchard-websearch-admin.css similarity index 91% rename from src/Orchard.Web/Modules/Orchard.MediaLibrary/Styles/orchard-websearch-admin.css rename to src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Styles/orchard-websearch-admin.css index a51e39431..0a72103da 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Styles/orchard-websearch-admin.css +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Styles/orchard-websearch-admin.css @@ -66,6 +66,14 @@ padding-left: 5px; } + #websearch-results .overlay .filename { + overflow: hidden; + -ms-text-overflow: ellipsis; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; + } + /* PROPERTIES */ #websearch-properties { @@ -153,16 +161,17 @@ /* SEARCH */ .query-container { + display: flex; margin: 5px; width: 90%; margin-bottom: 10px; } -#query { - margin-right: 40px; +.media-websearch-input-field { + width: 100%; } - #query input { + .media-websearch-input-field input { width: 100%; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; @@ -170,12 +179,11 @@ height: 28px; } -#icon { - float: right; - width:40px; +.media-websearch-search-icon { + width: 40px; } -#icon button { +.media-websearch-search-icon button { height: 28px; width: 40px; border: none; @@ -188,6 +196,15 @@ font-size: 18px; } +.media-websearch-api-selector-container { + margin-left: 10px; +} + + .media-websearch-api-selector-container .media-websearch-api-selector { + padding-top: 5px; + padding-bottom: 5px; + } + .actions { margin-top: 5px; } diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/ViewModels/WebSearchResult.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/ViewModels/WebSearchResult.cs new file mode 100644 index 000000000..7b7a3de31 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/ViewModels/WebSearchResult.cs @@ -0,0 +1,10 @@ +namespace Orchard.MediaLibrary.WebSearch.ViewModels { + public class WebSearchResult { + public string ThumbnailUrl { get; set; } + public int Width { get; set; } + public int Height { get; set; } + public string ImageUrl { get; set; } + public int Size { get; set; } + public string PageUrl { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Views/EditorTemplates/Parts/WebSearch.BingWebSearchSettings.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Views/EditorTemplates/Parts/WebSearch.BingWebSearchSettings.cshtml new file mode 100644 index 000000000..36c9ab3e5 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Views/EditorTemplates/Parts/WebSearch.BingWebSearchSettings.cshtml @@ -0,0 +1,11 @@ +@model Orchard.MediaLibrary.WebSearch.Models.BingWebSearchSettingsPart + +
+ @T("Bing Web Search") +
+ @Html.TextBoxFor(m => m.ApiKey, new { type = "password", @class = "text medium"}) + @T("Your private key.") +
+ + @T("Get a free API Key on {0}.", Html.Raw("Azure")) +
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Views/EditorTemplates/Parts/WebSearch.GoogleWebSearchSettings.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Views/EditorTemplates/Parts/WebSearch.GoogleWebSearchSettings.cshtml new file mode 100644 index 000000000..83eda4513 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Views/EditorTemplates/Parts/WebSearch.GoogleWebSearchSettings.cshtml @@ -0,0 +1,14 @@ +@model Orchard.MediaLibrary.WebSearch.Models.GoogleWebSearchSettingsPart + +
+ @T("Google Web Search") +
+ @Html.TextBoxFor(m => m.ApiKey, new { type = "password", @class = "text medium"}) + @T("Your private key.") + + @Html.TextBoxFor(m => m.SearchEngineId, new { type = "password", @class = "text medium"}) + @T("Your search engine ID aka cx.") +
+ + @T("Get a free API Key on {0}. Also, you need to create custom search engine at {1} based on your search criteria.", Html.Raw("Google API Console"), Html.Raw("Google Custom Search")) +
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Views/EditorTemplates/Parts/WebSearch.PixabayWebSearchSettings.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Views/EditorTemplates/Parts/WebSearch.PixabayWebSearchSettings.cshtml new file mode 100644 index 000000000..2c9001266 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Views/EditorTemplates/Parts/WebSearch.PixabayWebSearchSettings.cshtml @@ -0,0 +1,11 @@ +@model Orchard.MediaLibrary.WebSearch.Models.PixabayWebSearchSettingsPart + +
+ @T("Pixabay Web Search") +
+ @Html.TextBoxFor(m => m.ApiKey, new { type = "password", @class = "text medium" }) + @T("Your private key.") +
+ + @T("Get a free API Key on {0}.", Html.Raw("
Pixabay")) +
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/WebSearch/Index.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Views/WebSearch/Index.cshtml similarity index 72% rename from src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/WebSearch/Index.cshtml rename to src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Views/WebSearch/Index.cshtml index 409caf9d7..6a2f9fe6e 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/WebSearch/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Views/WebSearch/Index.cshtml @@ -1,8 +1,8 @@ @model Orchard.MediaLibrary.ViewModels.ImportMediaViewModel -@using System.Text -@using Orchard.ContentManagement -@using Orchard.MediaLibrary.Models +@using Orchard.MediaLibrary.WebSearch +@using Orchard.MediaLibrary.WebSearch.Providers +@using System.Linq @@ -10,70 +10,90 @@ @{ Script.Require("jQuery").AtFoot(); Script.Require("Knockout").AtFoot(); - + Style.Include("orchard-mediaproviders-admin.css"); Style.Include("orchard-websearch-admin.css"); Style.Require("FontAwesome"); + + var webSearchProviders = WorkContext.Resolve>(); + + var hasValidProvider = webSearchProviders.Any(); + var hasValidApiKey = webSearchProviders.Any(provider => provider.IsValid()); + var apiNames = webSearchProviders.Select(provider => provider.Name); } @Display.Metas() @Display.HeadScripts() @Display.HeadLinks() @Display.StyleSheetLinks() - - @{ - var apiKey = WorkContext.CurrentSite.As().ApiKey; - } - +
- - - @if (String.IsNullOrWhiteSpace(apiKey)) { + @if (!hasValidProvider) + { +
+ @T("You need to enable a Web Search provider feature like \"Media Library Web Search - Bing\".") +
+ return; + } + @if (!hasValidApiKey) + {
@T("You need to define an API Key in the Media settings before being able to use this feature.")
+ return; }
-
- +
+
-
- + +
+ +
+ +
+
    -
  • +
  • -

    +

+
- +

@T("SELECTION")

- +
  • -
    +
    @@ -81,10 +101,11 @@
-
+
- @using(Script.Foot()) { - + } - -@Display.FootScripts() + + @Display.FootScripts() \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Web.config b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Web.config new file mode 100644 index 000000000..8a1de1000 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/Web.config @@ -0,0 +1,67 @@ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/packages.config b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/packages.config new file mode 100644 index 000000000..e2ec26e1b --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary.WebSearch/packages.config @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Handlers/WebSearchSettingsPartHandler.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Handlers/WebSearchSettingsPartHandler.cs deleted file mode 100644 index 1cb01924e..000000000 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Handlers/WebSearchSettingsPartHandler.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Orchard.ContentManagement; -using Orchard.ContentManagement.Handlers; -using Orchard.Localization; -using Orchard.MediaLibrary.Models; - -namespace Orchard.MediaLibrary.Handlers { - public class WebSearchSettingsPartHandler : ContentHandler { - public WebSearchSettingsPartHandler() { - T = NullLocalizer.Instance; - Filters.Add(new ActivatingFilter("Site")); - Filters.Add(new TemplateFilterForPart("WebSearchSettings", "Parts/WebSearch.WebSearchSettings", "media")); - } - - public Localizer T { get; set; } - - protected override void GetItemMetadata(GetContentItemMetadataContext context) { - if (context.ContentItem.ContentType != "Site") - return; - base.GetItemMetadata(context); - context.Metadata.EditorGroupInfo.Add(new GroupInfo(T("Media"))); - } - } -} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Models/WebSearchSettingsPart.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Models/WebSearchSettingsPart.cs deleted file mode 100644 index f1a9fc060..000000000 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Models/WebSearchSettingsPart.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Orchard.ContentManagement; -using Orchard.ContentManagement.FieldStorage.InfosetStorage; - -namespace Orchard.MediaLibrary.Models { - public class WebSearchSettingsPart : ContentPart { - - public string ApiKey { - get { return this.As().Get("ApiKey"); } - set { this.As().Set("ApiKey", 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 e6bbc2024..13634d91a 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Orchard.MediaLibrary.csproj +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Orchard.MediaLibrary.csproj @@ -113,7 +113,6 @@ - @@ -122,7 +121,6 @@ - @@ -182,7 +180,6 @@ - @@ -200,14 +197,12 @@ - - @@ -217,7 +212,6 @@ - @@ -255,9 +249,6 @@ - - - @@ -377,9 +368,6 @@ - - - diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/EditorTemplates/Parts/WebSearch.WebSearchSettings.cshtml b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/EditorTemplates/Parts/WebSearch.WebSearchSettings.cshtml deleted file mode 100644 index b9ee02e80..000000000 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Views/EditorTemplates/Parts/WebSearch.WebSearchSettings.cshtml +++ /dev/null @@ -1,11 +0,0 @@ -@model Orchard.MediaLibrary.Models.WebSearchSettingsPart - -
- @T("Web Search") -
- @Html.TextBoxFor(m => m.ApiKey, new { @class = "text medium"}) - @T("Your private key.") -
- - @T("Get a free API Key on {0}", Html.Raw("http://datamarket.azure.com/dataset/bing/search")) -
\ No newline at end of file diff --git a/src/Orchard.sln b/src/Orchard.sln index f92168c67..ac7bfe3ce 100644 --- a/src/Orchard.sln +++ b/src/Orchard.sln @@ -94,6 +94,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.Web", "Orchard.Web\ {6BD8B2FA-F2E3-4AC8-A4C3-2925A653889A} = {6BD8B2FA-F2E3-4AC8-A4C3-2925A653889A} {14C049FD-B35B-415A-A824-87F26B26E7FD} = {14C049FD-B35B-415A-A824-87F26B26E7FD} {085948FF-0E9B-4A9A-B564-F8B8B4BDDDBC} = {085948FF-0E9B-4A9A-B564-F8B8B4BDDDBC} + {8EE141BE-7217-4F5B-8214-3146BEFA07E3} = {8EE141BE-7217-4F5B-8214-3146BEFA07E3} EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.Framework", "Orchard\Orchard.Framework.csproj", "{2D1D92BB-4555-4CBE-8D0E-63563D6CE4C6}" @@ -285,6 +286,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.OpenId", "Orchard.W EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.Glimpse", "Orchard.Web\Modules\Orchard.Glimpse\Orchard.Glimpse.csproj", "{71E17466-D937-49D7-8C7D-77CCBAB8CCF4}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.MediaLibrary.WebSearch", "Orchard.Web\Modules\Orchard.MediaLibrary.WebSearch\Orchard.MediaLibrary.WebSearch.csproj", "{8EE141BE-7217-4F5B-8214-3146BEFA07E3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution CodeCoverage|Any CPU = CodeCoverage|Any CPU @@ -1138,6 +1141,16 @@ Global {71E17466-D937-49D7-8C7D-77CCBAB8CCF4}.FxCop|Any CPU.Build.0 = Release|Any CPU {71E17466-D937-49D7-8C7D-77CCBAB8CCF4}.Release|Any CPU.ActiveCfg = Release|Any CPU {71E17466-D937-49D7-8C7D-77CCBAB8CCF4}.Release|Any CPU.Build.0 = Release|Any CPU + {8EE141BE-7217-4F5B-8214-3146BEFA07E3}.CodeCoverage|Any CPU.ActiveCfg = Release|Any CPU + {8EE141BE-7217-4F5B-8214-3146BEFA07E3}.CodeCoverage|Any CPU.Build.0 = Release|Any CPU + {8EE141BE-7217-4F5B-8214-3146BEFA07E3}.Coverage|Any CPU.ActiveCfg = Release|Any CPU + {8EE141BE-7217-4F5B-8214-3146BEFA07E3}.Coverage|Any CPU.Build.0 = Release|Any CPU + {8EE141BE-7217-4F5B-8214-3146BEFA07E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8EE141BE-7217-4F5B-8214-3146BEFA07E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8EE141BE-7217-4F5B-8214-3146BEFA07E3}.FxCop|Any CPU.ActiveCfg = Release|Any CPU + {8EE141BE-7217-4F5B-8214-3146BEFA07E3}.FxCop|Any CPU.Build.0 = Release|Any CPU + {8EE141BE-7217-4F5B-8214-3146BEFA07E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8EE141BE-7217-4F5B-8214-3146BEFA07E3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1228,6 +1241,7 @@ Global {1CC62F45-E6FF-43D5-84BF-509A1085D994} = {74E681ED-FECC-4034-B9BD-01B0BB1BDECA} {42E217C1-E163-4B6B-9E8F-42BEE21B6896} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5} {71E17466-D937-49D7-8C7D-77CCBAB8CCF4} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5} + {8EE141BE-7217-4F5B-8214-3146BEFA07E3} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EnterpriseLibraryConfigurationToolBinariesPath = packages\TransientFaultHandling.Core.5.1.1209.1\lib\NET4