Skip to content

Commit 3561be6

Browse files
Moved embed video import to a dedicated service. (#8827)
1 parent 5c3d045 commit 3561be6

File tree

4 files changed

+67
-33
lines changed

4 files changed

+67
-33
lines changed

src/Orchard.Web/Modules/Orchard.MediaLibrary/Controllers/OEmbedController.cs

+7-33
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,16 @@ namespace Orchard.MediaLibrary.Controllers {
1717
[Admin, Themed(false)]
1818
public class OEmbedController : Controller {
1919
private readonly IMediaLibraryService _mediaLibraryService;
20+
private readonly IOEmbedService _oEmbedService;
2021

2122
public OEmbedController(
2223
IOrchardServices services,
23-
IMediaLibraryService mediaManagerService) {
24-
_mediaLibraryService = mediaManagerService;
24+
IMediaLibraryService mediaManagerService,
25+
IOEmbedService oEmbedService) {
26+
2527
Services = services;
28+
_mediaLibraryService = mediaManagerService;
29+
_oEmbedService = oEmbedService;
2630
T = NullLocalizer.Instance;
2731
}
2832

@@ -78,39 +82,9 @@ public ActionResult IndexPOST(string folderPath, string url, string type, string
7882
}
7983
}
8084

81-
var webClient = new WebClient { Encoding = Encoding.UTF8 };
8285
try {
83-
// <link rel="alternate" href="http://vimeo.com/api/oembed.xml?url=http%3A%2F%2Fvimeo.com%2F23608259" type="text/xml+oembed">
84-
85-
var source = webClient.DownloadString(url);
86+
viewModel.Content = _oEmbedService.DownloadMediaData(url);
8687

87-
// seek type="text/xml+oembed" or application/xml+oembed
88-
var oembedSignature = source.IndexOf("type=\"text/xml+oembed\"", StringComparison.OrdinalIgnoreCase);
89-
if (oembedSignature == -1) {
90-
oembedSignature = source.IndexOf("type=\"application/xml+oembed\"", StringComparison.OrdinalIgnoreCase);
91-
}
92-
if (oembedSignature != -1) {
93-
var tagStart = source.Substring(0, oembedSignature).LastIndexOf('<');
94-
var tagEnd = source.IndexOf('>', oembedSignature);
95-
var tag = source.Substring(tagStart, tagEnd - tagStart);
96-
var matches = new Regex("href=\"([^\"]+)\"").Matches(tag);
97-
if (matches.Count > 0) {
98-
var href = matches[0].Groups[1].Value;
99-
try {
100-
var content = webClient.DownloadString(Server.HtmlDecode(href));
101-
viewModel.Content = XDocument.Parse(content);
102-
}
103-
catch {
104-
// bubble exception
105-
}
106-
}
107-
}
108-
if (viewModel.Content == null) {
109-
viewModel.Content = new XDocument(
110-
new XDeclaration("1.0", "utf-8", "yes"),
111-
new XElement("oembed")
112-
);
113-
}
11488
var root = viewModel.Content.Root;
11589
if (!String.IsNullOrWhiteSpace(url)) {
11690
root.El("url", url);

src/Orchard.Web/Modules/Orchard.MediaLibrary/Orchard.MediaLibrary.csproj

+2
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,9 @@
200200
<Compile Include="Security\MediaAuthorizationEventHandler.cs" />
201201
<Compile Include="Services\IMediaLibraryService.cs" />
202202
<Compile Include="Providers\IMediaFolderProvider.cs" />
203+
<Compile Include="Services\IOEmbedService.cs" />
203204
<Compile Include="Services\MediaLibraryService.cs" />
205+
<Compile Include="Services\OEmbedService.cs" />
204206
<Compile Include="Services\Shapes.cs" />
205207
<Compile Include="Services\XmlRpcHandler.cs" />
206208
<Compile Include="Settings\MediaLibraryPickerFieldEditorEvents.cs" />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using System.Xml.Linq;
2+
3+
namespace Orchard.MediaLibrary.Services {
4+
public interface IOEmbedService : IDependency {
5+
XDocument DownloadMediaData(string url);
6+
}
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System;
2+
using System.Net;
3+
using System.Text;
4+
using System.Text.RegularExpressions;
5+
using System.Web;
6+
using System.Xml.Linq;
7+
8+
namespace Orchard.MediaLibrary.Services {
9+
public class OEmbedService : IOEmbedService {
10+
public XDocument DownloadMediaData(string url) {
11+
var webClient = new WebClient { Encoding = Encoding.UTF8 };
12+
XDocument doc = null;
13+
try {
14+
// <link rel="alternate" href="http://vimeo.com/api/oembed.xml?url=http%3A%2F%2Fvimeo.com%2F23608259" type="text/xml+oembed">
15+
var source = webClient.DownloadString(url);
16+
17+
// seek type="text/xml+oembed" or application/xml+oembed
18+
var oembedSignature = source.IndexOf("type=\"text/xml+oembed\"", StringComparison.OrdinalIgnoreCase);
19+
if (oembedSignature == -1) {
20+
oembedSignature = source.IndexOf("type=\"application/xml+oembed\"", StringComparison.OrdinalIgnoreCase);
21+
}
22+
if (oembedSignature != -1) {
23+
var tagStart = source.Substring(0, oembedSignature).LastIndexOf('<');
24+
var tagEnd = source.IndexOf('>', oembedSignature);
25+
var tag = source.Substring(tagStart, tagEnd - tagStart);
26+
var matches = new Regex("href=\"([^\"]+)\"").Matches(tag);
27+
if (matches.Count > 0) {
28+
var href = matches[0].Groups[1].Value;
29+
try {
30+
var content = webClient.DownloadString(HttpUtility.HtmlDecode(href));
31+
doc = XDocument.Parse(content);
32+
} catch {
33+
// bubble exception
34+
}
35+
}
36+
}
37+
} catch {
38+
doc = null;
39+
}
40+
41+
if (doc == null) {
42+
doc = new XDocument(
43+
new XDeclaration("1.0", "utf-8", "yes"),
44+
new XElement("oembed")
45+
);
46+
}
47+
48+
return doc;
49+
}
50+
}
51+
}

0 commit comments

Comments
 (0)