From ea58deab8cda53b4bd744cb0b9b1e1eed68dd760 Mon Sep 17 00:00:00 2001 From: Arne Moerman Date: Sun, 15 Dec 2024 19:04:29 +0100 Subject: [PATCH] initial commit --- .../DesignTimeBuild/.dtbcache.v2 | Bin 0 -> 84415 bytes ...4d62bf6e-28ef-44ea-83c5-7c950723e7a6.vsidx | Bin 0 -> 7454 bytes ...bf076abb-6035-4b43-b4c4-af53df5dcc1a.vsidx | Bin 0 -> 5244 bytes ...d3d138b7-8cc4-49e4-9660-a72627ece054.vsidx | Bin 0 -> 10747 bytes ...eb69531b-3217-4624-9534-f4c52d3425f4.vsidx | Bin 0 -> 8986 bytes .../FileContentIndex/read.lock | 0 .vs/LetterBoxdUnwatchedGenerator/v17/.suo | Bin 0 -> 35328 bytes LetterBoxdUnwatchedGenerator.sln | 25 +++++ .../CommandLineSplit.cs | 91 ++++++++++++++++++ LetterBoxdUnwatchedGenerator/IMovie.cs | 8 ++ .../LetterBoxdConnection.cs | 25 +++++ .../LetterBoxdUnwatchedGenerator.csproj | 10 ++ .../LetterBoxdWatchedMovie.cs | 37 +++++++ LetterBoxdUnwatchedGenerator/LocalMovie.cs | 58 +++++++++++ LetterBoxdUnwatchedGenerator/Program.cs | 39 ++++++++ 15 files changed, 293 insertions(+) create mode 100644 .vs/LetterBoxdUnwatchedGenerator/DesignTimeBuild/.dtbcache.v2 create mode 100644 .vs/LetterBoxdUnwatchedGenerator/FileContentIndex/4d62bf6e-28ef-44ea-83c5-7c950723e7a6.vsidx create mode 100644 .vs/LetterBoxdUnwatchedGenerator/FileContentIndex/bf076abb-6035-4b43-b4c4-af53df5dcc1a.vsidx create mode 100644 .vs/LetterBoxdUnwatchedGenerator/FileContentIndex/d3d138b7-8cc4-49e4-9660-a72627ece054.vsidx create mode 100644 .vs/LetterBoxdUnwatchedGenerator/FileContentIndex/eb69531b-3217-4624-9534-f4c52d3425f4.vsidx create mode 100644 .vs/LetterBoxdUnwatchedGenerator/FileContentIndex/read.lock create mode 100644 .vs/LetterBoxdUnwatchedGenerator/v17/.suo create mode 100644 LetterBoxdUnwatchedGenerator.sln create mode 100644 LetterBoxdUnwatchedGenerator/CommandLineSplit.cs create mode 100644 LetterBoxdUnwatchedGenerator/IMovie.cs create mode 100644 LetterBoxdUnwatchedGenerator/LetterBoxdConnection.cs create mode 100644 LetterBoxdUnwatchedGenerator/LetterBoxdUnwatchedGenerator.csproj create mode 100644 LetterBoxdUnwatchedGenerator/LetterBoxdWatchedMovie.cs create mode 100644 LetterBoxdUnwatchedGenerator/LocalMovie.cs create mode 100644 LetterBoxdUnwatchedGenerator/Program.cs diff --git a/.vs/LetterBoxdUnwatchedGenerator/DesignTimeBuild/.dtbcache.v2 b/.vs/LetterBoxdUnwatchedGenerator/DesignTimeBuild/.dtbcache.v2 new file mode 100644 index 0000000000000000000000000000000000000000..c4c4b1f609c4768deb8d231c6c36581f4dde5dae GIT binary patch literal 84415 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 literal 0 HcmV?d00001 diff --git a/LetterBoxdUnwatchedGenerator.sln b/LetterBoxdUnwatchedGenerator.sln new file mode 100644 index 0000000..b1879a1 --- /dev/null +++ b/LetterBoxdUnwatchedGenerator.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.6.33723.286 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LetterBoxdUnwatchedGenerator", "LetterBoxdUnwatchedGenerator\LetterBoxdUnwatchedGenerator.csproj", "{AA177F53-376A-40C9-B372-BA5FD25FEAD7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AA177F53-376A-40C9-B372-BA5FD25FEAD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AA177F53-376A-40C9-B372-BA5FD25FEAD7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA177F53-376A-40C9-B372-BA5FD25FEAD7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AA177F53-376A-40C9-B372-BA5FD25FEAD7}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F57C2260-910C-480D-A2FF-22FF5A6EEDE7} + EndGlobalSection +EndGlobal diff --git a/LetterBoxdUnwatchedGenerator/CommandLineSplit.cs b/LetterBoxdUnwatchedGenerator/CommandLineSplit.cs new file mode 100644 index 0000000..7d83b5f --- /dev/null +++ b/LetterBoxdUnwatchedGenerator/CommandLineSplit.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LetterBoxdUnwatchedGenerator +{ + internal static class CommandLineSplitExt + { + + //public static IEnumerable SplitCommandLine(this string commandLine, char splitChar = ' ') + //{ + // bool inQuotes = false; + // bool isEscaping = false; + + // StringBuilder currentArg = new StringBuilder(); + + // foreach (char c in commandLine) + // { + // if (c == '\\' && !isEscaping) { isEscaping = true; continue; } + // if (c == '\"' && !isEscaping) inQuotes = !inQuotes; + // isEscaping = false; + + // if (!inQuotes && (splitChar == ' ' ? Char.IsWhiteSpace(c) : c == splitChar)) + // { + // if (currentArg.Length > 0) + // { + // yield return currentArg.ToString(); + // currentArg.Clear(); + // } + // } + // else + // { + // currentArg.Append(c); + // } + // } + + // if (currentArg.Length > 0) + // { + // yield return currentArg.ToString(); + // } + //} + + + public static IEnumerable SplitCommandLine(this string commandLine, char splitChar = ' ') + { + bool inQuotes = false; + bool isEscaping = false; + + return commandLine.Split(c => + { + if (c == '\\' && !isEscaping) { isEscaping = true; return false; } + if (c == '\"' && !isEscaping) inQuotes = !inQuotes; + isEscaping = false; + + return !inQuotes && (splitChar == ' ' ? Char.IsWhiteSpace(c) : c == splitChar); //Char.IsWhiteSpace(c)/*c == ' '*/; + }).Select(arg => arg.Trim().TrimMatchingQuotes('\"').Replace("\\\"", "\"")); + } + + public static IEnumerable Split(this string str, Func controller) + { + int nextPiece = 0; + + for (int c = 0; c < str.Length; c++) + { + if (controller(str[c])) + { + yield return str.Substring(nextPiece, c - nextPiece); + nextPiece = c + 1; + } + } + + yield return str.Substring(nextPiece); + } + + public static string TrimMatchingQuotes(this string input, char quote) + { + if ((input.Length >= 2) && + (input[0] == quote) && (input[input.Length - 1] == quote)) + return input.Substring(1, input.Length - 2); + + return input; + } + + public static string JoinCommandLine(this IEnumerable arguments, char joinChar = ' ') + { + return string.Join(joinChar, arguments.Select(a => a.Contains(joinChar) ? $"\"{a}\"" : a)); + } + } +} diff --git a/LetterBoxdUnwatchedGenerator/IMovie.cs b/LetterBoxdUnwatchedGenerator/IMovie.cs new file mode 100644 index 0000000..dcaf6cc --- /dev/null +++ b/LetterBoxdUnwatchedGenerator/IMovie.cs @@ -0,0 +1,8 @@ +namespace LetterBoxdUnwatchedGenerator +{ + public interface IMovie + { + public string Title { get; } + public int Year { get; } + } +} diff --git a/LetterBoxdUnwatchedGenerator/LetterBoxdConnection.cs b/LetterBoxdUnwatchedGenerator/LetterBoxdConnection.cs new file mode 100644 index 0000000..0ec393e --- /dev/null +++ b/LetterBoxdUnwatchedGenerator/LetterBoxdConnection.cs @@ -0,0 +1,25 @@ +using System.Net.Http.Headers; + +namespace LetterBoxdUnwatchedGenerator +{ + public class LetterBoxdConnection + { + const string baseUrl = "https://letterboxd.com/api/v0/"; + HttpClient httpClient; + + public LetterBoxdConnection() + { + //Authentication + httpClient = new HttpClient(); + httpClient.DefaultRequestHeaders.Add("Accept", "application/json"); + //add url form encoded content + var results = httpClient.PostAsync(baseUrl + "auth/token", new StringContent("grant_type=password&username=USERNAME&password=PASSWORD", MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded"))); //, Encoding.UTF8, "application/x-www-form-urlencoded")); + + results.Result.EnsureSuccessStatusCode(); + var bearer = results.Result.Content.ReadAsStringAsync().Result; + + httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearer); + + } + } +} diff --git a/LetterBoxdUnwatchedGenerator/LetterBoxdUnwatchedGenerator.csproj b/LetterBoxdUnwatchedGenerator/LetterBoxdUnwatchedGenerator.csproj new file mode 100644 index 0000000..f02677b --- /dev/null +++ b/LetterBoxdUnwatchedGenerator/LetterBoxdUnwatchedGenerator.csproj @@ -0,0 +1,10 @@ + + + + Exe + net7.0 + enable + enable + + + diff --git a/LetterBoxdUnwatchedGenerator/LetterBoxdWatchedMovie.cs b/LetterBoxdUnwatchedGenerator/LetterBoxdWatchedMovie.cs new file mode 100644 index 0000000..45b8925 --- /dev/null +++ b/LetterBoxdUnwatchedGenerator/LetterBoxdWatchedMovie.cs @@ -0,0 +1,37 @@ +namespace LetterBoxdUnwatchedGenerator +{ + public class LetterBoxdWatchedMovie : IMovie + { + public DateTime Date { get; } + public string Title { get; } + public int Year { get; } + public string LetterboxdUri { get; } + + public LetterBoxdWatchedMovie(DateTime date, string title, int year, string letterboxdUri) + { + Date = date; + Title = title; + Year = year; + LetterboxdUri = letterboxdUri; + } + + public static IEnumerable FromFile(string path) + { + var lines = File.ReadAllLines(path); + + if (lines.Length < 1 || !lines[0].StartsWith("Date,Name,Year,Letterboxd URI")) return Enumerable.Empty(); + + return lines.Skip(1).Select(line => + { + var lineParts = line.SplitCommandLine(','); + + var date = !string.IsNullOrEmpty(lineParts.First()) && DateTime.TryParse(lineParts.First(), out DateTime dateOut) ? dateOut : DateTime.MinValue; + var title = lineParts.Skip(1).First(); + var year = !string.IsNullOrEmpty(lineParts.Skip(2).First()) && int.TryParse(lineParts.Skip(2).First(), out int yearOut) ? yearOut : 0; + var letterboxdUri = lineParts.Skip(3).First(); + + return new LetterBoxdWatchedMovie(date, title, year, letterboxdUri); + }); + } + } +} diff --git a/LetterBoxdUnwatchedGenerator/LocalMovie.cs b/LetterBoxdUnwatchedGenerator/LocalMovie.cs new file mode 100644 index 0000000..fd06506 --- /dev/null +++ b/LetterBoxdUnwatchedGenerator/LocalMovie.cs @@ -0,0 +1,58 @@ +namespace LetterBoxdUnwatchedGenerator +{ + public class LocalMovie : IMovie + { + public string Title { get; } + public int Year { get; } + public string? Resolution { get; } + public string Directory { get; } + + public LocalMovie(string title, int year, string? resolution, string directory) + { + Title = title; + Year = year; + Resolution = resolution; + Directory = directory; + } + public static LocalMovie FromDirectory(string directoryName, string directoryFullName) + { + string title; + int? year; + string? resolution; + + var yearIndex = directoryName.LastIndexOf('('); + var resolutionIndex = directoryName.LastIndexOf('['); + if (yearIndex == -1) + { + year = null; + if (resolutionIndex == -1) + { + resolution = null; + title = directoryName; + } + else + { + resolution = directoryName.Substring(resolutionIndex + 1, directoryName.LastIndexOf(']') - resolutionIndex - 1); + title = directoryName[..(resolutionIndex - 1)].Trim(); + } + } + else + { + if (int.TryParse(directoryName.AsSpan(yearIndex + 1, directoryName.LastIndexOf(')') - yearIndex - 1), out int yearConverted)) year = yearConverted; + else year = null; + if (resolutionIndex == -1) + { + resolution = null; + title = directoryName[..(yearIndex - 1)].Trim(); + } + else + { + resolution = directoryName.Substring(resolutionIndex + 1, directoryName.LastIndexOf(']') - resolutionIndex - 1); + title = directoryName[..(yearIndex - 1)].Trim(); + } + } + + return new LocalMovie(title, year ?? 0, resolution, directoryFullName); + } + } +} diff --git a/LetterBoxdUnwatchedGenerator/Program.cs b/LetterBoxdUnwatchedGenerator/Program.cs new file mode 100644 index 0000000..2ee3860 --- /dev/null +++ b/LetterBoxdUnwatchedGenerator/Program.cs @@ -0,0 +1,39 @@ +using System.Text; + +namespace LetterBoxdUnwatchedGenerator +{ + internal class Program + { + static void Main(string[] args) + { + DirectoryInfo di = new DirectoryInfo(@"A:\Video\Movies\All"); + var localMovies = di.EnumerateDirectories().Select(di => LocalMovie.FromDirectory(di.Name, di.FullName)).ToList(); + + var watchedMovies = LetterBoxdWatchedMovie.FromFile(@"A:\homes\@DH-ARNEHOME\0\arne-1103\Documents\Inactive\2023-07-01 Letterboxd download\letterboxd-thearne4-2023-07-01-10-32-utc\watched.csv"); + + var unwatchedMovies = localMovies.Where(lm => !watchedMovies.Any(wm => lm.Title.Replace("-", "").Replace("(", "").Replace(")", "").Replace(" ", "").ToLowerInvariant().EndsWith(wm.Title.Replace("\\", "").Replace("/", "").Replace(":", "").Replace("\"", "").Replace("?", "").Replace("<", "").Replace(">", "").Replace("|", "").Replace("-", "").Replace(" ", "").ToLowerInvariant()) && wm.Year == lm.Year)); + + WriteToCsv(@"A:\homes\@DH-ARNEHOME\0\arne-1103\Documents\Inactive\2023-07-01 Letterboxd download\local-unwatched.csv", unwatchedMovies); + + //unwatchedMovies.ForEach(um => Console.WriteLine(um.Title)); + + Console.WriteLine("-------------"); + Console.WriteLine($"Total: {unwatchedMovies.Count()}"); + Console.ReadKey(); + } + static void WriteToCsv(string path, IEnumerable unwatchedMovies) + { + StringBuilder sb = new(); + sb.AppendLine("Title,Year"); + foreach (IMovie movie in unwatchedMovies) + { + var title = movie.Title.Contains(',') ? $"\"{movie.Title}\"" : movie.Title; + var year = movie.Year == 0 ? "" : movie.Year.ToString(); + + sb.AppendLine($"{title},{year}"); + } + + File.WriteAllText(path, sb.ToString()); + } + } +} \ No newline at end of file