aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/Resolvers/VideoResolver.cs
blob: df304c3290ea15b1653621381e8d0acc5dea9a58 (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
using System.Collections.Generic;
using System.IO;
using MediaBrowser.Controller.Events;
using MediaBrowser.Model.Entities;

namespace MediaBrowser.Controller.Resolvers
{
    /// <summary>
    /// Resolves a Path into a Video
    /// </summary>
    public class VideoResolver : BaseVideoResolver<Video>
    {
    }

    /// <summary>
    /// Resolves a Path into a Video or Video subclass
    /// </summary>
    public abstract class BaseVideoResolver<T> : BaseItemResolver<T>
        where T : Video, new()
    {
        protected override T Resolve(ItemResolveEventArgs args)
        {
            // If the path is a file check for a matching extensions
            if (!args.IsFolder)
            {
                if (IsVideoFile(args.Path))
                {
                    return new T()
                    {
                        VideoType = VideoType.VideoFile,
                        Path = args.Path
                    };
                }
            }

            else
            {
                // If the path is a folder, check if it's bluray or dvd
                T item = ResolveFromFolderName(args.Path);

                if (item != null)
                {
                    return item;
                }

                // Also check the subfolders for bluray or dvd
                foreach (KeyValuePair<string, FileAttributes> folder in args.FileSystemChildren)
                {
                    if (!folder.Value.HasFlag(FileAttributes.Directory))
                    {
                        continue;
                    }

                    item = ResolveFromFolderName(folder.Key);

                    if (item != null)
                    {
                        return item;
                    }
                }
            }

            return null;
        }

        private T ResolveFromFolderName(string folder)
        {
            if (folder.IndexOf("video_ts", System.StringComparison.OrdinalIgnoreCase) != -1)
            {
                return new T()
                {
                    VideoType = VideoType.DVD,
                    Path = Path.GetDirectoryName(folder)
                };
            }
            if (folder.IndexOf("bdmv", System.StringComparison.OrdinalIgnoreCase) != -1)
            {
                return new T()
                {
                    VideoType = VideoType.BluRay,
                    Path = Path.GetDirectoryName(folder)
                };
            }

            return null;
        }

        private static bool IsVideoFile(string path)
        {
            string extension = Path.GetExtension(path).ToLower();

            switch (extension)
            {
                case ".mkv":
                case ".m2ts":
                case ".iso":
                case ".ts":
                case ".rmvb":
                case ".mov":
                case ".avi":
                case ".mpg":
                case ".mpeg":
                case ".wmv":
                case ".mp4":
                case ".divx":
                case ".dvr-ms":
                case ".wtv":
                case ".ogm":
                case ".ogv":
                case ".asf":
                case ".m4v":
                case ".flv":
                case ".f4v":
                case ".3gp":
                    return true;

                default:
                    return false;
            }
        }
    }
}