youtube-lbry: Initial version.
This commit is contained in:
parent
b02cf11736
commit
5d44c749f5
5
Makefile
5
Makefile
|
@ -5,7 +5,7 @@ CMD = blink 2grep 2search burncpu drac duplicate-packets em emoticons \
|
||||||
rand rclean rina rn rrm seekmaniac shython sound-reload \
|
rand rclean rina rn rrm seekmaniac shython sound-reload \
|
||||||
splitvideo stdout swapout T teetime timestamp tracefile \
|
splitvideo stdout swapout T teetime timestamp tracefile \
|
||||||
transpose upsidedown vid w4it-for-port-open whitehash \
|
transpose upsidedown vid w4it-for-port-open whitehash \
|
||||||
wifi-reload wssh ytv yyyymmdd
|
wifi-reload wssh youtube-lbry ytv yyyymmdd
|
||||||
|
|
||||||
all: blink/blink.1 2search/2grep.1 2search/2search.1 \
|
all: blink/blink.1 2search/2grep.1 2search/2search.1 \
|
||||||
burncpu/burncpu.1 drac/drac.1 encdir/encdir.1 \
|
burncpu/burncpu.1 drac/drac.1 encdir/encdir.1 \
|
||||||
|
@ -20,7 +20,8 @@ all: blink/blink.1 2search/2grep.1 2search/2search.1 \
|
||||||
stdout/stdout.1 teetime/teetime.1 timestamp/timestamp.1 \
|
stdout/stdout.1 teetime/teetime.1 timestamp/timestamp.1 \
|
||||||
tracefile/tracefile.1 transpose/transpose.1 T/T.1 \
|
tracefile/tracefile.1 transpose/transpose.1 T/T.1 \
|
||||||
upsidedown/upsidedown.1 vid/vid.1 wifi-reload/wifi-reload.1 \
|
upsidedown/upsidedown.1 vid/vid.1 wifi-reload/wifi-reload.1 \
|
||||||
wssh/wssh.1 ytv/ytv.1 yyyymmdd/yyyymmdd.1
|
wssh/wssh.1 youtube-lbry/youtube-lbry.1 ytv/ytv.1 \
|
||||||
|
yyyymmdd/yyyymmdd.1
|
||||||
|
|
||||||
%.1: %
|
%.1: %
|
||||||
pod2man $< > $@
|
pod2man $< > $@
|
||||||
|
|
145
youtube-lbry/youtube-lbry
Executable file
145
youtube-lbry/youtube-lbry
Executable file
|
@ -0,0 +1,145 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
: <<=cut
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
youtube-lbry - Copy videos from YouTube to LBRY
|
||||||
|
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
B<youtube-lbry> @lbry-channel https://youtube-url [https://youtube-url ...]
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
B<youtube-lbry> downloads a YouTube video using B<youtube-dl>, and
|
||||||
|
re-publishes it in a channel on LBRY.
|
||||||
|
|
||||||
|
It tries to preserve title, description, thumbnail, upload date,
|
||||||
|
license, author, tags
|
||||||
|
|
||||||
|
=head1 EXAMPLES
|
||||||
|
|
||||||
|
=head2 EXAMPLE: Copy a single video
|
||||||
|
|
||||||
|
youtube-lbry @mytestchannel https://www.youtube.com/watch?v=KCzj6HOVOG4
|
||||||
|
|
||||||
|
=head2 EXAMPLE: Copy all PROSAs videos
|
||||||
|
|
||||||
|
playlist=UUe2zaWqk4k5WnwiYCOtP3tQ
|
||||||
|
lbry_channel=@PROSA
|
||||||
|
youtube-dl --get-id https://www.youtube.com/watch?list=$playlist |
|
||||||
|
parallel -uXj1 youtube-lbry $lbry_channel
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Copyright (C) 2021 Ole Tange,
|
||||||
|
http://ole.tange.dk and Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
at your option any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
=head1 DEPENDENCIES
|
||||||
|
|
||||||
|
B<youtube-lbry> uses B<youtube-dl>, and B<lbrynet>.
|
||||||
|
|
||||||
|
|
||||||
|
=head1 SEE ALSO
|
||||||
|
|
||||||
|
B<lbrynet>
|
||||||
|
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
copy_one() {
|
||||||
|
# E.g. channel_name="@mytestchannel"
|
||||||
|
channel_name="$1"
|
||||||
|
# E.g. https://www.youtube.com/watch?v=KCzj6HOVOG4
|
||||||
|
youtubeurl="$2"
|
||||||
|
|
||||||
|
tmp=$(mktemp -p "`pwd`" -d)
|
||||||
|
cd "$tmp"
|
||||||
|
# Get metadata in .json-format
|
||||||
|
youtube-dl --write-description --write-info-json --write-annotations "$youtubeurl"
|
||||||
|
|
||||||
|
# youtube-dl may download a .webm but convert it to mkv
|
||||||
|
# So we do not know the extension. Instead we use the newest
|
||||||
|
file_path="$(find "$tmp" -iregex \
|
||||||
|
'.*\(webm\|rm\|mkv\|mov\|mpg\|mpeg\|asf\|avi\|wmv\|flv\|mp4\|3gp\)$' \
|
||||||
|
-printf '%T@ %p\n' |
|
||||||
|
sort -n | tail -1 | cut -f2- -d" " | perl -pe 's/"/\\"/g')"
|
||||||
|
name="$(jq -r .fulltitle < *.json | perl -pe 'chomp;s/[^-a-z0-9]/-/gi')"
|
||||||
|
title="$(jq -r .fulltitle < *.json | perl -pe 'chomp;s/"/\\"/g')"
|
||||||
|
description="$(jq -r .description < *.json | perl -pe 's/"/\\"/g')"
|
||||||
|
# Not entirely true: Uploader could be someone else than Author
|
||||||
|
author="$(jq -r .uploader < *.json | perl -pe 'chomp')"
|
||||||
|
# One tag per --tags
|
||||||
|
tags_opt="$(jq -r .tags[] < *.json | perl -pe 'chomp; s/(.*)/--tags="$1" /')"
|
||||||
|
# Untested
|
||||||
|
languages_opt="$(jq -r .formats[].language < *.json |
|
||||||
|
grep -v 'null' |
|
||||||
|
perl -pe 's/(.*)/--languages=$1 /')"
|
||||||
|
license="$(jq -r < *json .license)"
|
||||||
|
thumbnail_url="$(jq -r .thumbnail < *.json | perl -pe 'chomp')"
|
||||||
|
release_time="$(jq -r .upload_date < *.json | perl -MHTTP::Date -nwle 'print str2time($_)' )"
|
||||||
|
|
||||||
|
lbry_publish() {
|
||||||
|
cat <<EOF > lbry.publish
|
||||||
|
lbrynet publish \
|
||||||
|
--bid=0.00001 \
|
||||||
|
--file_path="$file_path" \
|
||||||
|
--name="$name" \
|
||||||
|
--title="$title" \
|
||||||
|
--description="$description" \
|
||||||
|
--author="$author" \
|
||||||
|
$languages_opt \
|
||||||
|
$tags_opt \
|
||||||
|
--license="$license" \
|
||||||
|
--thumbnail_url="$thumbnail_url" \
|
||||||
|
--release_time="$release_time" \
|
||||||
|
--channel_name="$channel_name" \
|
||||||
|
--optimize_file \
|
||||||
|
--validate_file
|
||||||
|
EOF
|
||||||
|
bash lbry.publish >> lbrynet.out
|
||||||
|
}
|
||||||
|
if lbry_publish ; then
|
||||||
|
green="\033[48;5;78;38;5;0m"
|
||||||
|
reset="\033[00m\n"
|
||||||
|
printf "$green"
|
||||||
|
printf "The video should show up in lbry://$channel_name in 5 minutes."
|
||||||
|
printf "$reset"
|
||||||
|
rm -r "$tmp"
|
||||||
|
else
|
||||||
|
amber="\033[48;5;208;38;5;0m"
|
||||||
|
reset="\033[00m\n"
|
||||||
|
cat lbrynet.out
|
||||||
|
printf "$amber"
|
||||||
|
echo Publishing to LBRY failed.
|
||||||
|
echo See errors in "$tmp"/lbrynet.out
|
||||||
|
printf "$reset"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
export -f copy_one
|
||||||
|
|
||||||
|
channel_name="$1"
|
||||||
|
shift
|
||||||
|
parallel -uj1 copy_one "$channel_name" ::: "$@"
|
Loading…
Reference in a new issue