add archive% to /vtubers
This commit is contained in:
parent
3f199a86fe
commit
856070cca1
apps/bright
lib
bright
bright_web
test
@ -11,7 +11,6 @@ defmodule Bright.Streams do
|
|||||||
alias Bright.Vtubers.Vtuber
|
alias Bright.Vtubers.Vtuber
|
||||||
alias Bright.Tags.Tag
|
alias Bright.Tags.Tag
|
||||||
alias Bright.Platforms.Platform
|
alias Bright.Platforms.Platform
|
||||||
alias Bright.Socials.XPost
|
|
||||||
|
|
||||||
alias Bright.{
|
alias Bright.{
|
||||||
Cache,
|
Cache,
|
||||||
@ -568,4 +567,39 @@ defmodule Bright.Streams do
|
|||||||
max_attempts: max_attempts
|
max_attempts: max_attempts
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get_streams_count_for_vtuber(vtuber_id) do
|
||||||
|
query =
|
||||||
|
from(s in Stream,
|
||||||
|
join: sv in "streams_vtubers",
|
||||||
|
on: sv.stream_id == s.id,
|
||||||
|
where: sv.vtuber_id == ^vtuber_id,
|
||||||
|
preload: [:vtubers, :vods]
|
||||||
|
)
|
||||||
|
|
||||||
|
Repo.aggregate(
|
||||||
|
query,
|
||||||
|
:count,
|
||||||
|
:id
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_streams_with_vods_count_for_vtuber(vtuber_id) do
|
||||||
|
query =
|
||||||
|
from(s in Stream,
|
||||||
|
join: sv in "streams_vtubers",
|
||||||
|
on: sv.stream_id == s.id,
|
||||||
|
# Join with Vod to ensure there are vods
|
||||||
|
join: v in Vod,
|
||||||
|
on: v.stream_id == s.id,
|
||||||
|
# Filter by the specific vtuber
|
||||||
|
where: sv.vtuber_id == ^vtuber_id,
|
||||||
|
# Ensure distinct streams
|
||||||
|
distinct: s.id,
|
||||||
|
# Preload vods association
|
||||||
|
preload: [:vtubers, :vods]
|
||||||
|
)
|
||||||
|
|
||||||
|
Repo.aggregate(query, :count, :id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -7,6 +7,8 @@ defmodule Bright.Vtubers do
|
|||||||
alias Bright.Repo
|
alias Bright.Repo
|
||||||
|
|
||||||
alias Bright.Vtubers.Vtuber
|
alias Bright.Vtubers.Vtuber
|
||||||
|
alias Bright.Streams.Stream
|
||||||
|
alias Bright.Streams.Vod
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Returns the list of vtubers.
|
Returns the list of vtubers.
|
||||||
@ -106,4 +108,49 @@ defmodule Bright.Vtubers do
|
|||||||
# def to_string(%Bright.Auth.User{name: name}) when not is_nil(name), do: name
|
# def to_string(%Bright.Auth.User{name: name}) when not is_nil(name), do: name
|
||||||
# def to_string(%Bright.Auth.User{}), do: "Anonymous"
|
# def to_string(%Bright.Auth.User{}), do: "Anonymous"
|
||||||
# end
|
# end
|
||||||
|
|
||||||
|
def get_stream_count(vtuber_id) do
|
||||||
|
from(s in Stream,
|
||||||
|
where: s.vtuber_id == ^vtuber_id
|
||||||
|
)
|
||||||
|
|> Repo.aggregate(:count, :id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def vtuber_archive_percentage(%Vtuber{id: id}), do: vtuber_archive_percentage(id)
|
||||||
|
|
||||||
|
def vtuber_archive_percentage(vtuber_id) do
|
||||||
|
total_streams =
|
||||||
|
from(s in Stream,
|
||||||
|
# Join the association table
|
||||||
|
join: sv in "streams_vtubers",
|
||||||
|
on: sv.stream_id == s.id,
|
||||||
|
where: sv.vtuber_id == ^vtuber_id
|
||||||
|
)
|
||||||
|
|> Repo.aggregate(:count, :id)
|
||||||
|
|
||||||
|
streams_with_vods =
|
||||||
|
from(s in Stream,
|
||||||
|
join: sv in "streams_vtubers",
|
||||||
|
on: sv.stream_id == s.id,
|
||||||
|
join: v in Vod,
|
||||||
|
on: v.stream_id == s.id,
|
||||||
|
where: sv.vtuber_id == ^vtuber_id,
|
||||||
|
distinct: s.id,
|
||||||
|
preload: [:vtubers, :vods]
|
||||||
|
)
|
||||||
|
|> Repo.aggregate(:count, :id)
|
||||||
|
|
||||||
|
percentage =
|
||||||
|
if total_streams > 0 do
|
||||||
|
Float.round(streams_with_vods / total_streams * 100, 2)
|
||||||
|
else
|
||||||
|
0.0
|
||||||
|
end
|
||||||
|
|
||||||
|
%{
|
||||||
|
total_streams: total_streams,
|
||||||
|
streams_with_vods: streams_with_vods,
|
||||||
|
percentage: percentage
|
||||||
|
}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -442,7 +442,7 @@ defmodule BrightWeb.CoreComponents do
|
|||||||
def error(assigns) do
|
def error(assigns) do
|
||||||
~H"""
|
~H"""
|
||||||
<p class="help is-danger">
|
<p class="help is-danger">
|
||||||
<.icon name="circle-exclamation" />
|
<.icon type="solid" name="person_digging" />
|
||||||
{render_slot(@inner_block)}
|
{render_slot(@inner_block)}
|
||||||
</p>
|
</p>
|
||||||
"""
|
"""
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
defmodule BrightWeb.VtuberHTML do
|
defmodule BrightWeb.VtuberHTML do
|
||||||
use BrightWeb, :html
|
use BrightWeb, :html
|
||||||
|
alias Bright.Vtubers
|
||||||
|
|
||||||
embed_templates "vtuber_html/*"
|
embed_templates "vtuber_html/*"
|
||||||
|
|
||||||
|
@ -8,10 +8,26 @@
|
|||||||
</.header>
|
</.header>
|
||||||
|
|
||||||
<.table id="vtubers" rows={@vtubers} row_click={&JS.navigate(~p"/vtubers/#{&1}")}>
|
<.table id="vtubers" rows={@vtubers} row_click={&JS.navigate(~p"/vtubers/#{&1}")}>
|
||||||
<:col :let={vtuber} label="ID">{vtuber.id}</:col>
|
<:col :let={vtuber} label="Name">{vtuber.display_name}</:col>
|
||||||
<:col :let={vtuber} label="Image">{vtuber.image}</:col>
|
<:col :let={vtuber} label="Image">
|
||||||
<:col :let={vtuber} label="Slug">{vtuber.slug}</:col>
|
<figure class="image is-24x24">
|
||||||
<:col :let={vtuber} label="Display Name">{vtuber.display_name}</:col>
|
<img src={vtuber.image} alt={vtuber.display_name} class="is-rounded" />
|
||||||
|
</figure>
|
||||||
|
</:col>
|
||||||
|
<:col :let={vtuber} label="Archival">
|
||||||
|
|
||||||
|
<% %{total_streams: total_streams, streams_with_vods: streams_with_vods, percentage: percentage} = Vtubers.vtuber_archive_percentage(vtuber) %>
|
||||||
|
<div class="columns is-mobile">
|
||||||
|
<div class="column is-two-thirds">
|
||||||
|
<progress class="progress is-success" value={percentage} max="100">
|
||||||
|
<%= percentage %>%
|
||||||
|
</progress>
|
||||||
|
</div>
|
||||||
|
<div class="column is-one-third">
|
||||||
|
<%= streams_with_vods %> of <%= total_streams %> (<%= percentage %>%)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</:col>
|
||||||
|
|
||||||
<:action :let={vtuber}>
|
<:action :let={vtuber}>
|
||||||
<div class="sr-only">
|
<div class="sr-only">
|
||||||
|
@ -20,7 +20,7 @@ defmodule Bright.PlatformsTest do
|
|||||||
end
|
end
|
||||||
|
|
||||||
test "create_platform/1 with valid data creates a platform" do
|
test "create_platform/1 with valid data creates a platform" do
|
||||||
valid_attrs = %{name: "some name", url: "some url", slug: "some_slug"}
|
valid_attrs = %{name: "some name", url: "some url", slug: "some_slug", nsfw: true}
|
||||||
|
|
||||||
assert {:ok, %Platform{} = platform} = Platforms.create_platform(valid_attrs)
|
assert {:ok, %Platform{} = platform} = Platforms.create_platform(valid_attrs)
|
||||||
assert platform.name == "some name"
|
assert platform.name == "some name"
|
||||||
|
@ -3,9 +3,9 @@ defmodule BrightWeb.PlatformControllerTest do
|
|||||||
|
|
||||||
import Bright.PlatformsFixtures
|
import Bright.PlatformsFixtures
|
||||||
|
|
||||||
@create_attrs %{name: "some name", url: "some url", icon: "some icon"}
|
@create_attrs %{name: "some name", url: "some url", slug: "some slug"}
|
||||||
@update_attrs %{name: "some updated name", url: "some updated url", icon: "some updated icon"}
|
@update_attrs %{name: "some updated name", url: "some updated url", slug: "some updated slug"}
|
||||||
@invalid_attrs %{name: nil, url: nil, icon: nil}
|
@invalid_attrs %{name: nil, url: nil, slug: nil}
|
||||||
|
|
||||||
describe "index" do
|
describe "index" do
|
||||||
test "lists all platforms", %{conn: conn} do
|
test "lists all platforms", %{conn: conn} do
|
||||||
|
Loading…
x
Reference in New Issue
Block a user