Folds the standalone ThreeTxtFileHelper tool into URLNotesGrabberCORE so text-file ingest/output/correct lives alongside the API scraper. Adds new flags -ingest, -output, -correct (with -apply), -updatepaths, and a one-time -importposts <posts.db> migration. Schema: Blogs.TTFolderPath and Posts.PostType are added by an idempotent migration. On (BlogName, PostID) collisions, content columns are overwritten while engagement columns (ByLikes, RootBlogName, RootURL, HasNotesGathered, NotFound, NotesGatheredDateTime, Likes*) are preserved. Co-Authored-By: Claude Opus 4.7 <[email protected]>
71 lines
2.6 KiB
C#
71 lines
2.6 KiB
C#
using System.Text.Json;
|
|
|
|
namespace URLNotesGrabberCORE
|
|
{
|
|
// Port of ThreeTxtFileHelper/UpdateBlogPaths.cs. Reads .tumblr / .tmblrpriv metadata
|
|
// files from a root\Index folder and populates Blogs.TTFolderPath in TL.db.
|
|
public static class UpdateBlogPathsRunner
|
|
{
|
|
public static int Run(string rootPath)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(rootPath))
|
|
{
|
|
Console.WriteLine("UpdateBlogPaths: rootPath is required.");
|
|
return 1;
|
|
}
|
|
|
|
DataAccess.EnsureTTFileHelperColumnsExist();
|
|
|
|
string indexPath = Path.Combine(rootPath, "Index");
|
|
if (!Directory.Exists(indexPath))
|
|
{
|
|
Console.WriteLine($"Index folder not found at: {indexPath}");
|
|
return 1;
|
|
}
|
|
|
|
Console.WriteLine($"Scanning Index folder: {indexPath}");
|
|
|
|
var blogFiles = Directory.GetFiles(indexPath, "*.tumblr")
|
|
.Concat(Directory.GetFiles(indexPath, "*.tmblrpriv"))
|
|
.ToList();
|
|
|
|
Console.WriteLine($"Found {blogFiles.Count} blog metadata files");
|
|
|
|
int updatedCount = 0;
|
|
|
|
foreach (var blogFile in blogFiles)
|
|
{
|
|
try
|
|
{
|
|
string blogName = Path.GetFileNameWithoutExtension(blogFile);
|
|
string jsonContent = File.ReadAllText(blogFile);
|
|
using JsonDocument doc = JsonDocument.Parse(jsonContent);
|
|
JsonElement root = doc.RootElement;
|
|
|
|
if (root.TryGetProperty("FileDownloadLocation", out JsonElement locationElement))
|
|
{
|
|
string? fileDownloadLocation = locationElement.GetString();
|
|
if (!string.IsNullOrWhiteSpace(fileDownloadLocation))
|
|
{
|
|
DataAccess.SetBlogTTFolderPath(blogName, fileDownloadLocation);
|
|
updatedCount++;
|
|
Console.WriteLine($"Updated {blogName}: {fileDownloadLocation}");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine($"No FileDownloadLocation found in {blogFile}");
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"Error processing {blogFile}: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
Console.WriteLine($"\nUpdated {updatedCount} blogs with TTFolderPath");
|
|
return 0;
|
|
}
|
|
}
|
|
}
|