113 lines
4.1 KiB
C#
113 lines
4.1 KiB
C#
using dy.net.model.dto;
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
namespace dy.net.utils
|
|
{
|
|
public static class DouyinLiveStatusParser
|
|
{
|
|
public static DouyinLiveStatusProbe Parse(
|
|
int? liveStatus,
|
|
string roomId,
|
|
string roomIdStr,
|
|
JToken roomData)
|
|
{
|
|
var room = NormalizeRoomData(roomData);
|
|
var roomStatus = FindInt(room, "status");
|
|
var isLive = liveStatus == 1 || (!liveStatus.HasValue && roomStatus == 2);
|
|
var hasKnownStatus = liveStatus.HasValue || roomStatus.HasValue;
|
|
|
|
return new DouyinLiveStatusProbe
|
|
{
|
|
Status = isLive
|
|
? DouyinLiveStatusState.Live
|
|
: hasKnownStatus ? DouyinLiveStatusState.Offline : DouyinLiveStatusState.Unknown,
|
|
RoomId = FirstNonEmpty(
|
|
roomIdStr,
|
|
roomId,
|
|
FindString(room, "id_str"),
|
|
FindString(room, "room_id_str"),
|
|
FindString(room, "room_id")),
|
|
WebRid = FirstNonEmpty(
|
|
FindString(room, "web_rid"),
|
|
FindString(room, "webRid")),
|
|
Title = Limit(FindString(room, "title"), 500),
|
|
StartedAt = ParseUnixTime(FindLong(room, "start_time") ?? FindLong(room, "create_time"))
|
|
};
|
|
}
|
|
|
|
private static JToken NormalizeRoomData(JToken value)
|
|
{
|
|
if (value == null || value.Type == JTokenType.Null) return null;
|
|
if (value.Type != JTokenType.String) return value;
|
|
var text = value.Value<string>();
|
|
if (string.IsNullOrWhiteSpace(text)) return null;
|
|
try { return JToken.Parse(text); }
|
|
catch { return null; }
|
|
}
|
|
|
|
private static string FindString(JToken token, string name)
|
|
{
|
|
var value = Find(token, name);
|
|
return value?.Type == JTokenType.Null ? null : value?.ToString();
|
|
}
|
|
|
|
private static int? FindInt(JToken token, string name)
|
|
{
|
|
var value = Find(token, name);
|
|
return int.TryParse(value?.ToString(), out var parsed) ? parsed : null;
|
|
}
|
|
|
|
private static long? FindLong(JToken token, string name)
|
|
{
|
|
var value = Find(token, name);
|
|
return long.TryParse(value?.ToString(), out var parsed) ? parsed : null;
|
|
}
|
|
|
|
private static JToken Find(JToken token, string name)
|
|
{
|
|
if (token == null) return null;
|
|
if (token is JObject obj)
|
|
{
|
|
var property = obj.Properties().FirstOrDefault(x =>
|
|
string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase));
|
|
if (property != null) return property.Value;
|
|
foreach (var child in obj.Properties())
|
|
{
|
|
var found = Find(child.Value, name);
|
|
if (found != null) return found;
|
|
}
|
|
}
|
|
else if (token is JArray array)
|
|
{
|
|
foreach (var child in array)
|
|
{
|
|
var found = Find(child, name);
|
|
if (found != null) return found;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private static string FirstNonEmpty(params string[] values) =>
|
|
values.FirstOrDefault(x => !string.IsNullOrWhiteSpace(x))?.Trim();
|
|
|
|
private static DateTime? ParseUnixTime(long? value)
|
|
{
|
|
if (!value.HasValue || value <= 0) return null;
|
|
try
|
|
{
|
|
var timestamp = value > 10_000_000_000
|
|
? DateTimeOffset.FromUnixTimeMilliseconds(value.Value)
|
|
: DateTimeOffset.FromUnixTimeSeconds(value.Value);
|
|
return timestamp.LocalDateTime;
|
|
}
|
|
catch { return null; }
|
|
}
|
|
|
|
private static string Limit(string value, int maxLength) =>
|
|
string.IsNullOrWhiteSpace(value)
|
|
? null
|
|
: value.Trim().Length <= maxLength ? value.Trim() : value.Trim()[..maxLength];
|
|
}
|
|
}
|