Fix comments (Python API), add dislike bar

Comments: switch from CLI --write-comments to yt-dlp Python API with
getcomments=True — more reliable, proper extractor_args dict format

Dislikes: add dislike_count column, fetch from returnyoutubedislike.com
after each video metadata upsert (5s timeout, non-fatal)

UI: replace emoji like count with a like/dislike ratio bar — blue fill
showing like proportion, labels on each end; views stay in meta row

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Mattias Tall
2026-05-26 11:33:00 +02:00
parent c9e64d2814
commit 74e2b4cd73
5 changed files with 83 additions and 22 deletions

View File

@@ -894,7 +894,6 @@ export default function Watch() {
<div className="flex items-center gap-2 text-sm text-zinc-500 flex-wrap">
{date && <span>{date}</span>}
{video?.view_count > 0 && <><span>·</span><span>{formatViews(video.view_count)}</span></>}
{video?.like_count > 0 && <><span>·</span><span>👍 {formatViews(video.like_count).replace(" views", "")}</span></>}
{video?.category && <><span>·</span><span>{video.category}</span></>}
{video?.duration_seconds && (
<><span>·</span>
@@ -912,6 +911,26 @@ export default function Watch() {
)}
</div>
{/* Like/dislike bar */}
{video?.like_count > 0 && (
<div className="flex flex-col gap-1 w-full">
<div className="flex justify-between text-xs text-zinc-500">
<span>{formatViews(video.like_count).replace(" views", "")} likes</span>
{video?.dislike_count > 0 && <span>{formatViews(video.dislike_count).replace(" views", "")} dislikes</span>}
</div>
<div className="h-1 w-full bg-zinc-800 rounded-full overflow-hidden">
<div
className="h-full bg-blue-500 rounded-full"
style={{
width: video?.dislike_count > 0
? `${(video.like_count / (video.like_count + video.dislike_count)) * 100}%`
: "100%",
}}
/>
</div>
</div>
)}
{/* Actions */}
<div className="flex items-center gap-2 flex-wrap">
{!dlComplete && !isDownloading && !downloadMut.isPending && (