mixin video_list_item(className, video, options = {})
  div(class={[className]: true, "video-list-item--watched": video.watched})
    - let link = `/watch?v=${video.videoId}`
    if options.continuous
      - link += `&continuous=1&session-watched=${sessionWatchedNext}`
    if video.type == "playlist"
      - link = `/playlist?list=${video.playlistId}`
    else if video.type == "channel"
      - link = `/channel/${video.authorId}`
    - const showDearrow = options.settings.dearrow > 0 && video.dearrowData && Object.keys(video.dearrowData).length > 0
    if showDearrow
      input(type="checkbox" checked=(options.settings.dearrow != 1) class={ "dearrow-button-list": true, "change-title": video.dearrowData.title || video.dearrowData.loading, "change-thumb": video.dearrowData.thumbnail || video.dearrowData.loading, "loading": video.dearrowData.loading })
    .info
      - let title = video.title
      - let titleAlt = undefined
      if showDearrow && (video.dearrowData.title || video.dearrowData.loading) && options.settings.dearrow != 3
        - titleAlt = video.dearrowData.title || video.title
      div.title
        a(href=link).title-link= title
      if titleAlt
        div(class={ "title": true, "alt": true })
          a(href=link).title-link= titleAlt
      div.author-line
        a(href=`/channel/${video.authorId}`).author= video.author
        - const views = video.viewCountText || video.second__viewCountText
        if views
          = ` • `
          span.views= views
        if video.publishedText
          = ` • `
          span.published= video.publishedText
        if options.showMarkWatched
          form(method="post" action=`/formapi/markwatched/${video.videoId}`).mark-watched
            = ` • `
            button.mark-watched__button Mark watched
      if video.descriptionHtml
        div.description!= video.descriptionHtml
    - let thumbnail = `/vi/${video.videoId}/mqdefault.jpg`
    - let thumbnailAlt = undefined
    if video.type == "playlist"
      - thumbnail = video.playlistThumbnail
    if video.type == "channel"
      - thumbnail = video.authorThumbnails.slice(-1)[0].url
    if video.type != "playlist" && showDearrow && (video.dearrowData.thumbnail || video.dearrowData.loading) && options.settings.dearrow != 2
      - thumbnailAlt = video.dearrowData.thumbnail ? `${options.settings.dearrow_thumbnail_instance + (settings.dearrow_thumbnail_instance.endsWith("/") ? "" : "/")}${video.dearrowData.thumbnail}` : thumbnail
    div(class={ thumbnail: true, channel: video.type == "channel" ? true : undefined })
      a(href=link tabindex="-1").thumbnail__link
        img(loading="lazy" src=thumbnail width=320 height=180 alt="").image
      if thumbnailAlt
        a(class={ "thumbnail__link": true, "alt": true } href=link tabindex="-1")
          img(loading="lazy" src=thumbnailAlt width=320 height=180 alt="").image
      if video.second__lengthText != undefined || video.type == "playlist"
        span.duration= video.type != "playlist" ? video.second__lengthText : `${video.videoCount} videos`
      details.thumbnail__more
        summary.thumbnail__show-more ×
        .thumbnail__options-container
          .thumbnail__options-list
            - const paramsBase = {}
            - if (url) paramsBase.referrer = url.pathname + url.search
            a(href=`/filters?${new URLSearchParams({"channel-id": video.authorId, label: video.author, ...paramsBase})}`).menu-look Hide this channel
            a(href=`/filters?${new URLSearchParams({title: video.title, ...paramsBase})}`).menu-look Hide by title
            a(href="/filters").menu-look Edit all filters
