1.0-dev11 (Notifications added, removing task after success option added, deleting video temp after error option added)

This commit is contained in:
2022-03-03 00:34:52 +01:00
Unverified
parent d8eb103dcc
commit bcdb1dd246
7 changed files with 85 additions and 19 deletions

View File

@@ -17,7 +17,7 @@ namespace VDownload.Core.Services
{
{ "delete_temp_on_start", true },
{ "twitch_vod_passive_trim", true },
{ "twitch_vod_downloading_chunk_retry_after_error", true },
{ "twitch_vod_downloading_chunk_retry_after_error", false },
{ "twitch_vod_downloading_chunk_max_retries", 10 },
{ "twitch_vod_downloading_chunk_retries_delay", 5000 },
{ "media_transcoding_use_hardware_acceleration", true },
@@ -32,7 +32,10 @@ namespace VDownload.Core.Services
{ "custom_temp_location", false },
{ "max_active_video_task", 5 },
{ "replace_output_file_if_exists", false },
{ "remove_task_when_successfully_ended", false }
{ "remove_task_when_successfully_ended", false },
{ "delete_task_temp_when_ended_with_error", false },
{ "show_notification_when_task_ended_successfully", false },
{ "show_notification_when_task_ended_unsuccessfully", false }
};
#endregion

View File

@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Text.RegularExpressions;
@@ -266,7 +267,7 @@ namespace VDownload.Core.Services.Sources.Twitch
private static async Task<byte[]> DownloadChunkAsync(Uri chunkUrl, CancellationToken cancellationToken = default)
{
int retriesCount = 0;
while ((bool)Config.GetValue("twitch_vod_downloading_chunk_retry_after_error") && retriesCount < (int)Config.GetValue("twitch_vod_downloading_chunk_max_retries"))
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
try
@@ -276,13 +277,16 @@ namespace VDownload.Core.Services.Sources.Twitch
return await client.DownloadDataTaskAsync(chunkUrl);
}
}
catch
catch (WebException wex)
{
retriesCount++;
await Task.Delay((int)Config.GetValue("twitch_vod_downloading_chunk_retries_delay"));
if ((bool)Config.GetValue("twitch_vod_downloading_chunk_retry_after_error") && retriesCount < (int)Config.GetValue("twitch_vod_downloading_chunk_max_retries"))
{
retriesCount++;
await Task.Delay((int)Config.GetValue("twitch_vod_downloading_chunk_retries_delay"));
}
else throw wex;
}
}
throw new WebException("An error occurs while downloading a Twitch VOD chunk");
}
// WRITE CHUNK TO FILE

View File

