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("&", "&") ?? x.TvgName?.Replace("&", "&"), newPl, itemLoaded, cancellationToken)) .Where(x => x != null) .ToArray(); if (innerPlaylists.Length == 1) { return(innerPlaylists.FirstOrDefault()); } newPl.Children = innerPlaylists; return(newPl); } } } return(null); }