Skip to content

Commit f0a98fa

Browse files
authored
V2026.4.1 (#1836)
* feat: Update deps * feat: Update deno * feat: Version bump * feat: Update deps * Update Nickvision.Parabolic.WinUI.csproj * fix: WinAppSDK * feat: Update translations * fix: Browser extension on Windows * fix: Update deno missing on Linux * fix: No audio on Windows * chore: Cleanup * fix: Vertical resolutions * fix: Fallback format * fix: Time frames * fix: X quoted downloads * feat: Better requires playlist item handling * fix: Flatpak cookies * fix: aria2c hang * feat: Update translations
1 parent b41ad06 commit f0a98fa

67 files changed

Lines changed: 3669 additions & 3476 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/windows.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ jobs:
7272
Invoke-WebRequest https://github.com/yt-dlp/yt-dlp/releases/download/2026.03.17/yt-dlp${{ matrix.variant.ytdlp }}.exe -OutFile yt-dlp.exe
7373
Invoke-WebRequest https://github.com/Elypha/aria2-mod/releases/download/aria2c-1.37.0-b4fd7cb-20251126/aria2c-windows-x86_64-wintls.zip -OutFile aria2.zip
7474
Invoke-WebRequest https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-n8.1-latest-${{ matrix.variant.ffmpeg }}-gpl-8.1.zip -OutFile ffmpeg.zip
75-
Invoke-WebRequest https://github.com/denoland/deno/releases/download/v2.7.12/deno-${{ matrix.variant.deno }}-pc-windows-msvc.zip -OutFile deno.zip
75+
Invoke-WebRequest https://github.com/denoland/deno/releases/download/v2.7.14/deno-${{ matrix.variant.deno }}-pc-windows-msvc.zip -OutFile deno.zip
7676
Expand-Archive -Force 'aria2.zip'
7777
Expand-Archive -Force 'ffmpeg.zip'
7878
Expand-Archive -Force 'deno.zip'

Nickvision.Parabolic.GNOME/Nickvision.Parabolic.GNOME.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
<ItemGroup>
1717
<PackageReference Include="GirCore.Adw-1" Version="0.7.0" />
18-
<PackageReference Include="Nickvision.Desktop.GNOME" Version="2026.4.3" />
18+
<PackageReference Include="Nickvision.Desktop.GNOME" Version="2026.4.4" />
1919
</ItemGroup>
2020
<ItemGroup>
2121
<ProjectReference Include="..\Nickvision.Parabolic.Shared\Nickvision.Parabolic.Shared.csproj" />

Nickvision.Parabolic.GNOME/Views/MainWindow.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
using System.Collections.Generic;
1616
using System.Diagnostics.CodeAnalysis;
1717
using System.Linq;
18-
using System.Threading.Tasks;
1918

2019
namespace Nickvision.Parabolic.GNOME.Views;
2120

@@ -292,6 +291,21 @@ private void App_AppNotificationSent(object? sender, AppNotificationSentEventArg
292291
progress.ProgressChanged -= UpdateProgress_Changed;
293292
};
294293
}
294+
else if (e.Notification.Action == "update-deno")
295+
{
296+
toast.Timeout = 0;
297+
toast.ButtonLabel = _translationService._("Update");
298+
toast.OnButtonClicked += async (_, _) =>
299+
{
300+
_updateButton!.Visible = true;
301+
_updatePopover!.Popup();
302+
_updateProgressLabel!.Label_ = _translationService._("Downloading update: {0}%", 0);
303+
var progress = new Progress<DownloadProgress>();
304+
progress.ProgressChanged += UpdateProgress_Changed;
305+
await _controller.DenoUpdateAsync(progress);
306+
progress.ProgressChanged -= UpdateProgress_Changed;
307+
};
308+
}
295309
else if (e.Notification.Action == "error" && !string.IsNullOrEmpty(e.Notification.ActionParam))
296310
{
297311
toast.Timeout = 0;

Nickvision.Parabolic.Shared/Controllers/AddDownloadDialogController.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public async Task AddPlaylistDownloadsAsync(DiscoveryContext context, IReadOnlyL
8080
{
8181
hasVideo = true;
8282
}
83-
if(hasSuggestedSaveFolder && hasVideo)
83+
if (hasSuggestedSaveFolder && hasVideo)
8484
{
8585
break;
8686
}
@@ -116,6 +116,7 @@ public async Task AddPlaylistDownloadsAsync(DiscoveryContext context, IReadOnlyL
116116
SaveFolder = Path.Combine(!string.IsNullOrEmpty(media.SuggestedSaveFolder) ? media.SuggestedSaveFolder : saveFolder, context.Title.SanitizeForFilename(_configurationService.LimitCharacters)),
117117
FileType = selectedFileType.Value.IsVideo && media.Type == MediaType.Audio ? _configurationService.PreviousAudioOnlyFileType : selectedFileType.Value,
118118
PlaylistPosition = media.PlaylistPosition,
119+
RequiresPlaylistItems = media.RequiresPlaylistItems,
119120
VideoResolution = selectedVideoResoltuion.Value,
120121
AudioBitrate = selectedAudioBitrate.Value,
121122
SubtitleLanguages = filteredSubtitles,
@@ -192,6 +193,7 @@ public async Task AddSingleDownloadAsync(DiscoveryContext context, string saveFi
192193
SaveFolder = saveFolder,
193194
FileType = selectedFileType.Value,
194195
PlaylistPosition = media.PlaylistPosition,
196+
RequiresPlaylistItems = media.RequiresPlaylistItems,
195197
VideoFormat = selectedVideoFormat.Value,
196198
AudioFormat = selectedAudioFormat.Value,
197199
SubtitleLanguages = subtitleLanguages,

Nickvision.Parabolic.Shared/Controllers/MainWindowController.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class MainWindowController
2222
private readonly AppInfo _appInfo;
2323
private readonly IArgumentsService _argumentsService;
2424
private readonly IConfigurationService _configurationService;
25+
private readonly IDatabaseService _databaseService;
2526
private readonly IDenoExecutableService _denoExecutableService;
2627
private readonly IDownloadService _downloadService;
2728
private readonly INotificationService _notificationService;
@@ -34,12 +35,13 @@ public class MainWindowController
3435
private AppVersion _latestYtdlpVersion;
3536
private AppVersion _latestDenoVersion;
3637

37-
public MainWindowController(ILogger<MainWindowController> logger, AppInfo appInfo, IArgumentsService argumentsService, IConfigurationService configurationService, IDenoExecutableService denoExecutableService, IDownloadService downloadService, INotificationService notificationService, IPowerService powerService, IRecoveryService recoveryService, ITranslationService translationService, IUpdaterService updaterService, IYtdlpExecutableService ytdlpExecutableService)
38+
public MainWindowController(ILogger<MainWindowController> logger, AppInfo appInfo, IArgumentsService argumentsService, IConfigurationService configurationService, IDatabaseService databaseService, IDenoExecutableService denoExecutableService, IDownloadService downloadService, INotificationService notificationService, IPowerService powerService, IRecoveryService recoveryService, ITranslationService translationService, IUpdaterService updaterService, IYtdlpExecutableService ytdlpExecutableService)
3839
{
3940
_logger = logger;
4041
_appInfo = appInfo;
4142
_argumentsService = argumentsService;
4243
_configurationService = configurationService;
44+
_databaseService = databaseService;
4345
_denoExecutableService = denoExecutableService;
4446
_downloadService = downloadService;
4547
_notificationService = notificationService;
@@ -102,7 +104,7 @@ public Uri? UrlFromArgs
102104
{
103105
get
104106
{
105-
for (var i = 1; i < _argumentsService.Data.Count; i++)
107+
for (var i = 0; i < _argumentsService.Data.Count; i++)
106108
{
107109
var urlText = _argumentsService.Data[i].Trim();
108110
if (urlText.StartsWith("parabolic://", StringComparison.Ordinal))
@@ -259,7 +261,7 @@ public async Task<string> GetDebugInformationAsync(string extraInformation = "")
259261
var ffmpegVersion = await ExecuteAsync("ffmpeg", "-version");
260262
var ariaVersion = await ExecuteAsync("aria2c", "--version");
261263
extraInformation += string.IsNullOrEmpty(extraInformation) ? string.Empty : "\n";
262-
extraInformation += $"Log path: {(_appInfo.IsPortable ? "app.log" : Path.Combine(UserDirectories.LocalData, _appInfo.Name, "app.log"))}";
264+
extraInformation += $"Database encrypted: {_databaseService.IsEncrypted}\nLog path: {(_appInfo.IsPortable ? "app.log" : Path.Combine(UserDirectories.LocalData, _appInfo.Name, "app.log"))}";
263265
extraInformation += $"\n\nyt-dlp: {(ytdlpVersion is not null ? ytdlpVersion.ToString() : "not found")}";
264266
extraInformation += $"\ndeno: {(denoVersion is not null ? denoVersion.ToString() : "not found")}";
265267
extraInformation += $"\nffmpeg: {(!string.IsNullOrEmpty(ffmpegVersion) ? ffmpegVersion.Substring(ffmpegVersion.IndexOf("ffmpeg version") + 15, ffmpegVersion.IndexOf("Copyright") - 15) : "not found")}";

Nickvision.Parabolic.Shared/Controllers/PreferencesViewController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ public void Dispose()
429429

430430
public async Task SaveConfigurationAsync()
431431
{
432-
if(_transaction is not null)
432+
if (_transaction is not null)
433433
{
434434
await _transaction.CommitAsync();
435435
await _transaction.DisposeAsync();

Nickvision.Parabolic.Shared/Helpers/HostApplicationBuilderExtensions.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,19 @@ public IHostApplicationBuilder ConfigureParabolic(string[] args)
1818
{
1919
var appInfo = new AppInfo("org.nickvision.tubeconverter", "Nickvision Parabolic", "Parabolic")
2020
{
21-
Version = new AppVersion("2026.4.1-beta1"),
21+
Version = new AppVersion("2026.4.1"),
2222
Changelog = """
2323
- Fixed an issue where some settings would not save correctly
24+
- Fixed an issue where playlist downloads with a resolution limit had no audio
25+
- Fixed an issue where portrait/vertical videos in playlists downloaded at incorrect resolutions
26+
- Fixed an issue where downloads from sites with muxed-only streams would fail
27+
- Fixed an issue where downloading a time frame clip from a long video produced an incomplete result
28+
- Fixed an issue where downloading a time frame clip from a long video could hang indefinitely with aria2c enabled
29+
- Fixed an issue where X/Twitter quoted downloads could produce the same video twice
30+
- Fixed an issue where deno was unable to be updated in-app on Linux
31+
- Fixed an issue where browser cookies could not be found when running via Flatpak on Linux
2432
- Fixed an issue where Parabolic would not start on KDE desktops
33+
- Fixed an issue where Parabolic did not open links from browser extension on Windows
2534
""",
2635
SourceRepository = new Uri("https://github.com/NickvisionApps/Parabolic"),
2736
IssueTracker = new Uri("https://github.com/NickvisionApps/Parabolic/issues/new"),

Nickvision.Parabolic.Shared/Models/DiscoveryResult.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Nickvision.Desktop.Application;
22
using Nickvision.Desktop.Globalization;
3+
using Nickvision.Desktop.Helpers;
34
using System;
45
using System.Collections.Generic;
56
using System.Text.Json;
@@ -48,6 +49,22 @@ public DiscoveryResult(JsonElement ytdlp, IConfigurationService configurationSer
4849
}
4950
Media.Add(new Media(mediaObject, configurationService, translator, suggestedSaveFolder, string.Empty));
5051
}
52+
var urlCounts = new Dictionary<string, int>(Media.Count);
53+
foreach (var m in Media)
54+
{
55+
if (m.PlaylistPosition != -1 && !m.Url.IsEmpty)
56+
{
57+
var key = m.Url.ToString();
58+
urlCounts[key] = urlCounts.GetValueOrDefault(key, 0) + 1;
59+
}
60+
}
61+
foreach (var m in Media)
62+
{
63+
if (m.PlaylistPosition != -1 && !m.Url.IsEmpty && urlCounts.GetValueOrDefault(m.Url.ToString(), 0) > 1)
64+
{
65+
m.RequiresPlaylistItems = true;
66+
}
67+
}
5168
}
5269
else
5370
{

Nickvision.Parabolic.Shared/Models/DownloadOptions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public class DownloadOptions
1515
public Credential? Credential { get; set; }
1616
public MediaFileType FileType { get; set; }
1717
public int PlaylistPosition { get; set; }
18+
public bool RequiresPlaylistItems { get; set; }
1819
public Format? VideoFormat { get; set; }
1920
public Format? AudioFormat { get; set; }
2021
public IReadOnlyList<SubtitleLanguage> SubtitleLanguages { get; set; }
@@ -34,6 +35,7 @@ public DownloadOptions(Uri url)
3435
SaveFolder = string.Empty;
3536
FileType = MediaFileType.MP4;
3637
PlaylistPosition = -1;
38+
RequiresPlaylistItems = false;
3739
VideoFormat = null;
3840
AudioFormat = null;
3941
SubtitleLanguages = new List<SubtitleLanguage>();

Nickvision.Parabolic.Shared/Models/Media.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class Media
1313
public Uri Url { get; }
1414
public string Title { get; }
1515
public int PlaylistPosition { get; }
16+
public bool RequiresPlaylistItems { get; set; }
1617
public MediaType Type { get; }
1718
public TimeFrame TimeFrame { get; }
1819
public List<Format> Formats { get; }
@@ -25,6 +26,7 @@ private Media(string suggestedSaveFolder, string suggestedSaveFilename)
2526
Url = Uri.Empty;
2627
Title = suggestedSaveFilename;
2728
PlaylistPosition = -1;
29+
RequiresPlaylistItems = false;
2830
Type = MediaType.Video;
2931
TimeFrame = new TimeFrame(TimeSpan.Zero, TimeSpan.Zero);
3032
Formats = new List<Format>();

0 commit comments

Comments
 (0)