aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/IO/FileSystemHelper.cs
blob: 0a80a4d97ccf40bc595cec1f59db5a59f3fb1ce8 (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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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);
                    }
                }
            }

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

    }
}