diff options
Diffstat (limited to 'MediaBrowser.ServerApplication/LibraryViewer.cs')
| -rw-r--r-- | MediaBrowser.ServerApplication/LibraryViewer.cs | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/MediaBrowser.ServerApplication/LibraryViewer.cs b/MediaBrowser.ServerApplication/LibraryViewer.cs new file mode 100644 index 000000000..2bf51be4a --- /dev/null +++ b/MediaBrowser.ServerApplication/LibraryViewer.cs @@ -0,0 +1,243 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Persistence; +using MediaBrowser.Model.Querying; +using MediaBrowser.Model.Serialization; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using SortOrder = MediaBrowser.Model.Entities.SortOrder; + +namespace MediaBrowser.ServerApplication +{ + public partial class LibraryViewer : Form + { + private readonly IJsonSerializer _jsonSerializer; + private readonly ILibraryManager _libraryManager; + private readonly IDisplayPreferencesRepository _displayPreferencesManager; + private readonly IItemRepository _itemRepository; + + private User _currentUser; + + public LibraryViewer(IJsonSerializer jsonSerializer, IUserManager userManager, ILibraryManager libraryManager, IDisplayPreferencesRepository displayPreferencesManager, IItemRepository itemRepo) + { + InitializeComponent(); + + _jsonSerializer = jsonSerializer; + _libraryManager = libraryManager; + _displayPreferencesManager = displayPreferencesManager; + _itemRepository = itemRepo; + + foreach (var user in userManager.Users) + selectUser.Items.Add(user); + selectUser.Items.Insert(0, new User { Name = "Physical" }); + selectUser.SelectedIndex = 0; + + selectUser.SelectedIndexChanged += selectUser_SelectedIndexChanged; + treeView1.AfterSelect += treeView1_AfterSelect; + } + + void treeView1_AfterSelect(object sender, TreeViewEventArgs e) + { + if (e.Node != null) + { + var item = (BaseItem)e.Node.Tag; + lblType.Text = "Type: " + item.GetType().Name; + + var json = FormatJson(_jsonSerializer.SerializeToString(item)); + + if (item is IHasMediaStreams) + { + var mediaStreams = _itemRepository.GetMediaStreams(new MediaStreamQuery + { + ItemId = item.Id + + }).ToList(); + + if (mediaStreams.Count > 0) + { + json += "\n\nMedia Streams:\n\n" + FormatJson(_jsonSerializer.SerializeToString(mediaStreams)); + } + } + + txtJson.Text = json; + } + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + selectUser_SelectedIndexChanged(null, null); + } + + void selectUser_SelectedIndexChanged(object sender, EventArgs e) + { + _currentUser = selectUser.SelectedItem as User; + if (_currentUser != null) + LoadTree(); + } + + private void LoadTree() + { + treeView1.Nodes.Clear(); + + IEnumerable<BaseItem> children = _currentUser.Name == "Physical" ? new[] { _libraryManager.RootFolder } : _libraryManager.RootFolder.GetChildren(_currentUser, true); + children = OrderByName(children, _currentUser); + + foreach (Folder folder in children) + { + + var currentFolder = folder; + + var node = new TreeNode { Tag = currentFolder }; + + var subChildren = currentFolder.GetChildren(_currentUser, true); + subChildren = OrderByName(subChildren, _currentUser); + AddChildren(node, subChildren, _currentUser); + node.Text = currentFolder.Name + " (" + + node.Nodes.Count + ")"; + + treeView1.Nodes.Add(node); + } + } + + /// <summary> + /// Adds the children. + /// </summary> + /// <param name="parent">The parent.</param> + /// <param name="children">The children.</param> + /// <param name="user">The user.</param> + private void AddChildren(TreeNode parent, IEnumerable<BaseItem> children, User user) + { + foreach (var item in children) + { + var node = new TreeNode { Tag = item }; + var subFolder = item as Folder; + if (subFolder != null) + { + var prefs = _displayPreferencesManager.GetDisplayPreferences(subFolder.DisplayPreferencesId, user.Id, "LibraryExplorer"); + + AddChildren(node, OrderBy(subFolder.GetChildren(user, true), user, prefs.SortBy), user); + node.Text = item.Name + " (" + node.Nodes.Count + ")"; + } + else + { + node.Text = item.Name; + } + parent.Nodes.Add(node); + } + } + + /// <summary> + /// Orders the name of the by. + /// </summary> + /// <param name="items">The items.</param> + /// <param name="user">The user.</param> + /// <returns>IEnumerable{BaseItem}.</returns> + private IEnumerable<BaseItem> OrderByName(IEnumerable<BaseItem> items, User user) + { + return OrderBy(items, user, ItemSortBy.SortName); + } + + /// <summary> + /// Orders the name of the by. + /// </summary> + /// <param name="items">The items.</param> + /// <param name="user">The user.</param> + /// <returns>IEnumerable{BaseItem}.</returns> + private IEnumerable<BaseItem> OrderBy(IEnumerable<BaseItem> items, User user, string order) + { + return _libraryManager.Sort(items, user, new[] { order }, SortOrder.Ascending); + } + + /// <summary> + /// The INDEN t_ STRING + /// </summary> + private const string INDENT_STRING = " "; + /// <summary> + /// Formats the json. + /// </summary> + /// <param name="str">The STR.</param> + /// <returns>System.String.</returns> + private static string FormatJson(string str) + { + var indent = 0; + var quoted = false; + var sb = new StringBuilder(); + for (var i = 0; i < str.Length; i++) + { + var ch = str[i]; + switch (ch) + { + case '{': + case '[': + sb.Append(ch); + if (!quoted) + { + sb.AppendLine(); + Enumerable.Range(0, ++indent).ForEach(item => sb.Append(INDENT_STRING)); + } + break; + case '}': + case ']': + if (!quoted) + { + sb.AppendLine(); + Enumerable.Range(0, --indent).ForEach(item => sb.Append(INDENT_STRING)); + } + sb.Append(ch); + break; + case '"': + sb.Append(ch); + bool escaped = false; + var index = i; + while (index > 0 && str[--index] == '\\') + escaped = !escaped; + if (!escaped) + quoted = !quoted; + break; + case ',': + sb.Append(ch); + if (!quoted) + { + sb.AppendLine(); + Enumerable.Range(0, indent).ForEach(item => sb.Append(INDENT_STRING)); + } + break; + case ':': + sb.Append(ch); + if (!quoted) + sb.Append(" "); + break; + default: + sb.Append(ch); + break; + } + } + return sb.ToString(); + } + } + + /// <summary> + /// Class Extensions + /// </summary> + static class Extensions + { + /// <summary> + /// Fors the each. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="ie">The ie.</param> + /// <param name="action">The action.</param> + public static void ForEach<T>(this IEnumerable<T> ie, Action<T> action) + { + foreach (var i in ie) + { + action(i); + } + } + } +} |
