diff --git a/handler/episode.go b/handler/episode.go index d1dfc8c..d5d78db 100644 --- a/handler/episode.go +++ b/handler/episode.go @@ -15,6 +15,9 @@ import ( ) const maxUploadSize = 200 << 20 // 200 MB +const timeLayout = "2006-01-02 15:04:05" + +func fmtTime(t time.Time) string { return t.Format(timeLayout) } type EpisodeHandler struct { Store *store.Store @@ -47,16 +50,20 @@ func (h *EpisodeHandler) ServeDashboard(w http.ResponseWriter, r *http.Request) Description string AudioPath string ImageURL template.URL - PublishedAt time.Time + PublishedAt string } var epViews []epView for _, ep := range episodes { + pubFormatted := ep.PublishedAt + if pt, err := time.Parse(timeLayout, ep.PublishedAt); err == nil { + pubFormatted = pt.Format("Jan 2, 2006") + } ev := epView{ ID: ep.ID, Title: ep.Title, Description: ep.Description, AudioPath: ep.AudioPath, - PublishedAt: ep.PublishedAt, + PublishedAt: pubFormatted, } if ep.ImagePath != "" { ev.ImageURL = template.URL("/uploads/" + ep.ImagePath) @@ -126,7 +133,7 @@ func (h *EpisodeHandler) ServeNew(w http.ResponseWriter, r *http.Request) { imagePath, _ := h.saveUploadedFile(r, "image_file", "images") - _, err = h.Store.CreateEpisode(userID, title, description, audioPath, imagePath, publishedAt) + _, err = h.Store.CreateEpisode(userID, title, description, audioPath, imagePath, fmtTime(publishedAt)) if err != nil { h.Tpl.Render(w, "episode_form", map[string]any{ "Editing": false, @@ -152,10 +159,14 @@ func (h *EpisodeHandler) ServeEdit(w http.ResponseWriter, r *http.Request) { http.Error(w, "episode not found", http.StatusNotFound) return } + pubStr := "" + if pt, err := time.Parse(timeLayout, ep.PublishedAt); err == nil { + pubStr = pt.Format("2006-01-02T15:04") + } h.Tpl.Render(w, "episode_form", map[string]any{ "Editing": true, "Episode": ep, - "PublishedAt": ep.PublishedAt.Format("2006-01-02T15:04"), + "PublishedAt": pubStr, }) return } @@ -206,7 +217,7 @@ func (h *EpisodeHandler) ServeEdit(w http.ResponseWriter, r *http.Request) { imagePath = newPath } - if err := h.Store.UpdateEpisode(id, title, description, audioPath, imagePath, publishedAt); err != nil { + if err := h.Store.UpdateEpisode(id, title, description, audioPath, imagePath, fmtTime(publishedAt)); err != nil { http.Error(w, "update failed", http.StatusInternalServerError) return } diff --git a/handler/import.go b/handler/import.go index 0fc4fb2..0f59d9a 100644 --- a/handler/import.go +++ b/handler/import.go @@ -243,7 +243,7 @@ func (h *ImportHandler) importSelected(w http.ResponseWriter, r *http.Request, r publishedAt = t } - _, err = h.Store.CreateEpisode(userID, item.Title, item.Description, audioPath, imagePath, publishedAt) + _, err = h.Store.CreateEpisode(userID, item.Title, item.Description, audioPath, imagePath, publishedAt.Format("2006-01-02 15:04:05")) if err != nil { errors = append(errors, fmt.Sprintf("%s: database error: %v", item.Title, err)) h.removeFile(audioPath) diff --git a/handler/rss.go b/handler/rss.go index 063c8a2..4cd3907 100644 --- a/handler/rss.go +++ b/handler/rss.go @@ -104,6 +104,10 @@ func (h *RSSHandler) ServeRSS(w http.ResponseWriter, r *http.Request) { itemImage = &rssItunesImage{Href: h.fullURL(epImage)} } + pubStr := ep.PublishedAt + if pt, err := time.Parse("2006-01-02 15:04:05", ep.PublishedAt); err == nil { + pubStr = pt.Format(time.RFC1123Z) + } items = append(items, rssItem{ Title: ep.Title, Description: ep.Description, @@ -111,7 +115,7 @@ func (h *RSSHandler) ServeRSS(w http.ResponseWriter, r *http.Request) { URL: h.fullURL(ep.AudioPath), Type: "audio/mpeg", }, - PubDate: ep.PublishedAt.Format(time.RFC1123Z), + PubDate: pubStr, GUID: h.fullURL(ep.AudioPath), ItunesImage: itemImage, }) diff --git a/store/store.go b/store/store.go index 7b3a091..5eb92b1 100644 --- a/store/store.go +++ b/store/store.go @@ -2,7 +2,6 @@ package store import ( "database/sql" - "time" _ "modernc.org/sqlite" ) @@ -15,7 +14,7 @@ type User struct { PodcastSlug string PodcastImage string PodcastAuthor string - CreatedAt time.Time + CreatedAt string } type Episode struct { @@ -25,8 +24,8 @@ type Episode struct { Description string AudioPath string ImagePath string - PublishedAt time.Time - CreatedAt time.Time + PublishedAt string + CreatedAt string } type Store struct { @@ -173,7 +172,7 @@ func (s *Store) GetEpisode(id int64) (*Episode, error) { return e, nil } -func (s *Store) CreateEpisode(userID int64, title, description, audioPath, imagePath string, publishedAt time.Time) (int64, error) { +func (s *Store) CreateEpisode(userID int64, title, description, audioPath, imagePath, publishedAt string) (int64, error) { res, err := s.db.Exec("INSERT INTO episodes (user_id, title, description, audio_path, image_path, published_at) VALUES (?, ?, ?, ?, ?, ?)", userID, title, description, audioPath, imagePath, publishedAt) if err != nil { @@ -182,7 +181,7 @@ func (s *Store) CreateEpisode(userID int64, title, description, audioPath, image return res.LastInsertId() } -func (s *Store) UpdateEpisode(id int64, title, description, audioPath, imagePath string, publishedAt time.Time) error { +func (s *Store) UpdateEpisode(id int64, title, description, audioPath, imagePath, publishedAt string) error { _, err := s.db.Exec("UPDATE episodes SET title=?, description=?, audio_path=?, image_path=?, published_at=? WHERE id=?", title, description, audioPath, imagePath, publishedAt, id) return err diff --git a/template/dashboard.html b/template/dashboard.html index bec66d3..a44582c 100644 --- a/template/dashboard.html +++ b/template/dashboard.html @@ -138,7 +138,7 @@