refactor: simplify codebase

This commit is contained in:
2026-07-17 22:26:53 +00:00
parent 0ae1b094c5
commit 20209a9b6d
26 changed files with 291 additions and 904 deletions
+12 -42
View File
@@ -74,25 +74,14 @@ type ChannelPointsContext struct {
// Game describes the current Twitch category for a live stream.
type Game struct {
ID string
Name string
DisplayName string
ID string
Name string
}
// StreamMetadata describes the live stream state used for watch telemetry.
type StreamMetadata struct {
BroadcastID string
Title string
Game *Game
ViewerCount int
Tags []Tag
ChannelLogin string
}
// Tag is one stream tag entry returned by Twitch.
type Tag struct {
ID string
LocalizedName string
BroadcastID string
Game *Game
}
// MinuteWatchedPayload is the Spade telemetry body Twitch accepts for simulated viewing.
@@ -317,20 +306,13 @@ func (s *Service) StreamMetadata(ctx context.Context, login string) (*StreamMeta
var data struct {
User *struct {
BroadcastSettings *struct {
Title string `json:"title"`
Game *struct {
ID string `json:"id"`
Name string `json:"name"`
DisplayName string `json:"displayName"`
Game *struct {
ID string `json:"id"`
Name string `json:"name"`
} `json:"game"`
} `json:"broadcastSettings"`
Stream *struct {
ID string `json:"id"`
ViewersCount int `json:"viewersCount"`
Tags []struct {
ID string `json:"id"`
LocalizedName string `json:"localizedName"`
} `json:"tags"`
ID string `json:"id"`
} `json:"stream"`
} `json:"user"`
}
@@ -344,25 +326,13 @@ func (s *Service) StreamMetadata(ctx context.Context, login string) (*StreamMeta
return nil, fmt.Errorf("stream metadata missing broadcast settings for %s", login)
}
metadata := &StreamMetadata{
BroadcastID: data.User.Stream.ID,
Title: strings.TrimSpace(data.User.BroadcastSettings.Title),
ViewerCount: data.User.Stream.ViewersCount,
ChannelLogin: login,
}
metadata := &StreamMetadata{BroadcastID: data.User.Stream.ID}
if game := data.User.BroadcastSettings.Game; game != nil {
metadata.Game = &Game{
ID: game.ID,
Name: game.Name,
DisplayName: game.DisplayName,
ID: game.ID,
Name: game.Name,
}
}
for _, tag := range data.User.Stream.Tags {
metadata.Tags = append(metadata.Tags, Tag{
ID: tag.ID,
LocalizedName: tag.LocalizedName,
})
}
if metadata.BroadcastID == "" {
return nil, fmt.Errorf("stream metadata missing broadcast id for %s", login)
}
@@ -423,7 +393,7 @@ func (s *Service) TouchPlayback(ctx context.Context, login string, token *Playba
if token == nil || token.Signature == "" || token.Value == "" {
return errors.New("playback access token is incomplete")
}
masterURL := gql.HLSMasterPlaylistURL(login, token.Signature, token.Value)
masterURL := "https://usher.ttvnw.net/api/channel/hls/" + login + ".m3u8?player=twitchweb&allow_source=true&type=any&p=1&sig=" + token.Signature + "&token=" + token.Value
variantURL, err := s.fetchPlaylistTarget(ctx, masterURL)
if err != nil {
return fmt.Errorf("fetch master playlist: %w", err)
+2 -5
View File
@@ -214,22 +214,19 @@ func TestStreamMetadata(t *testing.T) {
t.Parallel()
client := &fakeGQL{data: map[string]string{
"VideoPlayerStreamInfoOverlayChannel": `{"user":{"broadcastSettings":{"title":" Live title ","game":{"id":"99","name":"game-name","displayName":"Game Name"}},"stream":{"id":"broadcast","viewersCount":77,"tags":[{"id":"1","localizedName":"English"}]}}}`,
"VideoPlayerStreamInfoOverlayChannel": `{"user":{"broadcastSettings":{"game":{"id":"99","name":"game-name"}},"stream":{"id":"broadcast"}}}`,
}}
service := &Service{GQL: client}
metadata, err := service.StreamMetadata(context.Background(), "streamer")
if err != nil {
t.Fatal(err)
}
if metadata.BroadcastID != "broadcast" || metadata.Title != "Live title" {
if metadata.BroadcastID != "broadcast" {
t.Fatalf("metadata = %#v", metadata)
}
if metadata.Game == nil || metadata.Game.Name != "game-name" {
t.Fatalf("game = %#v", metadata.Game)
}
if len(metadata.Tags) != 1 || metadata.Tags[0].LocalizedName != "English" {
t.Fatalf("tags = %#v", metadata.Tags)
}
}
func TestFetchSpadeURL(t *testing.T) {