aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2016-11-03 19:35:19 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2016-11-03 19:35:19 -0400
commitd5ea8ca3ad378fc7e0a18ad314e1dfce07003ab6 (patch)
tree4742a665e3455389a9795ff8b6c292263b3876e8 /Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs
parentd0babf322dad6624ee15622d11db52e58db5197f (diff)
move classes to portable
Diffstat (limited to 'Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs')
-rw-r--r--Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs146
1 files changed, 146 insertions, 0 deletions
diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs
new file mode 100644
index 0000000000..ded4f04c4a
--- /dev/null
+++ b/Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs
@@ -0,0 +1,146 @@
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Serialization;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
+
+namespace Emby.Server.Implementations.LiveTv.EmbyTV
+{
+ public class ItemDataProvider<T>
+ where T : class
+ {
+ private readonly object _fileDataLock = new object();
+ private List<T> _items;
+ private readonly IJsonSerializer _jsonSerializer;
+ protected readonly ILogger Logger;
+ private readonly string _dataPath;
+ protected readonly Func<T, T, bool> EqualityComparer;
+ private readonly IFileSystem _fileSystem;
+
+ public ItemDataProvider(IFileSystem fileSystem, IJsonSerializer jsonSerializer, ILogger logger, string dataPath, Func<T, T, bool> equalityComparer)
+ {
+ Logger = logger;
+ _dataPath = dataPath;
+ EqualityComparer = equalityComparer;
+ _jsonSerializer = jsonSerializer;
+ _fileSystem = fileSystem;
+ }
+
+ public IReadOnlyList<T> GetAll()
+ {
+ lock (_fileDataLock)
+ {
+ if (_items == null)
+ {
+ Logger.Info("Loading live tv data from {0}", _dataPath);
+ _items = GetItemsFromFile(_dataPath);
+ }
+ return _items.ToList();
+ }
+ }
+
+ private List<T> GetItemsFromFile(string path)
+ {
+ var jsonFile = path + ".json";
+
+ try
+ {
+ return _jsonSerializer.DeserializeFromFile<List<T>>(jsonFile) ?? new List<T>();
+ }
+ catch (FileNotFoundException)
+ {
+ }
+ catch (IOException ex)
+ {
+ Logger.ErrorException("Error deserializing {0}", ex, jsonFile);
+ }
+ catch (Exception ex)
+ {
+ Logger.ErrorException("Error deserializing {0}", ex, jsonFile);
+ }
+ return new List<T>();
+ }
+
+ private void UpdateList(List<T> newList)
+ {
+ if (newList == null)
+ {
+ throw new ArgumentNullException("newList");
+ }
+
+ var file = _dataPath + ".json";
+ _fileSystem.CreateDirectory(Path.GetDirectoryName(file));
+
+ lock (_fileDataLock)
+ {
+ _jsonSerializer.SerializeToFile(newList, file);
+ _items = newList;
+ }
+ }
+
+ public virtual void Update(T item)
+ {
+ if (item == null)
+ {
+ throw new ArgumentNullException("item");
+ }
+
+ var list = GetAll().ToList();
+
+ var index = list.FindIndex(i => EqualityComparer(i, item));
+
+ if (index == -1)
+ {
+ throw new ArgumentException("item not found");
+ }
+
+ list[index] = item;
+
+ UpdateList(list);
+ }
+
+ public virtual void Add(T item)
+ {
+ if (item == null)
+ {
+ throw new ArgumentNullException("item");
+ }
+
+ var list = GetAll().ToList();
+
+ if (list.Any(i => EqualityComparer(i, item)))
+ {
+ throw new ArgumentException("item already exists");
+ }
+
+ list.Add(item);
+
+ UpdateList(list);
+ }
+
+ public void AddOrUpdate(T item)
+ {
+ var list = GetAll().ToList();
+
+ if (!list.Any(i => EqualityComparer(i, item)))
+ {
+ Add(item);
+ }
+ else
+ {
+ Update(item);
+ }
+ }
+
+ public virtual void Delete(T item)
+ {
+ var list = GetAll().Where(i => !EqualityComparer(i, item)).ToList();
+
+ UpdateList(list);
+ }
+ }
+}