Skip to content

Commit e14547b

Browse files
Merge pull request #27 from CosmicPredator/feature/medialist_air_time
Added nextAiringEpisode to MediaList query
2 parents b6f28e6 + 6cfa7f2 commit e14547b

File tree

4 files changed

+74
-29
lines changed

4 files changed

+74
-29
lines changed

internal/api/queries.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ const mediaListQuery = `query ($id: Int, $statusIn: [MediaListStatus]) {
2828
episodes
2929
chapters
3030
format
31+
nextAiringEpisode {
32+
airingAt
33+
timeUntilAiring
34+
}
3135
}
3236
}
3337
}

internal/api/responses/media_list.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ type ListCollection struct {
1515
Volumes *int `json:"volumes"`
1616
Episodes *int `json:"episodes"`
1717
MediaFormat string `json:"format"`
18+
NextAiringEpisode struct {
19+
AiringAt int64 `json:"airingAt"`
20+
TimeUntilAiring int64 `json:"timeUntilAiring"`
21+
} `json:"nextAiringEpisode"`
1822
} `json:"media"`
1923
} `json:"entries"`
2024
} `json:"lists"`

internal/helpers.go

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package internal
22

33
import (
4+
"fmt"
45
"os"
56
"strings"
7+
"time"
68
)
79

810
// maps "type" command line argument string to valid
@@ -63,29 +65,42 @@ func MediaFormatFormatter(mediaFormat string) string {
6365
}
6466

6567
func CanSupportKittyGP() bool {
66-
term := os.Getenv("TERM")
67-
termProgram := os.Getenv("TERM_PROGRAM")
68-
konsoleVersion := os.Getenv("KONSOLE_VERSION")
68+
term := os.Getenv("TERM")
69+
termProgram := os.Getenv("TERM_PROGRAM")
70+
konsoleVersion := os.Getenv("KONSOLE_VERSION")
6971

70-
if strings.Contains(strings.ToLower(term), "ghostty") {
71-
return true
72-
}
73-
if konsoleVersion != "" {
74-
return true
75-
}
76-
if strings.HasPrefix(strings.ToLower(term), "xterm-kitty") {
77-
return true
78-
}
79-
if strings.Contains(strings.ToLower(termProgram), "warp") {
80-
return true
81-
}
82-
if strings.Contains(strings.ToLower(term), "wayst") {
83-
return true
84-
}
85-
if strings.Contains(strings.ToLower(termProgram), "wezterm") ||
86-
strings.Contains(strings.ToLower(term), "wezterm") {
87-
return true
88-
}
72+
if strings.Contains(strings.ToLower(term), "ghostty") {
73+
return true
74+
}
75+
if konsoleVersion != "" {
76+
return true
77+
}
78+
if strings.HasPrefix(strings.ToLower(term), "xterm-kitty") {
79+
return true
80+
}
81+
if strings.Contains(strings.ToLower(termProgram), "warp") {
82+
return true
83+
}
84+
if strings.Contains(strings.ToLower(term), "wayst") {
85+
return true
86+
}
87+
if strings.Contains(strings.ToLower(termProgram), "wezterm") ||
88+
strings.Contains(strings.ToLower(term), "wezterm") {
89+
return true
90+
}
8991

90-
return false
91-
}
92+
return false
93+
}
94+
95+
func FormatAiringTs(seconds int64) string {
96+
d := time.Until(time.Unix(seconds, 0))
97+
if seconds <= 0 {
98+
return "—"
99+
}
100+
101+
days := d / (24 * time.Hour)
102+
hours := (d % (24 * time.Hour)) / time.Hour
103+
mins := (d % time.Hour) / time.Minute
104+
105+
return fmt.Sprintf("%dd %02dh %02dm", days, hours, mins)
106+
}

internal/ui/media_list.go

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,33 @@ type MediaListEntry struct {
2020
Title string
2121
Format string
2222
Progress string
23+
NextEpEpoch int64
2324
}
2425

25-
func (l *MediaListUI) renderColumn(entries ...*MediaListEntry) string {
26+
func (l *MediaListUI) renderColumn(mediaType internal.MediaType, entries ...*MediaListEntry) string {
2627
col := func(w int) lipgloss.Style {
2728
return lipgloss.NewStyle().Width(w).MarginRight(2).Align(lipgloss.Right)
2829
}
30+
31+
epFormatCol := func() string {
32+
if mediaType == internal.ANIME {
33+
return "NEXT EP IN"
34+
} else {
35+
return "FORMAT"
36+
}
37+
}()
38+
39+
epFormatValue := func(entry *MediaListEntry) string {
40+
if mediaType == internal.ANIME {
41+
return internal.FormatAiringTs(entry.NextEpEpoch)
42+
} else {
43+
return entry.Format
44+
}
45+
}
2946

3047
styles := []lipgloss.Style{
3148
col(7),
32-
col(8),
49+
col(10),
3350
col(8),
3451
col(0),
3552
}
@@ -41,7 +58,7 @@ func (l *MediaListUI) renderColumn(entries ...*MediaListEntry) string {
4158
var sb strings.Builder
4259
header := []string{
4360
headerStyle(styles[0]).Render("ID"),
44-
headerStyle(styles[1]).Render("FORMAT"),
61+
headerStyle(styles[1]).Render(epFormatCol),
4562
headerStyle(styles[2]).Render("PROGRESS"),
4663
headerStyle(styles[3]).Render("TITLE"),
4764
}
@@ -50,7 +67,7 @@ func (l *MediaListUI) renderColumn(entries ...*MediaListEntry) string {
5067
for _, entry := range entries {
5168
row := []string{
5269
styles[0].Foreground(lipgloss.ANSIColor(6)).Render(entry.Id),
53-
styles[1].Foreground(lipgloss.ANSIColor(2)).Render(entry.Format),
70+
styles[1].Foreground(lipgloss.ANSIColor(2)).Render(epFormatValue(entry)),
5471
styles[2].Foreground(lipgloss.ANSIColor(3)).Render(entry.Progress),
5572
styles[3].Render(entry.Title),
5673
}
@@ -71,6 +88,10 @@ func (l *MediaListUI) Render() error {
7188
}
7289

7390
for _, list := range selectedList.Lists {
91+
if list.Status != "CURRENT" && list.Status != "REPEATING" {
92+
continue
93+
}
94+
7495
for _, entry := range list.Entries {
7596
var progress string
7697

@@ -105,10 +126,11 @@ func (l *MediaListUI) Render() error {
105126
Title: entry.Media.Title.UserPreferred,
106127
Format: internal.MediaFormatFormatter(entry.Media.MediaFormat),
107128
Progress: progress,
129+
NextEpEpoch: entry.Media.NextAiringEpisode.AiringAt,
108130
})
109131
}
110132
}
111133

112-
fmt.Println(l.renderColumn(rows...))
134+
fmt.Println(l.renderColumn(internal.MediaType(l.MediaType), rows...))
113135
return nil
114136
}

0 commit comments

Comments
 (0)