2023-01-16(MO) 現在のスクリプト
取得エラー、rm削除、5秒ほど待って再取得としています。
再取得した後もファイル長が短い(ファイルには一度rmした記録があるが)=でもエラー?ならもう一度やり直し。
という事で、最大2回までrm,ダウンロードしなおし言う設定にしています。
#!/bin/bash
#easycheck_ver_0.1.1.20221016
cd `dirname $0`
target_dir=dir_folder_name
minimum_length=20
file_type=mp4
try_file=easycheck.txt
max_try_cnt=1
ymd_kizyun=`date --date '5 minutes ago' +%s`
ymd_kizyun_disp=`date -d @$ymd_kizyun +"%Y-%m-%d_%H:%M:%S"`
#再ダウンロード設定
DLD_COMMAND_COMMON="docker exec -i podsync_container ash -c "
DLD_URL_COMMON="https://www.youtube.com/watch?v="
#メール通知設定
SUBJECT="Podsync_easy_chk"
FROM_ADDR="from_mail_address@domain.com"
TO_ADDR="to_mail_address@domain.com"
LOG_TXT="easycheck.txt"
mail_send_flg=0
if [ ! -e $try_file ]; then
echo -n >| $try_file
echo "try_file=$try_file 作成しました。"
fi
idx=0
while read -r f; do
echo "file: $f"
extention=`echo $f | sed 's/^.*\.\([^\.]*\)$/\1/'`
if [ $extention == $file_type ]
then
ymd_file=`date +%Y%m%d-%H%M%S -r $f` ; echo $ymd_file
ymd_cmp_file=`date -r $f +%s` ; echo $ymd_cmp_file
if [ $ymd_kizyun -lt $ymd_cmp_file ]; then # -lt : '<' echo "判定基準日より前" else echo "判定基準日を経過したので判定対象" duration=$(ffmpeg -i $f 2>&1 | grep Duration | awk '{print $2}' | tr -d ,)
echo "再生時間="$duration
duration_ARR=(${duration//:/ })
tmp_hour=`echo $(( 10#${duration_ARR[0]} ))`
tmp_minute=`echo $(( 10#${duration_ARR[1]} ))`
duration_minute=$(( $tmp_hour * 60 + $tmp_minute ))
#再生時間長で再取得候補に追加
if (( "$duration_minute" < "$minimum_length" ))
then
# echo "c is less than d"
echo "再取得候補追加"
reget_arr[$idx]=$f
idx=$((idx + 1))
fi
fi
else
echo "extention Not Equal"
fi
#-mtimeで2日以内のファイルに対して新規判定とします。
done < <(find ./$target_dir -mindepth 1 -maxdepth 1 -mtime -2)
#try_file内にあるもので判定不要なものをはじく。以前判定しているはず。
idx=0
match_flg=0
while read line
do
line_ARR=(${line// / })
for v in "${reget_arr[@]}"
do
match_flg=0
if [ ${line_ARR[0]} = $v ]; then
match_flg=1
if (( "${line_ARR[1]}" < "$max_try_cnt" ))
then
file_match_arr[$idx]="${line_ARR[0]} $((line_ARR[1] + 1)) DEL $ymd_kizyun_disp"
rm ${line_ARR[0]}
mail_send_flg=1
echo "${file_match_arr[$idx]}"
#再ダウンロード指示を追加
sleep 5
TGT_DLD_DIR=`echo $(dirname ${line_ARR[0]}) | sed 's/\.\///'`
DLD_FILE_NAME=`echo $(basename ${line_ARR[0]}) | sed 's/\.[^\.]*$//'`
THIS_TIME_DLD_URL=$DLD_URL_COMMON$DLD_FILE_NAME
DLD_OPTION="cd /app/data/$TGT_DLD_DIR && youtube-dl -f bestvideo[ext=mp4]+bestaudio[ext=m4a] -o '%(id)s' $THIS_TIME_DLD_URL"
THIS_TIME_DLD_COMMAND=$DLD_COMMAND_COMMON'"'$DLD_OPTION'"'
eval $THIS_TIME_DLD_COMMAND
#再ダウンロード完了
else
file_match_arr[$idx]="${line_ARR[0]} $((line_ARR[1])) ${line_ARR[2]} Max_tryed_no_need_to_del"
echo "${file_match_arr[$idx]}"
fi
idx=$((idx + 1))
break
fi
done
if [ ${match_flg} = 0 ]; then
file_match_arr[$idx]="${line_ARR[0]} ${line_ARR[1]} ${line_ARR[2]} Previously_determined._No_need_this_time "
echo "${file_match_arr[$idx]}"
idx=$((idx + 1))
fi
done < $try_file echo ${file_match_arr[@]} #ここまでで一回新規ファイルをまとめて作る。 rm $try_file echo -n >| $try_file
for match in "${file_match_arr[@]}"
do
echo $match >> $try_file
done
#ファイルにはなかったけど、新規判定対象になるものをファイルに追加
for v in "${reget_arr[@]}"
do
match_flg=0
for match in "${file_match_arr[@]}"
do
match_ARR=(${match// / })
if [ ${match_ARR[0]} = $v ]; then
match_flg=1
break
fi
done
if [ ${match_flg} = 0 ]; then
#DELとファイル追加
echo "最初のDEL判定=0,最初のDEL=first"
rm $v
echo $v 0 first $ymd_kizyun_disp>> $try_file
mail_send_flg=1
#再ダウンロード指示を追加
sleep 5
TGT_DLD_DIR=`echo $(dirname ${v}) | sed 's/\.\///'`
DLD_FILE_NAME=`echo $(basename ${v}) | sed 's/\.[^\.]*$//'`
THIS_TIME_DLD_URL=$DLD_URL_COMMON$DLD_FILE_NAME
DLD_OPTION="cd /app/data/$TGT_DLD_DIR && youtube-dl -f bestvideo[ext=mp4]+bestaudio[ext=m4a] -o '%(id)s' $THIS_TIME_DLD_URL"
THIS_TIME_DLD_COMMAND=$DLD_COMMAND_COMMON'"'$DLD_OPTION'"'
eval $THIS_TIME_DLD_COMMAND
#再ダウンロード完了
fi
done
if [ ${mail_send_flg} != 0 ]; then
cat -v $LOG_TXT | mail -s $SUBJECT -r $FROM_ADDR $TO_ADDR
fi
1,1 先頭
2023-01-16(MO) ダウンロードエラーを判定して知らせる機能だけではなく、再度ダウンロードするように設定を変更
easycheck.txt で取得失敗、削除したリストを送ってきているわけですが、その後もう一度取得しなおしてくれた方が良い。
DLし直すのは以下のような感じで可能そうでした。
私の設定ではDockerのコンテナ内のyt-dlpを使っています。
一応5秒ほど待ってから実行します。確実に削除出来た後。
パスから保存Dir,保存File名を設定して再取得しています。
#!/bin/bash
DLD_COMMAND_COMMON="docker exec -i podsync_container ash -c "
DLD_URL_COMMON="https://www.youtube.com/watch?v="
STR="./dir_to/filename.mp4"
sleep 5
TGT_DLD_DIR=`echo $(dirname ${STR}) | sed 's/\.\///'`
DLD_FILE_NAME=`echo $(basename ${STR}) | sed 's/\.[^\.]*$//'`
THIS_TIME_DLD_URL=$DLD_URL_COMMON$DLD_FILE_NAME
DLD_OPTION="cd /app/data/$TGT_DLD_DIR && youtube-dl -f bestvideo[ext=mp4]+bestaudio[ext=m4a] -o '%(id)s' $THIS_TIME_DLD_URL"
THIS_TIME_DLD_COMMAND=$DLD_COMMAND_COMMON'"'$DLD_OPTION'"'
eval $THIS_TIME_DLD_COMMAND
2022-10-19(WE)プレミア公開カウントダウン、どうも14分以上取得してしまうようだ。
設定を以下に変更して様子を見ます。
minimum_length=15
2022-10-17(MO)取得しなおすとき(DELする時とか)に、メールで通知するよう変更
#以下を頭に追加。
SUBJECT="Podsync_easy_chk"
FROM_ADDR="アドレス"
TO_ADDR="アドレス"
LOG_TXT="easycheck.txt"
mail_send_flg=0
#変更、追加箇所
file_match_arr[$idx]="${line_ARR[0]} $((line_ARR[1] + 1)) DEL $ymd_kizyun_disp"
rm ${line_ARR[0]}
mail_send_flg=1
file_match_arr[$idx]="${line_ARR[0]} $((line_ARR[1])) ${line_ARR[3]} max_try"
mail_send_flg=1
echo $v 0 first $ymd_kizyun_disp>> $try_file
mail_send_flg=1
#最後に追加
if [ ${mail_send_flg} != 0 ]; then
cat -v $LOG_TXT | mail -s $SUBJECT -r $FROM_ADDR $TO_ADDR
fi
2022-10-17(MO)実行時間を記録するように変更
easycheck_ver_0.1.1.20221016
変更、追加
ymd_kizyun=`date --date '5 minutes ago' +%s`
ymd_kizyun_disp=`date -d @$ymd_kizyun +"%Y-%m-%d_%H:%M:%S"` #追加
変更前
file_match_arr[$idx]="${line_ARR[0]} $((line_ARR[1] + 1)) DEL"
file_match_arr[$idx]="${line_ARR[0]} $((line_ARR[1])) max_try"
file_match_arr[$idx]="${line_ARR[0]} ${line_ARR[1]} no_need "
echo $v 0 >> $try_file
変更後
file_match_arr[$idx]="${line_ARR[0]} $((line_ARR[1] + 1)) DEL $ymd_kizyun_disp"
file_match_arr[$idx]="${line_ARR[0]} $((line_ARR[1])) ${line_ARR[3]} max_try"
file_match_arr[$idx]="${line_ARR[0]} ${line_ARR[1]} ${line_ARR[3]} no_need "
echo $v 0 first $ymd_kizyun_disp>> $try_file
2022-10-16 1時間以上ある場合を考慮していなかった
バグ対応
#ver 0.1.1.20221016
duration=$(ffmpeg -i $f 2>&1 | grep Duration | awk '{print $2}' | tr -d ,)
echo "再生時間="$duration
duration_ARR=(${duration//:/ })
#10進数にして計算する。01とか、09とか頭に0が付いているかもしれないから。
tmp_hour=`echo $(( 10#${duration_ARR[0]} ))`
tmp_minute=`echo $(( 10#${duration_ARR[1]} ))`
duration_minute=$(( $tmp_hour * 60 + $tmp_minute ))
# if (( "${duration_ARR[1]}" < "$minimum_length" ))
if (( "$duration_minute" < "$minimum_length" ))
2022-10-13 再生時間、トライの数で判定。再取得
取りあえずやっつけだが、何度取得してもできないこともあるかもしれない。
それを想定して3回で取得を諦める設定にした。
取りあえず諦めるだけで通知は無い。そのうち必要になるかも。
でも取りあえずこれで問題なければこのまま放置すると思う。
10分以内の動画なら途中でおかしくなっているという判定で再取得。削除すれば勝手にとってくれるかなと。
一応ログっぽいファイルを作ることにする。本当にやっつけなのでコメントとか思いっきり残っているが。
#!/bin/bash
cd `dirname $0`
target_dir=対象のフォルダ
minimum_length=10
file_type=mp4
try_file=easycheck.txt
max_try_cnt=2
ymd_kizyun=`date --date '5 minutes ago' +%s`
if [ ! -e $try_file ]; then
echo -n >| $try_file
echo "try_file=$try_file 作成しました。"
fi
idx=0
while read -r f; do
echo "file: $f"
extention=`echo $f | sed 's/^.*\.\([^\.]*\)$/\1/'`
if [ $extention == $file_type ]
then
ymd_file=`date +%Y%m%d-%H%M%S -r $f` ; echo $ymd_file
ymd_cmp_file=`date -r $f +%s` ; echo $ymd_cmp_file
if [ $ymd_kizyun -lt $ymd_cmp_file ]; then # -lt : '<' echo "まだ基準日より前" else echo "基準日を過ぎた" duration=$(ffmpeg -i $f 2>&1 | grep Duration | awk '{print $2}' | tr -d ,)
echo "再生時間="$duration
duration_ARR=(${duration//:/ })
if (( "${duration_ARR[1]}" < "$minimum_length" ))
then
echo "再取得候補追加"
reget_arr[$idx]=$f
idx=$((idx + 1))
fi
fi
else
echo "extention Not Equal"
fi
done < <(find ./$target_dir -mindepth 1 -maxdepth 1 -mtime -2)
#ファイル内にあるもので判定不要なものをはじく
idx=0
match_flg=0
while read line
do
line_ARR=(${line// / })
for v in "${reget_arr[@]}"
do
match_flg=0
if [ ${line_ARR[0]} = $v ]; then
match_flg=1
if (( "${line_ARR[1]}" < "$max_try_cnt" ))
then
file_match_arr[$idx]="${line_ARR[0]} $((line_ARR[1] + 1)) DEL"
rm ${line_ARR[0]}
echo "${file_match_arr[$idx]}"
else
file_match_arr[$idx]="${line_ARR[0]} $((line_ARR[1])) max_try"
echo "${file_match_arr[$idx]}"
fi
idx=$((idx + 1))
break
fi
done
if [ ${match_flg} = 0 ]; then
file_match_arr[$idx]="${line_ARR[0]} ${line_ARR[1]} no_need "
echo "${file_match_arr[$idx]}"
idx=$((idx + 1))
fi
done < $try_file echo ${file_match_arr[@]} #ここまでで一回新規ファイルを作る。 rm $try_file echo -n >| $try_file
for match in "${file_match_arr[@]}"
do
echo $match >> $try_file
done
#新規でファイルに追加しないと
for v in "${reget_arr[@]}"
do
match_flg=0
for match in "${file_match_arr[@]}"
do
match_ARR=(${match// / })
if [ ${match_ARR[0]} = $v ]; then
match_flg=1
break
fi
done
if [ ${match_flg} = 0 ]; then
#DELとファイル追加
echo "新規del"
rm $v
echo $v 0 >> $try_file
fi
done
2022-10-10 たまたま今のところうまく行っているけど、作りかけたので記録。
とりあえずファイルの取得
#!/bin/bash
target_dir=対象のディレクトリ
while read -r f; do
echo "file: $f"
ymd=`date +%Y%m%d -r $f` ; echo $ymd
ffmpeg -i $f 2>&1 | grep Duration | awk '{print $2}' | tr -d ,
done < <(find ./$target_dir -mindepth 1 -maxdepth 1 -mtime -2)
2022-10-08 公開時間の間際での取得だとおかしな動画になってしまう対応
要は間もなく公開状態の時に取得してしまうと、不完全なのに取得完了と認識されてしまう。
恐らく不完全なファイルを削除して取得しなおせばいいのではないか?
たしかファイルが無い状態だともう一度取得してくれるはずなので、単純にファイル容量から判定して削除してやれば再び取得してくれるかなと。
でも何度かチャレンジしてそれでもダメだったときはあきらめてもらわないと困る。
あと、チャレンジしたならその旨を通知して欲しい。メールとかで。
この辺を盛り込んでスクリプトを作るかもしれない。
取りあえずサイズの小さいファイルがおかしいかどうか検証してみます。
2022-07-06
https://www.youtube.com/c/xxxxxxxx
のようなアドレスだと取得できていない用でした。
ソースを表示して、{“key”:”browse_id”,”value”:
等で検索。
,{“key”:”browse_id”,”value”:”aaaaaaaaaaaaaaaaaaaa”},
などが分かる。
https://www.youtube.com/channel/aaaaaaaaaaaaaaaaaaa
などでpodsync側に登録すると正常に取れるようでした。