Skip to content

Commit

Permalink
Finished implementing the option to download profile pictures #6, imp…
Browse files Browse the repository at this point in the history
…lemented the setting to disable download logs #7, and performed code rewrite/cleanup.

Update 1.2.7 almost ready :)
  • Loading branch information
Jettcodey committed Jun 20, 2024
1 parent 8cff584 commit 08811bc
Show file tree
Hide file tree
Showing 4 changed files with 127 additions and 73 deletions.
2 changes: 2 additions & 0 deletions AppSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public class Settings
public bool DownloadVideosOnly { get; set; }
public bool DownloadImagesOnly { get; set; }
public bool EnableJsonLogs { get; set; }
public bool EnableDownloadLogs { get; set; }
public bool UseOldFileStructure { get; set; }
public string LastDownloadFolderPath { get; set; }
public bool FirstRun { get; set; }
Expand Down Expand Up @@ -57,6 +58,7 @@ public void LoadSettings()
DownloadVideosOnly = false,
DownloadImagesOnly = false,
EnableJsonLogs = false,
EnableDownloadLogs = false,
UseOldFileStructure = false,
LastDownloadFolderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "TiktokDownloads"),
FirstRun = false,
Expand Down
2 changes: 1 addition & 1 deletion MainForm.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

166 changes: 95 additions & 71 deletions MainForm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,28 @@ namespace TikTok_Downloader
{
public partial class MainForm : Form
{
private readonly string logFolderPath;
private readonly string logFilePath;
string downloadFolderPath;
private readonly BrowserUtility browserUtility;
private string logFolderPath;
private string logFilePath;
private string downloadFolderPath;
private BrowserUtility browserUtility;
private bool EnableDownloadLogs;
private bool logJsonEnabled;
private readonly string jsonLogFilePath;
private readonly object jsonLock = new object();
private string jsonLogFilePath;
private object jsonLock = new object();
private bool useOldFileStructure;
private readonly AppSettings settings;
private SettingsDialog settingsDialog;
private List<string> cachedVideoUrls = new List<string>();


private bool isLoggingInitialized = false;

private Task LogSystemInformation(string logFilePath)
{
try
{
string systemInfo = "";

systemInfo += $"Region and Language: {CultureInfo.CurrentCulture.DisplayName}\n";
systemInfo += $"\nRegion and Language: {CultureInfo.CurrentCulture.DisplayName}\n";

using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Processor"))
{
Expand Down Expand Up @@ -80,35 +81,9 @@ public MainForm()
InitializeComponent();
settings = new AppSettings();
LoadSettingsatbeginning();
InitializeLoggingFolder();
settings.LoadSettings();
this.settingsDialog = settingsDialog;
string logFolderName = $"TTDownloader-Logs[{DateTime.Now:yyyy-MM-dd_HH-mm}]-Logs";
string logFolderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), logFolderName);


try
{
Directory.CreateDirectory(logFolderPath);
}
catch (Exception ex)
{
MessageBox.Show($"Error creating log directory: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
Environment.Exit(1);
}

logFilePath = Path.Combine(logFolderPath, $"TikTokDownloaderLog_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.txt");
jsonLogFilePath = Path.Combine(logFolderPath, $"JSON_Log_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.json");

try
{
Directory.CreateDirectory(logFolderPath);
}
catch (Exception ex)
{
MessageBox.Show($"Error creating log directory: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
Environment.Exit(1);
}

settingsDialog = new SettingsDialog(this);
Directory.CreateDirectory(downloadFolderPath);

Task.Run(async () =>
Expand All @@ -125,6 +100,29 @@ public MainForm()
outputTextBox.ReadOnly = true;
}

private void InitializeLoggingFolder()
{
if (!isLoggingInitialized && (EnableDownloadLogs || logJsonEnabled))
{
string logFolderName = $"TTDownloader-Logs[{DateTime.Now:yyyy-MM-dd_HH-mm}]-Logs";
logFolderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), logFolderName);

try
{
Directory.CreateDirectory(logFolderPath);
logFilePath = Path.Combine(logFolderPath, $"TikTokDownloaderLog_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.txt");
jsonLogFilePath = Path.Combine(logFolderPath, $"JSON_Log_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.json");

isLoggingInitialized = true;
}
catch (Exception ex)
{
MessageBox.Show($"Error creating log directory: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
Environment.Exit(1);
}
}
}

private void LoadSettingsatbeginning()
{
settings.LoadSettings();
Expand Down Expand Up @@ -161,54 +159,70 @@ private void LoadSettingsatbeginning()
{
downloadFolderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "TiktokDownloads");
}

EnableDownloadLogs = currentSettings.EnableDownloadLogs;
logJsonEnabled = currentSettings.EnableJsonLogs;
useOldFileStructure = currentSettings.UseOldFileStructure;
}


private static void LogMessage(string logFilePath, string message)
private void LogMessage(string logFilePath, string message)
{
if (!EnableDownloadLogs)
{
return;
}

lock (logFilePath)
{
string redactedMessage = message.Replace(Environment.UserName, "[RedactedUsername]");
File.AppendAllText(logFilePath, $"{DateTime.Now}: {redactedMessage}\n");
}
}

private void LogDownload(string fileName, string url)
{
LogMessage(logFilePath, $"Downloaded file: {fileName}, from URL: {url}");
}

private void LogJson(string fileName, string jsonContent, bool logJsonEnabled)

private void LogDownload(string fileName, string url)
{
if (!logJsonEnabled)
if (EnableDownloadLogs)
{
return;
LogMessage(logFilePath, $"Downloaded file: {fileName}, from URL: {url}");
}
}

lock (jsonLock)
private void LogJson(string fileName, string jsonContent)
{
if (logJsonEnabled)
{
try
lock (jsonLock)
{
using (StreamWriter writer = File.AppendText(jsonLogFilePath))
try
{
writer.WriteLine($"[{DateTime.Now}] File: {fileName}");
writer.WriteLine(jsonContent);
writer.WriteLine();
using (StreamWriter writer = File.AppendText(jsonLogFilePath))
{
writer.WriteLine($"[{DateTime.Now}] File: {fileName}");
writer.WriteLine(jsonContent);
writer.WriteLine();
}
}
catch (Exception ex)
{
outputTextBox.AppendText($"Error: An error occurred while logging the JSON response: {ex.Message}\r\n");
Console.WriteLine($"Error occurred while logging the JSON response: {ex}");
}
}
catch (Exception ex)
{
outputTextBox.AppendText($"Error: An error occurred while logging JSON response: {ex.Message}\r\n");
Console.WriteLine($"Error occurred while logging JSON response: {ex}");
}
}
}

private void LogError(string errorMessage)
{
LogMessage(logFilePath, $"ERROR: {errorMessage}");
if (EnableDownloadLogs)
{
LogMessage(logFilePath, $"ERROR: {errorMessage}");
}
}


class VideoData
{
public string Url { get; set; } = string.Empty;
Expand Down Expand Up @@ -452,7 +466,7 @@ private async Task MassDownloadByUsername()
// Close the page and context
await page.CloseAsync();
await context.CloseAsync();
LogMessage(logFilePath, "Page and context closed successfully");
LogMessage(logFilePath, "Browser Page and context closed successfully");

// Download all Videos and Images from the combined links file
await DownloadFromCombinedLinksFile(combinedLinksFilePath);
Expand Down Expand Up @@ -496,7 +510,7 @@ private async Task DownloadFromCombinedLinksFile(string filePath)

if (data == null)
{
LogError($"Error: Media from URL {trimmedUrl} was deleted!");
LogError($"Error: Media from URL {trimmedUrl} wasn´t found!");
progressBar.Value++;
continue;
}
Expand All @@ -514,7 +528,7 @@ private async Task DownloadFromTextFile(string filePath)
if (!File.Exists(filePath))
{
MessageBox.Show($"Error: Text File not Found", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
LogError("Text file not found!");
LogError("Text file not found or None was Selected!");
return;
}

Expand All @@ -540,7 +554,7 @@ private async Task DownloadFromTextFile(string filePath)

if (data == null)
{
LogError($"Error: Media from URL {trimmedUrl} not found!");
LogError($"Error: Media at URL {trimmedUrl} not found!");
progressBar.Value++;
continue;
}
Expand Down Expand Up @@ -674,7 +688,8 @@ private async Task<string> GetRedirectUrl(string url)
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
LogJson($"API_Response_For_'{MediaID}'", json, logJsonEnabled);
LogJson($"API_Response_For_'{MediaID}'", json);


if (string.IsNullOrWhiteSpace(json))
{
Expand Down Expand Up @@ -733,6 +748,7 @@ private async Task DownloadMedia(VideoData data, string url, bool useOldFileStru
{
try
{

string username = await ExtractUsernameFromUrl(url);

string userFolderPath = Path.Combine(downloadFolderPath, username);
Expand Down Expand Up @@ -786,7 +802,7 @@ private async Task DownloadMedia(VideoData data, string url, bool useOldFileStru
}
}

outputTextBox.AppendText($"Downloaded Image:'{fileName}' Successfully...\r\n");
outputTextBox.AppendText($"Downloading Images from User: {username}\r\nDownloaded Image:'{fileName}' Successfully...\r\n");
LogDownload(fileName, imageUrl);
}
}
Expand Down Expand Up @@ -842,13 +858,14 @@ private async Task DownloadMedia(VideoData data, string url, bool useOldFileStru
}
}

outputTextBox.AppendText($"Downloaded Video: '{fileName}' Successfully...\r\n");
outputTextBox.AppendText($"Downloading Video from User: {username}\r\nDownloaded Video: '{fileName}' Successfully...\r\n");
LogDownload(fileName, data.Url);
}

if (downloadAvatarsCheckBox.Checked)
{
await DownloadAvatars(data, url, username, useOldFileStructure);
LogMessage(logFilePath, "Download Avatars Checkbox is Active.");
}

}
Expand Down Expand Up @@ -888,7 +905,7 @@ private async Task DownloadMedia(VideoData data, string url, bool useOldFileStru
}
}

private async Task DownloadAvatars(VideoData data, string url,string username, bool useOldFileStructure)
private async Task DownloadAvatars(VideoData data, string url, string username, bool useOldFileStructure)
{
try
{
Expand All @@ -898,7 +915,7 @@ private async Task DownloadAvatars(VideoData data, string url,string username, b

if (Directory.Exists(avatarsFolderPath) && Directory.GetFiles(avatarsFolderPath).Length > 0)
{
outputTextBox.AppendText($"Avatars for user '{username}' already exist. Skipping avatar download.\r\n");
//outputTextBox.AppendText($"Avatars for user '{username}' already exist. Skipping avatar download.\r\n");
return;
}

Expand Down Expand Up @@ -929,7 +946,7 @@ private async Task DownloadAvatars(VideoData data, string url,string username, b
}
}

outputTextBox.AppendText($"Downloaded Avatar: '{fileName}' Successfully...\r\n");
outputTextBox.AppendText($"Downloaded Avatar From '{username}' Successfully...\r\n");
LogDownload(fileName, avatarUrl);
}
}
Expand All @@ -947,7 +964,7 @@ private async Task DownloadAvatars(VideoData data, string url,string username, b

if (File.Exists(filePath))
{
outputTextBox.AppendText($"GIF Avatar: '{fileName}' already exists. Skipping\r\n");
//outputTextBox.AppendText($"GIF Avatar: '{fileName}' already exists. Skipping\r\n");
continue;
}

Expand All @@ -960,13 +977,14 @@ private async Task DownloadAvatars(VideoData data, string url,string username, b
}
}

outputTextBox.AppendText($"Downloaded GIF Avatar: '{fileName}' Successfully...\r\n");
outputTextBox.AppendText($"Downloaded GIF Avatar from '{username}' Successfully...\r\n");
LogDownload(fileName, gifAvatarUrl);
}
}
else
{
outputTextBox.AppendText("No GIF avatars to download.\r\n");
LogDownload("No GIF avatars to download", url);
}
}
catch (Exception ex)
Expand All @@ -976,8 +994,6 @@ private async Task DownloadAvatars(VideoData data, string url,string username, b
}
}



private async Task<string> ExtractUsernameFromUrl(string url)
{
try
Expand All @@ -998,7 +1014,7 @@ private async Task<string> ExtractUsernameFromUrl(string url)
catch (Exception ex)
{
LogError($"Error extracting username from URL: {ex.Message}");
return "default_username";
return "Username not Found!";
}
}

Expand Down Expand Up @@ -1086,7 +1102,15 @@ public void SetUseOldFileStructure(bool value)
public void LogJsonCheckBox(bool value)
{
logJsonEnabled = value;
InitializeLoggingFolder();
}

public void EnableDownloadLogsCheckBox(bool value)
{
EnableDownloadLogs = value;
InitializeLoggingFolder();
}

private void outputTextBox_TextChanged(object sender, EventArgs e)
{

Expand Down
Loading

0 comments on commit 08811bc

Please sign in to comment.