@@ -35,7 +35,8 @@ namespace VDownload
protected override async void OnLaunched(LaunchActivatedEventArgs e)
{
// Rebuild configuration file
Config.Rebuild();
//Config.Rebuild();
Config.SetDefault();
// Delete temp on start
if ((bool)Config.GetValue("delete_temp_on_start"))

View File

@@ -205,6 +205,9 @@ The number in the numberbox indicades how many videos will be got from playlist.
<data name="HomeTaskPanelStateTextDownloading" xml:space="preserve">
<value>Downloading</value>
</data>
<data name="HomeTaskPanelStateTextError" xml:space="preserve">
<value>An error occured</value>
</data>
<data name="HomeTaskPanelStateTextFinalizing" xml:space="preserve">
<value>Finalizing</value>
</data>
@@ -259,6 +262,18 @@ The number in the numberbox indicades how many videos will be got from playlist.
<data name="MediaTypeOnlyVideoText" xml:space="preserve">
<value>Only video</value>
</data>
<data name="NotificationTaskEndedSuccessfullyDescription" xml:space="preserve">
<value>downloading ended successfully</value>
</data>
<data name="NotificationTaskEndedSuccessfullyHeader" xml:space="preserve">
<value>Video downloading ended successfully</value>
</data>
<data name="NotificationTaskEndedUnsuccessfullyDescription" xml:space="preserve">
<value>an error occured</value>
</data>
<data name="NotificationTaskEndedUnsuccessfullyHeader" xml:space="preserve">
<value>Video downloading ended unsuccessfully</value>
</data>
<data name="SourcesMainPageHeaderText.Text" xml:space="preserve">
<value>Sources</value>
</data>
@@ -295,4 +310,7 @@ The number in the numberbox indicades how many videos will be got from playlist.
<data name="SourcesTwitchSettingControlDescriptionNotLoggedIn" xml:space="preserve">
<value>Not logged in. Twitch authentication is required to download videos.</value>
</data>
<data name="TaskErrorInternetConnection" xml:space="preserve">
<value>Internet connection error</value>
</data>
</root>

View File

@@ -322,6 +322,9 @@
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
<Version>6.2.13</Version>
</PackageReference>
<PackageReference Include="Microsoft.Toolkit.Uwp.Notifications">
<Version>7.1.2</Version>
</PackageReference>
<PackageReference Include="Microsoft.Toolkit.Uwp.UI">
<Version>7.1.2</Version>
</PackageReference>

View File

@@ -138,7 +138,7 @@ namespace VDownload.Views.Home
catch (WebException wex)
{
HomeOptionsBarSearchingStatusControl.Content = HomeOptionsBarSearchingStatusErrorImage;
if (wex.Response == null)
if (wex.Response is null)
{
ContentDialog internetAccessErrorDialog = new ContentDialog
{

View File

@@ -1,6 +1,8 @@
using System;
using Microsoft.Toolkit.Uwp.Notifications;
using System;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using VDownload.Core.Enums;
@@ -53,7 +55,7 @@ namespace VDownload.Views.Home
Location = location;
// Set metadata
ThumbnailImage = (BitmapImage)ImagesRes["UnknownThumbnailImage"];
ThumbnailImage = VideoService.Thumbnail != null ? new BitmapImage { UriSource = VideoService.Thumbnail } : (BitmapImage)ImagesRes["UnknownThumbnailImage"];
SourceImage = new BitmapIcon { UriSource = new Uri($"ms-appx:///Assets/Sources/{VideoService.GetType().Namespace.Split(".").Last()}.png"), ShowAsMonochrome = false };
Title = VideoService.Title;
Author = VideoService.Author;
@@ -144,6 +146,8 @@ namespace VDownload.Views.Home
tempFolder = ApplicationData.Current.TemporaryFolder;
tempFolder = await tempFolder.CreateFolderAsync(uniqueID);
bool endedWithError = false;
try
{
// Throw exception if cancellation requested
@@ -212,6 +216,12 @@ namespace VDownload.Views.Home
HomeTaskPanelStateText.Text = $"{ResourceLoader.GetForCurrentView().GetString("HomeTaskPanelStateTextDone")} ({(Math.Floor(taskStopwatch.Elapsed.TotalHours) > 0 ? $"{ Math.Floor(taskStopwatch.Elapsed.TotalHours):0}:" : "")}{taskStopwatch.Elapsed.Minutes:00}:{taskStopwatch.Elapsed.Seconds:00})";
HomeTaskPanelStateProgressBar.Visibility = Visibility.Collapsed;
// Show notification
if ((bool)Config.GetValue("show_notification_when_task_ended_successfully"))
new ToastContentBuilder()
.AddText(ResourceLoader.GetForCurrentView().GetString("NotificationTaskEndedSuccessfullyHeader"))
.AddText($"\"{Title}\" - {ResourceLoader.GetForCurrentView().GetString("NotificationTaskEndedSuccessfullyDescription")}")
.Show();
}
catch (OperationCanceledException)
{
@@ -220,19 +230,46 @@ namespace VDownload.Views.Home
HomeTaskPanelStateText.Text = ResourceLoader.GetForCurrentView().GetString("HomeTaskPanelStateTextCancelled");
HomeTaskPanelStateProgressBar.Visibility = Visibility.Collapsed;
}
catch (WebException ex)
{
string errorInfo;
if (ex.Response is null) errorInfo = ResourceLoader.GetForCurrentView().GetString("TaskErrorInternetConnection");
else throw ex;
// Set state controls
HomeTaskPanelStateIcon.Source = (SvgImageSource)IconsRes["StateErrorIcon"];
HomeTaskPanelStateText.Text = $"{ResourceLoader.GetForCurrentView().GetString("HomeTaskPanelStateTextError")} ({errorInfo})";
HomeTaskPanelStateProgressBar.Visibility = Visibility.Collapsed;
// Show notification
if ((bool)Config.GetValue("show_notification_when_task_ended_unsuccessfully"))
new ToastContentBuilder()
.AddText(ResourceLoader.GetForCurrentView().GetString("NotificationTaskEndedUnsuccessfullyHeader"))
.AddText($"\"{Title}\" - {ResourceLoader.GetForCurrentView().GetString("NotificationTaskEndedUnsuccessfullyDescription")} ({errorInfo})")
.Show();
}
finally
{
// Change icon
HomeTaskPanelStartStopButton.Icon = new SymbolIcon(Symbol.Download);
// Set video status
TaskStatus = Core.Enums.TaskStatus.Idle;
// Delete temporary files
await tempFolder.DeleteAsync();
// Change icon
HomeTaskPanelStartStopButton.Icon = new SymbolIcon(Symbol.Download);
// Dispose unique id
TaskId.Dispose(uniqueID);
if (!endedWithError || (bool)Config.GetValue("delete_task_temp_when_ended_with_error"))
{
// Delete temporary files
await tempFolder.DeleteAsync();
// Dispose unique id
TaskId.Dispose(uniqueID);
}
if (!endedWithError && !CancellationTokenSource.IsCancellationRequested && (bool)Config.GetValue("remove_task_when_successfully_ended"))
{
// Remove task when successfully ended
TaskRemovingRequested?.Invoke(this, EventArgs.Empty);
}
}
}
else
@@ -268,7 +305,7 @@ namespace VDownload.Views.Home
private void HomeTaskPanelRemoveButton_Click(object sender, RoutedEventArgs e)
{
if (TaskStatus == Core.Enums.TaskStatus.InProgress || TaskStatus == Core.Enums.TaskStatus.Waiting) CancellationTokenSource.Cancel();
TaskRemovingRequested?.Invoke(sender, EventArgs.Empty);
TaskRemovingRequested?.Invoke(this, EventArgs.Empty);
}
#endregion