commit bb2cf4708d3c6c736b6e1acd37409c56bf743a99 Author: Aesthetiful Date: Mon Oct 5 21:14:14 2026 -0700 Init diff --git a/.vs/ProjectEvaluation/thumbnailserver2016.metadata.v9.bin b/.vs/ProjectEvaluation/thumbnailserver2016.metadata.v9.bin new file mode 100644 index 0000000..9ebbde0 Binary files /dev/null and b/.vs/ProjectEvaluation/thumbnailserver2016.metadata.v9.bin differ diff --git a/.vs/ProjectEvaluation/thumbnailserver2016.projects.v9.bin b/.vs/ProjectEvaluation/thumbnailserver2016.projects.v9.bin new file mode 100644 index 0000000..de48470 Binary files /dev/null and b/.vs/ProjectEvaluation/thumbnailserver2016.projects.v9.bin differ diff --git a/.vs/ProjectEvaluation/thumbnailserver2016.strings.v9.bin b/.vs/ProjectEvaluation/thumbnailserver2016.strings.v9.bin new file mode 100644 index 0000000..9d32c3b Binary files /dev/null and b/.vs/ProjectEvaluation/thumbnailserver2016.strings.v9.bin differ diff --git a/.vs/ThumbnailServer2016/DesignTimeBuild/.dtbcache.v2 b/.vs/ThumbnailServer2016/DesignTimeBuild/.dtbcache.v2 new file mode 100644 index 0000000..dba8db5 Binary files /dev/null and b/.vs/ThumbnailServer2016/DesignTimeBuild/.dtbcache.v2 differ diff --git a/.vs/ThumbnailServer2016/FileContentIndex/3cac2f9c-a17a-4563-801b-8e52271b0b3e.vsidx b/.vs/ThumbnailServer2016/FileContentIndex/3cac2f9c-a17a-4563-801b-8e52271b0b3e.vsidx new file mode 100644 index 0000000..402a231 Binary files /dev/null and b/.vs/ThumbnailServer2016/FileContentIndex/3cac2f9c-a17a-4563-801b-8e52271b0b3e.vsidx differ diff --git a/.vs/ThumbnailServer2016/FileContentIndex/8f339691-a665-47b3-8b57-8e439bd8fe3d.vsidx b/.vs/ThumbnailServer2016/FileContentIndex/8f339691-a665-47b3-8b57-8e439bd8fe3d.vsidx new file mode 100644 index 0000000..eb96c36 Binary files /dev/null and b/.vs/ThumbnailServer2016/FileContentIndex/8f339691-a665-47b3-8b57-8e439bd8fe3d.vsidx differ diff --git a/.vs/ThumbnailServer2016/FileContentIndex/ac608ecd-130c-4166-82df-b969bb2678c8.vsidx b/.vs/ThumbnailServer2016/FileContentIndex/ac608ecd-130c-4166-82df-b969bb2678c8.vsidx new file mode 100644 index 0000000..70aef67 Binary files /dev/null and b/.vs/ThumbnailServer2016/FileContentIndex/ac608ecd-130c-4166-82df-b969bb2678c8.vsidx differ diff --git a/.vs/ThumbnailServer2016/FileContentIndex/b3f25a73-58d2-4111-aea7-870eaa8ec509.vsidx b/.vs/ThumbnailServer2016/FileContentIndex/b3f25a73-58d2-4111-aea7-870eaa8ec509.vsidx new file mode 100644 index 0000000..70aef67 Binary files /dev/null and b/.vs/ThumbnailServer2016/FileContentIndex/b3f25a73-58d2-4111-aea7-870eaa8ec509.vsidx differ diff --git a/.vs/ThumbnailServer2016/FileContentIndex/eab239b9-d9a7-4714-bd97-99d385638da4.vsidx b/.vs/ThumbnailServer2016/FileContentIndex/eab239b9-d9a7-4714-bd97-99d385638da4.vsidx new file mode 100644 index 0000000..c8677ca Binary files /dev/null and b/.vs/ThumbnailServer2016/FileContentIndex/eab239b9-d9a7-4714-bd97-99d385638da4.vsidx differ diff --git a/.vs/ThumbnailServer2016/config/applicationhost.config b/.vs/ThumbnailServer2016/config/applicationhost.config new file mode 100644 index 0000000..0d88f0d --- /dev/null +++ b/.vs/ThumbnailServer2016/config/applicationhost.config @@ -0,0 +1,1016 @@ + + + + + + + +
+
+
+
+
+
+
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+ + +
+
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.vs/ThumbnailServer2016/v17/.futdcache.v2 b/.vs/ThumbnailServer2016/v17/.futdcache.v2 new file mode 100644 index 0000000..a39482c Binary files /dev/null and b/.vs/ThumbnailServer2016/v17/.futdcache.v2 differ diff --git a/.vs/ThumbnailServer2016/v17/.suo b/.vs/ThumbnailServer2016/v17/.suo new file mode 100644 index 0000000..9024288 Binary files /dev/null and b/.vs/ThumbnailServer2016/v17/.suo differ diff --git a/.vs/ThumbnailServer2016/v17/DocumentLayout.backup.json b/.vs/ThumbnailServer2016/v17/DocumentLayout.backup.json new file mode 100644 index 0000000..e5bcaed --- /dev/null +++ b/.vs/ThumbnailServer2016/v17/DocumentLayout.backup.json @@ -0,0 +1,137 @@ +{ + "Version": 1, + "WorkspaceRootPath": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|d:\\eracast\\storage\\app\\aspx\\thumbnailserver2016\\thumbnailserver2016\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|solutionrelative:thumbnailserver2016\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|d:\\eracast\\storage\\app\\aspx\\thumbnailserver2016\\thumbnailserver2016\\controllers\\thumbnailcontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|solutionrelative:thumbnailserver2016\\controllers\\thumbnailcontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|d:\\eracast\\storage\\app\\aspx\\thumbnailserver2016\\thumbnailserver2016\\data\\appdbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|solutionrelative:thumbnailserver2016\\data\\appdbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|d:\\eracast\\storage\\app\\aspx\\thumbnailserver2016\\thumbnailserver2016\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}", + "RelativeMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|solutionrelative:thumbnailserver2016\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}" + }, + { + "AbsoluteMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|d:\\eracast\\storage\\app\\aspx\\thumbnailserver2016\\thumbnailserver2016\\entities\\video.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|solutionrelative:thumbnailserver2016\\entities\\video.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|d:\\eracast\\storage\\app\\aspx\\thumbnailserver2016\\thumbnailserver2016\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}", + "RelativeMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|solutionrelative:thumbnailserver2016\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}" + }, + { + "AbsoluteMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|d:\\eracast\\storage\\app\\aspx\\thumbnailserver2016\\thumbnailserver2016\\appsettings.development.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}", + "RelativeMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|solutionrelative:thumbnailserver2016\\appsettings.development.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 5, + "Children": [ + { + "$type": "Document", + "DocumentIndex": 5, + "Title": "appsettings.json", + "DocumentMoniker": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\appsettings.json", + "RelativeDocumentMoniker": "ThumbnailServer2016\\appsettings.json", + "ToolTip": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\appsettings.json", + "RelativeToolTip": "ThumbnailServer2016\\appsettings.json", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAkAAABTAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", + "WhenOpened": "2024-11-13T23:00:26.458Z" + }, + { + "$type": "Document", + "DocumentIndex": 6, + "Title": "appsettings.Development.json", + "DocumentMoniker": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\appsettings.Development.json", + "RelativeDocumentMoniker": "ThumbnailServer2016\\appsettings.Development.json", + "ToolTip": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\appsettings.Development.json", + "RelativeToolTip": "ThumbnailServer2016\\appsettings.Development.json", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAADAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", + "WhenOpened": "2024-11-13T23:00:21.366Z" + }, + { + "$type": "Document", + "DocumentIndex": 2, + "Title": "AppDbContext.cs", + "DocumentMoniker": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Data\\AppDbContext.cs", + "RelativeDocumentMoniker": "ThumbnailServer2016\\Data\\AppDbContext.cs", + "ToolTip": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Data\\AppDbContext.cs", + "RelativeToolTip": "ThumbnailServer2016\\Data\\AppDbContext.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAkAAAAwAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-11-13T22:54:46.474Z" + }, + { + "$type": "Document", + "DocumentIndex": 3, + "Title": "launchSettings.json", + "DocumentMoniker": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Properties\\launchSettings.json", + "RelativeDocumentMoniker": "ThumbnailServer2016\\Properties\\launchSettings.json", + "ToolTip": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Properties\\launchSettings.json", + "RelativeToolTip": "ThumbnailServer2016\\Properties\\launchSettings.json", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAB8AAAAYAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", + "WhenOpened": "2024-11-08T20:59:41.453Z" + }, + { + "$type": "Document", + "DocumentIndex": 1, + "Title": "ThumbnailController.cs", + "DocumentMoniker": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Controllers\\ThumbnailController.cs", + "RelativeDocumentMoniker": "ThumbnailServer2016\\Controllers\\ThumbnailController.cs", + "ToolTip": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Controllers\\ThumbnailController.cs", + "RelativeToolTip": "ThumbnailServer2016\\Controllers\\ThumbnailController.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAABYAAAAgAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-11-08T20:46:17.852Z" + }, + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "Program.cs", + "DocumentMoniker": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Program.cs", + "RelativeDocumentMoniker": "ThumbnailServer2016\\Program.cs", + "ToolTip": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Program.cs", + "RelativeToolTip": "ThumbnailServer2016\\Program.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAABcAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-11-08T20:43:13.873Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 4, + "Title": "Video.cs", + "DocumentMoniker": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Entities\\Video.cs", + "RelativeDocumentMoniker": "ThumbnailServer2016\\Entities\\Video.cs", + "ToolTip": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Entities\\Video.cs", + "RelativeToolTip": "ThumbnailServer2016\\Entities\\Video.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAMAAAATAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-11-08T20:30:15.044Z" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{cce594b6-0c39-4442-ba28-10c64ac7e89f}" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/.vs/ThumbnailServer2016/v17/DocumentLayout.json b/.vs/ThumbnailServer2016/v17/DocumentLayout.json new file mode 100644 index 0000000..4b210a9 --- /dev/null +++ b/.vs/ThumbnailServer2016/v17/DocumentLayout.json @@ -0,0 +1,173 @@ +{ + "Version": 1, + "WorkspaceRootPath": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|d:\\eracast\\storage\\app\\aspx\\thumbnailserver2016\\thumbnailserver2016\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|solutionrelative:thumbnailserver2016\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|d:\\eracast\\storage\\app\\aspx\\thumbnailserver2016\\thumbnailserver2016\\controllers\\thumbnailcontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|solutionrelative:thumbnailserver2016\\controllers\\thumbnailcontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|d:\\eracast\\storage\\app\\aspx\\thumbnailserver2016\\thumbnailserver2016\\data\\appdbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|solutionrelative:thumbnailserver2016\\data\\appdbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|D:\\eracast\\app\\Http\\Controllers\\v2\\api.php||{3B902123-F8A7-4915-9F01-361F908088D0}" + }, + { + "AbsoluteMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|d:\\eracast\\storage\\app\\aspx\\thumbnailserver2016\\thumbnailserver2016\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}", + "RelativeMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|solutionrelative:thumbnailserver2016\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}" + }, + { + "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|D:\\eracast\\.env||{8B382828-6202-11D1-8870-0000F87579D2}" + }, + { + "AbsoluteMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|d:\\eracast\\storage\\app\\aspx\\thumbnailserver2016\\thumbnailserver2016\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}", + "RelativeMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|solutionrelative:thumbnailserver2016\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}" + }, + { + "AbsoluteMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|d:\\eracast\\storage\\app\\aspx\\thumbnailserver2016\\thumbnailserver2016\\entities\\video.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|solutionrelative:thumbnailserver2016\\entities\\video.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|d:\\eracast\\storage\\app\\aspx\\thumbnailserver2016\\thumbnailserver2016\\appsettings.development.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}", + "RelativeMoniker": "D:0:0:{65C2F2A5-9C93-4C4B-8C82-86044FA39891}|ThumbnailServer2016\\ThumbnailServer2016.csproj|solutionrelative:thumbnailserver2016\\appsettings.development.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 7, + "Children": [ + { + "$type": "Document", + "DocumentIndex": 4, + "Title": "appsettings.json", + "DocumentMoniker": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\appsettings.json", + "RelativeDocumentMoniker": "ThumbnailServer2016\\appsettings.json", + "ToolTip": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\appsettings.json", + "RelativeToolTip": "ThumbnailServer2016\\appsettings.json", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAkAAABTAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", + "WhenOpened": "2024-11-13T23:00:26.458Z", + "IsPinned": true, + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 5, + "Title": ".env", + "DocumentMoniker": "D:\\eracast\\.env", + "RelativeDocumentMoniker": "..\\..\\..\\..\\.env", + "ToolTip": "D:\\eracast\\.env", + "RelativeToolTip": "..\\..\\..\\..\\.env", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|", + "WhenOpened": "2025-02-24T09:00:13.384Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 3, + "Title": "api.php", + "DocumentMoniker": "D:\\eracast\\app\\Http\\Controllers\\v2\\api.php", + "RelativeDocumentMoniker": "..\\..\\..\\..\\app\\Http\\Controllers\\v2\\api.php", + "ToolTip": "D:\\eracast\\app\\Http\\Controllers\\v2\\api.php", + "RelativeToolTip": "..\\..\\..\\..\\app\\Http\\Controllers\\v2\\api.php", + "ViewState": "AgIAAO8CAAAAAAAAAAAAALIBAAAdAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.002338|", + "WhenOpened": "2025-02-24T08:56:55.876Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 8, + "Title": "appsettings.Development.json", + "DocumentMoniker": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\appsettings.Development.json", + "RelativeDocumentMoniker": "ThumbnailServer2016\\appsettings.Development.json", + "ToolTip": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\appsettings.Development.json", + "RelativeToolTip": "ThumbnailServer2016\\appsettings.Development.json", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAADAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", + "WhenOpened": "2024-11-13T23:00:21.366Z" + }, + { + "$type": "Document", + "DocumentIndex": 2, + "Title": "AppDbContext.cs", + "DocumentMoniker": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Data\\AppDbContext.cs", + "RelativeDocumentMoniker": "ThumbnailServer2016\\Data\\AppDbContext.cs", + "ToolTip": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Data\\AppDbContext.cs", + "RelativeToolTip": "ThumbnailServer2016\\Data\\AppDbContext.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAkAAAAwAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-11-13T22:54:46.474Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 6, + "Title": "launchSettings.json", + "DocumentMoniker": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Properties\\launchSettings.json", + "RelativeDocumentMoniker": "ThumbnailServer2016\\Properties\\launchSettings.json", + "ToolTip": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Properties\\launchSettings.json", + "RelativeToolTip": "ThumbnailServer2016\\Properties\\launchSettings.json", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAB8AAAAYAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", + "WhenOpened": "2024-11-08T20:59:41.453Z" + }, + { + "$type": "Document", + "DocumentIndex": 1, + "Title": "ThumbnailController.cs", + "DocumentMoniker": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Controllers\\ThumbnailController.cs", + "RelativeDocumentMoniker": "ThumbnailServer2016\\Controllers\\ThumbnailController.cs", + "ToolTip": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Controllers\\ThumbnailController.cs", + "RelativeToolTip": "ThumbnailServer2016\\Controllers\\ThumbnailController.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAABYAAAAgAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-11-08T20:46:17.852Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "Program.cs", + "DocumentMoniker": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Program.cs", + "RelativeDocumentMoniker": "ThumbnailServer2016\\Program.cs", + "ToolTip": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Program.cs", + "RelativeToolTip": "ThumbnailServer2016\\Program.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAABAAAABYAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-11-08T20:43:13.873Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 7, + "Title": "Video.cs", + "DocumentMoniker": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Entities\\Video.cs", + "RelativeDocumentMoniker": "ThumbnailServer2016\\Entities\\Video.cs", + "ToolTip": "D:\\eracast\\storage\\app\\aspx\\ThumbnailServer2016\\ThumbnailServer2016\\Entities\\Video.cs", + "RelativeToolTip": "ThumbnailServer2016\\Entities\\Video.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAMAAAATAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2024-11-08T20:30:15.044Z" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{cce594b6-0c39-4442-ba28-10c64ac7e89f}" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..2b6f66b --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ + +![Logo](https://www.eracast.cc/yt/imgbin/yt-mini-logo.jpg) + + +# Thumbnail Server for EraCast 2016 (Deprecated) + +This project was made using ASP.NET Web API and was made to generate thumbnails for EraCast 2016 +## Installation + +```bash + git clone https://github.com/eracast/ThumbnailServer2016.git + cd ThumbnailServer2016 + dotnet restore +``` + +Else if deploying use command below for complied release (Not recommended) + +```bash + dotnet publish -c Release -o ./publish +``` +## Run Locally + +CD to ThumbnailServer2016 inside root folder + +```bash + cd ThumbnailServer2016 +``` + +Build project + +```bash + dotnet build +``` + + +## Deployment + +CD to ThumbnailServer2016 inside root folder + +```bash + cd ThumbnailServer2016 +``` + +To build the compiled server run the command below (Not recommended) + +```bash + dotnet publish -c Release -o ./publish +``` + diff --git a/ThumbnailServer2016.service b/ThumbnailServer2016.service new file mode 100644 index 0000000..b147831 --- /dev/null +++ b/ThumbnailServer2016.service @@ -0,0 +1,12 @@ +[Unit] +Description=ThumbnailServer2016 + +[Service] +ExecStart=/usr/bin/dotnet /var/www/eracast/storage/app/aspx/ThumbnailServer2016/ThumbnailServer2016/publish/ThumbnailServer2016.dll --urls "http://localhost:5001" +Restart=always +User=www-data +Group=www-data +Environment=DOTNET_ENVIRONMENT=Production + +[Install] +WantedBy=multi-user.target diff --git a/ThumbnailServer2016.sln b/ThumbnailServer2016.sln new file mode 100644 index 0000000..cce1866 --- /dev/null +++ b/ThumbnailServer2016.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.11.35327.3 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThumbnailServer2016", "ThumbnailServer2016\ThumbnailServer2016.csproj", "{65C2F2A5-9C93-4C4B-8C82-86044FA39891}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {65C2F2A5-9C93-4C4B-8C82-86044FA39891}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {65C2F2A5-9C93-4C4B-8C82-86044FA39891}.Debug|Any CPU.Build.0 = Debug|Any CPU + {65C2F2A5-9C93-4C4B-8C82-86044FA39891}.Release|Any CPU.ActiveCfg = Release|Any CPU + {65C2F2A5-9C93-4C4B-8C82-86044FA39891}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A2280FC7-17D3-4A63-A17B-E7A911373014} + EndGlobalSection +EndGlobal diff --git a/ThumbnailServer2016/Controllers/ThumbnailController.cs b/ThumbnailServer2016/Controllers/ThumbnailController.cs new file mode 100644 index 0000000..def8981 --- /dev/null +++ b/ThumbnailServer2016/Controllers/ThumbnailController.cs @@ -0,0 +1,145 @@ +using Microsoft.AspNetCore.Mvc; +using System.IO; +using System.Diagnostics; +using System.Runtime.InteropServices; + +[ApiController] +public class ThumbnailController : ControllerBase +{ + private readonly AppDbContext _dbContext; + + public ThumbnailController(AppDbContext dbContext) + { + _dbContext = dbContext; + } + + [HttpGet("/get_thumbnail.aspx")] + public IActionResult GetThumbnail([FromQuery] string v) + { + if (string.IsNullOrEmpty(v) || !_dbContext.videos.Any(video => video.Rid == v)) + { + return DefaultThumbnail(); + } + + var video = _dbContext.videos.FirstOrDefault(video => video.Rid == v); + + if (video == null) + { + return DefaultThumbnail(); + } + + var videoPath = "/mnt/d/eracast/storage/app/videos/" + v + "/"; + var thumbnailPath = videoPath + "hqdefault.jpg"; + var originalThumbnailPath = videoPath + video.Thumbnail; + + Response.Headers["Cache-Control"] = "public, max-age=3600"; + + if (System.IO.File.Exists(thumbnailPath)) + { + Response.Headers["Content-Disposition"] = "inline; filename=\"hqdefault.jpg\""; + var file = File(System.IO.File.ReadAllBytes(thumbnailPath), "image/jpeg"); + return file; + } + + + if (!System.IO.File.Exists(originalThumbnailPath)) + { + Response.Headers["Content-Disposition"] = "inline; filename=\"hqdefault.jpg\""; + return DefaultThumbnail(); + } + + GenerateThumbnail(originalThumbnailPath, thumbnailPath); + + if (System.IO.File.Exists(thumbnailPath)) + { + Response.Headers["Content-Disposition"] = "inline; filename=\"hqdefault.jpg\""; + return File(System.IO.File.ReadAllBytes(thumbnailPath), "image/jpeg", "hqdefault.jpg"); + } + else + { + Response.Headers["Content-Disposition"] = "inline; filename=\"hqdefault.jpg\""; + return DefaultThumbnail(); + } + } + + private void GenerateThumbnail(string inputPath, string outputPath) + { + var ffmpegCommand = "ffmpeg -y -i " + inputPath + " -vf \"\"scale='if(gt(a,4/3),120,-1)':'if(gt(a,4/3),-1,90)',pad=120:90:(ow-iw)/2:(oh-ih)/2+2\"\" -vframes 1 " + outputPath; + ExecuteFFmpegCommand(ffmpegCommand); + + var webpOutputPath = System.IO.Path.ChangeExtension(outputPath, "webp"); + var webpCommand = "ffmpeg -y -i " + inputPath + " -vf \"\"scale='if(gt(a,4/3),120,-1)':'if(gt(a,4/3),-1,90)',pad=120:90:(ow-iw)/2:(oh-ih)/2+2\"\" -vframes 1 " + webpOutputPath; + ExecuteFFmpegCommand(webpCommand); + } + + private void ExecuteFFmpegCommand(string command) + { + Console.WriteLine("Executing: " + command); + /* for windows, uncomment if been hosted on windows + string shell, shellArgs; + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + shell = "cmd"; + shellArgs = $"/c {command}"; + } + else + { + shell = "/bin/bash"; + shellArgs = $"-c \"{command}\""; + } + + var processInfo = new ProcessStartInfo(shell, shellArgs) + { + RedirectStandardError = true, + RedirectStandardOutput = true, + UseShellExecute = false, + CreateNoWindow = true + }; + + using (var process = Process.Start(processInfo)) + { + if (process != null) + { + process.WaitForExit(); + } + } + */ + ProcessStartInfo startInfo = new ProcessStartInfo("bash", $"-c \"{command}\"") + { + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true + }; + + Process process = Process.Start(startInfo); + + process.OutputDataReceived += (sender, e) => + { + if (e.Data != null) + { + Console.WriteLine(e.Data); + } + }; + + process.ErrorDataReceived += (sender, e) => + { + if (e.Data != null) + { + Console.WriteLine($"ERROR: {e.Data}"); + } + }; + + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + process.WaitForExit(); + } + + private IActionResult DefaultThumbnail() + { + var defaultThumbnailPath = Path.Combine("/mnt/d/eracast/storage/app/thumbs/", "default.jpg"); + Response.Headers["Content-Disposition"] = "inline; filename=\"hqdefault.jpg\""; + return File(System.IO.File.ReadAllBytes(defaultThumbnailPath), "image/jpeg", "hqdefault.jpg"); + } +} diff --git a/ThumbnailServer2016/Data/AppDbContext.cs b/ThumbnailServer2016/Data/AppDbContext.cs new file mode 100644 index 0000000..f37936a --- /dev/null +++ b/ThumbnailServer2016/Data/AppDbContext.cs @@ -0,0 +1,15 @@ +// Data/AppDbContext.cs +using Microsoft.EntityFrameworkCore; + +public class AppDbContext : DbContext +{ + public DbSet