aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.ServerApplication/LibraryViewer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.ServerApplication/LibraryViewer.cs')
-rw-r--r--MediaBrowser.ServerApplication/LibraryViewer.cs243
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);
+ }
+ }
+ }
+}