private static MediaPath FromPathInternal(string path, string name, MediaPath parent, Action <string> itemLoaded, CancellationToken cancellationToken, bool?isPlaylist = null)
        {
            if (cancellationToken.IsCancellationRequested)
            {
                return(null);
            }

            if (string.IsNullOrEmpty(path))
            {
                return(null);
            }

            var uri = GetUri(path);

            if (uri != null)
            {
                itemLoaded?.Invoke(uri.OriginalString);

                if (!IsAbsolute(uri))
                {
                    if (parent == null)
                    {
                        return(null);
                    }

                    uri = new Uri(new Uri(WithoutQuery(parent.GetUri())), uri);
                }

                var pathType = GetPathType(uri);

                if (isPlaylist != null) // We can specify the file type
                {
                    pathType = isPlaylist.Value ? PathType.M3U8 : PathType.Other;
                }

                if (pathType == PathType.Other) // Если это не файл плейлиста, то это файл или путь к потоку
                {
                    return(new MediaPath(name, uri, parent));
                }
                else
                {
                    var stream = ToStream(uri);
                    if (stream != null)
                    {
                        var items          = LowLevelLoader.FromStream(stream);
                        var newPl          = new Playlist(name, uri, parent);
                        var innerPlaylists = items
                                             .Select(x =>
                                                     FromPathInternal(
                                                         x.Path,
                                                         x.Name?.Replace("&amp;", "&") ?? x.TvgName?.Replace("&amp;", "&"),
                                                         newPl,
                                                         itemLoaded,
                                                         cancellationToken))
                                             .Where(x => x != null)
                                             .ToArray();

                        if (innerPlaylists.Length == 1)
                        {
                            return(innerPlaylists.FirstOrDefault());
                        }

                        newPl.Children = innerPlaylists;

                        return(newPl);
                    }
                }
            }
            return(null);
        }