diff options
Diffstat (limited to 'MediaBrowser.Controller')
| -rw-r--r-- | MediaBrowser.Controller/Configuration/ServerConfiguration.cs | 1 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Kernel.cs | 4 | ||||
| -rw-r--r-- | MediaBrowser.Controller/MediaBrowser.Controller.csproj | 3 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Weather/WeatherClient.cs | 191 |
4 files changed, 198 insertions, 1 deletions
diff --git a/MediaBrowser.Controller/Configuration/ServerConfiguration.cs b/MediaBrowser.Controller/Configuration/ServerConfiguration.cs index f6dde3aa1..368c8ef37 100644 --- a/MediaBrowser.Controller/Configuration/ServerConfiguration.cs +++ b/MediaBrowser.Controller/Configuration/ServerConfiguration.cs @@ -5,5 +5,6 @@ namespace MediaBrowser.Controller.Configuration public class ServerConfiguration : BaseApplicationConfiguration
{
public bool EnableInternetProviders { get; set; }
+ public string WeatherZipCode { get; set; }
}
}
diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs index daf5fcd24..1a161ccc9 100644 --- a/MediaBrowser.Controller/Kernel.cs +++ b/MediaBrowser.Controller/Kernel.cs @@ -14,6 +14,7 @@ using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Controller.Resolvers;
+using MediaBrowser.Controller.Weather;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Progress;
@@ -24,6 +25,7 @@ namespace MediaBrowser.Controller public static Kernel Instance { get; private set; }
public ItemController ItemController { get; private set; }
+ public WeatherClient WeatherClient { get; private set; }
public IEnumerable<User> Users { get; private set; }
public Folder RootFolder { get; private set; }
@@ -72,6 +74,7 @@ namespace MediaBrowser.Controller ItemController = new ItemController();
DirectoryWatchers = new DirectoryWatchers();
+ WeatherClient = new WeatherClient();
ItemController.PreBeginResolvePath += ItemController_PreBeginResolvePath;
ItemController.BeginResolvePath += ItemController_BeginResolvePath;
@@ -228,7 +231,6 @@ namespace MediaBrowser.Controller user.Name = "Default User";
user.Id = Guid.Parse("5d1cf7fce25943b790d140095457a42b");
- //user.PrimaryImagePath = "D:\\Video\\TV\\Archer (2009)\\folder.jpg";
list.Add(user);
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index ab141c79f..f72202fea 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -37,6 +37,8 @@ <Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Core" />
+ <Reference Include="System.Net.Http" />
+ <Reference Include="System.Net.Http.WebRequest" />
<Reference Include="System.Reactive.Core, Version=2.0.20823.0, Culture=neutral, PublicKeyToken=f300afd708cefcd3, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Rx-Core.2.0.20823\lib\Net45\System.Reactive.Core.dll</HintPath>
@@ -77,6 +79,7 @@ <Compile Include="Resolvers\BaseItemResolver.cs" />
<Compile Include="Resolvers\FolderResolver.cs" />
<Compile Include="Resolvers\VideoResolver.cs" />
+ <Compile Include="Weather\WeatherClient.cs" />
<Compile Include="Xml\BaseItemXmlParser.cs" />
<Compile Include="Xml\XmlExtensions.cs" />
</ItemGroup>
diff --git a/MediaBrowser.Controller/Weather/WeatherClient.cs b/MediaBrowser.Controller/Weather/WeatherClient.cs new file mode 100644 index 000000000..c49c50477 --- /dev/null +++ b/MediaBrowser.Controller/Weather/WeatherClient.cs @@ -0,0 +1,191 @@ +using System;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Net.Cache;
+using System.Net.Http;
+using System.Threading.Tasks;
+using MediaBrowser.Common.Logging;
+using MediaBrowser.Common.Serialization;
+using MediaBrowser.Model.Weather;
+
+namespace MediaBrowser.Controller.Weather
+{
+ /// <summary>
+ /// Based on http://www.worldweatheronline.com/free-weather-feed.aspx
+ /// The classes in this file are a reproduction of the json output, which will then be converted to our weather model classes
+ /// </summary>
+ public class WeatherClient
+ {
+ private HttpClient HttpClient { get; set; }
+
+ public WeatherClient()
+ {
+ WebRequestHandler handler = new WebRequestHandler();
+
+ handler.AutomaticDecompression = DecompressionMethods.Deflate;
+ handler.CachePolicy = new RequestCachePolicy(RequestCacheLevel.Revalidate);
+
+ HttpClient = new HttpClient(handler);
+ }
+
+ public async Task<WeatherInfo> GetWeatherInfoAsync(string zipCode)
+ {
+ int numDays = 5;
+ string apiKey = "24902f60f1231941120109";
+
+ string url = "http://free.worldweatheronline.com/feed/weather.ashx?q=" + zipCode + "&format=json&num_of_days=" + numDays + "&key=" + apiKey;
+
+ Logger.LogInfo("Accessing weather from " + url);
+
+ using (Stream stream = await HttpClient.GetStreamAsync(url).ConfigureAwait(false))
+ {
+ WeatherData data = JsonSerializer.DeserializeFromStream<WeatherResult>(stream).data;
+
+ return GetWeatherInfo(data);
+ }
+ }
+
+ /// <summary>
+ /// Converst the json output to our WeatherInfo model class
+ /// </summary>
+ private WeatherInfo GetWeatherInfo(WeatherData data)
+ {
+ WeatherInfo info = new WeatherInfo();
+
+ if (data.current_condition.Any())
+ {
+ info.CurrentWeather = data.current_condition.First().ToWeatherStatus();
+ }
+
+ info.Forecasts = data.weather.Select(w => w.ToWeatherForecast()).ToArray();
+
+ return info;
+ }
+ }
+
+ class WeatherResult
+ {
+ public WeatherData data { get; set; }
+ }
+
+ public class WeatherData
+ {
+ public WeatherCondition[] current_condition { get; set; }
+ public DailyWeatherInfo[] weather { get; set; }
+ }
+
+ public class WeatherCondition
+ {
+ public string temp_C { get; set; }
+ public string temp_F { get; set; }
+ public string humidity { get; set; }
+ public string weatherCode { get; set; }
+
+ public WeatherStatus ToWeatherStatus()
+ {
+ return new WeatherStatus()
+ {
+ TemperatureCelsius = int.Parse(temp_C),
+ TemperatureFahrenheit = int.Parse(temp_F),
+ Humidity = int.Parse(humidity),
+ Condition = DailyWeatherInfo.GetCondition(weatherCode)
+ };
+ }
+ }
+
+ public class DailyWeatherInfo
+ {
+ public string date { get; set; }
+ public string precipMM { get; set; }
+ public string tempMaxC { get; set; }
+ public string tempMaxF { get; set; }
+ public string tempMinC { get; set; }
+ public string tempMinF { get; set; }
+ public string weatherCode { get; set; }
+ public string winddir16Point { get; set; }
+ public string winddirDegree { get; set; }
+ public string winddirection { get; set; }
+ public string windspeedKmph { get; set; }
+ public string windspeedMiles { get; set; }
+
+ public WeatherForecast ToWeatherForecast()
+ {
+ return new WeatherForecast()
+ {
+ Date = DateTime.Parse(date),
+ HighTemperatureCelsius = int.Parse(tempMaxC),
+ HighTemperatureFahrenheit = int.Parse(tempMaxF),
+ LowTemperatureCelsius = int.Parse(tempMinC),
+ LowTemperatureFahrenheit = int.Parse(tempMinF),
+ Condition = GetCondition(weatherCode)
+ };
+ }
+
+ public static WeatherConditions GetCondition(string weatherCode)
+ {
+ switch (weatherCode)
+ {
+ case "362":
+ case "365":
+ case "320":
+ case "317":
+ case "182":
+ return WeatherConditions.Sleet;
+ case "338":
+ case "335":
+ case "332":
+ case "329":
+ case "326":
+ case "323":
+ case "377":
+ case "374":
+ case "371":
+ case "368":
+ case "395":
+ case "392":
+ case "350":
+ case "227":
+ case "179":
+ return WeatherConditions.Snow;
+ case "314":
+ case "311":
+ case "308":
+ case "305":
+ case "302":
+ case "299":
+ case "296":
+ case "293":
+ case "284":
+ case "281":
+ case "266":
+ case "263":
+ case "359":
+ case "356":
+ case "353":
+ case "185":
+ case "176":
+ return WeatherConditions.Rain;
+ case "260":
+ case "248":
+ return WeatherConditions.Fog;
+ case "389":
+ case "386":
+ case "200":
+ return WeatherConditions.Thunderstorm;
+ case "230":
+ return WeatherConditions.Blizzard;
+ case "143":
+ return WeatherConditions.Mist;
+ case "122":
+ return WeatherConditions.Overcast;
+ case "119":
+ return WeatherConditions.Cloudy;
+ case "115":
+ return WeatherConditions.PartlyCloudy;
+ default:
+ return WeatherConditions.Sunny;
+ }
+ }
+ }
+}
|
