public virtual void SelectTracks(int resolution, string codec, bool engOnly) { VideoTracks = VideoTracks.GroupBy(x => x.Id).Select(x => x.First()).OrderBy(x => x.Bitrate).OrderBy(x => x.Height).ToList(); AudioTracks = AudioTracks.GroupBy(x => x.Id).Select(x => x.First()).OrderByDescending(x => x.Codec.Contains("dd")).OrderByDescending(x => x.Codec.Contains("ddp")).OrderByDescending(x => x.Codec.Contains("atmos")).OrderBy(x => x.Bitrate).ToList(); SelectedSubtitleTracks = SelectedSubtitleTracks.GroupBy(x => x.Id).Select(x => x.First()).OrderBy(x => x.Name).ThenByDescending(x => x.LanguageCode.Contains("en")).ToList(); List <VideoTrack> videoTrackPool = VideoTracks; List <AudioTrack> audioTrackPool = AudioTracks; /*if (DeviceConfig.L1Available) * { * videoTrackPool = VideoTracks.Where(x => x.SecurityLevel != ITrack.SecurityLevel.Hardware).ToList(); * audioTrackPool = AudioTracks.Where(x => x.SecurityLevel != ITrack.SecurityLevel.Hardware).ToList(); * }*/ if (codec != null) { if (codec == "H264") { videoTrackPool = videoTrackPool.Where(x => x.Codec.Contains("avc")).ToList(); } else if (codec == "H265") { videoTrackPool = videoTrackPool.Where(x => x.Codec.Contains("hvc") || x.Codec.Contains("hev")).ToList(); } } if (resolution == 0) { SelectedVideoTracks.Add(videoTrackPool.Last()); } else { try { SelectedVideoTracks.Add(videoTrackPool.Where(x => x.Height == resolution).Last()); } catch { SelectedVideoTracks.Add(videoTrackPool.Last()); } } string origLang = "en"; foreach (var track in AudioTracks) { if (track.Name.Contains("Original")) { origLang = track.Language; break; } } SelectedAudioTracks = audioTrackPool.GroupBy(x => x.Language + x.Name.Contains("Description").ToString()).Select(x => x.OrderByDescending(y => y.Name.Contains("Description")).OrderByDescending(y => y.Bitrate).FirstOrDefault()).ToList(); SelectedAudioTracks.AddRange(audioTrackPool.Where(x => x.Name.Contains("Description")).GroupBy(x => x.Language).Select(x => x.OrderByDescending(y => y.Name.Contains("Description")).OrderByDescending(y => y.Bitrate).FirstOrDefault())); SelectedAudioTracks = SelectedAudioTracks.OrderByDescending(y => y.Channels).OrderByDescending(y => y.Bitrate).OrderBy(x => x.Language).OrderByDescending(x => x.Language.Contains("en")).OrderByDescending(x => x.Language.Contains("en-us")).OrderByDescending(x => x.Language == origLang).ToList(); SelectedSubtitleTracks = SelectedSubtitleTracks.OrderBy(x => x.LanguageCode).OrderByDescending(x => x.LanguageCode == origLang).OrderByDescending(x => x.LanguageCode.Contains("en")).Where(x => !x.Name.Contains("Forced")).ToList(); if (engOnly) { SelectedAudioTracks = SelectedAudioTracks.Where(x => (x.Language.Contains("en") || x.Language == origLang) && !x.Name.Contains("Description")).ToList(); } if (engOnly) { SelectedSubtitleTracks = new List <SubtitleTrack>() { SelectedSubtitleTracks.Where(x => x.LanguageCode.Contains("en") || x.LanguageCode == origLang).FirstOrDefault() } } ; SelectedAudioTracks = SelectedAudioTracks.Distinct().ToList(); SelectedSubtitleTracks = SelectedSubtitleTracks.Distinct().ToList(); /* * foreach (var subtitleTrack in SelectedSubtitleTracks) * { * if (subtitleTrack.LanguageCode == origLang) * { * subtitleTrack.Default = true; * break; * } * } */ }