aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2014-01-18 16:52:01 -0500
committerLuke Pulverenti <luke.pulverenti@gmail.com>2014-01-18 16:52:01 -0500
commit7f51148130a95b73c1d2cfac10aa04b3817944b5 (patch)
tree6cf65c3e33504eae9827dfaf5e990d49a26cd904 /MediaBrowser.Server.Implementations
parent5ca7d6355684b1599a0ceb952b93e25e74e6c098 (diff)
display news on dashboard home page
Diffstat (limited to 'MediaBrowser.Server.Implementations')
-rw-r--r--MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj1
-rw-r--r--MediaBrowser.Server.Implementations/News/NewsService.cs132
2 files changed, 133 insertions, 0 deletions
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
index e530eca46..907301699 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -173,6 +173,7 @@
<Compile Include="LiveTv\RefreshChannelsScheduledTask.cs" />
<Compile Include="Localization\LocalizationManager.cs" />
<Compile Include="MediaEncoder\MediaEncoder.cs" />
+ <Compile Include="News\NewsService.cs" />
<Compile Include="Persistence\SqliteChapterRepository.cs" />
<Compile Include="Persistence\SqliteExtensions.cs" />
<Compile Include="Persistence\SqliteMediaStreamsRepository.cs" />
diff --git a/MediaBrowser.Server.Implementations/News/NewsService.cs b/MediaBrowser.Server.Implementations/News/NewsService.cs
new file mode 100644
index 000000000..b01470d31
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/News/NewsService.cs
@@ -0,0 +1,132 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.News;
+using MediaBrowser.Model.News;
+using MediaBrowser.Model.Querying;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Xml;
+
+namespace MediaBrowser.Server.Implementations.News
+{
+ public class NewsService : INewsService
+ {
+ private readonly IApplicationPaths _appPaths;
+ private readonly IFileSystem _fileSystem;
+ private readonly IHttpClient _httpClient;
+
+ public NewsService(IApplicationPaths appPaths, IFileSystem fileSystem, IHttpClient httpClient)
+ {
+ _appPaths = appPaths;
+ _fileSystem = fileSystem;
+ _httpClient = httpClient;
+ }
+
+ public async Task<QueryResult<NewsItem>> GetProductNews(NewsQuery query)
+ {
+ var path = Path.Combine(_appPaths.CachePath, "news.xml");
+
+ await EnsureNewsFile(path).ConfigureAwait(false);
+
+ var items = GetNewsItems(path);
+
+ var itemsArray = items.ToArray();
+ var count = itemsArray.Length;
+
+ if (query.StartIndex.HasValue)
+ {
+ itemsArray = itemsArray.Skip(query.StartIndex.Value).ToArray();
+ }
+
+ if (query.Limit.HasValue)
+ {
+ itemsArray = itemsArray.Take(query.Limit.Value).ToArray();
+ }
+
+ return new QueryResult<NewsItem>
+ {
+ Items = itemsArray,
+ TotalRecordCount = count
+ };
+ }
+
+ private IEnumerable<NewsItem> GetNewsItems(string path)
+ {
+ var xmlDoc = new XmlDocument();
+
+ xmlDoc.Load(path);
+
+ return ParseRssItems(xmlDoc);
+ }
+
+ private IEnumerable<NewsItem> ParseRssItems(XmlDocument xmlDoc)
+ {
+ var nodes = xmlDoc.SelectNodes("rss/channel/item");
+
+ if (nodes == null)
+ {
+ yield return null;
+ }
+
+ foreach (XmlNode node in nodes)
+ {
+ var newsItem = new NewsItem();
+
+ newsItem.Title = ParseDocElements(node, "title");
+
+ newsItem.Description = ParseDocElements(node, "description");
+
+ newsItem.Link = ParseDocElements(node, "link");
+
+ var date = ParseDocElements(node, "pubDate");
+ DateTime parsedDate;
+
+ if (DateTime.TryParse(date, out parsedDate))
+ {
+ newsItem.Date = parsedDate;
+ }
+
+ yield return newsItem;
+ }
+ }
+
+ private string ParseDocElements(XmlNode parent, string xPath)
+ {
+ var node = parent.SelectSingleNode(xPath);
+
+ return node != null ? node.InnerText : "Unresolvable";
+ }
+
+
+ /// <summary>
+ /// Ensures the news file.
+ /// </summary>
+ /// <param name="path">The path.</param>
+ /// <returns>Task.</returns>
+ private async Task EnsureNewsFile(string path)
+ {
+ var info = _fileSystem.GetFileSystemInfo(path);
+
+ if (!info.Exists || (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(info)).TotalHours > 24)
+ {
+ var requestOptions = new HttpRequestOptions
+ {
+ Url = "http://mediabrowser3.com/community/index.php?/blog/rss/1-media-browser-developers-blog",
+ Progress = new Progress<double>()
+ };
+
+ using (var stream = await _httpClient.Get(requestOptions).ConfigureAwait(false))
+ {
+ using (var fileStream = _fileSystem.GetFileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read, true))
+ {
+ await stream.CopyToAsync(fileStream).ConfigureAwait(false);
+ }
+ }
+ }
+ }
+ }
+}