diff --git a/static/index.html b/static/index.html index b32aa15..0bc5b07 100644 --- a/static/index.html +++ b/static/index.html @@ -53,8 +53,9 @@ aspect-ratio: 16/9; width: 20vw; transition: width 0.3s ease, box-shadow 0.3s ease, left 0.3s ease; - transform: translate(-50%, -50%); + transform: translate(-50%, 0); position: fixed; + overflow: hidden; /* Ensure content fits within rounded corners */ } .video-thumbnail.focussed { @@ -70,6 +71,28 @@ z-index: 1; } + .video-title { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + background-color: rgba(0, 0, 0, 0.7); + color: white; + padding: 8px; + box-sizing: border-box; + text-align: center; + font-size: 1rem; + opacity: 0; + transition: opacity 0.3s ease-in-out; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + } + + .video-thumbnail:hover .video-title, + .video-thumbnail.focussed .video-title { + opacity: 1; + } + .play-button { position: absolute; top: 50%; @@ -313,30 +336,32 @@ * @param append Set to true if this thumbnail should be appended to the video container, false if it should be prepended. */ function createVideoThumbnailElement(data, selected, append) { - let container = $(``); - let thumbnail = $(`Video Thumbnail`)[0]; - container.append(thumbnail) - let index; - if (append) { - $("#video-container").append(container); + let container = $(`
`); + let thumbnailImg = $(``); + let title = $(`
${data.title}
`); + container.append(thumbnailImg).append(title); + + let index; + if (append) { + $("#video-container").append(container); index = videoInfo.length; - videoInfo.push({ - thumbnail, + videoInfo.push({ + thumbnail: container[0], data - }) - } else { + }) + } else { $("#video-container").prepend(container); index = 0; videoInfo.unshift({ - thumbnail, + thumbnail: container[0], data }); - selectedThumbnailIndex++; + selectedThumbnailIndex++; + } + if (selected) { + container[0].classList.add("focussed"); + selectedThumbnailIndex = index; } - if (selected) { - thumbnail.classList.add("focussed"); - selectedThumbnailIndex = index; - } } /** diff --git a/webview.go b/webview.go index 5b489fd..8401f02 100644 --- a/webview.go +++ b/webview.go @@ -55,6 +55,7 @@ type VideoModel struct { ID int `json:"id"` Thumbnail string `json:"thumbnail"` URL string `json:"url"` + Title string `json:"title"` } type HomePageModel struct { @@ -65,13 +66,13 @@ type HomePageModel struct { func (a *App) homePage(c *gin.Context) { model := HomePageModel{} - errCurrent := a.db.Query("SELECT id, thumbnail FROM videos WHERE (watch_state IS NULL OR watch_state != 'watched') ORDER BY upload_date, episode LIMIT 1"). - ScanSingle(&model.Current.ID, &model.Current.Thumbnail) + errCurrent := a.db.Query("SELECT id, thumbnail, title FROM videos WHERE (watch_state IS NULL OR watch_state != 'watched') ORDER BY upload_date, episode LIMIT 1"). + ScanSingle(&model.Current.ID, &model.Current.Thumbnail, &model.Current.Title) var errNext, errPrevious error - for row := range a.db.Query("SELECT id, thumbnail FROM videos WHERE (watch_state IS NULL OR watch_state != 'watched') ORDER BY upload_date, episode LIMIT 3 OFFSET 1").Range(&errNext) { + for row := range a.db.Query("SELECT id, thumbnail, title FROM videos WHERE (watch_state IS NULL OR watch_state != 'watched') ORDER BY upload_date, episode LIMIT 3 OFFSET 1").Range(&errNext) { video := VideoModel{} - err := row.Scan(&video.ID, &video.Thumbnail) + err := row.Scan(&video.ID, &video.Thumbnail, &video.Title) if err != nil { log.Printf("Failed to scan next video: %v", err) c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to retrieve next videos"})