mirror of
https://github.com/algora-io/tv.git
synced 2024-11-16 00:58:59 +02:00
add admin util to import youtube videos
This commit is contained in:
parent
71d883fe45
commit
52aad5a5c7
120
lib/algora/admin/replace_with_youtube.ex
Normal file
120
lib/algora/admin/replace_with_youtube.ex
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
defmodule Algora.Admin.ReplaceWithYoutube do
|
||||||
|
alias Algora.Repo
|
||||||
|
alias Algora.Accounts.User
|
||||||
|
alias Algora.Library.Video
|
||||||
|
alias Algora.Ads.{Appearance, ContentMetrics, ProductReview}
|
||||||
|
alias Algora.Chat.Message
|
||||||
|
alias Algora.Library.{Segment, Subtitle}
|
||||||
|
alias Algora.Library
|
||||||
|
|
||||||
|
import Ecto.Query
|
||||||
|
|
||||||
|
# Algora.Admin.ReplaceWithYoutube.run("""
|
||||||
|
# 2024-08-27,heyandras,4:49:14,https://www.youtube.com/watch?v=ooMn-3ISOmI
|
||||||
|
# 2024-08-30,heyandras,5:34:09,https://www.youtube.com/watch?v=RtYlh3ze0EI
|
||||||
|
# 2024-09-02,heyandras,6:03:05,https://www.youtube.com/watch?v=X958aGE5NfI
|
||||||
|
# 2024-09-03,heyandras,5:50:26,https://www.youtube.com/watch?v=xO0plZnHKMg
|
||||||
|
# """)
|
||||||
|
|
||||||
|
def run(input) do
|
||||||
|
input
|
||||||
|
|> String.split("\n", trim: true)
|
||||||
|
|> Enum.each(&process_line/1)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp process_line(line) do
|
||||||
|
[date, handle, duration, youtube_url] = String.split(line, ",", trim: true)
|
||||||
|
user = Repo.get_by!(User, handle: handle)
|
||||||
|
|
||||||
|
date = Date.from_iso8601!(date)
|
||||||
|
duration_seconds = Library.from_hhmmss(duration)
|
||||||
|
|
||||||
|
old_videos = find_videos(user.id, date)
|
||||||
|
|
||||||
|
new_video = create_youtube_video(user.id, duration_seconds, youtube_url, old_videos)
|
||||||
|
|
||||||
|
transfer_related_records(old_videos, new_video)
|
||||||
|
|
||||||
|
delete_old_videos(old_videos)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp create_youtube_video(user_id, duration_seconds, youtube_url, old_videos) do
|
||||||
|
video_id = extract_youtube_id(youtube_url)
|
||||||
|
|
||||||
|
%Video{
|
||||||
|
user_id: user_id,
|
||||||
|
inserted_at: get_date_from_old_videos(old_videos),
|
||||||
|
duration: duration_seconds,
|
||||||
|
url: youtube_url,
|
||||||
|
format: :youtube,
|
||||||
|
type: :vod,
|
||||||
|
uuid: Ecto.UUID.generate(),
|
||||||
|
title: get_title_from_old_videos(old_videos),
|
||||||
|
thumbnail_url: "https://i.ytimg.com/vi/#{video_id}/maxresdefault.jpg"
|
||||||
|
}
|
||||||
|
|> Repo.insert!()
|
||||||
|
end
|
||||||
|
|
||||||
|
defp get_title_from_old_videos([first_video | _]), do: first_video.title
|
||||||
|
defp get_date_from_old_videos([first_video | _]), do: first_video.inserted_at
|
||||||
|
|
||||||
|
defp find_videos(user_id, date) do
|
||||||
|
Video
|
||||||
|
|> where([v], v.user_id == ^user_id)
|
||||||
|
|> where([v], fragment("DATE(inserted_at) = ?", ^date))
|
||||||
|
|> Repo.all()
|
||||||
|
end
|
||||||
|
|
||||||
|
defp transfer_related_records(old_videos, new_video) do
|
||||||
|
old_video_ids = Enum.map(old_videos, & &1.id)
|
||||||
|
|
||||||
|
transfer_appearances(old_video_ids, new_video.id)
|
||||||
|
transfer_content_metrics(old_video_ids, new_video.id)
|
||||||
|
transfer_product_reviews(old_video_ids, new_video.id)
|
||||||
|
transfer_messages(old_video_ids, new_video.id)
|
||||||
|
transfer_segments(old_video_ids, new_video.id)
|
||||||
|
transfer_subtitles(old_video_ids, new_video.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp transfer_appearances(old_video_ids, new_video_id) do
|
||||||
|
from(a in Appearance, where: a.video_id in ^old_video_ids)
|
||||||
|
|> Repo.update_all(set: [video_id: new_video_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
defp transfer_content_metrics(old_video_ids, new_video_id) do
|
||||||
|
from(cm in ContentMetrics, where: cm.video_id in ^old_video_ids)
|
||||||
|
|> Repo.update_all(set: [video_id: new_video_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
defp transfer_product_reviews(old_video_ids, new_video_id) do
|
||||||
|
from(pr in ProductReview, where: pr.video_id in ^old_video_ids)
|
||||||
|
|> Repo.update_all(set: [video_id: new_video_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
defp transfer_messages(old_video_ids, new_video_id) do
|
||||||
|
from(m in Message, where: m.video_id in ^old_video_ids)
|
||||||
|
|> Repo.update_all(set: [video_id: new_video_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
defp transfer_segments(old_video_ids, new_video_id) do
|
||||||
|
from(s in Segment, where: s.video_id in ^old_video_ids)
|
||||||
|
|> Repo.update_all(set: [video_id: new_video_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
defp transfer_subtitles(old_video_ids, new_video_id) do
|
||||||
|
from(s in Subtitle, where: s.video_id in ^old_video_ids)
|
||||||
|
|> Repo.update_all(set: [video_id: new_video_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
defp delete_old_videos(old_videos) do
|
||||||
|
Enum.each(old_videos, &Library.delete_video/1)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp extract_youtube_id(url) do
|
||||||
|
url
|
||||||
|
|> URI.parse()
|
||||||
|
|> Map.get(:query)
|
||||||
|
|> URI.decode_query()
|
||||||
|
|> Map.get("v")
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user