aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/Resolvers/BaseItemResolver.cs
blob: 8e43a791fc4acbf6e9adfe151e35eee5ec4483cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using System.IO;
using System.Text.RegularExpressions;

namespace MediaBrowser.Controller.Resolvers
{
    /// <summary>
    /// Class BaseItemResolver
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public abstract class BaseItemResolver<T> : IBaseItemResolver
        where T : BaseItem, new()
    {
        /// <summary>
        /// Resolves the specified args.
        /// </summary>
        /// <param name="args">The args.</param>
        /// <returns>`0.</returns>
        protected virtual T Resolve(ItemResolveArgs args)
        {
            return null;
        }

        /// <summary>
        /// Gets the priority.
        /// </summary>
        /// <value>The priority.</value>
        public virtual ResolverPriority Priority
        {
            get
            {
                return ResolverPriority.First;
            }
        }

        /// <summary>
        /// Sets initial values on the newly resolved item
        /// </summary>
        /// <param name="item">The item.</param>
        /// <param name="args">The args.</param>
        protected virtual void SetInitialItemValues(T item, ItemResolveArgs args)
        {
            // If the subclass didn't specify this
            if (string.IsNullOrEmpty(item.Path))
            {
                item.Path = args.Path;
            }

            // If the subclass didn't specify this
            if (args.Parent != null)
            {
                item.Parent = args.Parent;
            }

            item.Id = item.Path.GetMBId(item.GetType());
            item.DisplayMediaType = item.GetType().Name;
        }

        /// <summary>
        /// Resolves the path.
        /// </summary>
        /// <param name="args">The args.</param>
        /// <returns>BaseItem.</returns>
        public BaseItem ResolvePath(ItemResolveArgs args)
        {
            T item = Resolve(args);

            if (item != null)
            {
                // Set the args on the item
                item.ResolveArgs = args;

                // Set initial values on the newly resolved item
                SetInitialItemValues(item, args);

                // Make sure the item has a name
                EnsureName(item);

                // Make sure DateCreated and DateModified have values
                EntityResolutionHelper.EnsureDates(item, args);
            }

            return item;
        }

        /// <summary>
        /// Ensures the name.
        /// </summary>
        /// <param name="item">The item.</param>
        private void EnsureName(T item)
        {
            // If the subclass didn't supply a name, add it here
            if (string.IsNullOrEmpty(item.Name) && !string.IsNullOrEmpty(item.Path))
            {
                //we use our resolve args name here to get the name of the containg folder, not actual video file
                item.Name = GetMBName(item.ResolveArgs.FileInfo.cFileName, item.ResolveArgs.FileInfo.IsDirectory);
            }
        }

        /// <summary>
        /// The MB name regex
        /// </summary>
        private static readonly Regex MBNameRegex = new Regex("(\\[.*\\])", RegexOptions.Compiled);

        /// <summary>
        /// Strip out attribute items and return just the name we will use for items
        /// </summary>
        /// <param name="path">Assumed to be a file or directory path</param>
        /// <param name="isDirectory">if set to <c>true</c> [is directory].</param>
        /// <returns>The cleaned name</returns>
        private static string GetMBName(string path, bool isDirectory)
        {
            //first just get the file or directory name
            var fn = isDirectory ? Path.GetFileName(path) : Path.GetFileNameWithoutExtension(path);

            //now - strip out anything inside brackets
            fn = MBNameRegex.Replace(fn, string.Empty);

            return fn;
        }
    }

    /// <summary>
    /// Weed this to keep a list of resolvers, since Resolvers are built with generics
    /// </summary>
    public interface IBaseItemResolver
    {
        /// <summary>
        /// Resolves the path.
        /// </summary>
        /// <param name="args">The args.</param>
        /// <returns>BaseItem.</returns>
        BaseItem ResolvePath(ItemResolveArgs args);
        /// <summary>
        /// Gets the priority.
        /// </summary>
        /// <value>The priority.</value>
        ResolverPriority Priority { get; }
    }

    /// <summary>
    /// Enum ResolverPriority
    /// </summary>
    public enum ResolverPriority
    {
        /// <summary>
        /// The first
        /// </summary>
        First = 1,
        /// <summary>
        /// The second
        /// </summary>
        Second = 2,
        /// <summary>
        /// The third
        /// </summary>
        Third = 3,
        /// <summary>
        /// The last
        /// </summary>
        Last = 4
    }
}