From 9fe898f282b882d68c5f6114c00db903db3763fa Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sat, 4 Jan 2020 14:23:52 +0100 Subject: [PATCH] v4 rework --- Pages/Conference.cshtml | 50 ++++++++------------------ Pages/Conference.cshtml.cs | 72 +++++++++++++------------------------ Pages/Index.cshtml | 9 +++-- Pages/Info.cshtml | 56 ++++++++++++----------------- Pages/Shared/_Layout.cshtml | 2 +- Types.cs | 4 +-- c3stream.cs | 63 ++++++++++++++++++++++++++++---- 7 files changed, 125 insertions(+), 131 deletions(-) diff --git a/Pages/Conference.cshtml b/Pages/Conference.cshtml index b1d1b10..7bc354c 100644 --- a/Pages/Conference.cshtml +++ b/Pages/Conference.cshtml @@ -3,30 +3,16 @@ @using System.Net @using static ConferenceModel @{ - int tagFormat; - switch (Request.Query["c"]) { - case "36c3": - tagFormat = 2; - break; - case "35c3": - case "34c3": - tagFormat = 1; - break; - case "33c3": - tagFormat = 0; - break; - default: - Response.Redirect("/"); - return; + if (c3stream.Conferences.All(c => c.Acronym != Request.Query["c"])) { + Response.Redirect("/"); + return; } c3stream.UpdateCookie(Request, Response, $"/Conference?c={Request.Query["c"]}&"); - + ReadUserData(); ViewData["Title"] = Request.Query["c"]; var wc = new WebClient(); - var jsonpath = System.IO.Path.Combine(c3stream.DataPath, Request.Query["c"] + ".json"); - var json = System.IO.File.Exists(jsonpath) ? System.IO.File.ReadAllText(jsonpath) : wc.DownloadString($"https://api.media.ccc.de/public/conferences/{Request.Query["c"]}"); - var conference = Conference.FromJson(json); + var conference = c3stream.Conferences.First(c => c.Acronym == Request.Query["c"]); wc.Dispose(); } @@ -44,20 +30,14 @@ - @foreach (var talk in Request.Query["orderby"] == "published" ? conference.Events.OrderByDescending(p => p.ReleaseDate) : conference.Events.OrderBy(p => p.Date)) { - TalkMetadata metadata; - if (EventMetadata.Any(p => p.Guid == talk.Guid?.ToString())) { - metadata = EventMetadata.First(p => p.Guid == talk.Guid?.ToString()); - } - else { - metadata = GetEvent(talk.Guid?.ToString()); - EventMetadata.Add(metadata); - } - var isWatched = EventMetadata.Any(p => p.Guid == talk.Guid?.ToString() && p.State.FirstOrDefault(q => q.Guid == Request.Cookies["bookmark"])?.State == "watched"); - var isMarked = EventMetadata.Any(p => p.Guid == talk.Guid?.ToString() && p.State.FirstOrDefault(q => q.Guid == Request.Cookies["bookmark"])?.State == "marked"); - var file = metadata.Talk.Recordings.FirstOrDefault(p => System.IO.File.Exists(System.IO.Path.Combine(c3stream.CachePath, conference.Acronym, p.Filename))); - var eventName = tagFormat == 0 ? conference.Acronym : talk.Tags[0].Replace("-", "-
"); - var category = tagFormat switch { + @foreach (var talk in Request.Query["orderby"] == "published" ? conference.Talks.OrderByDescending(p => p.ReleaseDate) : conference.Talks.OrderBy(p => p.Date)) { + var state = UserData.FirstOrDefault(p => p.TalkId == talk.Guid && p.UserId == Request.Cookies["bookmark"])?.State; + var isWatched = state == "watched"; + var isMarked = state == "marked"; + var file = $"{talk.Slug}.mp4"; + var tagV = c3stream.Conferences.First(c => c.Acronym == Request.Query["c"]).TagVersion; + var eventName = tagV == 0 ? conference.Acronym : talk.Tags[0].Replace("-", "-
"); + var category = tagV switch { 0 => talk.Tags[0], 1 => talk.Tags[2], 2 => talk.Tags[3], @@ -83,8 +63,8 @@ - @if (file != null) { - + @if (System.IO.File.Exists(System.IO.Path.Combine(c3stream.CachePath, conference.Acronym, file))) { + } diff --git a/Pages/Conference.cshtml.cs b/Pages/Conference.cshtml.cs index eb20432..d9c9355 100644 --- a/Pages/Conference.cshtml.cs +++ b/Pages/Conference.cshtml.cs @@ -1,80 +1,58 @@ using System.Collections.Generic; using System.Linq; -using System.Net; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Logging; using Newtonsoft.Json; namespace c3stream.Pages { public class ConferenceModel : PageModel { - public static List EventMetadata = new List(); + public static List UserData = new List(); private readonly ILogger _logger; public ConferenceModel(ILogger logger) => _logger = logger; public void OnGet() { - var guid = Request.Query["guid"]; - var state = Request.Query["state"]; + var guid = Request.Query["guid"]; + var state = Request.Query["state"]; + var userid = Request.Cookies["bookmark"]; if (string.IsNullOrWhiteSpace(guid) || string.IsNullOrWhiteSpace(state) || !Request.Cookies.ContainsKey("bookmark")) return; lock (c3stream.Lock) { - ReadEventMetadata(); - var existing = EventMetadata.FirstOrDefault(p => p.Guid == guid)?.State.FirstOrDefault(p => p.Guid == Request.Cookies["bookmark"]); + ReadUserData(); + var existing = UserData.FirstOrDefault(p => p.TalkId == guid && p.UserId == userid); if (existing != null) - existing.State = state; + if (state == "unwatched") + UserData.Remove(existing); + else + existing.State = state; else - EventMetadata.FirstOrDefault(p => p.Guid == guid)?.State.Add(new UserState(Request.Cookies["bookmark"], state)); - WriteEventMetadata(); + UserData.Add(new UserStatus(userid, guid, state)); + WriteUserData(); Response.Redirect("/"); } } - public static TalkMetadata GetEvent(string guid) { - TalkMetadata metadata; - lock (c3stream.Lock) { - ReadEventMetadata(); - using (var wc = new WebClient()) { - var json = wc.DownloadString($"https://api.media.ccc.de/public/events/{guid}"); - var talk = Talk.FromJson(json); - metadata = new TalkMetadata(guid, talk); - EventMetadata.Add(metadata); - } - - WriteEventMetadata(); - } - - return metadata; - } - - public static void ReadEventMetadata() { + public static void ReadUserData() { lock (c3stream.Lock) - EventMetadata = JsonConvert.DeserializeObject>(System.IO.File.ReadAllText(c3stream.DbPath)); + UserData = JsonConvert.DeserializeObject>(System.IO.File.ReadAllText(c3stream.DbPath)); } - public static void WriteEventMetadata() { - System.IO.File.WriteAllText(c3stream.DbPath, JsonConvert.SerializeObject(EventMetadata)); - } - - public class TalkMetadata { - public readonly string Guid; - public List State; - public Talk Talk; - - public TalkMetadata(string guid, Talk talk) { - Guid = guid; - State = new List(); - Talk = talk; + public static void WriteUserData() { + lock (c3stream.Lock) { + System.IO.File.WriteAllText(c3stream.DbPath, JsonConvert.SerializeObject(UserData)); } } - public class UserState { - public string Guid; - public string State; + public class UserStatus { + public readonly string TalkId; + public readonly string UserId; + public string State; - public UserState(string guid, string state = "unwatched") { - Guid = guid; - State = state; + public UserStatus(string userId, string talkId, string state = "unwatched") { + UserId = userId; + State = state; + TalkId = talkId; } } } diff --git a/Pages/Index.cshtml b/Pages/Index.cshtml index 6bcf063..f0a31d6 100644 --- a/Pages/Index.cshtml +++ b/Pages/Index.cshtml @@ -2,7 +2,7 @@ @model IndexModel @{ ViewData["Title"] = "Home"; - c3stream.UpdateCookie(Request, Response, $"/?"); + c3stream.UpdateCookie(Request, Response, "/?"); }
@@ -10,9 +10,8 @@ Your bookmark link:
https://@Request.Host.Value?bookmark=@Request.Cookies["bookmark"]

- 36c3 - 35c3 - 34c3 - 33c3 + @foreach (var conf in c3stream.Conferences) { + @conf.Acronym + }
\ No newline at end of file diff --git a/Pages/Info.cshtml b/Pages/Info.cshtml index 738f0e6..497facd 100644 --- a/Pages/Info.cshtml +++ b/Pages/Info.cshtml @@ -4,53 +4,41 @@ ViewData["Title"] = "Info"; } @{ - if (string.IsNullOrWhiteSpace(Request.Query["guid"])) { + if (string.IsNullOrWhiteSpace(Request.Query["guid"]) || c3stream.GetEventByGuid(Request.Query["guid"]) == null) { Response.Redirect("/"); return; } c3stream.UpdateCookie(Request, Response, $"/Info?guid={Request.Query["guid"]}&"); - ConferenceModel.ReadEventMetadata(); - var talk = ConferenceModel.EventMetadata.FirstOrDefault(p => p.Guid == Request.Query["guid"]); + ConferenceModel.ReadUserData(); + var talk = c3stream.GetEventByGuid(Request.Query["guid"]); + var state = ConferenceModel.UserData.FirstOrDefault(p => p.TalkId == Request.Query["guid"] && p.UserId == Request.Cookies["bookmark"])?.State; if (talk == null) { Response.Redirect("/"); return; } + if (state == null) { + state = "unwatched"; + } - var title = talk.Talk.Title; - var speakers = talk.Talk.Persons.Aggregate((s, s1) => $"{s}, {s1}"); - var description = talk.Talk.Description; + var title = talk.Title; + var speakers = talk.Persons.Aggregate((s, s1) => $"{s}, {s1}"); + var description = talk.Description; if (string.IsNullOrEmpty(description)) { description = "<missing description>"; } - var isWatched = talk.State.FirstOrDefault(q => q.Guid == Request.Cookies["bookmark"])?.State == "watched"; - var isMarked = talk.State.FirstOrDefault(q => q.Guid == Request.Cookies["bookmark"])?.State == "marked"; - var file = talk.Talk.Recordings.FirstOrDefault(p => System.IO.File.Exists(System.IO.Path.Combine(c3stream.CachePath, talk.Talk.ConferenceUrl.AbsoluteUri.Split("/").Last(), p.Filename))); - var eventName = talk.Talk.Tags[0].Replace("-", "-
"); + var isWatched = state == "watched"; + var isMarked = state == "marked"; + var file = $"{talk.Slug}.mp4"; + var conference = c3stream.GetConferenceByEventGuid(talk.Guid); + var eventName = talk.Tags[0].Replace("-", "-
"); - int tagFormat; - switch (talk.Talk.ConferenceUrl.AbsoluteUri.Split("/").Last()) { - case "36c3": - tagFormat = 2; - break; - case "35c3": - case "34c3": - tagFormat = 1; - break; - case "33c3": - tagFormat = 0; - break; - default: - Response.Redirect("/"); - return; - } - - var category = tagFormat switch { - 0 => talk.Talk.Tags[0], - 1 => talk.Talk.Tags[2], - 2 => talk.Talk.Tags[3], + var category = c3stream.GetConferenceByEventGuid(Request.Query["guid"]).TagVersion switch { + 0 => talk.Tags[0], + 1 => talk.Tags[2], + 2 => talk.Tags[3], _ => "" }; } @@ -66,11 +54,11 @@ else { }
- + - @if (file != null) { - + @if (System.IO.File.Exists(System.IO.Path.Combine(c3stream.CachePath, conference.Acronym, file))) { + } diff --git a/Pages/Shared/_Layout.cshtml b/Pages/Shared/_Layout.cshtml index e25d992..f03d0a0 100644 --- a/Pages/Shared/_Layout.cshtml +++ b/Pages/Shared/_Layout.cshtml @@ -12,7 +12,7 @@