aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/IO/FileSystemHelper.cs
blob: 732cf0803e2b6f3006cf467dd672f40b00bbe6e1 (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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using MediaBrowser.Controller.Resolvers;
using MediaBrowser.Controller.Library;

namespace MediaBrowser.Controller.IO
{
    public static class FileSystemHelper
    {
        /// <summary>
        /// Transforms shortcuts into their actual paths and filters out items that should be ignored
        /// </summary>
        public static ItemResolveEventArgs FilterChildFileSystemEntries(ItemResolveEventArgs args, bool flattenShortcuts)
        {
            
            List<WIN32_FIND_DATA> returnChildren = new List<WIN32_FIND_DATA>();
            List<WIN32_FIND_DATA> resolvedShortcuts = new List<WIN32_FIND_DATA>();

            foreach (var file in args.FileSystemChildren)
            {
                // If it's a shortcut, resolve it
                if (Shortcut.IsShortcut(file.Path))
                {
                    string newPath = Shortcut.ResolveShortcut(file.Path);
                    WIN32_FIND_DATA newPathData = FileData.GetFileData(newPath);

                    // Find out if the shortcut is pointing to a directory or file
                    if (newPathData.IsDirectory)
                    {
                        // add to our physical locations
                        args.AdditionalLocations.Add(newPath);

                        // If we're flattening then get the shortcut's children
                        if (flattenShortcuts)
                        {
                            returnChildren.Add(file);
                            ItemResolveEventArgs newArgs = new ItemResolveEventArgs()
                            {
                                FileSystemChildren = FileData.GetFileSystemEntries(newPath, "*").ToArray()
                            };

                            resolvedShortcuts.AddRange(FilterChildFileSystemEntries(newArgs, false).FileSystemChildren);
                        }
                        else
                        {
                            returnChildren.Add(newPathData);
                        }
                    }
                    else
                    {
                        returnChildren.Add(newPathData);
                    }
                }
                else
                {
                    //not a shortcut check to see if we should filter it out
                    if (EntityResolutionHelper.ShouldResolvePath(file))
                    {
                        returnChildren.Add(file);
                    }
                    else
                    {
                        //filtered - see if it is one of our "indicator" folders and mark it now - no reason to search for it again
                        args.IsBDFolder |= file.cFileName.Equals("bdmv", StringComparison.OrdinalIgnoreCase);
                        args.IsDVDFolder |= file.cFileName.Equals("video_ts", StringComparison.OrdinalIgnoreCase);
                        args.IsHDDVDFolder |= file.cFileName.Equals("hvdvd_ts", StringComparison.OrdinalIgnoreCase);

                        //and check to see if it is a metadata folder and collect contents now if so
                        if (IsMetadataFolder(file.cFileName))
                        {
                            args.MetadataFiles = Directory.GetFiles(Path.Combine(args.Path, "metadata"), "*", SearchOption.TopDirectoryOnly);
                        }
                    }
                }
            }

            if (resolvedShortcuts.Count > 0)
            {
                resolvedShortcuts.InsertRange(0, returnChildren);
                args.FileSystemChildren = resolvedShortcuts.ToArray();
            }
            else
            {
                args.FileSystemChildren = returnChildren.ToArray();
            }
            return args;
        }

        public static bool IsMetadataFolder(string path)
        {
            return path.TrimEnd('\\').EndsWith("metadata", StringComparison.OrdinalIgnoreCase);
        }

        public static bool IsVideoFile(string path)
        {
            string extension = System.IO.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;
            }
        }
    }
}