297 lines
21 KiB
Go
297 lines
21 KiB
Go
// Code generated by templ - DO NOT EDIT.
|
|
|
|
// templ: version: v0.3.1001
|
|
package templates
|
|
|
|
//lint:file-ignore SA4006 This context is only used if a nested component is present.
|
|
|
|
import "github.com/a-h/templ"
|
|
import templruntime "github.com/a-h/templ/runtime"
|
|
|
|
import "mal/internal/jikan"
|
|
import "mal/internal/nyaa"
|
|
import "fmt"
|
|
|
|
// WatchPage renders the video player page
|
|
func WatchPage(anime jikan.Anime, episode int, torrents []nyaa.Torrent) templ.Component {
|
|
return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
|
|
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
|
|
if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
|
|
return templ_7745c5c3_CtxErr
|
|
}
|
|
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
|
|
if !templ_7745c5c3_IsBuffer {
|
|
defer func() {
|
|
templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
|
|
if templ_7745c5c3_Err == nil {
|
|
templ_7745c5c3_Err = templ_7745c5c3_BufErr
|
|
}
|
|
}()
|
|
}
|
|
ctx = templ.InitializeContext(ctx)
|
|
templ_7745c5c3_Var1 := templ.GetChildren(ctx)
|
|
if templ_7745c5c3_Var1 == nil {
|
|
templ_7745c5c3_Var1 = templ.NopComponent
|
|
}
|
|
ctx = templ.ClearChildren(ctx)
|
|
templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
|
|
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
|
|
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
|
|
if !templ_7745c5c3_IsBuffer {
|
|
defer func() {
|
|
templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
|
|
if templ_7745c5c3_Err == nil {
|
|
templ_7745c5c3_Err = templ_7745c5c3_BufErr
|
|
}
|
|
}()
|
|
}
|
|
ctx = templ.InitializeContext(ctx)
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<div class=\"watch-page\"><div class=\"watch-header\"><a href=\"")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
var templ_7745c5c3_Var3 templ.SafeURL
|
|
templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinURLErrs(templ.URL(fmt.Sprintf("/anime/%d", anime.MalID)))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/watch.templ`, Line: 12, Col: 62}
|
|
}
|
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "\" class=\"back-link\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" class=\"back-icon\"><path d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\"></path></svg> back to ")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
var templ_7745c5c3_Var4 string
|
|
templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(anime.DisplayTitle())
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/watch.templ`, Line: 16, Col: 35}
|
|
}
|
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "</a><h1>Episode ")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
var templ_7745c5c3_Var5 string
|
|
templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", episode))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/watch.templ`, Line: 18, Col: 44}
|
|
}
|
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "</h1></div><div class=\"watch-content\"><div class=\"player-container\" id=\"player-container\"><div class=\"player-placeholder\" id=\"player-placeholder\"><div class=\"player-message\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" class=\"player-icon\"><path d=\"M8 5v14l11-7z\"></path></svg><p>select a source to start streaming</p></div></div><div id=\"player-loading\" class=\"player-loading hidden\"><div class=\"loading-stream\"><div class=\"loading-dot\"></div><div class=\"loading-dot\"></div><div class=\"loading-dot\"></div></div><p id=\"loading-status\">connecting to peers...</p><p id=\"loading-progress\" class=\"loading-progress\"></p></div><video id=\"video-player\" class=\"video-player hidden\" controls playsinline></video></div><div class=\"sources-panel\"><h3>available sources</h3>")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
if len(torrents) == 0 {
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "<div class=\"no-sources\"><p>no torrents found for this episode</p><p class=\"hint\">try searching manually</p></div>")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
} else {
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "<div class=\"sources-list\">")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
for _, t := range torrents {
|
|
if t.Magnet != "" {
|
|
templ_7745c5c3_Err = TorrentSource(t).Render(ctx, templ_7745c5c3_Buffer)
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
}
|
|
}
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "</div>")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
}
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "<div class=\"manual-search\"><h4>manual search</h4><form hx-get=\"/api/stream/search-htmx\" hx-target=\"#search-results\" hx-indicator=\"#search-loading\"><input type=\"text\" name=\"q\" placeholder=\"")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
var templ_7745c5c3_Var6 string
|
|
templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%s %02d", anime.Title, episode))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/watch.templ`, Line: 76, Col: 66}
|
|
}
|
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "\" value=\"")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
var templ_7745c5c3_Var7 string
|
|
templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%s %02d", anime.Title, episode))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/watch.templ`, Line: 77, Col: 60}
|
|
}
|
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "\" class=\"search-input\"> <button type=\"submit\" class=\"search-btn\">search</button></form><div id=\"search-loading\" class=\"htmx-indicator\">searching...</div><div id=\"search-results\"></div></div></div></div><div class=\"episode-nav\">")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
if episode > 1 {
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "<a href=\"")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
var templ_7745c5c3_Var8 templ.SafeURL
|
|
templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinURLErrs(templ.URL(fmt.Sprintf("/watch/%d/%d", anime.MalID, episode-1)))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/watch.templ`, Line: 91, Col: 75}
|
|
}
|
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "\" class=\"nav-btn prev\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"></path></svg> previous</a> ")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
} else {
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "<span class=\"nav-btn disabled\">previous</span> ")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
}
|
|
if anime.Episodes == 0 || episode < anime.Episodes {
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "<a href=\"")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
var templ_7745c5c3_Var9 templ.SafeURL
|
|
templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinURLErrs(templ.URL(fmt.Sprintf("/watch/%d/%d", anime.MalID, episode+1)))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/watch.templ`, Line: 104, Col: 75}
|
|
}
|
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "\" class=\"nav-btn next\">next <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path></svg></a>")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
} else {
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "<span class=\"nav-btn disabled\">next</span>")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
}
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "</div></div><!-- HLS.js for browser playback --> <script src=\"https://cdn.jsdelivr.net/npm/hls.js@1\"></script> <script>\n\t\t\tconst currentEpisode = { fmt.Sprintf(\"%d\", episode) };\n\t\t\tlet currentStreamHash = null;\n\t\t\tlet progressInterval = null;\n\t\t\tlet hls = null;\n\n\t\t\tfunction startStream(magnet) {\n\t\t\t\tif (!magnet) {\n\t\t\t\t\tshowError('no magnet link available for this torrent');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tshowLoading('connecting to peers...');\n\t\t\t\t\n\t\t\t\tfetch('/api/stream/start', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify({ magnet: magnet })\n\t\t\t\t})\n\t\t\t\t.then(res => {\n\t\t\t\t\tif (!res.ok) {\n\t\t\t\t\t\treturn res.text().then(text => { throw new Error(text); });\n\t\t\t\t\t}\n\t\t\t\t\treturn res.json();\n\t\t\t\t})\n\t\t\t\t.then(data => {\n\t\t\t\t\tif (data.info_hash) {\n\t\t\t\t\t\tcurrentStreamHash = data.info_hash;\n\t\t\t\t\t\tshowLoading('starting transcoding...');\n\t\t\t\t\t\tstartProgressUpdates();\n\t\t\t\t\t\tstartHLS();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tshowError('invalid response from server');\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\tshowError(err.message || 'failed to start stream');\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction startHLS() {\n\t\t\t\tshowLoading('preparing video stream...');\n\n\t\t\t\tfetch('/api/stream/hls/' + currentStreamHash + '?ep=' + currentEpisode, {\n\t\t\t\t\tmethod: 'POST'\n\t\t\t\t})\n\t\t\t\t.then(res => {\n\t\t\t\t\tif (!res.ok) {\n\t\t\t\t\t\treturn res.text().then(text => { throw new Error(text); });\n\t\t\t\t\t}\n\t\t\t\t\treturn res.json();\n\t\t\t\t})\n\t\t\t\t.then(data => {\n\t\t\t\t\tplayHLS(data.playlist);\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\tshowError('transcoding failed: ' + (err.message || 'unknown error'));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction playHLS(playlistUrl) {\n\t\t\t\tconst video = document.getElementById('video-player');\n\t\t\t\t\n\t\t\t\t// Cleanup previous instance\n\t\t\t\tif (hls) {\n\t\t\t\t\thls.destroy();\n\t\t\t\t\thls = null;\n\t\t\t\t}\n\n\t\t\t\tdocument.getElementById('player-placeholder').classList.add('hidden');\n\t\t\t\tdocument.getElementById('player-loading').classList.add('hidden');\n\t\t\t\tvideo.classList.remove('hidden');\n\n\t\t\t\tif (Hls.isSupported()) {\n\t\t\t\t\thls = new Hls({\n\t\t\t\t\t\tenableWorker: true,\n\t\t\t\t\t\tlowLatencyMode: false,\n\t\t\t\t\t\tbackBufferLength: 90\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\thls.loadSource(playlistUrl);\n\t\t\t\t\thls.attachMedia(video);\n\t\t\t\t\t\n\t\t\t\t\thls.on(Hls.Events.MANIFEST_PARSED, function() {\n\t\t\t\t\t\tvideo.play().catch(e => console.log('Autoplay blocked:', e));\n\t\t\t\t\t});\n\n\t\t\t\t\thls.on(Hls.Events.ERROR, function(event, data) {\n\t\t\t\t\t\tif (data.fatal) {\n\t\t\t\t\t\t\tswitch(data.type) {\n\t\t\t\t\t\t\t\tcase Hls.ErrorTypes.NETWORK_ERROR:\n\t\t\t\t\t\t\t\t\tconsole.error('Network error, trying to recover...');\n\t\t\t\t\t\t\t\t\thls.startLoad();\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase Hls.ErrorTypes.MEDIA_ERROR:\n\t\t\t\t\t\t\t\t\tconsole.error('Media error, trying to recover...');\n\t\t\t\t\t\t\t\t\thls.recoverMediaError();\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tshowError('Playback error: ' + data.details);\n\t\t\t\t\t\t\t\t\thls.destroy();\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else if (video.canPlayType('application/vnd.apple.mpegurl')) {\n\t\t\t\t\t// Native HLS support (Safari)\n\t\t\t\t\tvideo.src = playlistUrl;\n\t\t\t\t\tvideo.addEventListener('loadedmetadata', function() {\n\t\t\t\t\t\tvideo.play().catch(e => console.log('Autoplay blocked:', e));\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tshowError('HLS playback not supported in this browser');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction showLoading(status) {\n\t\t\t\tdocument.getElementById('player-placeholder').classList.add('hidden');\n\t\t\t\tdocument.getElementById('video-player').classList.add('hidden');\n\t\t\t\tdocument.getElementById('player-loading').classList.remove('hidden');\n\t\t\t\tdocument.getElementById('loading-status').textContent = status;\n\t\t\t\tdocument.getElementById('loading-progress').textContent = '';\n\t\t\t}\n\n\t\t\tfunction showError(message) {\n\t\t\t\tstopProgressUpdates();\n\t\t\t\tdocument.getElementById('player-loading').classList.add('hidden');\n\t\t\t\tdocument.getElementById('video-player').classList.add('hidden');\n\t\t\t\t\n\t\t\t\tconst placeholder = document.getElementById('player-placeholder');\n\t\t\t\tplaceholder.classList.remove('hidden');\n\t\t\t\tplaceholder.innerHTML = '<div class=\"player-error\">' + escapeHtml(message) + '</div>';\n\t\t\t}\n\n\t\t\tfunction startProgressUpdates() {\n\t\t\t\tif (progressInterval) clearInterval(progressInterval);\n\t\t\t\tprogressInterval = setInterval(updateProgress, 2000);\n\t\t\t\tupdateProgress();\n\t\t\t}\n\n\t\t\tfunction stopProgressUpdates() {\n\t\t\t\tif (progressInterval) {\n\t\t\t\t\tclearInterval(progressInterval);\n\t\t\t\t\tprogressInterval = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction updateProgress() {\n\t\t\t\tif (!currentStreamHash) return;\n\t\t\t\t\n\t\t\t\tfetch('/api/stream/info/' + currentStreamHash)\n\t\t\t\t.then(res => res.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tconst progress = data.progress.toFixed(1);\n\t\t\t\t\tconst peers = data.peers;\n\t\t\t\t\tconst progressEl = document.getElementById('loading-progress');\n\t\t\t\t\tif (progressEl) {\n\t\t\t\t\t\tprogressEl.textContent = progress + '% downloaded | ' + peers + ' peers';\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(() => {});\n\t\t\t}\n\n\t\t\tfunction formatSize(bytes) {\n\t\t\t\tif (bytes < 1024) return bytes + ' B';\n\t\t\t\tif (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n\t\t\t\tif (bytes < 1024 * 1024 * 1024) return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n\t\t\t\treturn (bytes / (1024 * 1024 * 1024)).toFixed(2) + ' GB';\n\t\t\t}\n\n\t\t\tfunction escapeHtml(text) {\n\t\t\t\tconst div = document.createElement('div');\n\t\t\t\tdiv.textContent = text;\n\t\t\t\treturn div.innerHTML;\n\t\t\t}\n\n\t\t\t// Handle torrent selection from search results and source list\n\t\t\tdocument.addEventListener('click', function(e) {\n\t\t\t\tconst item = e.target.closest('[data-magnet]');\n\t\t\t\tif (item && item.dataset.magnet) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\n\t\t\t\t\t// Mark selected\n\t\t\t\t\tdocument.querySelectorAll('[data-magnet]').forEach(el => el.classList.remove('selected'));\n\t\t\t\t\titem.classList.add('selected');\n\t\t\t\t\t\n\t\t\t\t\tstartStream(item.dataset.magnet);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Cleanup on page leave\n\t\t\twindow.addEventListener('beforeunload', function() {\n\t\t\t\tstopProgressUpdates();\n\t\t\t\tif (hls) {\n\t\t\t\t\thls.destroy();\n\t\t\t\t}\n\t\t\t});\n\t\t</script>")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
return nil
|
|
})
|
|
templ_7745c5c3_Err = Layout(fmt.Sprintf("Watch %s - Episode %d", anime.DisplayTitle(), episode)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
return nil
|
|
})
|
|
}
|
|
|
|
// TorrentSource renders a single torrent source option
|
|
func TorrentSource(t nyaa.Torrent) templ.Component {
|
|
return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
|
|
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
|
|
if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
|
|
return templ_7745c5c3_CtxErr
|
|
}
|
|
templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
|
|
if !templ_7745c5c3_IsBuffer {
|
|
defer func() {
|
|
templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
|
|
if templ_7745c5c3_Err == nil {
|
|
templ_7745c5c3_Err = templ_7745c5c3_BufErr
|
|
}
|
|
}()
|
|
}
|
|
ctx = templ.InitializeContext(ctx)
|
|
templ_7745c5c3_Var10 := templ.GetChildren(ctx)
|
|
if templ_7745c5c3_Var10 == nil {
|
|
templ_7745c5c3_Var10 = templ.NopComponent
|
|
}
|
|
ctx = templ.ClearChildren(ctx)
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "<div class=\"source-item\" data-magnet=\"")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
var templ_7745c5c3_Var11 string
|
|
templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(t.Magnet)
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/watch.templ`, Line: 323, Col: 48}
|
|
}
|
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "\"><div class=\"source-title\">")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
var templ_7745c5c3_Var12 string
|
|
templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(truncateTitle(t.Title, 60))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/watch.templ`, Line: 324, Col: 56}
|
|
}
|
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "</div><div class=\"source-meta\"><span class=\"source-size\">")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
var templ_7745c5c3_Var13 string
|
|
templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(t.Size)
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/watch.templ`, Line: 326, Col: 37}
|
|
}
|
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "</span> <span class=\"source-seeds\">")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
var templ_7745c5c3_Var14 string
|
|
templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d", t.Seeders))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/watch.templ`, Line: 327, Col: 60}
|
|
}
|
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, " seeds</span></div></div>")
|
|
if templ_7745c5c3_Err != nil {
|
|
return templ_7745c5c3_Err
|
|
}
|
|
return nil
|
|
})
|
|
}
|
|
|
|
func truncateTitle(s string, max int) string {
|
|
if len(s) <= max {
|
|
return s
|
|
}
|
|
return s[:max-3] + "..."
|
|
}
|
|
|
|
var _ = templruntime.GeneratedTemplate
|