diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..21256661
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+* text=auto
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index ed6bc198..ae8d9570 100644
--- a/.gitignore
+++ b/.gitignore
@@ -56,6 +56,9 @@ ipch/
# ReSharper is a .NET coding add-in
_ReSharper*
+# Rider
+.idea
+
# NCrunch
*.ncrunch*
.*crunch*.local.xml
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b4a969dd..7b132b98 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,17 @@
+# 1.4.0
+
+## New features
+
+* Added an option to download tracks and cover arts using HTTP instead of HTTPS. You can use this option if your HTTPS traffic to Bandcamp is blocked. Thanks **@LedAlex**! [#185](https://github.com/Otiel/BandcampDownloader/issues/185) [#193](https://github.com/Otiel/BandcampDownloader/pull/193)
+
+## Improvements
+
+* Added / updated translations thanks to contributors. [#170](https://github.com/Otiel/BandcampDownloader/pull/170) [#184](https://github.com/Otiel/BandcampDownloader/pull/184) [#190](https://github.com/Otiel/BandcampDownloader/pull/190)
+
+## Bug fixes
+
+* Fixed lyrics not saved. Thanks **@roonel**! [#176](https://github.com/Otiel/BandcampDownloader/issues/176) [#182](https://github.com/Otiel/BandcampDownloader/pull/182)
+
# 1.3.5
## Bug fixes
@@ -6,7 +20,7 @@
## Improvements
-* Updated the following languages thanks to [contributors](https://github.com/Otiel/BandcampDownloader/pull/160): Italian.
+* Updated the following languages thanks to [contributors](https://github.com/Otiel/BandcampDownloader/pull/166): Italian.
# 1.3.4
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 3e2da2e4..94080116 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -4,9 +4,9 @@
This repository follows [git flow](https://nvie.com/posts/a-successful-git-branching-model) as a git branching and release management workflow. In short, after having forked the repository, you need to:
-* Checkout a new branch from the `develop` branch, named either `feature-…` or `fix-…`:
+* Checkout a new branch from the `develop` branch, named either `feature/…` or `fix/…`:
- git checkout -b fix-cover-not-downloaded develop
+ git checkout -b fix/cover-not-downloaded develop
* Commit your changes to the new branch.
* When done, create a new pull request to your new branch.
diff --git a/LICENSE b/LICENSE
index b1ad2f57..5eddd9d8 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,7 +1,7 @@
BandcampDownloader is licensed under the
MIT License
-Copyright (c) 2018-2020 Otiel
+Copyright (c) 2018-2022 Otiel
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index f9dee4ca..f752af1d 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
-[![build:master status](https://img.shields.io/appveyor/ci/Otiel/BandcampDownloader/master.svg?label=build:master&logo=appveyor)](https://ci.appveyor.com/project/Otiel/bandcampdownloader/branch/master) [![build:develop status](https://img.shields.io/appveyor/ci/Otiel/BandcampDownloader/develop.svg?label=build:develop&logo=appveyor)](https://ci.appveyor.com/project/Otiel/bandcampdownloader/branch/develop)
+[![build:master status](https://img.shields.io/appveyor/ci/Otiel/BandcampDownloader/master.svg?label=build:master&logo=appveyor)](https://ci.appveyor.com/project/Otiel/bandcampdownloader/branch/master) [![build:develop status](https://img.shields.io/appveyor/ci/Otiel/BandcampDownloader/develop.svg?label=build:develop&logo=appveyor)](https://ci.appveyor.com/project/Otiel/bandcampdownloader/branch/develop) [![Translation status](https://hosted.weblate.org/widgets/bandcampdownloader/-/bandcampdownloader/svg-badge.svg)](https://hosted.weblate.org/engage/bandcampdownloader/)
## Description
@@ -35,7 +35,7 @@ See the [changelog](CHANGELOG.md).
## Contributing
-You can help translating the application by going to the [Weblate project](https://hosted.weblate.org/engage/bandcampdownloader). See [here](docs/help-translate.md) for more info.
+You can help translating the application by going to the [Weblate project](https://hosted.weblate.org/engage/bandcampdownloader). See the [documentation](docs/help-translate.md) for more info.
[![Translation status](https://hosted.weblate.org/widgets/bandcampdownloader/-/287x66-white.png)](https://hosted.weblate.org/engage/bandcampdownloader)
diff --git a/docs/new-release.md b/docs/new-release.md
index 8ac7ac03..456b715a 100644
--- a/docs/new-release.md
+++ b/docs/new-release.md
@@ -11,17 +11,17 @@ This repository follows [git flow](https://nvie.com/posts/a-successful-git-branc
## Create a new release branch
-1. Create a new branch named `release-X.Y.Z` from `develop` and switch to this new branch.
+1. Create a new branch named `release/X.Y.Z` from `develop` and switch to this new branch.
2. Bump the version number:
* Commit the changes on `CHANGELOG.md`.
* Update the assembly number on `AssemblyInfo.cs` and commit.
## Finish the release branch
-1. Merge `release-X.Y.Z` into `master`.
-2. Create a new tag called `vX.Y.Z`.
-3. Merge `release-X.Y.Z` into `develop`.
-4. Delete the `release-X.Y.Z` branch.
+1. Merge `release/X.Y.Z` into `develop`.
+2. Delete the `release/X.Y.Z` branch.
+3. Merge `develop` into `master`.
+4. Create a new tag called `vX.Y.Z` on `master`.
5. Push `master`, `develop` and the new tag.
## Create the GitHub release
diff --git a/src/BandcampDownloader/App.xaml.cs b/src/BandcampDownloader/App.xaml.cs
index ac08fa90..d7f93d48 100644
--- a/src/BandcampDownloader/App.xaml.cs
+++ b/src/BandcampDownloader/App.xaml.cs
@@ -6,26 +6,31 @@
using NLog.Config;
using NLog.Targets;
-namespace BandcampDownloader {
-
- public partial class App: Application {
+namespace BandcampDownloader
+{
+ public partial class App : Application
+ {
///
/// Random class used to create random numbers.
///
public static readonly Random Random = new Random();
+ private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
///
/// The settings chosen by the user.
///
public static IUserSettings UserSettings { get; set; }
- protected override void OnStartup(StartupEventArgs e) {
+ protected override void OnStartup(StartupEventArgs e)
+ {
base.OnStartup(e);
InitializeLogger();
// Manage unhandled exceptions
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
+ LogAppProperties();
+
// Define the default security protocol to use for connection as TLS (#109)
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
@@ -34,17 +39,20 @@ protected override void OnStartup(StartupEventArgs e) {
ThemeHelper.ApplySkin(UserSettings.Theme);
}
- private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
+ private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
+ {
LogUnhandledExceptionToFile((Exception) e.ExceptionObject);
- MessageBox.Show(String.Format(BandcampDownloader.Properties.Resources.messageBoxUnhandledException, Constants.UrlIssues), "Bandcamp Downloader", MessageBoxButton.OK, MessageBoxImage.Error);
+ MessageBox.Show(string.Format(BandcampDownloader.Properties.Resources.messageBoxUnhandledException, Constants.UrlIssues), "Bandcamp Downloader", MessageBoxButton.OK, MessageBoxImage.Error);
}
///
/// Initializes the logger component.
///
- private void InitializeLogger() {
- var fileTarget = new FileTarget() {
+ private void InitializeLogger()
+ {
+ var fileTarget = new FileTarget()
+ {
FileName = Constants.LogFilePath,
Layout = "${longdate} ${level:uppercase=true:padding=-5:padCharacter= } ${message}",
ArchiveAboveSize = Constants.MaxLogSize,
@@ -61,21 +69,28 @@ private void InitializeLogger() {
/// Initializes data context for bindings between settings values and settings controls. This must be called
/// before initializing UI forms.
///
- private void InitializeSettings() {
+ private void InitializeSettings()
+ {
App.UserSettings = new ConfigurationBuilder().UseIniFile(Constants.UserSettingsFilePath).Build();
- if (string.IsNullOrEmpty(UserSettings.DownloadsPath)) {
+ if (string.IsNullOrEmpty(UserSettings.DownloadsPath))
+ {
// Its default value cannot be set in settings as it isn't determined by a constant function
App.UserSettings.DownloadsPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\{artist}\\{album}";
}
}
+ private void LogAppProperties()
+ {
+ _logger.Info($"BandcampDownloader version: {Constants.AppVersion}");
+ _logger.Info($".NET Framework version: {SystemVersionHelper.GetDotNetFrameworkVersion()}");
+ }
+
///
/// Writes the specified Exception to the application log file, along with the .NET version.
///
/// The Exception to log.
- private void LogUnhandledExceptionToFile(Exception exception) {
- Logger logger = LogManager.GetCurrentClassLogger();
- logger.Log(LogLevel.Fatal, $".NET Framework version: {SystemVersionHelper.GetDotNetFrameworkVersion()}");
+ private void LogUnhandledExceptionToFile(Exception exception)
+ {
LogHelper.LogExceptionAndInnerExceptionsToFile(exception);
}
}
diff --git a/src/BandcampDownloader/BandcampDownloader.csproj b/src/BandcampDownloader/BandcampDownloader.csproj
index 23957f88..981d8be8 100644
--- a/src/BandcampDownloader/BandcampDownloader.csproj
+++ b/src/BandcampDownloader/BandcampDownloader.csproj
@@ -155,6 +155,7 @@
+
@@ -292,9 +293,14 @@
Settings.settings
True
+
+
+
+
+
@@ -302,14 +308,17 @@
+
ResXFileCodeGenerator
Resources.Designer.cs
Designer
+
+
Designer
diff --git a/src/BandcampDownloader/Core/Constants.cs b/src/BandcampDownloader/Core/Constants.cs
index e9efb456..ff852b30 100644
--- a/src/BandcampDownloader/Core/Constants.cs
+++ b/src/BandcampDownloader/Core/Constants.cs
@@ -1,9 +1,10 @@
using System.IO;
using System.Reflection;
-namespace BandcampDownloader {
-
- internal static class Constants {
+namespace BandcampDownloader
+{
+ internal static class Constants
+ {
///
/// The version number of BandcampDownloader.
///
diff --git a/src/BandcampDownloader/Core/DownloadManager.cs b/src/BandcampDownloader/Core/DownloadManager.cs
index 1d56e502..393c05c4 100644
--- a/src/BandcampDownloader/Core/DownloadManager.cs
+++ b/src/BandcampDownloader/Core/DownloadManager.cs
@@ -9,9 +9,10 @@
using System.Threading.Tasks;
using ImageResizer;
-namespace BandcampDownloader {
-
- internal class DownloadManager {
+namespace BandcampDownloader
+{
+ internal class DownloadManager
+ {
///
/// Object used to lock on to prevent cancellation race condition.
///
@@ -45,7 +46,8 @@ internal class DownloadManager {
/// Initializes a new instance of DownloadManager.
///
/// The URLs we'll download from.
- public DownloadManager(string urls) {
+ public DownloadManager(string urls)
+ {
_urls = urls;
// Increase the maximum of concurrent connections to be able to download more than 2 (which is the default
@@ -56,11 +58,14 @@ public DownloadManager(string urls) {
///
/// Cancels all downloads.
///
- public void CancelDownloads() {
- lock (_cancellationLock) {
+ public void CancelDownloads()
+ {
+ lock (_cancellationLock)
+ {
_cancelDownloads = true;
// Stop current downloads
- if (_cancellationTokenSource != null) {
+ if (_cancellationTokenSource != null)
+ {
_cancellationTokenSource.Cancel();
}
}
@@ -69,12 +74,14 @@ public void CancelDownloads() {
///
/// Fetch albums data from the URLs specified when creating this DownloadManager.
///
- public async Task FetchUrlsAsync() {
+ public async Task FetchUrlsAsync()
+ {
var urls = _urls.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList();
urls = urls.Distinct().ToList();
// Get URLs of albums to download
- if (App.UserSettings.DownloadArtistDiscography) {
+ if (App.UserSettings.DownloadArtistDiscography)
+ {
urls = await GetArtistDiscographyAsync(urls);
}
@@ -88,27 +95,35 @@ public async Task FetchUrlsAsync() {
///
/// Starts downloads.
///
- public async Task StartDownloadsAsync() {
- if (_albums == null) {
+ public async Task StartDownloadsAsync()
+ {
+ if (_albums == null)
+ {
throw new Exception("Must call FetchUrls before calling StartDownloadsAsync");
}
- lock (_cancellationLock) {
- if (_cancelDownloads) {
+ lock (_cancellationLock)
+ {
+ if (_cancelDownloads)
+ {
return;
}
_cancellationTokenSource = new CancellationTokenSource();
}
// Start downloading albums
- if (App.UserSettings.DownloadOneAlbumAtATime) {
+ if (App.UserSettings.DownloadOneAlbumAtATime)
+ {
// Download one album at a time
- foreach (Album album in _albums) {
+ foreach (var album in _albums)
+ {
await DownloadAlbumAsync(album);
}
- } else {
+ }
+ else
+ {
// Parallel download
- int[] albumsIndexes = Enumerable.Range(0, _albums.Count).ToArray();
+ var albumsIndexes = Enumerable.Range(0, _albums.Count).ToArray();
await Task.WhenAll(albumsIndexes.Select(i => DownloadAlbumAsync(_albums[i])));
}
}
@@ -117,16 +132,21 @@ public async Task StartDownloadsAsync() {
/// Downloads an album.
///
/// The album to download.
- private async Task DownloadAlbumAsync(Album album) {
- if (_cancelDownloads) {
+ private async Task DownloadAlbumAsync(Album album)
+ {
+ if (_cancelDownloads)
+ {
// Abort
return;
}
// Create directory to place track files
- try {
+ try
+ {
Directory.CreateDirectory(album.Path);
- } catch {
+ }
+ catch
+ {
LogAdded(this, new LogArgs("An error occured when creating the album folder. Make sure you have the rights to write files in the folder you chose", LogType.Error));
return;
}
@@ -134,26 +154,32 @@ private async Task DownloadAlbumAsync(Album album) {
TagLib.Picture artwork = null;
// Download artwork
- if ((App.UserSettings.SaveCoverArtInTags || App.UserSettings.SaveCoverArtInFolder) && album.HasArtwork) {
+ if ((App.UserSettings.SaveCoverArtInTags || App.UserSettings.SaveCoverArtInFolder) && album.HasArtwork)
+ {
artwork = await DownloadCoverArtAsync(album);
}
// Download & tag tracks
- bool[] tracksDownloaded = new bool[album.Tracks.Count];
- int[] indexes = Enumerable.Range(0, album.Tracks.Count).ToArray();
+ var tracksDownloaded = new bool[album.Tracks.Count];
+ var indexes = Enumerable.Range(0, album.Tracks.Count).ToArray();
await Task.WhenAll(indexes.Select(async i => tracksDownloaded[i] = await DownloadAndTagTrackAsync(album, album.Tracks[i], artwork)));
// Create playlist file
- if (App.UserSettings.CreatePlaylist && !_cancelDownloads) {
+ if (App.UserSettings.CreatePlaylist && !_cancelDownloads)
+ {
new PlaylistCreator(album).SavePlaylistToFile();
LogAdded(this, new LogArgs($"Saved playlist for album \"{album.Title}\"", LogType.IntermediateSuccess));
}
- if (!_cancelDownloads) {
+ if (!_cancelDownloads)
+ {
// Tasks have not been aborted
- if (tracksDownloaded.All(x => x == true)) {
+ if (tracksDownloaded.All(x => x == true))
+ {
LogAdded(this, new LogArgs($"Successfully downloaded album \"{album.Title}\"", LogType.Success));
- } else {
+ }
+ else
+ {
LogAdded(this, new LogArgs($"Finished downloading album \"{album.Title}\". Some tracks were not downloaded", LogType.Success));
}
}
@@ -165,33 +191,41 @@ private async Task DownloadAlbumAsync(Album album) {
/// The album of the track to download.
/// The track to download.
/// The cover art.
- private async Task DownloadAndTagTrackAsync(Album album, Track track, TagLib.Picture artwork) {
- LogAdded(this, new LogArgs($"Downloading track \"{track.Title}\" from url: {track.Mp3Url}", LogType.VerboseInfo));
-
- int tries = 0;
- bool trackDownloaded = false;
- TrackFile currentFile = DownloadingFiles.Where(f => f.Url == track.Mp3Url).First();
-
- if (File.Exists(track.Path)) {
- long length = new FileInfo(track.Path).Length;
+ private async Task DownloadAndTagTrackAsync(Album album, Track track, TagLib.Picture artwork)
+ {
+ var trackMp3Url = UrlHelper.GetHttpUrlIfNeeded(track.Mp3Url);
+ LogAdded(this, new LogArgs($"Downloading track \"{track.Title}\" from url: {trackMp3Url}", LogType.VerboseInfo));
+
+ var tries = 0;
+ var trackDownloaded = false;
+ var currentFile = DownloadingFiles.Where(f => f.Url == track.Mp3Url).First();
+
+ if (File.Exists(track.Path))
+ {
+ var length = new FileInfo(track.Path).Length;
if (currentFile.Size > length - (currentFile.Size * App.UserSettings.AllowedFileSizeDifference) &&
- currentFile.Size < length + (currentFile.Size * App.UserSettings.AllowedFileSizeDifference)) {
+ currentFile.Size < length + (currentFile.Size * App.UserSettings.AllowedFileSizeDifference))
+ {
LogAdded(this, new LogArgs($"Track already exists within allowed file size range: track \"{Path.GetFileName(track.Path)}\" from album \"{album.Title}\" - Skipping download!", LogType.IntermediateSuccess));
return false;
}
}
- do {
- if (_cancelDownloads) {
+ do
+ {
+ if (_cancelDownloads)
+ {
// Abort
return false;
}
- using (var webClient = new WebClient()) {
+ using (var webClient = new WebClient())
+ {
ProxyHelper.SetProxy(webClient);
// Update progress bar when downloading
- webClient.DownloadProgressChanged += (s, e) => {
+ webClient.DownloadProgressChanged += (s, e) =>
+ {
currentFile.BytesReceived = e.BytesReceived;
};
@@ -199,27 +233,40 @@ private async Task DownloadAndTagTrackAsync(Album album, Track track, TagL
_cancellationTokenSource.Token.Register(webClient.CancelAsync);
// Start download
- try {
- await webClient.DownloadFileTaskAsync(track.Mp3Url, track.Path);
+ try
+ {
+ LogAdded(this, new LogArgs($"Downloading track \"{track.Title}\" from url: {trackMp3Url}", LogType.VerboseInfo));
+ await webClient.DownloadFileTaskAsync(trackMp3Url, track.Path);
trackDownloaded = true;
- LogAdded(this, new LogArgs($"Downloaded track \"{track.Title}\" from url: {track.Mp3Url}", LogType.VerboseInfo));
- } catch (WebException ex) when (ex.Status == WebExceptionStatus.RequestCanceled) {
+ LogAdded(this, new LogArgs($"Downloaded track \"{track.Title}\" from url: {trackMp3Url}", LogType.VerboseInfo));
+ }
+ catch (WebException ex) when (ex.Status == WebExceptionStatus.RequestCanceled)
+ {
// Downloads cancelled by the user
return false;
- } catch (TaskCanceledException) {
+ }
+ catch (TaskCanceledException)
+ {
// Downloads cancelled by the user
return false;
- } catch (WebException) {
+ }
+ catch (WebException)
+ {
// Connection closed probably because no response from Bandcamp
- if (tries + 1 < App.UserSettings.DownloadMaxTries) {
+ if (tries + 1 < App.UserSettings.DownloadMaxTries)
+ {
LogAdded(this, new LogArgs($"Unable to download track \"{Path.GetFileName(track.Path)}\" from album \"{album.Title}\". Try {tries + 1} of {App.UserSettings.DownloadMaxTries}", LogType.Warning));
- } else {
+ }
+ else
+ {
LogAdded(this, new LogArgs($"Unable to download track \"{Path.GetFileName(track.Path)}\" from album \"{album.Title}\". Hit max retries of {App.UserSettings.DownloadMaxTries}", LogType.Error));
}
}
- if (trackDownloaded) {
- if (App.UserSettings.ModifyTags) {
+ if (trackDownloaded)
+ {
+ if (App.UserSettings.ModifyTags)
+ {
// Tag (ID3) the file when downloaded
var tagFile = TagLib.File.Create(track.Path);
tagFile = TagHelper.UpdateArtist(tagFile, album.Artist, App.UserSettings.TagArtist);
@@ -234,7 +281,8 @@ private async Task DownloadAndTagTrackAsync(Album album, Track track, TagL
LogAdded(this, new LogArgs($"Tags saved for track \"{Path.GetFileName(track.Path)}\" from album \"{album.Title}\"", LogType.VerboseInfo));
}
- if (App.UserSettings.SaveCoverArtInTags && artwork != null) {
+ if (App.UserSettings.SaveCoverArtInTags && artwork != null)
+ {
// Save cover in tags when downloaded
var tagFile = TagLib.File.Create(track.Path);
tagFile.Tag.Pictures = new TagLib.IPicture[1] { artwork };
@@ -248,7 +296,8 @@ private async Task DownloadAndTagTrackAsync(Album album, Track track, TagL
}
tries++;
- if (!trackDownloaded && tries < App.UserSettings.DownloadMaxTries) {
+ if (!trackDownloaded && tries < App.UserSettings.DownloadMaxTries)
+ {
await WaitForCooldownAsync(tries);
}
}
@@ -262,24 +311,29 @@ private async Task DownloadAndTagTrackAsync(Album album, Track track, TagL
/// the album folder.
///
/// The album.
- private async Task DownloadCoverArtAsync(Album album) {
+ private async Task DownloadCoverArtAsync(Album album)
+ {
TagLib.Picture artworkInTags = null;
- int tries = 0;
- bool artworkDownloaded = false;
- TrackFile currentFile = DownloadingFiles.Where(f => f.Url == album.ArtworkUrl).First();
+ var tries = 0;
+ var artworkDownloaded = false;
+ var currentFile = DownloadingFiles.Where(f => f.Url == album.ArtworkUrl).First();
- do {
- if (_cancelDownloads) {
+ do
+ {
+ if (_cancelDownloads)
+ {
// Abort
return null;
}
- using (var webClient = new WebClient()) {
+ using (var webClient = new WebClient())
+ {
ProxyHelper.SetProxy(webClient);
// Update progress bar when downloading
- webClient.DownloadProgressChanged += (s, e) => {
+ webClient.DownloadProgressChanged += (s, e) =>
+ {
currentFile.BytesReceived = e.BytesReceived;
};
@@ -287,67 +341,94 @@ private async Task DownloadAndTagTrackAsync(Album album, Track track, TagL
_cancellationTokenSource.Token.Register(webClient.CancelAsync);
// Start download
- try {
- await webClient.DownloadFileTaskAsync(album.ArtworkUrl, album.ArtworkTempPath);
+ var albumArtworkUrl = UrlHelper.GetHttpUrlIfNeeded(album.ArtworkUrl);
+ try
+ {
+ LogAdded(this, new LogArgs($"Downloading artwork from url: {album.ArtworkUrl}", LogType.VerboseInfo));
+ await webClient.DownloadFileTaskAsync(albumArtworkUrl, album.ArtworkTempPath);
artworkDownloaded = true;
- } catch (WebException ex) when (ex.Status == WebExceptionStatus.RequestCanceled) {
+ }
+ catch (WebException ex) when (ex.Status == WebExceptionStatus.RequestCanceled)
+ {
// Downloads cancelled by the user
return null;
- } catch (TaskCanceledException) {
+ }
+ catch (TaskCanceledException)
+ {
// Downloads cancelled by the user
return null;
- } catch (WebException) {
+ }
+ catch (WebException)
+ {
// Connection closed probably because no response from Bandcamp
- if (tries < App.UserSettings.DownloadMaxTries) {
+ if (tries < App.UserSettings.DownloadMaxTries)
+ {
LogAdded(this, new LogArgs($"Unable to download artwork for album \"{album.Title}\". Try {tries + 1} of {App.UserSettings.DownloadMaxTries}", LogType.Warning));
- } else {
+ }
+ else
+ {
LogAdded(this, new LogArgs($"Unable to download artwork for album \"{album.Title}\". Hit max retries of {App.UserSettings.DownloadMaxTries}", LogType.Error));
}
}
- if (artworkDownloaded) {
+ if (artworkDownloaded)
+ {
// Convert/resize artwork to be saved in album folder
- if (App.UserSettings.SaveCoverArtInFolder && (App.UserSettings.CoverArtInFolderConvertToJpg || App.UserSettings.CoverArtInFolderResize)) {
+ if (App.UserSettings.SaveCoverArtInFolder && (App.UserSettings.CoverArtInFolderConvertToJpg || App.UserSettings.CoverArtInFolderResize))
+ {
var settings = new ResizeSettings();
- if (App.UserSettings.CoverArtInFolderConvertToJpg) {
+ if (App.UserSettings.CoverArtInFolderConvertToJpg)
+ {
settings.Format = "jpg";
settings.Quality = 90;
}
- if (App.UserSettings.CoverArtInFolderResize) {
+ if (App.UserSettings.CoverArtInFolderResize)
+ {
settings.MaxHeight = App.UserSettings.CoverArtInFolderMaxSize;
settings.MaxWidth = App.UserSettings.CoverArtInFolderMaxSize;
}
- await Task.Run(() => {
+ await Task.Run(() =>
+ {
ImageBuilder.Current.Build(album.ArtworkTempPath, album.ArtworkPath, settings); // Save it to the album folder
});
- } else if (App.UserSettings.SaveCoverArtInFolder) {
+ }
+ else if (App.UserSettings.SaveCoverArtInFolder)
+ {
await FileHelper.CopyFileAsync(album.ArtworkTempPath, album.ArtworkPath);
}
// Convert/resize artwork to be saved in tags
- if (App.UserSettings.SaveCoverArtInTags && (App.UserSettings.CoverArtInTagsConvertToJpg || App.UserSettings.CoverArtInTagsResize)) {
+ if (App.UserSettings.SaveCoverArtInTags && (App.UserSettings.CoverArtInTagsConvertToJpg || App.UserSettings.CoverArtInTagsResize))
+ {
var settings = new ResizeSettings();
- if (App.UserSettings.CoverArtInTagsConvertToJpg) {
+ if (App.UserSettings.CoverArtInTagsConvertToJpg)
+ {
settings.Format = "jpg";
settings.Quality = 90;
}
- if (App.UserSettings.CoverArtInTagsResize) {
+ if (App.UserSettings.CoverArtInTagsResize)
+ {
settings.MaxHeight = App.UserSettings.CoverArtInTagsMaxSize;
settings.MaxWidth = App.UserSettings.CoverArtInTagsMaxSize;
}
- await Task.Run(() => {
+ await Task.Run(() =>
+ {
ImageBuilder.Current.Build(album.ArtworkTempPath, album.ArtworkTempPath, settings); // Save it to %Temp%
});
}
- artworkInTags = new TagLib.Picture(album.ArtworkTempPath) {
+ artworkInTags = new TagLib.Picture(album.ArtworkTempPath)
+ {
Description = "Picture"
};
- try {
+ try
+ {
File.Delete(album.ArtworkTempPath);
- } catch {
+ }
+ catch
+ {
// Could not delete the file. Nevermind, it's in %Temp% folder...
}
@@ -357,7 +438,8 @@ await Task.Run(() => {
}
tries++;
- if (!artworkDownloaded && tries < App.UserSettings.DownloadMaxTries) {
+ if (!artworkDownloaded && tries < App.UserSettings.DownloadMaxTries)
+ {
await WaitForCooldownAsync(tries);
}
}
@@ -370,40 +452,54 @@ await Task.Run(() => {
/// Returns the albums located at the specified URLs.
///
/// The URLs.
- private async Task> GetAlbumsAsync(List urls) {
+ private async Task> GetAlbumsAsync(List urls)
+ {
var albums = new List();
- foreach (string url in urls) {
+ foreach (var url in urls.Select(o => UrlHelper.GetHttpUrlIfNeeded(o)))
+ {
LogAdded(this, new LogArgs($"Retrieving album data for {url}", LogType.Info));
// Retrieve URL HTML source code
- string htmlCode = "";
- using (var webClient = new WebClient() { Encoding = Encoding.UTF8 }) {
+ var htmlCode = "";
+ using (var webClient = new WebClient() { Encoding = Encoding.UTF8 })
+ {
ProxyHelper.SetProxy(webClient);
- if (_cancelDownloads) {
+ if (_cancelDownloads)
+ {
// Abort
return new List();
}
- try {
+ try
+ {
+ LogAdded(this, new LogArgs($"Downloading album info from url: {url}", LogType.VerboseInfo));
htmlCode = await webClient.DownloadStringTaskAsync(url);
- } catch {
+ }
+ catch
+ {
LogAdded(this, new LogArgs($"Could not retrieve data for {url}", LogType.Error));
continue;
}
}
// Get info on album
- try {
- Album album = BandcampHelper.GetAlbum(htmlCode);
+ try
+ {
+ var album = BandcampHelper.GetAlbum(htmlCode);
- if (album.Tracks.Count > 0) {
+ if (album.Tracks.Count > 0)
+ {
albums.Add(album);
- } else {
+ }
+ else
+ {
LogAdded(this, new LogArgs($"No tracks found for {url}, album will not be downloaded", LogType.Warning));
}
- } catch {
+ }
+ catch
+ {
LogAdded(this, new LogArgs($"Could not retrieve album info for {url}", LogType.Error));
continue;
}
@@ -416,60 +512,54 @@ private async Task> GetAlbumsAsync(List urls) {
/// Returns the artists discography from any URL (artist, album, track).
///
/// The URLs.
- private async Task> GetArtistDiscographyAsync(List urls) {
+ private async Task> GetArtistDiscographyAsync(List urls)
+ {
var albumsUrls = new List();
- foreach (string url in urls) {
+ foreach (var url in urls.Select(o => UrlHelper.GetHttpUrlIfNeeded(o)))
+ {
LogAdded(this, new LogArgs($"Retrieving artist discography from {url}", LogType.Info));
- // Retrieve URL HTML source code
- string htmlCode = "";
- using (var webClient = new WebClient() { Encoding = Encoding.UTF8 }) {
- ProxyHelper.SetProxy(webClient);
-
- if (_cancelDownloads) {
- // Abort
- return new List();
- }
-
- try {
- htmlCode = await webClient.DownloadStringTaskAsync(url);
- } catch {
- LogAdded(this, new LogArgs($"Could not retrieve data for {url}", LogType.Error));
- continue;
- }
- }
-
// Get artist "music" bandcamp page (http://artist.bandcamp.com/music)
-
var regex = new Regex("https?://[^/]*");
- string artistPage = regex.Match(url).ToString();
- string artistMusicPage = artistPage + "/music";
+ var artistPage = regex.Match(url).ToString();
+ var artistMusicPage = UrlHelper.GetHttpUrlIfNeeded(artistPage + "/music");
// Retrieve artist "music" page HTML source code
- using (var webClient = new WebClient() { Encoding = Encoding.UTF8 }) {
+ var htmlCode = "";
+ using (var webClient = new WebClient() { Encoding = Encoding.UTF8 })
+ {
ProxyHelper.SetProxy(webClient);
- if (_cancelDownloads) {
+ if (_cancelDownloads)
+ {
// Abort
return new List();
}
- try {
+ try
+ {
+ LogAdded(this, new LogArgs($"Downloading album info from url: {url}", LogType.VerboseInfo));
htmlCode = await webClient.DownloadStringTaskAsync(artistMusicPage);
- } catch {
+ }
+ catch
+ {
LogAdded(this, new LogArgs($"Could not retrieve data for {artistMusicPage}", LogType.Error));
continue;
}
}
- int count = albumsUrls.Count;
- try {
+ var count = albumsUrls.Count;
+ try
+ {
albumsUrls.AddRange(BandcampHelper.GetAlbumsUrl(htmlCode, artistPage));
- } catch (NoAlbumFoundException) {
+ }
+ catch (NoAlbumFoundException)
+ {
LogAdded(this, new LogArgs($"No referred album could be found on {artistMusicPage}. Try to uncheck the \"Download artist discography\" option", LogType.Error));
}
- if(albumsUrls.Count - count == 0) {
+ if (albumsUrls.Count - count == 0)
+ {
// This seem to be a one-album artist with no "music" page => URL redirects to the unique album URL
albumsUrls.Add(url);
}
@@ -484,14 +574,16 @@ private async Task> GetArtistDiscographyAsync(List urls) {
/// The URL.
/// The title of the file to be displayed in the log.
/// The type of the file.
- private async Task GetFileSizeAsync(string url, string titleForLog, FileType fileType) {
+ private async Task GetFileSizeAsync(string url, string titleForLog, FileType fileType)
+ {
long size = 0;
bool sizeRetrieved;
- int tries = 0;
+ var tries = 0;
string fileTypeForLog;
string protocolMethod;
- switch (fileType) {
+ switch (fileType)
+ {
case FileType.Artwork:
fileTypeForLog = "cover art file for album";
protocolMethod = "HEAD";
@@ -507,27 +599,36 @@ private async Task GetFileSizeAsync(string url, string titleForLog, FileTy
throw new NotImplementedException();
}
- do {
- if (_cancelDownloads) {
+ do
+ {
+ if (_cancelDownloads)
+ {
// Abort
return 0;
}
- try {
+ try
+ {
size = await FileHelper.GetFileSizeAsync(url, protocolMethod);
sizeRetrieved = true;
LogAdded(this, new LogArgs($"Retrieved the size of the {fileTypeForLog} \"{titleForLog}\"", LogType.VerboseInfo));
- } catch {
+ }
+ catch
+ {
sizeRetrieved = false;
- if (tries + 1 < App.UserSettings.DownloadMaxTries) {
+ if (tries + 1 < App.UserSettings.DownloadMaxTries)
+ {
LogAdded(this, new LogArgs($"Failed to retrieve the size of the {fileTypeForLog} \"{titleForLog}\". Try {tries + 1} of {App.UserSettings.DownloadMaxTries}", LogType.Warning));
- } else {
+ }
+ else
+ {
LogAdded(this, new LogArgs($"Failed to retrieve the size of the {fileTypeForLog} \"{titleForLog}\". Hit max retries of {App.UserSettings.DownloadMaxTries}. Progress update may be wrong.", LogType.Error));
}
}
tries++;
- if (!sizeRetrieved && tries < App.UserSettings.DownloadMaxTries) {
+ if (!sizeRetrieved && tries < App.UserSettings.DownloadMaxTries)
+ {
await WaitForCooldownAsync(tries);
}
} while (!sizeRetrieved && tries < App.UserSettings.DownloadMaxTries);
@@ -539,30 +640,41 @@ private async Task GetFileSizeAsync(string url, string titleForLog, FileTy
/// Returns the files to download from a list of albums.
///
/// The albums.
- private async Task> GetFilesToDownloadAsync(List albums) {
+ private async Task> GetFilesToDownloadAsync(List albums)
+ {
var files = new List();
- foreach (Album album in albums) {
+ foreach (var album in albums)
+ {
LogAdded(this, new LogArgs($"Computing size for album \"{album.Title}\"...", LogType.Info));
// Artwork
- if ((App.UserSettings.SaveCoverArtInTags || App.UserSettings.SaveCoverArtInFolder) && album.HasArtwork) {
- if (App.UserSettings.RetrieveFilesSize) {
- long size = await GetFileSizeAsync(album.ArtworkUrl, album.Title, FileType.Artwork);
+ if ((App.UserSettings.SaveCoverArtInTags || App.UserSettings.SaveCoverArtInFolder) && album.HasArtwork)
+ {
+ if (App.UserSettings.RetrieveFilesSize)
+ {
+ var size = await GetFileSizeAsync(album.ArtworkUrl, album.Title, FileType.Artwork);
files.Add(new TrackFile(album.ArtworkUrl, 0, size));
- } else {
+ }
+ else
+ {
files.Add(new TrackFile(album.ArtworkUrl, 0, 0));
}
}
// Tracks
- if (App.UserSettings.RetrieveFilesSize) {
- int[] tracksIndexes = Enumerable.Range(0, album.Tracks.Count).ToArray();
- await Task.WhenAll(tracksIndexes.Select(async i => {
- long size = await GetFileSizeAsync(album.Tracks[i].Mp3Url, album.Tracks[i].Title, FileType.Track);
+ if (App.UserSettings.RetrieveFilesSize)
+ {
+ var tracksIndexes = Enumerable.Range(0, album.Tracks.Count).ToArray();
+ await Task.WhenAll(tracksIndexes.Select(async i =>
+ {
+ var size = await GetFileSizeAsync(album.Tracks[i].Mp3Url, album.Tracks[i].Title, FileType.Track);
files.Add(new TrackFile(album.Tracks[i].Mp3Url, 0, size));
}));
- } else {
- foreach (Track track in album.Tracks) {
+ }
+ else
+ {
+ foreach (var track in album.Tracks)
+ {
files.Add(new TrackFile(track.Mp3Url, 0, 0));
}
}
@@ -576,8 +688,10 @@ await Task.WhenAll(tracksIndexes.Select(async i => {
///
/// The times count we tried to download the same file.
///
- private async Task WaitForCooldownAsync(int triesNumber) {
- if (App.UserSettings.DownloadRetryCooldown != 0) {
+ private async Task WaitForCooldownAsync(int triesNumber)
+ {
+ if (App.UserSettings.DownloadRetryCooldown != 0)
+ {
await Task.Delay((int) (Math.Pow(App.UserSettings.DownloadRetryExponent, triesNumber) * App.UserSettings.DownloadRetryCooldown * 1000));
}
}
diff --git a/src/BandcampDownloader/Core/LogArgs.cs b/src/BandcampDownloader/Core/LogArgs.cs
index 50295533..a40ae417 100644
--- a/src/BandcampDownloader/Core/LogArgs.cs
+++ b/src/BandcampDownloader/Core/LogArgs.cs
@@ -1,12 +1,14 @@
using System;
-namespace BandcampDownloader {
-
- internal class LogArgs: EventArgs {
+namespace BandcampDownloader
+{
+ internal class LogArgs : EventArgs
+ {
public LogType LogType { get; private set; }
public string Message { get; private set; }
- public LogArgs(string message, LogType logType) {
+ public LogArgs(string message, LogType logType)
+ {
Message = message;
LogType = logType;
}
diff --git a/src/BandcampDownloader/Core/LogType.cs b/src/BandcampDownloader/Core/LogType.cs
index 3ec04075..47e00186 100644
--- a/src/BandcampDownloader/Core/LogType.cs
+++ b/src/BandcampDownloader/Core/LogType.cs
@@ -1,6 +1,7 @@
-namespace BandcampDownloader {
-
- internal enum LogType {
+namespace BandcampDownloader
+{
+ internal enum LogType
+ {
VerboseInfo,
Info,
IntermediateSuccess,
diff --git a/src/BandcampDownloader/Core/PlaylistCreator.cs b/src/BandcampDownloader/Core/PlaylistCreator.cs
index 986a1db8..2cd003da 100644
--- a/src/BandcampDownloader/Core/PlaylistCreator.cs
+++ b/src/BandcampDownloader/Core/PlaylistCreator.cs
@@ -4,9 +4,10 @@
using PlaylistsNET.Content;
using PlaylistsNET.Models;
-namespace BandcampDownloader {
-
- internal class PlaylistCreator {
+namespace BandcampDownloader
+{
+ internal class PlaylistCreator
+ {
///
/// The album.
///
@@ -16,17 +17,20 @@ internal class PlaylistCreator {
/// Initializes a new instance of PlaylistCreator.
///
///
- public PlaylistCreator(Album album) {
+ public PlaylistCreator(Album album)
+ {
_album = album;
}
///
/// Saves the playlist to a file.
///
- public void SavePlaylistToFile() {
+ public void SavePlaylistToFile()
+ {
string fileContent;
- switch (App.UserSettings.PlaylistFormat) {
+ switch (App.UserSettings.PlaylistFormat)
+ {
case PlaylistFormat.m3u:
fileContent = CreateM3uPlaylist();
break;
@@ -49,13 +53,17 @@ public void SavePlaylistToFile() {
///
/// Returns the playlist in m3u format.
///
- private string CreateM3uPlaylist() {
- var playlist = new M3uPlaylist() {
+ private string CreateM3uPlaylist()
+ {
+ var playlist = new M3uPlaylist()
+ {
IsExtended = App.UserSettings.M3uExtended,
};
- foreach (Track track in _album.Tracks) {
- playlist.PlaylistEntries.Add(new M3uPlaylistEntry() {
+ foreach (var track in _album.Tracks)
+ {
+ playlist.PlaylistEntries.Add(new M3uPlaylistEntry()
+ {
Album = _album.Title,
AlbumArtist = _album.Artist,
Duration = TimeSpan.FromSeconds(track.Duration),
@@ -70,11 +78,14 @@ private string CreateM3uPlaylist() {
///
/// Returns the playlist in pls format.
///
- private string CreatePlsPlaylist() {
+ private string CreatePlsPlaylist()
+ {
var playlist = new PlsPlaylist();
- foreach (Track track in _album.Tracks) {
- playlist.PlaylistEntries.Add(new PlsPlaylistEntry() {
+ foreach (var track in _album.Tracks)
+ {
+ playlist.PlaylistEntries.Add(new PlsPlaylistEntry()
+ {
Length = TimeSpan.FromSeconds(track.Duration),
Path = Path.GetFileName(track.Path),
Title = track.Title,
@@ -87,13 +98,17 @@ private string CreatePlsPlaylist() {
///
/// Returns the playlist in wpl format.
///
- private string CreateWplPlaylist() {
- var playlist = new WplPlaylist() {
+ private string CreateWplPlaylist()
+ {
+ var playlist = new WplPlaylist()
+ {
Title = _album.Title,
};
- foreach (Track track in _album.Tracks) {
- playlist.PlaylistEntries.Add(new WplPlaylistEntry() {
+ foreach (var track in _album.Tracks)
+ {
+ playlist.PlaylistEntries.Add(new WplPlaylistEntry()
+ {
AlbumArtist = _album.Artist,
AlbumTitle = _album.Title,
Duration = TimeSpan.FromSeconds(track.Duration),
@@ -109,13 +124,17 @@ private string CreateWplPlaylist() {
///
/// Returns the playlist in zpl format.
///
- private string CreateZplPlaylist() {
- var playlist = new ZplPlaylist() {
+ private string CreateZplPlaylist()
+ {
+ var playlist = new ZplPlaylist()
+ {
Title = _album.Title,
};
- foreach (Track track in _album.Tracks) {
- playlist.PlaylistEntries.Add(new ZplPlaylistEntry() {
+ foreach (var track in _album.Tracks)
+ {
+ playlist.PlaylistEntries.Add(new ZplPlaylistEntry()
+ {
AlbumArtist = _album.Artist,
AlbumTitle = _album.Title,
Duration = TimeSpan.FromSeconds(track.Duration),
diff --git a/src/BandcampDownloader/Core/UserSettings.cs b/src/BandcampDownloader/Core/UserSettings.cs
index 787fb0f6..e5582067 100644
--- a/src/BandcampDownloader/Core/UserSettings.cs
+++ b/src/BandcampDownloader/Core/UserSettings.cs
@@ -1,24 +1,35 @@
using System.ComponentModel;
+using System.Diagnostics.CodeAnalysis;
using Config.Net;
-namespace BandcampDownloader {
-
+namespace BandcampDownloader
+{
// List of languages with ISO language name, native name and codes https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
- public enum Language {
+ [SuppressMessage("ReSharper", "InconsistentNaming")]
+ public enum Language
+ {
[Description("English")]
en,
//[Description("Arabic (العربية)")]
//ar,
[Description("Chinese (Simplified) (汉语)")]
zh,
+ [Description("Croatian (hrvatski jezik)")]
+ hr,
[Description("Dutch (Nederlands)")]
nl,
+ //[Description("Esperanto")]
+ //eo,
+ [Description("Finnish (Suomi)")]
+ fi,
[Description("French (Français)")]
fr,
[Description("German (Deutsch)")]
de,
- //[Description("Indonesian (Bahasa Indonesia)")]
- //id,
+ // [Description("Hungarian (Magyar)")]
+ // hu,
+ [Description("Indonesian (Bahasa Indonesia)")]
+ id,
[Description("Italian (Italiano)")]
it,
//[Description("Korean (한국어)")]
@@ -29,17 +40,25 @@ public enum Language {
pl,
[Description("Portuguese (Português)")]
pt,
+ [Description("Portuguese Brazil (Português Brasil)")]
+ pt_BR,
[Description("Russian (русский)")]
ru,
[Description("Spanish (Español)")]
es,
+ [Description("Swedish (Svenska)")]
+ sv,
[Description("Turkish (Türkçe)")]
tr,
[Description("Ukrainian (Українська)")]
uk,
+ [Description("Vietnamese (Tiếng Việt)")]
+ vi,
}
- public enum PlaylistFormat {
+ [SuppressMessage("ReSharper", "InconsistentNaming")]
+ public enum PlaylistFormat
+ {
[Description("M3U")]
m3u,
[Description("PLS")]
@@ -50,20 +69,23 @@ public enum PlaylistFormat {
zpl,
}
- public enum ProxyType {
+ public enum ProxyType
+ {
None,
System,
Manual,
}
- public enum Skin {
+ public enum Skin
+ {
[Description("Dark")]
Dark,
[Description("Light")]
Light,
}
- public enum TagEditAction {
+ public enum TagEditAction
+ {
[Description("Empty tag")]
Empty,
[Description("Save in tag")]
@@ -72,15 +94,16 @@ public enum TagEditAction {
DoNotModify,
}
- public enum TagRemoveAction {
+ public enum TagRemoveAction
+ {
[Description("Empty tag")]
Empty,
[Description("Do not modify")]
DoNotModify,
}
- public interface IUserSettings {
-
+ public interface IUserSettings
+ {
[Option(DefaultValue = 0.05)]
double AllowedFileSizeDifference { get; set; }
@@ -199,5 +222,8 @@ public interface IUserSettings {
[Option(DefaultValue = Skin.Light)]
Skin Theme { get; set; }
+
+ [Option(DefaultValue = false)]
+ bool UseHttpInsteadOfHttps { get; set; }
}
}
\ No newline at end of file
diff --git a/src/BandcampDownloader/Helpers/BandcampHelper.cs b/src/BandcampDownloader/Helpers/BandcampHelper.cs
index fdce6209..eadf456b 100644
--- a/src/BandcampDownloader/Helpers/BandcampHelper.cs
+++ b/src/BandcampDownloader/Helpers/BandcampHelper.cs
@@ -6,21 +6,25 @@
using HtmlAgilityPack;
using Newtonsoft.Json;
-namespace BandcampDownloader {
-
- internal static class BandcampHelper {
-
+namespace BandcampDownloader
+{
+ internal static class BandcampHelper
+ {
///
/// Retrieves the data on the album of the specified Bandcamp page.
///
/// The HTML source code of a Bandcamp album page.
/// The data on the album of the specified Bandcamp page.
- public static Album GetAlbum(string htmlCode) {
+ public static Album GetAlbum(string htmlCode)
+ {
// Keep the interesting part of htmlCode only
string albumData;
- try {
+ try
+ {
albumData = GetAlbumData(htmlCode);
- } catch (Exception e) {
+ }
+ catch (Exception e)
+ {
throw new Exception("Could not retrieve album data in HTML code.", e);
}
@@ -29,22 +33,28 @@ public static Album GetAlbum(string htmlCode) {
// Deserialize JSON
Album album;
- try {
- var settings = new JsonSerializerSettings {
+ try
+ {
+ var settings = new JsonSerializerSettings
+ {
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore
};
album = JsonConvert.DeserializeObject(albumData, settings).ToAlbum();
- } catch (Exception e) {
+ }
+ catch (Exception e)
+ {
throw new Exception("Could not deserialize JSON data.", e);
}
// Extract lyrics from album page
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(htmlCode);
- foreach (Track track in album.Tracks) {
- HtmlNode lyricsElement = htmlDoc.GetElementbyId("_lyrics_" + track.Number);
- if (lyricsElement != null) {
+ foreach (var track in album.Tracks)
+ {
+ var lyricsElement = htmlDoc.GetElementbyId("lyrics_row_" + track.Number);
+ if (lyricsElement != null)
+ {
track.Lyrics = lyricsElement.InnerText.Trim();
}
}
@@ -57,15 +67,18 @@ public static Album GetAlbum(string htmlCode) {
///
/// The HTML source code of a Bandcamp page.
/// The albums URL existing on the specified Bandcamp page.
- public static List GetAlbumsUrl(string htmlCode, string artistPage) {
+ public static List GetAlbumsUrl(string htmlCode, string artistPage)
+ {
// Get albums ("real" albums or track-only pages) relative urls
var regex = new Regex("href=\"(?/(album|track)/.*)\"");
- if (!regex.IsMatch(htmlCode)) {
+ if (!regex.IsMatch(htmlCode))
+ {
throw new NoAlbumFoundException();
}
var albumsUrl = new List();
- foreach (Match m in regex.Matches(htmlCode)) {
+ foreach (Match m in regex.Matches(htmlCode))
+ {
albumsUrl.Add(artistPage + m.Groups["url"].Value);
}
@@ -74,29 +87,32 @@ public static List GetAlbumsUrl(string htmlCode, string artistPage) {
return albumsUrl;
}
- private static string FixJson(string albumData) {
+ private static string FixJson(string albumData)
+ {
// Some JSON is not correctly formatted in bandcamp pages, so it needs to be fixed before we can deserialize it
// In trackinfo property, we have for instance:
// url: "http://verbalclick.bandcamp.com" + "/album/404"
// -> Remove the " + "
var regex = new Regex("(?url: \".+)\" \\+ \"(?.+\",)");
- string fixedData = regex.Replace(albumData, "${root}${album}");
+ var fixedData = regex.Replace(albumData, "${root}${album}");
return fixedData;
}
- private static string GetAlbumData(string htmlCode) {
- string startString = "data-tralbum=\"{";
- string stopString = "}\"";
+ private static string GetAlbumData(string htmlCode)
+ {
+ var startString = "data-tralbum=\"{";
+ var stopString = "}\"";
- if (htmlCode.IndexOf(startString) == -1) {
+ if (htmlCode.IndexOf(startString) == -1)
+ {
// Could not find startString
throw new Exception($"Could not find the following string in HTML code: {startString}");
}
- string albumDataTemp = htmlCode.Substring(htmlCode.IndexOf(startString) + startString.Length - 1);
- string albumData = albumDataTemp.Substring(0, albumDataTemp.IndexOf(stopString) + 1);
+ var albumDataTemp = htmlCode.Substring(htmlCode.IndexOf(startString) + startString.Length - 1);
+ var albumData = albumDataTemp.Substring(0, albumDataTemp.IndexOf(stopString) + 1);
albumData = WebUtility.HtmlDecode(albumData);
diff --git a/src/BandcampDownloader/Helpers/EnumerationExtension.cs b/src/BandcampDownloader/Helpers/EnumerationExtension.cs
index b056a2eb..bd5d22a5 100644
--- a/src/BandcampDownloader/Helpers/EnumerationExtension.cs
+++ b/src/BandcampDownloader/Helpers/EnumerationExtension.cs
@@ -3,49 +3,59 @@
using System.Linq;
using System.Windows.Markup;
-namespace BandcampDownloader {
-
- internal class EnumerationExtension: MarkupExtension {
-
- public class EnumerationMember {
+namespace BandcampDownloader
+{
+ internal class EnumerationExtension : MarkupExtension
+ {
+ public class EnumerationMember
+ {
public string Description { get; set; }
public object Value { get; set; }
}
private Type _enumType;
- public Type EnumType {
- get {
+ public Type EnumType
+ {
+ get
+ {
return _enumType;
}
- private set {
- if (_enumType == value) {
+ private set
+ {
+ if (_enumType == value)
+ {
return;
}
- Type underlyingType = Nullable.GetUnderlyingType(value) ?? value;
- if (!underlyingType.IsEnum) {
+ var underlyingType = Nullable.GetUnderlyingType(value) ?? value;
+ if (!underlyingType.IsEnum)
+ {
throw new ArgumentException("Type must be an Enum.");
}
_enumType = value;
}
}
- public EnumerationExtension(Type enumType) {
+ public EnumerationExtension(Type enumType)
+ {
EnumType = enumType ?? throw new ArgumentNullException(nameof(enumType));
}
- public override object ProvideValue(IServiceProvider serviceProvider) {
- Array enumValues = Enum.GetValues(EnumType);
- EnumerationMember[] enumerationMembers = (
+ public override object ProvideValue(IServiceProvider serviceProvider)
+ {
+ var enumValues = Enum.GetValues(EnumType);
+ var enumerationMembers = (
from object enumValue in enumValues
- select new EnumerationMember {
+ select new EnumerationMember
+ {
Value = enumValue,
Description = GetDescription(enumValue)
}).ToArray();
return enumerationMembers;
}
- private string GetDescription(object enumValue) {
+ private string GetDescription(object enumValue)
+ {
return EnumType.GetField(enumValue.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault() is DescriptionAttribute descriptionAttribute ? descriptionAttribute.Description : enumValue.ToString();
}
}
diff --git a/src/BandcampDownloader/Helpers/Exceptions.cs b/src/BandcampDownloader/Helpers/Exceptions.cs
index 0e3b8d98..7b7465f7 100644
--- a/src/BandcampDownloader/Helpers/Exceptions.cs
+++ b/src/BandcampDownloader/Helpers/Exceptions.cs
@@ -1,10 +1,12 @@
using System;
-namespace BandcampDownloader {
-
- internal class CouldNotCheckForUpdatesException: Exception {
+namespace BandcampDownloader
+{
+ internal class CouldNotCheckForUpdatesException : Exception
+ {
}
- internal class NoAlbumFoundException: Exception {
+ internal class NoAlbumFoundException : Exception
+ {
}
}
\ No newline at end of file
diff --git a/src/BandcampDownloader/Helpers/FileHelper.cs b/src/BandcampDownloader/Helpers/FileHelper.cs
index fef10c4b..1dc35ac0 100644
--- a/src/BandcampDownloader/Helpers/FileHelper.cs
+++ b/src/BandcampDownloader/Helpers/FileHelper.cs
@@ -4,22 +4,25 @@
using System.Text.RegularExpressions;
using System.Threading.Tasks;
-namespace BandcampDownloader {
-
- internal static class FileHelper {
-
+namespace BandcampDownloader
+{
+ internal static class FileHelper
+ {
///
/// Asynchronously copies an existing file to a new file.
///
/// The file to copy.
/// The name of the destination file.
- public static async Task CopyFileAsync(string sourceFile, string destinationFile) {
+ public static async Task CopyFileAsync(string sourceFile, string destinationFile)
+ {
// https://stackoverflow.com/a/35467471/825024
const FileOptions fileOptions = FileOptions.Asynchronous | FileOptions.SequentialScan;
const int bufferSize = 4096;
- using (var sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, fileOptions)) {
- using (var destinationStream = new FileStream(destinationFile, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize, fileOptions)) {
+ using (var sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, fileOptions))
+ {
+ using (var destinationStream = new FileStream(destinationFile, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize, fileOptions))
+ {
await sourceStream.CopyToAsync(destinationStream);
}
}
@@ -31,15 +34,20 @@ public static async Task CopyFileAsync(string sourceFile, string destinationFile
/// The URL.
/// The protocol method to use in order to retrieve the file size.
/// The size of the file located at the provided URL.
- public static async Task GetFileSizeAsync(string url, string protocolMethod) {
- WebRequest webRequest = HttpWebRequest.Create(url);
+ public static async Task GetFileSizeAsync(string url, string protocolMethod)
+ {
+ var webRequest = HttpWebRequest.Create(UrlHelper.GetHttpUrlIfNeeded(url));
webRequest.Method = protocolMethod;
long fileSize;
- try {
- using (WebResponse webResponse = await webRequest.GetResponseAsync()) {
+ try
+ {
+ using (var webResponse = await webRequest.GetResponseAsync())
+ {
fileSize = webResponse.ContentLength;
}
- } catch (Exception e) {
+ }
+ catch (Exception e)
+ {
throw new Exception("Could not retrieve file size.", e);
}
return fileSize;
@@ -49,8 +57,10 @@ public static async Task GetFileSizeAsync(string url, string protocolMetho
/// Replaces the forbidden characters \ / : * ? " < > | from the System.String object by an underscore _ in
/// order to be used for a Windows file or folder.
///
- public static string ToAllowedFileName(this string fileName) {
- if (fileName == null) {
+ public static string ToAllowedFileName(this string fileName)
+ {
+ if (fileName == null)
+ {
throw new ArgumentNullException(nameof(fileName));
}
diff --git a/src/BandcampDownloader/Helpers/LanguageHelper.cs b/src/BandcampDownloader/Helpers/LanguageHelper.cs
index a7564840..159669d4 100644
--- a/src/BandcampDownloader/Helpers/LanguageHelper.cs
+++ b/src/BandcampDownloader/Helpers/LanguageHelper.cs
@@ -2,15 +2,16 @@
using System.Globalization;
using WPFLocalizeExtension.Engine;
-namespace BandcampDownloader {
-
- internal static class LanguageHelper {
-
+namespace BandcampDownloader
+{
+ internal static class LanguageHelper
+ {
///
/// Applies the specified language.
///
/// The language to apply.
- public static void ApplyLanguage(Language language) {
+ public static void ApplyLanguage(Language language)
+ {
// Apply language
LocalizeDictionary.Instance.Culture = GetCultureInfo(language);
}
@@ -19,21 +20,31 @@ public static void ApplyLanguage(Language language) {
/// Returns the CultureInfo corresponding to the specified Language.
///
/// The Language.
- private static CultureInfo GetCultureInfo(Language language) {
+ private static CultureInfo GetCultureInfo(Language language)
+ {
// Existing cultures: https://dotnetfiddle.net/e1BX7M
- switch (language) {
+ switch (language)
+ {
//case Language.ar:
// return new CultureInfo("ar");
case Language.de:
return new CultureInfo("de");
case Language.en:
return new CultureInfo("en");
+ //case Language.eo:
+ // return new CultureInfo("eo");
case Language.es:
return new CultureInfo("es");
+ case Language.fi:
+ return new CultureInfo("fi");
case Language.fr:
return new CultureInfo("fr");
- //case Language.id:
- // return new CultureInfo("id");
+ case Language.hr:
+ return new CultureInfo("hr");
+ // case Language.hu:
+ // return new CultureInfo("hu");
+ case Language.id:
+ return new CultureInfo("id");
case Language.it:
return new CultureInfo("it");
case Language.nb_NO:
@@ -46,12 +57,18 @@ private static CultureInfo GetCultureInfo(Language language) {
return new CultureInfo("nl");
case Language.pt:
return new CultureInfo("pt");
+ case Language.pt_BR:
+ return new CultureInfo("pt-BR");
case Language.ru:
return new CultureInfo("ru");
+ case Language.sv:
+ return new CultureInfo("sv");
case Language.tr:
return new CultureInfo("tr");
case Language.uk:
return new CultureInfo("uk");
+ case Language.vi:
+ return new CultureInfo("vi");
case Language.zh:
return new CultureInfo("zh");
default:
diff --git a/src/BandcampDownloader/Helpers/LogHelper.cs b/src/BandcampDownloader/Helpers/LogHelper.cs
index e8baaa41..b04bbbd3 100644
--- a/src/BandcampDownloader/Helpers/LogHelper.cs
+++ b/src/BandcampDownloader/Helpers/LogHelper.cs
@@ -2,18 +2,20 @@
using System.Windows.Media;
using NLog;
-namespace BandcampDownloader {
-
- internal static class LogHelper {
-
+namespace BandcampDownloader
+{
+ internal static class LogHelper
+ {
///
/// Returns the color associated to the specified log type.
///
/// The type of the log.
- public static SolidColorBrush GetColor(LogType logType) {
+ public static SolidColorBrush GetColor(LogType logType)
+ {
SolidColorBrush color;
- switch (logType) {
+ switch (logType)
+ {
case LogType.Info:
color = App.UserSettings.Theme == Skin.Dark ? new SolidColorBrush((Color) ColorConverter.ConvertFromString("#f0f0f0")) : Brushes.Black;
break;
@@ -43,10 +45,12 @@ public static SolidColorBrush GetColor(LogType logType) {
/// Writes the specified Exception and all its InnerException to the application log file.
///
/// The Exception to log.
- public static void LogExceptionAndInnerExceptionsToFile(Exception exception) {
+ public static void LogExceptionAndInnerExceptionsToFile(Exception exception)
+ {
LogExceptionToFile(exception);
- if (exception.InnerException != null) {
+ if (exception.InnerException != null)
+ {
LogExceptionAndInnerExceptionsToFile(exception.InnerException);
}
}
@@ -55,17 +59,20 @@ public static void LogExceptionAndInnerExceptionsToFile(Exception exception) {
/// Writes the specified Exception to the application log file.
///
/// The Exception to log.
- public static void LogExceptionToFile(Exception exception) {
- Logger logger = LogManager.GetCurrentClassLogger();
- logger.Log(LogLevel.Fatal, String.Format("{0} {1}", exception.GetType().ToString(), exception.Message));
+ public static void LogExceptionToFile(Exception exception)
+ {
+ var logger = LogManager.GetCurrentClassLogger();
+ logger.Log(LogLevel.Fatal, string.Format("{0} {1}", exception.GetType().ToString(), exception.Message));
logger.Log(LogLevel.Fatal, exception.StackTrace);
}
///
/// Returns the NLog.LogLevel associated to the specified LogType.
///
- public static LogLevel ToNLogLevel(this LogType logType) {
- switch (logType) {
+ public static LogLevel ToNLogLevel(this LogType logType)
+ {
+ switch (logType)
+ {
case LogType.VerboseInfo:
return LogLevel.Debug;
case LogType.Info:
diff --git a/src/BandcampDownloader/Helpers/ProxyHelper.cs b/src/BandcampDownloader/Helpers/ProxyHelper.cs
index 25eba4cf..57bd468e 100644
--- a/src/BandcampDownloader/Helpers/ProxyHelper.cs
+++ b/src/BandcampDownloader/Helpers/ProxyHelper.cs
@@ -1,21 +1,24 @@
using System;
using System.Net;
-namespace BandcampDownloader {
-
- internal static class ProxyHelper {
-
+namespace BandcampDownloader
+{
+ internal static class ProxyHelper
+ {
///
/// Sets the proxy of the specified WebClient according to the UserSettings.
///
/// The WebClient to modify.
- public static void SetProxy(WebClient webClient) {
- switch (App.UserSettings.Proxy) {
+ public static void SetProxy(WebClient webClient)
+ {
+ switch (App.UserSettings.Proxy)
+ {
case ProxyType.None:
webClient.Proxy = null;
break;
case ProxyType.System:
- if (webClient.Proxy != null) {
+ if (webClient.Proxy != null)
+ {
webClient.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;
}
break;
diff --git a/src/BandcampDownloader/Helpers/RichTextBoxHelper.cs b/src/BandcampDownloader/Helpers/RichTextBoxHelper.cs
index c298fdb4..4610ed00 100644
--- a/src/BandcampDownloader/Helpers/RichTextBoxHelper.cs
+++ b/src/BandcampDownloader/Helpers/RichTextBoxHelper.cs
@@ -1,13 +1,14 @@
using System.Windows.Controls;
-namespace BandcampDownloader {
-
- internal static class RichTextBoxHelper {
-
+namespace BandcampDownloader
+{
+ internal static class RichTextBoxHelper
+ {
///
/// Returns true if scroll position of the current RichTextBox is at the end; false otherwise.
///
- public static bool IsScrolledToEnd(this RichTextBox richTextBox) {
+ public static bool IsScrolledToEnd(this RichTextBox richTextBox)
+ {
return richTextBox.VerticalOffset > richTextBox.ExtentHeight - richTextBox.ViewportHeight - 10;
}
}
diff --git a/src/BandcampDownloader/Helpers/SystemVersionHelper.cs b/src/BandcampDownloader/Helpers/SystemVersionHelper.cs
index fdbca2b0..5a9c19f9 100644
--- a/src/BandcampDownloader/Helpers/SystemVersionHelper.cs
+++ b/src/BandcampDownloader/Helpers/SystemVersionHelper.cs
@@ -1,19 +1,24 @@
using Microsoft.Win32;
-namespace BandcampDownloader {
-
- internal static class SystemVersionHelper {
-
+namespace BandcampDownloader
+{
+ internal static class SystemVersionHelper
+ {
///
/// Returns the .NET Framework version installed by querying the registry.
///
- public static string GetDotNetFrameworkVersion() {
+ public static string GetDotNetFrameworkVersion()
+ {
const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
- using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey)) {
- if (ndpKey != null && ndpKey.GetValue("Release") != null) {
+ using (var ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey))
+ {
+ if (ndpKey != null && ndpKey.GetValue("Release") != null)
+ {
return GetDotNetFrameworkVersion((int) ndpKey.GetValue("Release"));
- } else {
+ }
+ else
+ {
return "Version 4.5 or later is not detected.";
}
}
@@ -24,36 +29,47 @@ public static string GetDotNetFrameworkVersion() {
/// defined on https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed
///
/// The value of the "Release" DWORD.
- private static string GetDotNetFrameworkVersion(int releaseKey) {
+ private static string GetDotNetFrameworkVersion(int releaseKey)
+ {
// Checking the version using >= enables forward compatibility.
- if (releaseKey >= 528040) {
+ if (releaseKey >= 528040)
+ {
return "4.8 or later";
}
- if (releaseKey >= 461808) {
+ if (releaseKey >= 461808)
+ {
return "4.7.2";
}
- if (releaseKey >= 461308) {
+ if (releaseKey >= 461308)
+ {
return "4.7.1";
}
- if (releaseKey >= 460798) {
+ if (releaseKey >= 460798)
+ {
return "4.7";
}
- if (releaseKey >= 394802) {
+ if (releaseKey >= 394802)
+ {
return "4.6.2";
}
- if (releaseKey >= 394254) {
+ if (releaseKey >= 394254)
+ {
return "4.6.1";
}
- if (releaseKey >= 393295) {
+ if (releaseKey >= 393295)
+ {
return "4.6";
}
- if (releaseKey >= 379893) {
+ if (releaseKey >= 379893)
+ {
return "4.5.2";
}
- if (releaseKey >= 378675) {
+ if (releaseKey >= 378675)
+ {
return "4.5.1";
}
- if (releaseKey >= 378389) {
+ if (releaseKey >= 378389)
+ {
return "4.5";
}
diff --git a/src/BandcampDownloader/Helpers/TagHelper.cs b/src/BandcampDownloader/Helpers/TagHelper.cs
index 456e65ec..1fd11a2e 100644
--- a/src/BandcampDownloader/Helpers/TagHelper.cs
+++ b/src/BandcampDownloader/Helpers/TagHelper.cs
@@ -1,15 +1,17 @@
-namespace BandcampDownloader {
-
- internal static class TagHelper {
-
+namespace BandcampDownloader
+{
+ internal static class TagHelper
+ {
///
/// Returns the file updated with the specified album artist based on the specified TagEditAction.
///
/// The file to update.
/// The value used if TagEditAction = Modify.
/// The TagEditAction specifying how the tag should be updated.
- public static TagLib.File UpdateAlbumArtist(TagLib.File file, string albumArtist, TagEditAction editAction) {
- switch (editAction) {
+ public static TagLib.File UpdateAlbumArtist(TagLib.File file, string albumArtist, TagEditAction editAction)
+ {
+ switch (editAction)
+ {
case TagEditAction.Empty:
file.Tag.AlbumArtists = new string[1] { "" };
break;
@@ -30,8 +32,10 @@ public static TagLib.File UpdateAlbumArtist(TagLib.File file, string albumArtist
/// The file to update.
/// The value used if TagEditAction = Modify.
/// The TagEditAction specifying how the tag should be updated.
- public static TagLib.File UpdateAlbumTitle(TagLib.File file, string albumTitle, TagEditAction editAction) {
- switch (editAction) {
+ public static TagLib.File UpdateAlbumTitle(TagLib.File file, string albumTitle, TagEditAction editAction)
+ {
+ switch (editAction)
+ {
case TagEditAction.Empty:
file.Tag.Album = "";
break;
@@ -52,8 +56,10 @@ public static TagLib.File UpdateAlbumTitle(TagLib.File file, string albumTitle,
/// The file to update.
/// The value used if TagEditAction = Modify.
/// The TagEditAction specifying how the tag should be updated.
- public static TagLib.File UpdateAlbumYear(TagLib.File file, uint albumYear, TagEditAction editAction) {
- switch (editAction) {
+ public static TagLib.File UpdateAlbumYear(TagLib.File file, uint albumYear, TagEditAction editAction)
+ {
+ switch (editAction)
+ {
case TagEditAction.Empty:
file.Tag.Year = 0;
break;
@@ -74,8 +80,10 @@ public static TagLib.File UpdateAlbumYear(TagLib.File file, uint albumYear, TagE
/// The file to update.
/// The value used if TagEditAction = Modify.
/// The TagEditAction specifying how the tag should be updated.
- public static TagLib.File UpdateArtist(TagLib.File file, string artist, TagEditAction editAction) {
- switch (editAction) {
+ public static TagLib.File UpdateArtist(TagLib.File file, string artist, TagEditAction editAction)
+ {
+ switch (editAction)
+ {
case TagEditAction.Empty:
file.Tag.Performers = new string[1] { "" };
break;
@@ -95,8 +103,10 @@ public static TagLib.File UpdateArtist(TagLib.File file, string artist, TagEditA
///
/// The file to update.
/// The TagRemoveAction specifying how the tag should be updated.
- public static TagLib.File UpdateComments(TagLib.File file, TagRemoveAction removeAction) {
- switch (removeAction) {
+ public static TagLib.File UpdateComments(TagLib.File file, TagRemoveAction removeAction)
+ {
+ switch (removeAction)
+ {
case TagRemoveAction.Empty:
file.Tag.Comment = "";
break;
@@ -114,8 +124,10 @@ public static TagLib.File UpdateComments(TagLib.File file, TagRemoveAction remov
/// The file to update.
/// The value used if TagEditAction = Modify.
/// The TagEditAction specifying how the tag should be updated.
- public static TagLib.File UpdateTrackLyrics(TagLib.File file, string trackLyrics, TagEditAction editAction) {
- switch (editAction) {
+ public static TagLib.File UpdateTrackLyrics(TagLib.File file, string trackLyrics, TagEditAction editAction)
+ {
+ switch (editAction)
+ {
case TagEditAction.Empty:
file.Tag.Lyrics = "";
break;
@@ -136,8 +148,10 @@ public static TagLib.File UpdateTrackLyrics(TagLib.File file, string trackLyrics
/// The file to update.
/// The value used if TagEditAction = Modify.
/// The TagEditAction specifying how the tag should be updated.
- public static TagLib.File UpdateTrackNumber(TagLib.File file, uint trackNumber, TagEditAction editAction) {
- switch (editAction) {
+ public static TagLib.File UpdateTrackNumber(TagLib.File file, uint trackNumber, TagEditAction editAction)
+ {
+ switch (editAction)
+ {
case TagEditAction.Empty:
file.Tag.Track = 0;
break;
@@ -158,8 +172,10 @@ public static TagLib.File UpdateTrackNumber(TagLib.File file, uint trackNumber,
/// The file to update.
/// The value used if TagEditAction = Modify.
/// The TagEditAction specifying how the tag should be updated.
- public static TagLib.File UpdateTrackTitle(TagLib.File file, string trackTitle, TagEditAction editAction) {
- switch (editAction) {
+ public static TagLib.File UpdateTrackTitle(TagLib.File file, string trackTitle, TagEditAction editAction)
+ {
+ switch (editAction)
+ {
case TagEditAction.Empty:
file.Tag.Title = "";
break;
diff --git a/src/BandcampDownloader/Helpers/ThemeHelper.cs b/src/BandcampDownloader/Helpers/ThemeHelper.cs
index dc93fa8f..51fdba9b 100644
--- a/src/BandcampDownloader/Helpers/ThemeHelper.cs
+++ b/src/BandcampDownloader/Helpers/ThemeHelper.cs
@@ -1,18 +1,20 @@
using System;
using System.Windows;
-namespace BandcampDownloader {
-
- internal static class ThemeHelper {
-
+namespace BandcampDownloader
+{
+ internal static class ThemeHelper
+ {
///
/// Applies the specified skin to the application resources.
///
/// The skin to apply.
- public static void ApplySkin(Skin skin) {
+ public static void ApplySkin(Skin skin)
+ {
Application.Current.Resources.MergedDictionaries.Clear();
- switch (skin) {
+ switch (skin)
+ {
case Skin.Dark:
Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("Themes\\DarkTheme.xaml", UriKind.Relative) });
break;
diff --git a/src/BandcampDownloader/Helpers/UpdatesHelper.cs b/src/BandcampDownloader/Helpers/UpdatesHelper.cs
index 5e6c23d6..2395fd29 100644
--- a/src/BandcampDownloader/Helpers/UpdatesHelper.cs
+++ b/src/BandcampDownloader/Helpers/UpdatesHelper.cs
@@ -2,40 +2,51 @@
using System.Net;
using System.Threading.Tasks;
-namespace BandcampDownloader {
-
- internal static class UpdatesHelper {
-
+namespace BandcampDownloader
+{
+ internal static class UpdatesHelper
+ {
///
/// Returns the latest version available.
///
- public static async Task GetLatestVersionAsync() {
+ public static async Task GetLatestVersionAsync()
+ {
// Note: GitHub uses a HTTP redirect to redirect from the generic latest release page to the actual latest release page
// Retrieve the redirect page from the GitHub latest release page
var request = HttpWebRequest.CreateHttp(Constants.UrlLatestRelease);
request.AllowAutoRedirect = false;
- string redirectPage = "";
- try {
- using (WebResponse response = await request.GetResponseAsync()) {
+ var redirectPage = "";
+ try
+ {
+ using (var response = await request.GetResponseAsync())
+ {
redirectPage = ((HttpWebResponse) response).GetResponseHeader("Location");
// redirectPage should be like "https://github.com/Otiel/BandcampDownloader/releases/tag/vX.X.X"
}
- } catch {
+ }
+ catch
+ {
throw new CouldNotCheckForUpdatesException();
}
// Extract the version number from the URL
string latestVersionNumber;
- try {
+ try
+ {
latestVersionNumber = redirectPage.Substring(redirectPage.LastIndexOf("/v") + 2); // X.X.X
- } catch {
+ }
+ catch
+ {
throw new CouldNotCheckForUpdatesException();
}
- if (Version.TryParse(latestVersionNumber, out Version latestVersion)) {
+ if (Version.TryParse(latestVersionNumber, out var latestVersion))
+ {
return latestVersion;
- } else {
+ }
+ else
+ {
throw new CouldNotCheckForUpdatesException();
}
}
diff --git a/src/BandcampDownloader/Helpers/UrlHelper.cs b/src/BandcampDownloader/Helpers/UrlHelper.cs
new file mode 100644
index 00000000..2a6c553a
--- /dev/null
+++ b/src/BandcampDownloader/Helpers/UrlHelper.cs
@@ -0,0 +1,10 @@
+namespace BandcampDownloader
+{
+ public static class UrlHelper
+ {
+ public static string GetHttpUrlIfNeeded(string url)
+ {
+ return App.UserSettings.UseHttpInsteadOfHttps ? url.Replace("https", "http") : url;
+ }
+ }
+}
diff --git a/src/BandcampDownloader/Model/Album.cs b/src/BandcampDownloader/Model/Album.cs
index cde4081f..ce4cf56f 100644
--- a/src/BandcampDownloader/Model/Album.cs
+++ b/src/BandcampDownloader/Model/Album.cs
@@ -1,10 +1,10 @@
using System;
using System.Collections.Generic;
-namespace BandcampDownloader {
-
- internal class Album {
-
+namespace BandcampDownloader
+{
+ internal class Album
+ {
///
/// The album artist.
///
@@ -28,8 +28,10 @@ internal class Album {
///
/// True if the album has an artwork; false otherwise.
///
- public bool HasArtwork {
- get {
+ public bool HasArtwork
+ {
+ get
+ {
return ArtworkUrl != null;
}
}
@@ -62,7 +64,8 @@ public bool HasArtwork {
///
/// Initializes a new Album.
///
- public Album(string artist, string artworkUrl, DateTime releaseDate, string title) {
+ public Album(string artist, string artworkUrl, DateTime releaseDate, string title)
+ {
Artist = artist;
ArtworkUrl = artworkUrl;
ReleaseDate = releaseDate;
@@ -77,8 +80,10 @@ public Album(string artist, string artworkUrl, DateTime releaseDate, string titl
///
/// Returns the file extension to be used for the playlist, depending of the type of playlist defined in UserSettings.
///
- private static string GetPlaylistFileExtension() {
- switch (App.UserSettings.PlaylistFormat) {
+ private static string GetPlaylistFileExtension()
+ {
+ switch (App.UserSettings.PlaylistFormat)
+ {
case PlaylistFormat.m3u:
return ".m3u";
case PlaylistFormat.pls:
@@ -97,8 +102,9 @@ private static string GetPlaylistFileExtension() {
/// the UserSettings, by replacing the placeholders strings with their corresponding values. The returned file
/// name does NOT contain the extension.
///
- private string ParseCoverArtFileName() {
- string fileName = App.UserSettings.CoverArtFileNameFormat
+ private string ParseCoverArtFileName()
+ {
+ var fileName = App.UserSettings.CoverArtFileNameFormat
.Replace("{year}", ReleaseDate.Year.ToString())
.Replace("{month}", ReleaseDate.Month.ToString("00"))
.Replace("{day}", ReleaseDate.Day.ToString("00"))
@@ -111,15 +117,17 @@ private string ParseCoverArtFileName() {
/// Returns the folder path from the specified path format, by replacing the placeholders strings with their
/// corresponding values. If the path is too long (> 247 characters), it will be stripped.
///
- private string ParseFolderPath() {
- string path = App.UserSettings.DownloadsPath;
+ private string ParseFolderPath()
+ {
+ var path = App.UserSettings.DownloadsPath;
path = path.Replace("{year}", ReleaseDate.Year.ToString().ToAllowedFileName());
path = path.Replace("{month}", ReleaseDate.Month.ToString("00").ToAllowedFileName());
path = path.Replace("{day}", ReleaseDate.Day.ToString("00").ToAllowedFileName());
path = path.Replace("{artist}", Artist.ToAllowedFileName());
path = path.Replace("{album}", Title.ToAllowedFileName());
- if (path.Length >= 248) {
+ if (path.Length >= 248)
+ {
// Windows doesn't do well with path >= 248 characters (and path + filename >= 260 characters)
path = path.Substring(0, 247);
}
@@ -131,8 +139,9 @@ private string ParseFolderPath() {
/// Returns the file name to be used for the playlist file of the specified album from the file name format saved
/// in the UserSettings, by replacing the placeholders strings with their corresponding values.
///
- private string ParsePlaylistFileName() {
- string fileName = App.UserSettings.PlaylistFileNameFormat
+ private string ParsePlaylistFileName()
+ {
+ var fileName = App.UserSettings.PlaylistFileNameFormat
.Replace("{year}", ReleaseDate.Year.ToString())
.Replace("{month}", ReleaseDate.Month.ToString("00"))
.Replace("{day}", ReleaseDate.Day.ToString("00"))
@@ -146,17 +155,19 @@ private string ParsePlaylistFileName() {
/// replacing the placeholders strings with their corresponding values. If the path is too long (> 259
/// characters), it will be stripped.
///
- private string ParsePlaylistPath() {
- string fileExt = GetPlaylistFileExtension();
+ private string ParsePlaylistPath()
+ {
+ var fileExt = GetPlaylistFileExtension();
// Compute paths where to save artwork
- string filePath = Path + "\\" + ParsePlaylistFileName() + fileExt;
+ var filePath = Path + "\\" + ParsePlaylistFileName() + fileExt;
- if (filePath.Length >= 260) {
+ if (filePath.Length >= 260)
+ {
// Windows doesn't do well with path + filename >= 260 characters (and path >= 248 characters) Path has
// been shorten to 247 characters before, so we have 12 characters max left for "\filename.ext", so 11
// character max for "filename.ext"
- int fileNameMaxLength = 11 - fileExt.Length;
+ var fileNameMaxLength = 11 - fileExt.Length;
filePath = Path + "\\" + ParsePlaylistFileName().Substring(0, fileNameMaxLength) + fileExt;
}
@@ -166,25 +177,28 @@ private string ParsePlaylistPath() {
///
/// Sets the ArtworkPath and ArtworkTempPath properties.
///
- private void SetArtworkPaths() {
- if (HasArtwork) {
- string artworkFileExt = System.IO.Path.GetExtension(ArtworkUrl);
+ private void SetArtworkPaths()
+ {
+ if (HasArtwork)
+ {
+ var artworkFileExt = System.IO.Path.GetExtension(ArtworkUrl);
// In order to prevent #54 (artworkTempPath used at the same time by another downloading thread), we'll
// add a random number to the name of the artwork file saved in Temp directory
- string randomNumber = App.Random.Next(1, 1000).ToString("00#");
+ var randomNumber = App.Random.Next(1, 1000).ToString("00#");
// Compute paths where to save artwork
ArtworkTempPath = System.IO.Path.GetTempPath() + "\\" + ParseCoverArtFileName() + randomNumber + artworkFileExt;
ArtworkPath = Path + "\\" + ParseCoverArtFileName() + artworkFileExt;
- if (ArtworkTempPath.Length >= 260 || ArtworkPath.Length >= 260) {
+ if (ArtworkTempPath.Length >= 260 || ArtworkPath.Length >= 260)
+ {
// Windows doesn't do well with path + filename >= 260 characters (and path >= 248 characters) Path
// has been shorten to 247 characters before, so we have 12 characters max left for "\filename.ext",
// so 11 character max for "filename.ext" There may be only one path needed to shorten, but it's
// better to use the same file name in both places
- int fileNameInTempMaxLength = 11 - randomNumber.Length - artworkFileExt.Length;
- int fileNameInFolderMaxLength = 11 - artworkFileExt.Length;
+ var fileNameInTempMaxLength = 11 - randomNumber.Length - artworkFileExt.Length;
+ var fileNameInFolderMaxLength = 11 - artworkFileExt.Length;
ArtworkTempPath = System.IO.Path.GetTempPath() + "\\" + ParseCoverArtFileName().Substring(0, fileNameInTempMaxLength) + randomNumber + artworkFileExt;
ArtworkPath = Path + "\\" + ParseCoverArtFileName().Substring(0, fileNameInFolderMaxLength) + artworkFileExt;
}
diff --git a/src/BandcampDownloader/Model/FileType.cs b/src/BandcampDownloader/Model/FileType.cs
index a5a708f0..06ab0f2d 100644
--- a/src/BandcampDownloader/Model/FileType.cs
+++ b/src/BandcampDownloader/Model/FileType.cs
@@ -1,6 +1,7 @@
-namespace BandcampDownloader {
-
- internal enum FileType {
+namespace BandcampDownloader
+{
+ internal enum FileType
+ {
Artwork,
Track
}
diff --git a/src/BandcampDownloader/Model/JSON/JsonAlbum.cs b/src/BandcampDownloader/Model/JSON/JsonAlbum.cs
index 6cbf8c01..459acd5c 100644
--- a/src/BandcampDownloader/Model/JSON/JsonAlbum.cs
+++ b/src/BandcampDownloader/Model/JSON/JsonAlbum.cs
@@ -3,9 +3,10 @@
using System.Linq;
using Newtonsoft.Json;
-namespace BandcampDownloader {
-
- internal class JsonAlbum {
+namespace BandcampDownloader
+{
+ internal class JsonAlbum
+ {
private readonly string _urlEnd = "_0.jpg";
private readonly string _urlStart = "https://f4.bcbits.com/img/a"; // Uses the art_id variable to retrieve the image from Bandcamp hosting site
@@ -24,12 +25,14 @@ internal class JsonAlbum {
[JsonProperty("trackinfo")]
public List Tracks { get; set; }
- public Album ToAlbum() {
+ public Album ToAlbum()
+ {
// Some albums do not have a cover art
- string artworkUrl = ArtId == null ? null : _urlStart + ArtId.PadLeft(10, '0') + _urlEnd;
+ var artworkUrl = ArtId == null ? null : _urlStart + ArtId.PadLeft(10, '0') + _urlEnd;
// Singles might not have a release date #144
- if (ReleaseDate == new DateTime()) {
+ if (ReleaseDate == new DateTime())
+ {
ReleaseDate = AlbumData.ReleaseDate;
}
diff --git a/src/BandcampDownloader/Model/JSON/JsonAlbumData.cs b/src/BandcampDownloader/Model/JSON/JsonAlbumData.cs
index 3f1d9a0a..3460c170 100644
--- a/src/BandcampDownloader/Model/JSON/JsonAlbumData.cs
+++ b/src/BandcampDownloader/Model/JSON/JsonAlbumData.cs
@@ -1,10 +1,10 @@
using System;
using Newtonsoft.Json;
-namespace BandcampDownloader {
-
- internal class JsonAlbumData {
-
+namespace BandcampDownloader
+{
+ internal class JsonAlbumData
+ {
[JsonProperty("title")]
public string AlbumTitle { get; set; }
diff --git a/src/BandcampDownloader/Model/JSON/JsonMp3File.cs b/src/BandcampDownloader/Model/JSON/JsonMp3File.cs
index 2727bf45..26aa553f 100644
--- a/src/BandcampDownloader/Model/JSON/JsonMp3File.cs
+++ b/src/BandcampDownloader/Model/JSON/JsonMp3File.cs
@@ -1,9 +1,9 @@
using Newtonsoft.Json;
-namespace BandcampDownloader {
-
- internal class JsonMp3File {
-
+namespace BandcampDownloader
+{
+ internal class JsonMp3File
+ {
[JsonProperty("mp3-128")]
public string Url { get; set; }
}
diff --git a/src/BandcampDownloader/Model/JSON/JsonTrack.cs b/src/BandcampDownloader/Model/JSON/JsonTrack.cs
index c57d46c2..4289057c 100644
--- a/src/BandcampDownloader/Model/JSON/JsonTrack.cs
+++ b/src/BandcampDownloader/Model/JSON/JsonTrack.cs
@@ -1,9 +1,9 @@
using Newtonsoft.Json;
-namespace BandcampDownloader {
-
- internal class JsonTrack {
-
+namespace BandcampDownloader
+{
+ internal class JsonTrack
+ {
[JsonProperty("duration")]
public double Duration { get; set; }
@@ -19,9 +19,10 @@ internal class JsonTrack {
[JsonProperty("title")]
public string Title { get; set; }
- public Track ToTrack(Album album) {
- string mp3Url = (File.Url.StartsWith("//") ? "http:" : "") + File.Url; // "//example.com" Uri lacks protocol
- int number = Number == 0 ? 1 : Number; // For bandcamp track pages, Number will be 0. Set 1 instead
+ public Track ToTrack(Album album)
+ {
+ var mp3Url = (File.Url.StartsWith("//") ? "http:" : "") + File.Url; // "//example.com" Uri lacks protocol
+ var number = Number == 0 ? 1 : Number; // For bandcamp track pages, Number will be 0. Set 1 instead
return new Track(album, Duration, Lyrics, mp3Url, number, Title);
}
diff --git a/src/BandcampDownloader/Model/Track.cs b/src/BandcampDownloader/Model/Track.cs
index 346c7c2b..25f4c0b9 100644
--- a/src/BandcampDownloader/Model/Track.cs
+++ b/src/BandcampDownloader/Model/Track.cs
@@ -1,7 +1,7 @@
-namespace BandcampDownloader {
-
- internal class Track {
-
+namespace BandcampDownloader
+{
+ internal class Track
+ {
///
/// The track album.
///
@@ -40,7 +40,8 @@ internal class Track {
///
/// Initializes a new Track.
///
- public Track(Album album, double duration, string lyrics, string mp3Url, int number, string title) {
+ public Track(Album album, double duration, string lyrics, string mp3Url, int number, string title)
+ {
Album = album;
Duration = duration;
Lyrics = lyrics;
@@ -55,8 +56,9 @@ public Track(Album album, double duration, string lyrics, string mp3Url, int num
/// Returns the file name to be used for the track from the file name format saved in the UserSettings, by
/// replacing the placeholders strings with their corresponding values. The returned file name DOES contain the extension.
///
- private string ParseTrackFileName() {
- string fileName = App.UserSettings.FileNameFormat
+ private string ParseTrackFileName()
+ {
+ var fileName = App.UserSettings.FileNameFormat
.Replace("{year}", Album.ReleaseDate.Year.ToString())
.Replace("{month}", Album.ReleaseDate.Month.ToString("00"))
.Replace("{day}", Album.ReleaseDate.Day.ToString("00"))
@@ -71,14 +73,16 @@ private string ParseTrackFileName() {
/// Returns the file path to be used for the track from the file name format saved in the UserSettings, by
/// replacing the placeholders strings with their corresponding values. The returned file path DOES contain the extension.
///
- private string ParseTrackFilePath() {
- string fileName = ParseTrackFileName();
+ private string ParseTrackFilePath()
+ {
+ var fileName = ParseTrackFileName();
- string path = Album.Path + "\\" + fileName;
- if (path.Length >= 260) {
+ var path = Album.Path + "\\" + fileName;
+ if (path.Length >= 260)
+ {
// Windows doesn't do well with path + filename >= 260 characters (and path >= 248 characters)
// album.Path has been shorten to 247 characters before, so we have 12 characters max left for "\filename.ext", so 11 character max for "filename.ext"
- int fileNameMaxLength = 11 - System.IO.Path.GetExtension(path).Length;
+ var fileNameMaxLength = 11 - System.IO.Path.GetExtension(path).Length;
path = Album.Path + "\\" + fileName.Substring(0, fileNameMaxLength) + System.IO.Path.GetExtension(path);
}
diff --git a/src/BandcampDownloader/Model/TrackFile.cs b/src/BandcampDownloader/Model/TrackFile.cs
index aa75055e..d5c68354 100644
--- a/src/BandcampDownloader/Model/TrackFile.cs
+++ b/src/BandcampDownloader/Model/TrackFile.cs
@@ -1,12 +1,14 @@
-namespace BandcampDownloader {
-
- internal class TrackFile {
+namespace BandcampDownloader
+{
+ internal class TrackFile
+ {
public long BytesReceived { get; set; }
public bool Downloaded { get; set; }
public long Size { get; set; }
public string Url { get; set; }
- public TrackFile(string url, long bytesReceived, long size) {
+ public TrackFile(string url, long bytesReceived, long size)
+ {
Url = url;
BytesReceived = bytesReceived;
Size = size;
diff --git a/src/BandcampDownloader/Properties/AssemblyInfo.cs b/src/BandcampDownloader/Properties/AssemblyInfo.cs
index 9cf30915..965624ac 100644
--- a/src/BandcampDownloader/Properties/AssemblyInfo.cs
+++ b/src/BandcampDownloader/Properties/AssemblyInfo.cs
@@ -47,6 +47,6 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.3.5")]
-[assembly: AssemblyFileVersion("1.3.5")]
+[assembly: AssemblyVersion("1.4.0")]
+[assembly: AssemblyFileVersion("1.4.0")]
[assembly: GuidAttribute("8C171C7F-9BAC-4EC0-A287-59908B48953F")]
\ No newline at end of file
diff --git a/src/BandcampDownloader/Properties/Resources.Designer.cs b/src/BandcampDownloader/Properties/Resources.Designer.cs
index 1c2e312a..bfd35f55 100644
--- a/src/BandcampDownloader/Properties/Resources.Designer.cs
+++ b/src/BandcampDownloader/Properties/Resources.Designer.cs
@@ -433,6 +433,24 @@ internal static string checkBoxSaveCoverArtInTags_ToolTip {
}
}
+ ///
+ /// Looks up a localized string similar to Use HTTP instead of HTTPS.
+ ///
+ internal static string checkBoxUseHttpInsteadOfHttps {
+ get {
+ return ResourceManager.GetString("checkBoxUseHttpInsteadOfHttps", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Use this option if your HTTPS traffic to Bandcamp is blocked..
+ ///
+ internal static string checkBoxUseHttpInsteadOfHttps_Tooltip {
+ get {
+ return ResourceManager.GetString("checkBoxUseHttpInsteadOfHttps_Tooltip", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Show _verbose log.
///
@@ -757,6 +775,15 @@ internal static string labelPlaylistFormat {
}
}
+ ///
+ /// Looks up a localized string similar to Proxy.
+ ///
+ internal static string labelProxy {
+ get {
+ return ResourceManager.GetString("labelProxy", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Some settings cannot be changed while tracks are downloading..
///
@@ -969,7 +996,7 @@ internal static string messageBoxUnhandledException {
}
///
- /// Looks up a localized string similar to _Manual proxy configuration.
+ /// Looks up a localized string similar to _Manual configuration.
///
internal static string radioButtonManualProxy {
get {
@@ -978,7 +1005,7 @@ internal static string radioButtonManualProxy {
}
///
- /// Looks up a localized string similar to _No proxy.
+ /// Looks up a localized string similar to _None.
///
internal static string radioButtonNoProxy {
get {
@@ -987,7 +1014,7 @@ internal static string radioButtonNoProxy {
}
///
- /// Looks up a localized string similar to S_ystem proxy.
+ /// Looks up a localized string similar to S_ystem.
///
internal static string radioButtonSystemProxy {
get {
diff --git a/src/BandcampDownloader/Properties/Resources.ar.resx b/src/BandcampDownloader/Properties/Resources.ar.resx
index 517f9d56..c5ecd6a7 100644
--- a/src/BandcampDownloader/Properties/Resources.ar.resx
+++ b/src/BandcampDownloader/Properties/Resources.ar.resx
@@ -1,4 +1,4 @@
-
+
@@ -61,6 +61,9 @@
…
+
+ تصفح بحثًا عن الملف
+
_الغاء
@@ -73,6 +76,12 @@
_الاعدادات
+
+ أفتح الإعدادات
+
+
+ إعادة ضبط الإعدادات الافتراضية
+
_حفظ
@@ -85,27 +94,94 @@
_معاينة
+
+ تعذر تنزيل سجل التغيير من {0}
+
بحث عن تحديثات عند تشغيل البرنامج
+
+ يستعلم عن العنوان التالي عند بدء تشغيل التطبيق:
+
تحويل الصيغة الى JPG
+
+ يحول صورة الغلاف إلى JPG بضغط 90 (مقايضة ممتازة بين الحجم والجودة).
+
تحديد اعلى ارتفاع وعرض
+
+ يغير حجم صورة الغلاف إلى أقصى عرض / ارتفاع محدد.
+
تحويل الصيغة الى JPG
+
+ يحول صورة الغلاف إلى JPG بضغط 90 (مقايضة ممتازة بين الحجم والجودة).
+
تحديد اعلى ارتفاع وعرض
+
+ يغير حجم صورة الغلاف إلى أقصى عرض / ارتفاع محدد.
+
صنع قائمة تشغيل لكل البوم
+
+ ينشئ ملف مسار الألبوم لكل ألبوم تم تنزيله.
+
تحميل البومات الفنان كلها
+
+ تحميل جميع ألبومات الفنان.
+
+
+ تشغيل أصوات الإخطارات
+
+
+ تفعيل صوت إخطار حين الانتهاء من التحميل.
+
+
+ استخدام التنسيق الموسع (فقط لملفات M3U)
+
+
+ قوائم تشغيل ملفات M3U بالشكل الموسع (التوجيهات مسبوقة بالحرف #).
+
+
+ تعديل علامات الأغاني (ID3)
+
+
+ يعدل كل علامة بالشكل المحدد أدناه.
+
+إذا لم يكن الأمر كذلك ، فستظل جميع العلامات بدون تغيير ، أي ما يعادل إعداد "عدم التعديل" لكل علامة.
+
+
+ قم بتنزيل ألبوم واحد في كل مرة
+
+
+ يقوم بتنزيل ألبوم واحد فقط في كل مرة.
+إذا لم يكن الأمر كذلك ، فسيتم تنزيل جميع الألبومات بشكل متزامن (يتوفر أفضل عرض نطاق ترددي عالٍ).
+
+
+ استرجع حجم الملف قبل تنزيل الأغاني
+
+
+ يسترجع حجم الملف لإظهار تقدم دقيق.
+إذا لم يكن كذلك ، فسيتم حفظ بعض النطاق الترددي / الوقت.
+
+
+ احفظ في الملف
+
+
+ تحميل صورة الغلاف إلى مجلد الألبوم.
+
+
+ يحفظ غلاف الألبوم في علامات الأغاني.
+
_الغاء
diff --git a/src/BandcampDownloader/Properties/Resources.de.resx b/src/BandcampDownloader/Properties/Resources.de.resx
index 02bcea42..4bdf0b59 100644
--- a/src/BandcampDownloader/Properties/Resources.de.resx
+++ b/src/BandcampDownloader/Properties/Resources.de.resx
@@ -160,7 +160,7 @@
Beim Start auf _Aktualisierungen prüfen
- Folgenden Adresse beim Start der App abfragen:
+ Folgenden Adresse beim Start der Anwendung abfragen:
In _JPG umwandeln
@@ -216,7 +216,7 @@
Ändert jedes Schlagwort wie unten angegeben.
-Wenn nicht, sind alle Schlagworte unverändert, was der Einstellung „Nicht ändern” für jedes Schlagwort entspricht.
+Wenn nicht, sind alle Schlagworte unverändert, was der Einstellung „Nicht ändern“ für jedes Schlagwort entspricht.
Nur ein Album gleichzeitig _herunterladen
diff --git a/src/BandcampDownloader/Properties/Resources.eo.resx b/src/BandcampDownloader/Properties/Resources.eo.resx
new file mode 100644
index 00000000..dd7ffbcf
--- /dev/null
+++ b/src/BandcampDownloader/Properties/Resources.eo.resx
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ …
+
+
+ _Nuligi
+
+
+ _Elŝuti novan version
+
+
+ _Agordoj
+
+
+ Malfermi agordojn
+
+
+ _Konservi
+
+
+ _Elŝuti
+
+
+ _Rezigni
+
+
+ Konservi en dosier_ujo
+
+
+ Konservi en _etikedoj
+
+
+ Ŝanĝprotokolo
+
+
+ _Haveno
+
+
+ _Lingvo
+
+
+ Pri
+
+
+ Elŝutoj
+
+
+ Reto
+
+
+ Ludlisto
+
+
+ _Etoso
+
+
+ Versio
+
+
+ Retejo
+
+
+ _Nuligi
+
+
+ _Ne
+
+
+ _Bone
+
+
+ _Jes
+
+
+ Ĉu nuliĝi ĉiujn dosierojn?
+
+
+ _Fermi aplikaĵon
+
+
+ Konservi kiel
+
+
+ Malhela
+
+
+ Hela
+
+
+ Ne modifiki
+
+
+ Ne modifiki
+
+
+ Helpi traduki
+
+
+ Agordoj
+
+
\ No newline at end of file
diff --git a/src/BandcampDownloader/Properties/Resources.es.resx b/src/BandcampDownloader/Properties/Resources.es.resx
index c6054a0d..2a8d8d24 100644
--- a/src/BandcampDownloader/Properties/Resources.es.resx
+++ b/src/BandcampDownloader/Properties/Resources.es.resx
@@ -525,7 +525,7 @@ Valor recomendado = 4
Pega los enlaces de los álbumes a descargar aquí. Puedes especificar varios URLs escribiendo uno por línea.
Un URL de Bandcamp se ve como: http://[artista].bandcamp.com/album/[álbum] o http://[artista].bandcamp.com/track/[canción]
-Pegar páginas de artista: http://[artista].bandcamp.com y chequea "☑ Descargar discografía del artista" para descargar todos su(s) álbumes.
+Pegar páginas de artista: http://[artista].bandcamp.com y chequea «☑ Descargar discografía del artista» para descargar todos su(s) álbumes.
Configuración
diff --git a/src/BandcampDownloader/Properties/Resources.fi.resx b/src/BandcampDownloader/Properties/Resources.fi.resx
new file mode 100644
index 00000000..af89a7dd
--- /dev/null
+++ b/src/BandcampDownloader/Properties/Resources.fi.resx
@@ -0,0 +1,479 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Voit käyttää paikkamerkkejä räätälöidäksesi tiedostonimen:
+- {artist} korvataan albumin artistilla
+- {album} korvataan albumin nimellä
+- {year}, {month} ja {day} korvataan albumin julkaisupäivämäärällä
+
+
+ Voit käyttää paikkamerkkejä räätälöidäksesi tiedostonimen:
+- {artist} korvataan albumin artistilla
+- {title} korvataan kappaleen nimellä
+- {tracknum} korvataan kappaleen järjestysnumerolla
+- {album} korvataan albumin nimellä
+- {year}, {month} ja {day} korvataan albumin julkaisupäivämäärällä
+
+
+ Voit käyttää paikkamerkkejä räätälöidäksesi tiedostonimen:
+- {artist} korvataan albumin artistilla
+- {album} korvataan albumin nimellä
+- {year}, {month} ja {day} korvataan albumin julkaisupäivämäärällä
+
+
+ Voit käyttää paikkamerkkejä räätälöidäksesi latauskansion albumista riippuen:
+- {artist} korvataan albumin artistilla
+- {album} korvataan albumin nimellä
+- {year}, {month} ja {day} korvataan albumin julkaisupäivämäärällä
+
+
+ Käytetään rajoittamaan eksponentiaalista peruutusmekanismia.
+Jokaisen epäonnistuneen latauksen jälkeen BandcampDownloader voi odottaa tietyn ajanjakson ennen seuraavaa yritystä
+ladata kappale, jotta vältetään joutumasta Bandcampin roskapostisuodattimeen.
+Käytetty kaava odotusajan laskemiseen on seuraava:
+
+aika = cooldown * (exponent ^ yritysten lukumäärä)
+
+Suositeltu arvo = 4
+
+
+ Käytetään rajoittamaan eksponentiaalista peruutusmekanismia.
+Jokaisen epäonnistuneen latauksen jälkeen BandcampDownloader voi odottaa tietyn ajanjakson ennen seuraavaa yritystä
+ladata kappale, jotta vältetään joutumasta Bandcampin roskapostisuodattimeen.
+Käytetty kaava odotusajan laskemiseen on seuraava:
+
+aika = cooldown * (exponent ^ yritysten lukumäärä)
+
+Suositeltu arvo = 0.2
+
+
+ Maksimimäärä latausyrityksiä, jos se epäonnistuu.
+Kun maksimiluku on saavutettu (joka kappaletta kohden), kappaleen lataus ohitetaan).
+
+Suositeltu arvo = 7
+
+
+ Kun kappaletta tallennetaan, jos saman niminen kappale on jo olemassa, se tullaan tarkastamaan.
+Jos kappaleiden koot poikkeavat vähemmän kuin tämän arvon (prosenteissa) kappaleen lataus ohitetaan.
+Aseta arvoksi 0, jotta kappaleet tallennetaan aina, vaikka levyllä olisi jo sama kappale.
+
+Suositeltu arvo = 5
+
+
+ Vaalea
+
+
+ Tumma
+
+
+ Tallenna nimellä
+
+
+ Ennalta-arvaamaton virhe tapahtui. Sovellus sulkeutuu nyt.
+
+Tee tästä uusi ilmoitus ja sisällytä siihen lokitiedoston tiedot:
+{0}
+
+
+ Palautetaanko oletusasetukset?
+
+
+ _Palauta oletusasetukset
+
+
+ Ei voitu avata linkkiä:
+{0}
+
+
+ Tällä hetkellä on meneillään olevia latauksia. Haluatko varmasti sulkea sovelluksen ja pysäyttää kaikki lataukset?
+
+
+ _Sulje sovellus
+
+
+ Peruuta kaikki lataukset?
+
+
+ _Teema
+
+
+ Valitse nämä asetukset omalla vastuulla.
+
+
+ Valitse kansio, johon albumit tallennetaan
+
+
+ Näyttää enemmän tietoa lokista.
+
+
+ Tallentaa albumitaiteen kappeleen tageihin.
+
+
+ Lataa kansitaiteen albumikansioon.
+
+
+ Selvittää tiedostokoon näyttääkseen latauksen edistymisen.
+Jos ei, säästetään hieman dataa/aikaa.
+
+
+ Lataa yhden albumin kerrallaan.
+Jos ei, kaikki albumit ladataan yhtäaikaisesti (toimii paremmin hyvällä verkkoyhteydellä).
+
+
+ Muuntaa jokaisen tagin alla määritellyllä tavalla.
+
+Jos ei, kaikki tagit ovat muuttamattomia, mikä vastaa asetusta "Älä muokkaa" jokaisessa tagissa.
+
+
+ M3U-soittolistat laajennetussa muodossa (direktiivejä edeltää #-merkki).
+
+
+ Ilmoitusten äänet valmille latauksille.
+
+
+ Tallentaa artistin diskografian kokonaan.
+
+
+ Luo albumin kappaletiedoston jokaiselle ladatulle albumille.
+
+
+ Venyttää kansitaiteen määriteltyyn maksimileveyteen/-korkeuteen.
+
+
+ Muuntaa kansitaiteen JPG-muotoon kompressiotasolla 90 (erinomainen kompromissi koon ja laadun välillä).
+
+
+ Venyttää kansitaiteen määriteltyyn maksimileveyteen-/korkeuteen.
+
+
+ Muuntaa kansitaiteen JPG-muotoon kompressiotasolla 90 (erinomainen kompromissi koon ja laadun suhteen).
+
+
+ Tiedustelee seuraavista osoitteista sovelluksen käynnistyessä:
+
+
+ Ei voitu ladata muutoslokia sijainnista {0}
+
+
+ Palauta oletusasetukset
+
+
+ Avaa asetukset
+
+
+ Selaa kansiota
+
+
+ Päivitä
+
+
+ Asetukset
+
+
+ Liitä albumien osoitteet tähän lataamista varten. Voit syöttää useampia osoitteita kirjoittamalla jokaisen osoitteen uudelle riville.
+
+Bandcamp-osoite näyttää tältä: http://[artisti].bandcamp.com/album/[albumi] or http://[artisti].bandcamp.com/track/[kappale]
+Liitä artistin sivut: http://[artisti].bandcamp.com ja valitse "☑ Tallenna artistin diskografia" ladataksesi kaikki albumit.
+
+
+ Auta kääntämisessä
+
+
+ Julkaisuhistoria
+
+
+ J_ärjestelmän välityspalvelin
+
+
+ _Ei välityspalvelinta
+
+
+ _Manuaalinen välityspalvelimen määrittely
+
+
+ Sinulla on jo uusin versio ({0}).
+
+
+ Virhe päivistysten tarkistuksessa. Yritä myöhemmin uudelleen.
+
+
+ Albumin julkaisu_vuosi
+
+
+ Verkkosivu
+
+
+ Uusi versio saatavilla
+
+
+ Ei voitu ladata päivityksiä
+
+
+ Versio
+
+
+ (lokitiedosto on aina runsassanainen)
+
+
+ _Otsikko
+
+
+ Kappaleen n_umero
+
+
+ Joitain asetuksia ei voida muuttaa kesken kappaleiden latauksen.
+
+
+ Soittolistan _muoto
+
+
+ Tiedosto_nimen muoto
+
+
+ _Sanat
+
+
+ Nimeäminen ja tagit
+
+
+ Soittolista
+
+
+ Verkko
+
+
+ Yleinen
+
+
+ Lataukset
+
+
+ Kansikuva
+
+
+ Lisäasetukset
+
+
+ Tietoa
+
+
+ _Kieli
+
+
+ Ilmoita bugista
+
+
+ _Portti
+
+
+ _HTTP(S) välityspalvelin
+
+
+ _Tiedostonimen formaatti:
+
+
+ Tallenna albumit _kohteeseen
+
+
+ Yritä uudelleen _exponent
+
+
+ Yritä uudelleen c_ooldown (sekuntia)
+
+
+ _Maksimimäärä latausyrityksiä
+
+
+ Nykyinen versio:
+
+
+ Maksimikoko (p_x)
+
+
+ Maksimikoko (_px)
+
+
+ Tiedosto_nimen formaatti
+
+
+ Komm_entit
+
+
+ Muutosloki
+
+
+ Muutosloki
+
+
+ _Palauta oletusasetukset
+
+
+ _Artisti
+
+
+ Sallittu tiedostokoon _eroavaisuus (%)
+
+
+ Albumin _nimi
+
+
+ Albumin art_isti
+
+
+ Näytä _runsassanainen loki
+
+
+ Tallenna _tageihin
+
+
+ Tallenna _kansioon
+
+
+ Muunna _JPG -muotoon
+
+
+ Tarkista _päivitykset käynnistyessä
+
+
+ Tyhjennä tagi
+
+
+ Älä muokkaa
+
+
+ Tallenna tagiin
+
+
+ Selvitä _tiedostokoko ennen kappaleiden lataamista
+
+
+ _Tallenna yksi albumi kerrallaan
+
+
+ _Muokkaa kappaleiden tageja (ID3)
+
+
+ Käytä _laajennettua formaattia (koskee vain M3U:ta)
+
+
+ Toista _ilmoitusten äänet
+
+
+ Tallenna _artistin diskografia
+
+
+ Luo _soittolista joka albumille
+
+
+ Rajoita m_aksimileveyttä/-korkeutta
+
+
+ Muunna muotoon JP_G
+
+
+ Rajoita _maksimileveyttä/-korkeutta
+
+
+ Tyhjennä tagi
+
+
+ Älä muokkaa
+
+
+ _Kyllä
+
+
+ _OK
+
+
+ _Ei
+
+
+ _Peruuta
+
+
+ _Näytä
+
+
+ _Peruuta
+
+
+ _Tallenna
+
+
+ _Tallenna
+
+
+ _Asetukset
+
+
+ _Lataa uusin versio
+
+
+ Tarkista päivitykset
+
+
+ _Peruuta
+
+
+ …
+
+
\ No newline at end of file
diff --git a/src/BandcampDownloader/Properties/Resources.fr.resx b/src/BandcampDownloader/Properties/Resources.fr.resx
index d4da2f69..3eddd668 100644
--- a/src/BandcampDownloader/Properties/Resources.fr.resx
+++ b/src/BandcampDownloader/Properties/Resources.fr.resx
@@ -216,7 +216,7 @@
Chaque métadonnée sera modifiée selon les règles définies ci-dessous.
-Si cette option est décochée, toutes les règles définies ci-dessous seront ignorées et les métadonnées seront conservées à l'identique du fichier téléchargé. Cela revient à régler "Ne pas modifier" pour chaque métadonnée.
+Si cette option est décochée, toutes les règles définies ci-dessous seront ignorées et les métadonnées seront conservées à l'identique du fichier téléchargé. Ceci revient à régler « Ne pas modifier » pour chaque métadonnée.
Télécharger un album à la _fois
@@ -395,7 +395,7 @@ Décocher cette option permet de gagner du temps.
_Oui
- Êtes-vous sûr de vouloir arrêter les téléchargements ?
+ Annuler tous les téléchargements ?
Une erreur est intervenue lors de la vérification de mises à jour. Veuillez réessayer plus tard.
@@ -404,7 +404,7 @@ Décocher cette option permet de gagner du temps.
_Fermer l'application
- Des téléchargements sont en cours. Êtes-vous sûr de vouloir fermer l'application et arrêter tous les téléchargements ?
+ Des téléchargements sont en cours. Êtes-vous sûr·e de vouloir fermer l'application et arrêter tous les téléchargements ?
Impossible d'ouvrir le lien suivant :
@@ -426,13 +426,13 @@ Merci d'ouvrir un nouveau problème avec le contenu de votre ficher log sur
{0}
- Proxy _manuel
+ _Manuel
- A_ucun proxy
+ A_ucun
- Proxy _système
+ _Système
Sauvegarder en tant que
@@ -534,4 +534,13 @@ de leurs albums.
Mise à jour
+
+ Utiliser HTTP au lieu de HTTPS
+
+
+ Proxy
+
+
+ Utilisez cette option si vos flux HTTPS vers Bandcamp sont filtrés.
+
\ No newline at end of file
diff --git a/src/BandcampDownloader/Properties/Resources.hr.resx b/src/BandcampDownloader/Properties/Resources.hr.resx
new file mode 100644
index 00000000..0cf9bc06
--- /dev/null
+++ b/src/BandcampDownloader/Properties/Resources.hr.resx
@@ -0,0 +1,477 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ …
+
+
+ Traži mapu
+
+
+ _Odustani
+
+
+ Pro_vjeri sada
+
+
+ _Preuzmi novu verziju
+
+
+ Po_stavke
+
+
+ Otvori postavke
+
+
+ Obnovi standardne postavke
+
+
+ _Spremi
+
+
+ _Preuzmi
+
+
+ _Odustani
+
+
+ _Pogled
+
+
+ Neuspjelo preuzimanje protokola promjena od {0}
+
+
+ Traži no_ve verzije prilikom pokretanja
+
+
+ Šalje upit na sljedeću adresu prilikom pokretanja programa:
+
+
+ Pretvori u _JPG
+
+
+ Pretvara omot u JPG s kompresijom od 90 (izvrstan kompromis između veličine i kvalitete).
+
+
+ Ograniči _maksimalnu širinu i visinu
+
+
+ Mijenja veličinu omota na zadanu maksimalnu širinu i visinu.
+
+
+ Pretvori u JP_G
+
+
+ Pretvara omot u JPG s kompresijom od 90 (izvrstan kompromis između veličine i kvalitete).
+
+
+ Ograniči m_aksimalnu širinu i visinu
+
+
+ Mijenja veličinu omota na zadanu maksimalnu širinu i visinu.
+
+
+ Stvori _popis pjesama za svaki album
+
+
+ Stvara datoteku s popisom pjesama albuma za svaki preuzeti album.
+
+
+ Preuzmi diskogr_afiju izvođača
+
+
+ Preuzima cijelu diskografiju izvođača.
+
+
+ Sviraj zvukove upozore_nja
+
+
+ Zvuk upozorenja za gotova preuzimanja.
+
+
+ Koristi prošir_eni format (samo za M3U)
+
+
+ M3U popisi pjesama u proširenom formatu (direktive s predznakom #).
+
+
+ _Promijeni oznake pjesama (ID3)
+
+
+ Mijenja svaku oznaku kako je niže dolje određeno.
+
+Ako ne, sve oznake ostaju nepromijenjene, što odgovara postavci „Ne mijenjaj” za svaku oznaku.
+
+
+ _Preuzmi albume pojedinačno
+
+
+ Preuzima samo jedan album odjednom.
+Ako ne, svi se albumi preuzimaju istodobno (zahtijeva veliku protočnost).
+
+
+ Pronađi ve_ličinu datoteke prije preuzimanja pjesama
+
+
+ Pronalazi veličinu datoteke za prikaz točnog stanja napretka.
+Ako ne, štedi se neka protočnost/vrijeme.
+
+
+ Spremi u _mapu
+
+
+ Preuzima omot u mapu albuma.
+
+
+ Spremi u _oznake
+
+
+ Sprema omot u oznaku pjesme.
+
+
+ Prikaži _opširan protokol
+
+
+ Prikazuje više informacija u protokolu.
+
+
+ Odaberi mapu za spremanje albuma
+
+
+ Promijeni ove postavke na vlastitu odgovornost.
+
+
+ _Izvođač albuma
+
+
+ _Naslov albuma
+
+
+ Dozvoljena razlika veličine _datoteke (%)
+
+
+ _Izvođač
+
+
+ _Obnovi postavke
+
+
+ Protokol promjena
+
+
+ Protokol promjena
+
+
+ Kom_entari
+
+
+ Format ime_na datoteke
+
+
+ Maks. veličina (_px)
+
+
+ Maks. veličina (p_x)
+
+
+ Trenutačna verzija:
+
+
+ _Maks. broj pokušaja preuzimanja
+
+
+ Interval mirovanja (s)
+
+
+ Pot_enciranje ponovnih pokušaja
+
+
+ Spremi albume _u
+
+
+ _Format imena datoteke:
+
+
+ _HTTP(S) poslužitelj
+
+
+ _Priključak
+
+
+ Prijavi grešku
+
+
+ _Jezik
+
+
+ Informacije
+
+
+ Napredne postavke
+
+
+ Omot
+
+
+ Preuzimanja
+
+
+ Opće
+
+
+ Mreža
+
+
+ Popis pjesama
+
+
+ Nazivi i oznake
+
+
+ _Tekstovi pjesama
+
+
+ Format ime_na datoteke
+
+
+ _Format popisa pjesama
+
+
+ Neke se postavke ne mogu mijenjati dok se pjesme preuzimaju.
+
+
+ _Tema
+
+
+ B_roj pjesme
+
+
+ _Naslov
+
+
+ (protokol je uvijek opširan)
+
+
+ Verzija
+
+
+ Neuspjelo traženje novih verzija
+
+
+ Postoji nova verzija
+
+
+ Web-stranica
+
+
+ _Godina izdanja albuma
+
+
+ _Odustani
+
+
+ _Ne
+
+
+ _U redu
+
+
+ _Da
+
+
+ Prekinuti sva preuzimanja?
+
+
+ Dogodila se greška prilikom traženja novih verzija. Pokušaj kasnije ponovo.
+
+
+ _Zatvori program
+
+
+ Trenutačno postoje aktivna preuzimanja. Stvarno želiš zatvoriti program i prekinuti sva preuzimanja?
+
+
+ Neuspjelo otvaranje poveznice:
+{0}
+
+
+ Već imaš najnoviju verziju ({0}).
+
+
+ _Obnovi postavke
+
+
+ Obnoviti sve postavke na standardne vrijednosti?
+
+
+ Dogodila se neobradiva greška. Program će se sada zatvoriti.
+
+Otvori novi problem sa sadržajem tvoje datoteke protokola
+{0}
+
+
+ _Ručno postavljanje poslužitelja
+
+
+ _Bez poslužitelja
+
+
+ _Sustavski poslužitelj
+
+
+ Spremi kao
+
+
+ Tamna
+
+
+ Svijetla
+
+
+ Ne mijenjaj
+
+
+ Ukloni oznaku
+
+
+ Spremi u oznaku
+
+
+ Ne mijenjaj
+
+
+ Ukloni oznaku
+
+
+ Povijest izdanja
+
+
+ Pomogni prevesti
+
+
+ Prilikom preuzimanja pjesme, ako ista datoteka (ime datoteke) već postoji, usporedit će se s datotekom koja se preuzima.
+Ako je razlika između veličina datoteka manja od ove vrijednosti (u postocima), preuzimanje pjesme se preskače.
+Postavi ovu vrijednost na 0, kako bi se pjesme uvijek preuzele, čak i ako već postoje na disku.
+
+Preporučena vrijednost = 5
+
+
+ Ime datoteke možeš prilagoditi pomoću rezerviranih mjesta:
+- {artist} će se zamijeniti s izvođačem albuma
+- {album} će se zamijeniti s naslovom albuma
+- {year}, {month} i {day} će se zamijeniti s datumom izdanja albuma
+
+
+ Maksimalan broj pokušaja preuzimanja pjesme, ako ne uspije.
+Nakon tog broja (za svaku pjesmu), preuzimanje pjesme se preskače.
+
+Preporučena vrijednost = 7
+
+
+ Koristi se za upravljanje eksponencijalnim mehanizmom ponovnih pokušaja.
+Nakon svakog neuspjelog preuzimanja pjesme, BandcampDownloader može pričekati određeno vrijeme prije ponovnog pokušaja
+preuzimanja pjesme, kako bi se izbjeglo golicanje Bandcampovog filtra protiv neželjene pošte.
+Formula koja se koristi za izračunavanje vremena prije ponovnog pokušaja preuzimanja je sljedeća:
+vrijeme = mirovanje * (potencija ^ broj pokušaja)
+
+Preporučena vrijednost = 0,2
+
+
+ Koristi se za upravljanje eksponencijalnim mehanizmom ponovnih pokušaja.
+Nakon svakog neuspjelog preuzimanja pjesme, BandcampDownloader može pričekati određeno vrijeme prije ponovnog pokušaja
+preuzimanja pjesme, kako bi se izbjeglo golicanje Bandcampovog filtra protiv neželjene pošte.
+Formula koja se koristi za izračunavanje vremena prije ponovnog pokušaja preuzimanja je sljedeća:
+vrijeme = mirovanje * (potencija ^ broj pokušaja)
+
+Preporučena vrijednost = 4
+
+
+ Mapu preuzimanja možeš prilagoditi pomoću rezerviranih mjesta, ovisno o albumu:
+- {artist} će se zamijeniti s izvođačem albuma
+- {album} će se zamijeniti s naslovom albuma
+- {year}, {month} i {day} će se zamijeniti s datumom izdanja albuma
+
+
+ Ime datoteke možeš prilagoditi pomoću rezerviranih mjesta:
+- {artist} će se zamijeniti s izvođačem albuma
+- {title} će se zamijeniti s naslovom pjesme
+- {tracknum} će se zamijeniti s brojem pjesme
+- {album} će se zamijeniti s naslovom albuma
+- {year}, {month} i {day} će se zamijeniti s datumom izdanja albuma
+
+
+ Ime datoteke možeš prilagoditi pomoću rezerviranih mjesta:
+- {artist} će se zamijeniti s izvođačem albuma
+- {album} će se zamijeniti s naslovom albuma
+- {year}, {month} i {day} će se zamijeniti s datumom izdanja albuma
+
+
+ Ovdje umetni URL adrese albuma za preuzimanje. Možeš odrediti više URL adresa zapisivanjem URL adresa po retku.
+
+URL adresa Bandcampa izgleda ovako: http://[artist].bandcamp.com/album/[album] ili http://[artist].bandcamp.com/track/[track]
+Umetni stranice izvođača: http://[artist].bandcamp.com i označi „☑ Preuzmi diskografiju izvođača” za preuzimanje svih albuma tog izvođača.
+
+
+ Postavke
+
+
+ Aktualiziraj
+
+
\ No newline at end of file
diff --git a/src/BandcampDownloader/Properties/Resources.hu.resx b/src/BandcampDownloader/Properties/Resources.hu.resx
index 1142279b..4367a44a 100644
--- a/src/BandcampDownloader/Properties/Resources.hu.resx
+++ b/src/BandcampDownloader/Properties/Resources.hu.resx
@@ -1,4 +1,4 @@
-
+
@@ -58,23 +58,8 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- _Letoltes
-
-
- _Mentes
-
-
- Alapertelmezett beallitasok alkalmazasa
-
-
- Beallitasok megnyitasa
-
-
- _Beallitasok
-
-
- _Uj verzio letoltese
+
+ Mappavalasztas
_Visszavonas
@@ -82,50 +67,65 @@
Frissites
-
- Mappavalasztas
+
+ _Uj verzio letoltese
-
- Az alabbi link nem nyithato meg:
-{0}
+
+ _Beallitasok
-
- A legfrissebb kiadast hasznalod ({0}).
+
+ Beallitasok megnyitasa
-
- Aktiv letoltesek futnak a hatterben. Biztos vagy benne, hogy bezarod az alkalmazast es leallitod az osszes letoltest?
+
+ Alapertelmezett beallitasok alkalmazasa
-
- A frissitesek ellenorzese kozben hiba lepett fel. Kerjuk probalja ujra.
+
+ _Mentes
-
- Osszes letoltes visszavonasa?
+
+ _Letoltes
-
- Album kiadasanak eve
+
+ _Visszavonas
_Megjelenes/Tema
-
- Uj kiadas erheto el
+
+ Kiadas
Uj kiadas ellenorzese sikertelen
-
- Kiadas
+
+ Uj kiadas erheto el
+
+
+ Album kiadasanak eve
_Visszavonas
-
- _Visszavonas
+
+ Osszes letoltes visszavonasa?
-
- Beallitasok visszaallitasa alapertelmezett allapotba?
+
+ A frissitesek ellenorzese kozben hiba lepett fel. Kerjuk probalja ujra.
+
+
+ Aktiv letoltesek futnak a hatterben. Biztos vagy benne, hogy bezarod az alkalmazast es leallitod az osszes letoltest?
+
+
+ Az alabbi link nem nyithato meg:
+{0}
+
+
+ A legfrissebb kiadast hasznalod ({0}).
_Beallitasok visszaallitasa
+
+ Beallitasok visszaallitasa alapertelmezett allapotba?
+
\ No newline at end of file
diff --git a/src/BandcampDownloader/Properties/Resources.id.resx b/src/BandcampDownloader/Properties/Resources.id.resx
index efeb51b1..96798e4f 100644
--- a/src/BandcampDownloader/Properties/Resources.id.resx
+++ b/src/BandcampDownloader/Properties/Resources.id.resx
@@ -76,6 +76,12 @@
_pengaturan
+
+ Buka pengaturan
+
+
+ Setel ulang pengaturan ke default
+
_simpan
@@ -88,15 +94,235 @@
_Lihat
+
+ Tidak dapat mengunduh log perubahan dari {0}
+
Cek perbaruan saat memulaikan
+
+ Kueri alamat berikut saat memulai aplikasi:
+
Konvert ke _JPG
+
+ Mengubah cover art ke JPG dengan kompresi 90 (trade-off yang sangat baik antara ukuran dan kualitas).
+
+
+ Batasi _maksimum lebar / tinggi
+
+
+ Mengubah ukuran spesifik lebar/tinggi maksimal cover art.
+
Konvert ke JP_G
+
+ Mengonversi cover art menjadi JPG dengan kompresi 90 (pertukaran yang sangat baik antara ukuran dan kualitas).
+
+
+ Batasi lebar/tinggi m_aksimum
+
+
+ Mengubah ukuran cover art menjadi lebar / tinggi maks yang ditentukan.
+
+
+ Buat _playlist untuk setiap album
+
+
+ Membuat file trek album untuk setiap album yang diunduh.
+
+
+ Unduh diskografi _artist
+
+
+ Unduh semua diskografi artis.
+
+
+ Putar suara _notifications
+
+
+ Suara notifikasi untuk unduhan yang selesai.
+
+
+ Gunakan _extended format (hanya untuk M3U)
+
+
+ Daftar putar M3U dalam format diperpanjang ( diawali dengan karakter #).
+
+
+ _Ubah tag trek (ID3)
+
+
+ Mengubah setiap tag seperti yang ditentukan di bawah ini.
+
+Jika tidak, semua tag tidak diubah, setara dengan setelan "Jangan ubah" untuk setiap tag.
+
+
+ _Unduh satu album sekaligus
+
+
+ Hanya mengunduh satu album sekaligus
+Jika tidak, semua album diunduh secara bersamaan (idealnya tersedia bandwidth tinggi).
+
+
+ Ambil _file sebelum mengunduh trek
+
+
+ Mengambil ukuran file untuk menunjukkan progress.
+Jika tidak, beberapa bandwidth / waktu disimpan.
+
+
+ Simpan dalam _folder
+
+
+ Unduh cover art ke berkas album.
+
+
+ Simpan dalam _tags
+
+
+ Menyimpan cover art di tag trek.
+
+
+ Tampilkan log _verbose
+
+
+ Lihat lebih banyak info di log.
+
+
+ Pilih folder untuk menyimpan album
+
+
+ Ubah pengaturan ini dengan risiko ditanggung sendiri.
+
+
+ Album art_is
+
+
+ Nama _album
+
+
+ Ukuran file yang diizinkan _perbedaan (%)
+
+
+ _Artis
+
+
+ _Setel ulang pengaturan
+
+
+ Rilis perubahan
+
+
+ Rilis perubahan
+
+
+ Kome_tar
+
+
+ Format nama_file
+
+
+ Ukuran maks (_px)
+
+
+ Ukuran maksimum (p_x)
+
+
+ Versi sekarang:
+
+
+ _Maks upaya pengunduhan
+
+
+ Mencoba kembali c_ooldown (dtk)
+
+
+ Coba lagi _exponent
+
+
+ Simpan album _ke
+
+
+ _namaberkas format:
+
+
+ _HTTP(S) proxy
+
+
+ _Port
+
+
+ Laporkan bug
+
+
+ _Bahasa
+
+
+ Tentang
+
+
+ Pengaturan lanjutan
+
+
+ Sampul album
+
+
+ Unduhan
+
+
+ Umum
+
+
+ Jaringan
+
+
+ Daftar putar
+
+
+ Penamaan dan tag
+
+
+ _Lirik
+
+
+ Format nama_file
+
+
+ Daftar _format
+
+
+ Beberapa setelan tak bisa diubah ketika trek sedang diunduh.
+
+
+ _Tema
+
+
+ n_omor trek
+
+
+ _Judul
+
+
+ (berkas log selalu verbose)
+
+
+ Versi
+
+
+ Tidak dapat memeriksa pembaruan
+
+
+ Versi baru tersedia
+
+
+ Situs web
+
+
+ Rilis album _tahun
+
_Batal
@@ -109,6 +335,55 @@
_Ya
+
+ Batalkan semua unduhan?
+
+
+ Terjadi kesalahan saat memeriksa pembaruan. Silakan coba lagi nanti.
+
+
+ _Tutup aplikasi
+
+
+ Ada unduhan yang sedang berjalan. Apakah anda yang ingin menutup aplikasi dan menghentikan semua unduhan?
+
+
+ Tidak dapat membuka link berikut:
+{0}
+
+
+ Anda sudah memiliki versi terbaru ({0}).
+
+
+ _Setel ulang pengaturan
+
+
+ Setel ulang semua pengaturan ke default?
+
+
+ Terjadi kesalahan yang tidak tertangani. Aplikasi akan ditutup sekarang.
+
+Harap laporkan masalah baru dengan konten file log Anda di
+{0}
+
+
+ _Pengaturan proksi manual
+
+
+ _Tidak ada proksi
+
+
+ S_istem proksi
+
+
+ Simpan sebagai
+
+
+ Gelap
+
+
+ Terang
+
Jangan di modif
@@ -124,4 +399,79 @@
Tag di bersihkan
+
+ Sejarah rilis
+
+
+ Bantu terjemahkan
+
+
+ Saat mengunduh trek, jika file (nama) yang sama sudah ada, ia akan diperiksa terhadap trek untuk diunduh.
+Jika ukuran kedua file berbeda dari nilai ini (dalam persen), unduhan trek akan dilewati.
+Atur nilai ini ke 0 untuk selalu mengunduh trek, meskipun sudah ada di disk.
+
+Nilai yang disarankan = 5
+
+
+ Anda bisa menggunakan tempat penampung untuk mengkustomisasi nama file:
+- [artis} akan digantikan oleh artis album
+- {album} akan digantikan oleh nama album
+- {year}, {month} dan {day} akan digantikan oleh tanggal rilis album
+
+
+ Jumlah maksimum percobaan mengunduh trek jika gagal.
+Setelah nomor tersebut tercapai (untuk setiap trek), unduhan trek akan dilewati.
+
+Nilai yang disarankan = 7
+
+
+ Digunakan untuk mengontrol mekanisme back-off eksponensial.
+Setelah setiap kegagalan pengunduhan trek, BandcampDownloader dapat menunggu sebelum mencoba lagi
+untuk mengunduh trek agar tidak menggelitik filter anti-spam Bandcamp.
+Rumus yang digunakan untuk menghitung waktu tunggu sebelum mencoba lagi unduhan adalah sebagai berikut:
+waktu = cooldown * (eksponen ^ percobaan-hitung)
+
+Nilai yang disarankan = 0,2
+
+
+ Digunakan untuk mengontrol mekanisme back-off eksponensial.
+Setiap kali pengunduhan gagal, BandcampDownloader dapat menunggu sebelum mencoba lagi
+untuk mengunduh trek agar tidak menggelitik filter anti-spam Bandcamp.
+Rumus yang digunakan untuk menghitung waktu untuk tunggu sebelum mencoba lagi unduhan adalah sebagai berikut:
+waktu = cooldown * (eksponen ^ percobaan-hitung)
+
+Nilai yang disarankan = 4
+
+
+ Anda dapat menggunakan tempat penampung untuk mengkustomisasi folder unduhan tergantung pada album:
+- [artis} akan digantikan oleh artis album
+- {album} akan digantikan oleh nama album
+- {year}, {month} dan {day} akan digantikan oleh tanggal rilis album
+
+
+ Anda bisa menggunakan tempat penampung untuk mengkustomisasi nama file:
+- [artis} akan digantikan oleh artis album
+- {title} akan digantikan oleh nama trek
+- {tracknum} akan digantikan oleh nomor trek
+- {album} akan digantikan oleh nama album
+- {year}, {month} dan {day} akan digantikan oleh tanggal rilis album
+
+
+ Anda bisa menggunakan tempat penampung untuk mengkustomisasi nama file:
+- [artis} akan digantikan oleh artis album
+- {album} akan digantikan oleh nama album
+- {year}, {month} dan {day} akan digantikan oleh tanggal rilis album
+
+
+ Tempel URL album untuk diunduh di sini. Anda dapat memuat beberapa URL per baris.
+
+URL Bandcamp terlihat seperti: http://[artist].bandcamp.com/album/[album] atau http://[artist].bandcamp.com/track/[track]
+Tempel halaman artis: http://[artis].bandcamp.com dan centang "☑ Unduh diskografi artis" untuk mengunduh semua album mereka.
+
+
+ Pengaturan
+
+
+ Perbarui
+
\ No newline at end of file
diff --git a/src/BandcampDownloader/Properties/Resources.it.resx b/src/BandcampDownloader/Properties/Resources.it.resx
index c95ac882..908c97f4 100644
--- a/src/BandcampDownloader/Properties/Resources.it.resx
+++ b/src/BandcampDownloader/Properties/Resources.it.resx
@@ -1,4 +1,4 @@
-
+
-
+
@@ -178,7 +178,7 @@
Konverter til JP_G
- Konverterer omslagsbilde til JPG, med sammenpakking på 90 (utmerket kompromiss mellom størrelse og kvalitet).
+ Konverterer omslagsbilde til JPG, med filkompresjon på 90 (utmerket kompromiss mellom størrelse og kvalitet).
Begrens mak_simal bredde/høyde
@@ -223,7 +223,7 @@ Hvis ikke, vil alle etiketter forbli uendret, tilsvarende "Ikke endre" for hver
Laster ned kun ett album av gangen.
-Hvis ikke, vil alle album lastes ned samtidig (som er bedre, gitt at høy båndbredde forefinnes)
+Hvis ikke, vil alle album lastes ned samtidig (som er å foretrekke gitt at høy båndbredde forefinnes).
Hent fil_størrelse før nedlasting av spor
@@ -248,7 +248,7 @@ Uten dette kan man spare litt båndbredde/tid.
Vis sirlig _loggføring
- Viser mer info i loggen
+ Viser mer info i loggen.
Velg mappen å lagre album i
@@ -263,7 +263,7 @@ Uten dette kan man spare litt båndbredde/tid.
Album_navn
- Tillat fil_størrelsesforskjell (%)
+ Tillatt filstørrelsesforskjell (%)
Art_ist
@@ -365,7 +365,7 @@ Uten dette kan man spare litt båndbredde/tid.
Titte_l
- (loggfilen er alltid sirlig)
+ (loggfilen er alltid ordrik)
Versjon
@@ -432,7 +432,7 @@ Innrapporter feilen sammen med innholdet i loggfilen din på:
_Ingen mellomtjener
- _Systemmellomtjener
+ S_ystemmellomtjener
Lagre som
@@ -447,7 +447,7 @@ Innrapporter feilen sammen med innholdet i loggfilen din på:
Ikke endre
- Tom etikett
+ Fjern etikett
Lagre i etikett
@@ -456,7 +456,7 @@ Innrapporter feilen sammen med innholdet i loggfilen din på:
Ikke endre
- Tøm etikett
+ Fjern etikett
Utgivelseshistorikk
diff --git a/src/BandcampDownloader/Properties/Resources.nl.resx b/src/BandcampDownloader/Properties/Resources.nl.resx
index 5ae2cdac..de88e83d 100644
--- a/src/BandcampDownloader/Properties/Resources.nl.resx
+++ b/src/BandcampDownloader/Properties/Resources.nl.resx
@@ -1,4 +1,4 @@
-
+
@@ -61,6 +61,9 @@
…
+
+ Bladeren naar map
+
_Annuleren
@@ -73,6 +76,12 @@
In_stellingen
+
+ Instellingen openen
+
+
+ Standaardwaarden herstellen
+
Op_slaan
@@ -85,105 +94,69 @@
_Bekijken
+
+ Kan wijzigingslog niet ophalen van {0}
+
Automatisch controleren op _updates
+
+ Vraagt het volgende adres bij het starten van de app:
+
Converteren naar _JPG
+
+ Converteert hoesafbeeldingen naar JPG met een compressie van 90 (uitstekende afweging tussen grootte en kwaliteit).
+
_Maximale hoogte/breedte beperken
+
+ Hiermee wordt de hoesgrootte aangepast aan de opgegeven maximale breedte / hoogte.
+
Converteren naar JP_G
+
+ Converteert hoesafbeeldingen naar JPG met een compressie van 90 (uitstekende afweging tussen grootte en kwaliteit).
+
M_aximale hoogte/breedte beperken
+
+ Hiermee wordt de hoesgrootte aangepast aan de opgegeven maximale breedte / hoogte.
+
Afs_peellijsten maken voor elk album
+
+ Creëert een albumtrackbestand voor elk gedownload album.
+
Discografie van _artiest downloaden
+
+ Downloadt de hele discografie van de artiest.
+
Meldi_ngsgeluiden afspelen
+
+ Meldingsgeluid voor voltooide downloads.
+
Uitg_ebreid formaat gebruiken (alleen M3U)
+
+ M3U afspeellijsten in uitgebreid formaat (richtlijnen voorafgegaan door de # karakter).
+
_Tags aanpassen (ID3)
Eén album tegelijk _downloaden
-
- _Annuleren
-
-
- _Nee
-
-
- _Oké
-
-
- _Ja
-
-
- Niet aanpassen
-
-
- Tag wissen
-
-
- Opslaan in tag
-
-
- Niet aanpassen
-
-
- Tag wissen
-
-
- Bladeren naar map
-
-
- Instellingen openen
-
-
- Standaardwaarden herstellen
-
-
- Kan wijzigingslog niet ophalen van {0}
-
-
- Vraagt het volgende adres bij het starten van de app:
-
-
- Converteert hoesafbeeldingen naar JPG met een compressie van 90 (uitstekende afweging tussen grootte en kwaliteit).
-
-
- Hiermee wordt de hoesgrootte aangepast aan de opgegeven maximale breedte / hoogte.
-
-
- Converteert hoesafbeeldingen naar JPG met een compressie van 90 (uitstekende afweging tussen grootte en kwaliteit).
-
-
- Hiermee wordt de hoesgrootte aangepast aan de opgegeven maximale breedte / hoogte.
-
-
- Creëert een albumtrackbestand voor elk gedownload album.
-
-
- Downloadt de hele discografie van de artiest.
-
-
- Meldingsgeluid voor voltooide downloads.
-
-
- M3U afspeellijsten in uitgebreid formaat (richtlijnen voorafgegaan door de # karakter).
-
Haal _bestandsgrootte op voor het downloaden van tracks
@@ -319,6 +292,18 @@
Album release _jaar
+
+ _Annuleren
+
+
+ _Nee
+
+
+ _Oké
+
+
+ _Ja
+
Er is een fout opgetreden bij het controleren op updates. Probeer het later opnieuw.
@@ -334,6 +319,21 @@
S_ysteem proxy
+
+ Niet aanpassen
+
+
+ Tag wissen
+
+
+ Opslaan in tag
+
+
+ Niet aanpassen
+
+
+ Tag wissen
+
Releases geschiedenis
diff --git a/src/BandcampDownloader/Properties/Resources.pt-BR.resx b/src/BandcampDownloader/Properties/Resources.pt-BR.resx
new file mode 100644
index 00000000..3f65f005
--- /dev/null
+++ b/src/BandcampDownloader/Properties/Resources.pt-BR.resx
@@ -0,0 +1,477 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ …
+
+
+ Procurar pasta
+
+
+ _Cancelar
+
+
+ _Verificar agora
+
+
+ _Baixar nova versão
+
+
+ _Configurações
+
+
+ Abrir configurações
+
+
+ Redefinir configurações padrão
+
+
+ _Salvar
+
+
+ _Baixar
+
+
+ _Cancelar
+
+
+ _Visualizar
+
+
+ Não foi possível baixar o registro de alterações a partir de {0}
+
+
+ Verificar por at_ualizações ao iniciar
+
+
+ Consultar o seguinte endereço ao iniciar o aplicativo:
+
+
+ Converter para _JPG
+
+
+ Converte a arte da capa para JPG com uma compressão de 90 (equilíbrio excelente entre tamanho e qualidade).
+
+
+ Limitar largura/altura _máxima
+
+
+ Redimensiona a arte da capa para a largura/altura máxima especificada.
+
+
+ Converter para JP_G
+
+
+ Converte a arte da capa para JPG com uma compressão de 90 (equilíbrio excelente entre tamanho e qualidade).
+
+
+ Limitar largura/altura máxim_a
+
+
+ Redimensiona a arte da capa para a largura/altura máxima especificada.
+
+
+ Criar _playlist para cada álbum
+
+
+ Cria um arquivo de faixas do álbum para cada álbum baixado.
+
+
+ Baixar discografia do _artista
+
+
+ Baixa toda a discografia do artista.
+
+
+ Reproduzir sons de _notificação
+
+
+ Som de notificação ao concluir os downloads.
+
+
+ Usar formato _estendido (somente para M3U)
+
+
+ Playlists M3U no formato estendido (diretivas precedidas do caractere #).
+
+
+ _Modificar tags das faixas (ID3)
+
+
+ Modifica cada tag como especificado abaixo.
+
+Se não , todas as tags permanecerão inalteradas, equivalente a definir “Não modificar” para cada tag.
+
+
+ _Baixar um álbum de cada vez
+
+
+ Baixa somente um álbum por vez.
+Se não, álbuns são baixados simultaneamente (preferível fornecer alta largura de banda).
+
+
+ Obter _tamanho do arquivo antes de baixar as faixas
+
+
+ Obtém o tamanho do arquivo para mostrar um progresso mais preciso.
+Se não, um pouco de uso de rede/tempo é poupado.
+
+
+ Salvar na _pasta
+
+
+ Baixa a arte da capa para a pasta do álbum.
+
+
+ Salvar nas _tags
+
+
+ Salva a arte da capa nas tags da faixa.
+
+
+ Mostrar log _detalhado
+
+
+ Mostra mais informações no log.
+
+
+ Selecione a pasta onde salvar os álbuns
+
+
+ Altere essas configurações por sua própria conta e risco.
+
+
+ Art_ista do álbum
+
+
+ _Nome do artista
+
+
+ Diferença de tamanho de arquivo permitida (%)
+
+
+ _Artista
+
+
+ _Redefinir configurações
+
+
+ Registro de alterações
+
+
+ Registro de alterações
+
+
+ Com_entários
+
+
+ Formato do _nome do arquivo
+
+
+ Tamanho máximo (_px)
+
+
+ Tamanho máximo (p_x)
+
+
+ Versão atual:
+
+
+ _Máximo de tentativas de download
+
+
+ _Intervalo entre tentativas (seg.)
+
+
+ Ag_ente de repetição
+
+
+ Salvar álbuns _em
+
+
+ _Formato de nome do arquivo:
+
+
+ Proxy _HTTP(S)
+
+
+ _Porta
+
+
+ Relatar um erro
+
+
+ _Idioma
+
+
+ Sobre
+
+
+ Configurações avançadas
+
+
+ Arte da capa
+
+
+ Downloads
+
+
+ Geral
+
+
+ Rede
+
+
+ Playlist
+
+
+ Nomeação e tags
+
+
+ _Letras
+
+
+ Formato de _nome do arquivo
+
+
+ _Formato da playlist
+
+
+ Algumas configurações não podem ser alteradas enquanto faixas estão sendo baixadas.
+
+
+ _Tema
+
+
+ N_úmero da faixa
+
+
+ _Título
+
+
+ (o arquivo de log sempre é detalhado)
+
+
+ Versão
+
+
+ Não foi possível verificar por atualizações
+
+
+ Nova versão disponível
+
+
+ Site
+
+
+ _Ano de lançamento
+
+
+ _Cancelar
+
+
+ _Não
+
+
+ _OK
+
+
+ _Sim
+
+
+ Cancelar todos os downloads?
+
+
+ Ocorreu um erro ao verificar por atualizações. Por favor, tente novamente mais tarde.
+
+
+ Fe_char aplicativo
+
+
+ Existem downloads ativos no momento. Tem certeza de que deseja fechar o aplicativo e interromper todos os downloads?
+
+
+ Não foi possível abrir o seguinte link:
+{0}
+
+
+ Você já possui a versão mais recente ({0}).
+
+
+ _Redefinir configurações
+
+
+ Redefinir todas as configurações para seus valores padrão?
+
+
+ Ocorreu um erro não tratado. O aplicativo será fechado agora.
+
+Abra um novo problema (issue) com o conteúdo do seu arquivo de log em
+{0}
+
+
+ Configuração _manual de proxy
+
+
+ _Sem proxy
+
+
+ Proxy do s_istema
+
+
+ Salvar como
+
+
+ Escuro
+
+
+ Claro
+
+
+ Não modificar
+
+
+ Limpar tag
+
+
+ Salvar na tag
+
+
+ Não modificar
+
+
+ Limpar tag
+
+
+ Histórico de versões
+
+
+ Ajude a traduzir
+
+
+ Ao baixar uma faixa, se o mesmo arquivo (nome) já existir, ele será verificado em relação à faixa a ser baixada.
+Se o tamanho de ambos os arquivos for inferior a este valor (em porcentagem), o download da faixa será ignorado.
+Defina este valor como 0 para sempre baixar as faixas, mesmo se já existirem no disco.
+
+Valor recomendado = 5
+
+
+ Você pode usar marcadores de posição para personalizar o nome do arquivo:
+- {artist} será substituído pelo artista do álbum
+- {album} será substituído pelo nome do álbum
+- {year}, {month} e {day} serão substituídos pela data de lançamento do álbum
+
+
+ Número máximo de tentativas realizadas para baixar uma faixa, se falhar.
+Depois que esse número for alcançado (para cada faixa), o download da faixa será ignorado.
+
+Valor recomendado = 7
+
+
+ Usado para controlar o mecanismo de back-off exponencial.
+Após cada falha de download de uma faixa, o BandcampDownloader pode esperar por um tempo específico antes de tentar novamente
+para baixar a faixa, a fim de evitar ativar o filtro anti-spam do Bandcamp.
+A fórmula usada para calcular o tempo de espera antes de tentar novamente um download é a seguinte:
+tempo = intervalo * (expoente ^ contagem de tentativas)
+
+Valor recomendado = 0,2
+
+
+ Usado para controlar o mecanismo de back-off exponencial.
+Após cada falha de download de uma faixa, o BandcampDownloader pode esperar por um tempo específico antes de tentar novamente
+para baixar a faixa, a fim de evitar ativar o filtro anti-spam do Bandcamp.
+A fórmula usada para calcular o tempo de espera antes de tentar novamente um download é a seguinte:
+tempo = intervalo * (expoente ^ contagem de tentativas)
+
+Valor recomendado = 4
+
+
+ Você pode usar marcadores de posição para personalizar a pasta de download dependendo do álbum:
+- {artist} será substituído pelo artista do álbum
+- {album} será substituído pelo nome do álbum
+- {year}, {month} e {day} serão substituídos pela data de lançamento do álbum
+
+
+ Você pode usar marcadores de posição para personalizar o nome do arquivo:
+- {artist} será substituído pelo artista do álbum
+- {title} será substituído pelo nome da faixa
+- {tracknum} será substituído pelo número da faixa
+- {album} será substituído pelo nome do álbum
+- {year}, {month} e {day} serão substituídos pela data de lançamento do álbum
+
+
+ Você pode usar marcadores de posição para personalizar o nome do arquivo:
+- {artist} será substituído pelo artista do álbum
+- {album} será substituído pelo nome do álbum
+- {year}, {month} e {day} serão substituídos pela data de lançamento do álbum
+
+
+ Cole aqui URLs de álbuns para baixar. Você pode especificar várias URLs ao adicionar uma URL por linha.
+
+Uma URL do Bandcamp parece com: http://[artista].bandcamp.com/album/[álbum] ou http://[artista].bandcamp.com/track/[faixa]
+Colar páginas de artistas: http://[artista]/.bandcamp.com e marque “☑ Baixar discografia do artista” para baixar todos os seus álbuns.
+
+
+ Configurações
+
+
+ Atualizar
+
+
\ No newline at end of file
diff --git a/src/BandcampDownloader/Properties/Resources.pt.resx b/src/BandcampDownloader/Properties/Resources.pt.resx
index 260cc393..a545822a 100644
--- a/src/BandcampDownloader/Properties/Resources.pt.resx
+++ b/src/BandcampDownloader/Properties/Resources.pt.resx
@@ -157,7 +157,7 @@
Modifica cada rótulo como especificado abaixo.
-Caso contrário, todos as tags não serão alteradas, equivalente a definir "Não modificar" para cada tag.
+Caso contrário, todos as tags não serão alteradas, equivalente a definir «Não modificar» para cada tag.
_Baixar um álbum de cada vez
@@ -426,18 +426,18 @@ Valor recomendado = 7
Usado para controlar o mecanismo de recuo exponencial.
-Após cada falha de um download de faixa, o BandcampDownloader pode esperar por um tempo específico antes de tentar
-baixar a faixa novamente a fim de evitar o filtro anti-spam do Bandcamp.
-A fórmula usada para calcular o tempo de espera antes de tentar baixar novamente é o seguinte:
+Após cada falha de uma descarrega de faixa, o BandcampDownloader pode esperar por um tempo específico antes de tentar
+descarregar a faixa novamente de modo a evitar o filtro anti-spam do Bandcamp.
+A fórmula usada para calcular o tempo de espera antes de tentar descarregar novamente é o seguinte:
tempo = tempo de espera * (expoente ^ contagem de tentativas)
Valor recomendado = 0.2
Usado para controlar o mecanismo de recuo exponencial.
-Após cada falha de um download de faixa, o BandcampDownloader pode esperar por um tempo específico antes de tentar
-baixar a faixa novamente a fim de evitar o filtro anti-spam do Bandcamp.
-A fórmula usada para calcular o tempo de espera antes de tentar baixar novamente é o seguinte:
+Após cada falha de uma descarrega de faixa, o BandcampDownloader pode esperar por um tempo específico antes de tentar
+descarregar a faixa novamente de modo a evitar o filtro anti-spam do Bandcamp.
+A fórmula usada para calcular o tempo de espera antes de tentar a descarrega novamente é o seguinte:
tempo = tempo de espera * (expoente ^ contagem de tentativas)
Valor recomendado = 4
@@ -465,8 +465,8 @@ Valor recomendado = 4
Cole as URLs dos álbuns para baixar, aqui. Você pode especificar várias URLs escrevendo uma URL por linha.
-Uma URL do Bandcamp se parece com: "http://[artista].bandcamp.com/album/[álbum]" ou "http://[artista].bandcamp.com/track/[faixa]"
-Cole as páginas do artista: "http://[artista].bandcamp.com" e cheque "☑ Baixar a discografia do artista" para baixar todos os seus álbuns.
+Uma URL do Bandcamp se parece com: http://[artista].bandcamp.com/album/[álbum] ou http://[artista].bandcamp.com/track/[faixa]
+Cole as páginas do artista: http://[artista].bandcamp.com e cheque «☑ Baixar a discografia do artista» para baixar todos os seus álbuns.
Configurações
diff --git a/src/BandcampDownloader/Properties/Resources.resx b/src/BandcampDownloader/Properties/Resources.resx
index 59b834df..18832322 100644
--- a/src/BandcampDownloader/Properties/Resources.resx
+++ b/src/BandcampDownloader/Properties/Resources.resx
@@ -426,13 +426,13 @@ Please open a new issue with the content of your log file on
{0}
- _Manual proxy configuration
+ _Manual configuration
- _No proxy
+ _None
- S_ystem proxy
+ S_ystem
Save as
@@ -533,4 +533,13 @@ Paste artist pages: http://[artist].bandcamp.com and check "☑ Download artist
Update
+
+ Use HTTP instead of HTTPS
+
+
+ Proxy
+
+
+ Use this option if your HTTPS traffic to Bandcamp is blocked.
+
\ No newline at end of file
diff --git a/src/BandcampDownloader/Properties/Resources.ru.resx b/src/BandcampDownloader/Properties/Resources.ru.resx
index 1a9f07b5..3df659c2 100644
--- a/src/BandcampDownloader/Properties/Resources.ru.resx
+++ b/src/BandcampDownloader/Properties/Resources.ru.resx
@@ -352,18 +352,19 @@ If not, some bandwidth/time is saved.
{0}
- У вас уже есть последняя версия ({0}).
+ У вас уже есть последняя версия ({0}).
_Сбросить настройки
- Сбросить все настройки по умолчанию?
+ Сбросить все настройки на их значения по умолчанию?
Произошла неизвестная ошибка. Приложение будет закрыто.
-Пожалуйста, откройте новую проблему с содержанием вашего файла журнала на
+Пожалуйста, откройте новую проблему с содержанием вашего файла журнала на
+{0}
_Ручная настройка прокси
@@ -425,7 +426,7 @@ If not, some bandwidth/time is saved.
Используется для управления экспоненциальным механизмом отката.
-После каждого сбоя загрузки трека BandcampDownloader может подождать определенное время, прежде чем снова попытаться загрузить трек, чтобы избежать лимит фильтра спама Bandcamp.
+После каждого сбоя загрузки трека BandcampDownloader может подождать определенное время, прежде чем снова попытается загрузить трек, чтобы избежать лимит фильтра спама Bandcamp.
Формула, используемая для вычисления времени ожидания перед повторной попыткой загрузки, выглядит следующим образом:
время = время перезарядки * (экспонента ^ количество попыток)
@@ -461,12 +462,11 @@ If not, some bandwidth/time is saved.
- {year}, {month} и {day} будут заменены датой выпуска альбома
- Вставьте здесь URL-адреса альбомов, чтобы загрузить. Вы можете указать несколько URL-адресов, написав один URL-адрес в строке.
+ Вставьте здесь URL-адреса альбомов, чтобы загрузить. Вы можете указать несколько URL-адресов, написав по одному URL-адресу на строку.
-URL-адрес Bandcamp выглядит следующим образом: http://[artist].bandcamp.com/album/[album] or
+URL-адрес Bandcamp выглядит следующим образом: http://[artist].bandcamp.com/album/[album] или
http://[artist].bandcamp.com/track/[track]
-Вставьте страницы исполнителя: http://[artist].bandcamp.com и установите флажок «☑ Скачать дискографию исполнителя ", чтобы
-скачать все их альбомы.
+Вставьте страницы исполнителя: http://[artist].bandcamp.com и установите флажок "☑ Скачать дискографию исполнителя", чтобы скачать все их альбомы.
Настройки
diff --git a/src/BandcampDownloader/Properties/Resources.sv.resx b/src/BandcampDownloader/Properties/Resources.sv.resx
new file mode 100644
index 00000000..c120294c
--- /dev/null
+++ b/src/BandcampDownloader/Properties/Resources.sv.resx
@@ -0,0 +1,341 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ (logg-filen är alltid detaljerad)
+
+
+ Fil_namnsformat
+
+
+ Ta emot _filstorlek före spåren nerladdas
+
+
+ Ljus
+
+
+ Mörk
+
+
+ Spara som
+
+
+ Återställ alla inställningar till deras standardvärden?
+
+
+ _Återställ inställningar
+
+
+ Kunde inte öppna den följande länken:
+{0}
+
+
+ _Stäng ner applikation
+
+
+ Avbryt alla nerladdningar?
+
+
+ _Tema
+
+
+ Ändra dessa inställningar på din egen risk.
+
+
+ Välj en mapp att spara album i
+
+
+ Visar mer information i loggen.
+
+
+ Spara omslagsbild i spårtaggarna.
+
+
+ Ladda ner omslagsbild till albumets mapp.
+
+
+ Aviseringsljud för avslutade nerladdningar.
+
+
+ Kunde inte ladda ner ändringslogg från {0}
+
+
+ Återställ till standard-inställningarna
+
+
+ Öppna inställningar
+
+
+ Bläddra efter mapp
+
+
+ Uppdatering
+
+
+ Inställningar
+
+
+ Hjälp till att översätta
+
+
+ S_ystemproxy
+
+
+ _Ingen proxy
+
+
+ _Manuell konfigurering av proxy
+
+
+ Du har redan den senaste versionen ({0}).
+
+
+ Hemsida
+
+
+ Ny version tillgänglig
+
+
+ Kunde inte söka efter uppdateringar
+
+
+ Version
+
+
+ _Titel
+
+
+ Spårn_ummer
+
+
+ Några inställningar kan inte ändras medans spåren laddas ner.
+
+
+ Spelistformat
+
+
+ Fil_namnsformat
+
+
+ _Texter
+
+
+ Namngivning och taggar
+
+
+ Spellista
+
+
+ Nätverk
+
+
+ Generellt
+
+
+ Nerladdningar
+
+
+ Omslagsbild
+
+
+ Avancerade inställningar
+
+
+ Om
+
+
+ _Språk
+
+
+ Rapportera en bugg
+
+
+ _Port
+
+
+ _HTTP(S) proxy
+
+
+ _Filnamnsformat:
+
+
+ Spara album _till
+
+
+ _Maximalt antal nerladdningsförsök
+
+
+ Nuvarande version:
+
+
+ Maximal storlek (p_x)
+
+
+ Maximal storlek (_px)
+
+
+ Komm_entarer
+
+
+ Ändringslogg
+
+
+ Ändringslogg
+
+
+ _Återställ inställningar
+
+
+ _Artist
+
+
+ Namn på album
+
+
+ Albumart_ist
+
+
+ Visa _utförlig logg
+
+
+ Spara i _taggar
+
+
+ Spara i _mapp
+
+
+ _Ladda ner ett album i taget
+
+
+ _Modifiera spårtaggar (ID3)
+
+
+ Använd _förlängt format (endast för M3U)
+
+
+ Spela upp_aviseringsljud
+
+
+ Skapa _spellista för varje album
+
+
+ Konvertera till JP_G
+
+
+ Konvertera till _JPG
+
+
+ Sök efter _uppdateringar vid uppstart
+
+
+ Rensa tagg
+
+
+ Modifiera inte
+
+
+ Spara i tagg
+
+
+ Rensa tagg
+
+
+ Modifiera inte
+
+
+ _Ja
+
+
+ _OK
+
+
+ _Nej
+
+
+ _Avbryt
+
+
+ _Visa
+
+
+ _Avbryt
+
+
+ _Ladda ner
+
+
+ _Spara
+
+
+ _Inställningar
+
+
+ _Ladda ner ny version
+
+
+ Kontrollera n_u
+
+
+ _Avbryt
+
+
+ …
+
+
\ No newline at end of file
diff --git a/src/BandcampDownloader/Properties/Resources.uk.resx b/src/BandcampDownloader/Properties/Resources.uk.resx
index cc32fecb..60c39677 100644
--- a/src/BandcampDownloader/Properties/Resources.uk.resx
+++ b/src/BandcampDownloader/Properties/Resources.uk.resx
@@ -1,4 +1,4 @@
-
+