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"]
\ 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 @@