My Peertube server is shutting down, so I need to move my videos to another one. The official scripts don’t seem to cover this case very well, so here is what I did.
My script fetches videos and their details and uploads them to the new server via the Peertube API.
Contributions welcome: I was not able to copy video descriptions across, and I was too lazy so I hard-coded the number of tags. Also, I didn’t make a git repo for all this because I felt it needs more thought, but feel free to start one and I will happily contribute this.
This script copies all videos in a single Peertube channel to a different server. You must find the numeric ID of the channel on the new server to copy into, which I did by looking at the responses in the Network tab of Firefox’s developer tools when I clicked on its name in the web interface. It requires bash, curl, youtube-dl and jq.
Here’s peertube-migrate-channel.bash:
#!/bin/bash set -u set -e # Modify these for your setup OLD_SERVER="INSERT OLD SERVER e.g. https://peertube.social" OLD_CHANNEL="INSERT CHANNEL URL-NAME e.g. trials_fusion" NEW_SERVER="INSERT NEW SERVER e.g. https://video.hardlimit.com" NEW_CHANNEL="INSERT NEW CHANNEL ID e.g. 4103" USERNAME="INSERT_USERNAME for new server e.g. trials" PASSWORD="INSERT PASSWORD for new server" TAG1="INSERT_A_TAG e.g trials" TAG2="INSERT_A_TAG e.g. gaming" TAG3="INSERT_A_TAG e.g. gameing" DIR=$(mktemp -d) API_PATH="${NEW_SERVER}/api/v1" # Find out how many videos are in the channel curl -s \ "${OLD_SERVER}/api/v1/video-channels/${OLD_CHANNEL}/videos/?count=1" \ > "${DIR}/videos-total.json" TOTAL=$(jq .total < "${DIR}/videos-total.json") CURRENT=0 PAGE_SIZE=10 # Get a list of URLS for all the videos echo -n "" > "${DIR}/urls.txt" while (( CURRENT < TOTAL )); do FILE="${DIR}/videos-page-${CURRENT}.json" curl -s \ "${OLD_SERVER}/api/v1/video-channels/${OLD_CHANNEL}/videos/?start=${CURRENT}&count=${PAGE_SIZE}&skipCount=true" \ > "${FILE}" jq ".data | map(.uuid) | .[]" -r < "${FILE}" >> "${DIR}/urls.txt" CURRENT=$((CURRENT + PAGE_SIZE)) done # Log in to the new server client_id=$(curl -s "${API_PATH}/oauth-clients/local" | jq -r ".client_id") client_secret=$(curl -s "${API_PATH}/oauth-clients/local" | jq -r ".client_secret") token=$(curl -s "${API_PATH}/users/token" \ --data client_id="${client_id}" \ --data client_secret="${client_secret}" \ --data grant_type=password \ --data response_type=code \ --data username="${USERNAME}" \ --data password="${PASSWORD}" \ | jq -r ".access_token") # Download and upload each video tac "${DIR}/urls.txt" \ | while read ID; do URL="${OLD_SERVER}/api/v1/videos/${ID}" curl -s "${URL}" > "${DIR}/info-${ID}.json" NAME=$(jq -r .name < "${DIR}/info-${ID}.json") CATEGORY=$(jq -r .category.id < "${DIR}/info-${ID}.json") LICENCE=$(jq -r .licence.id < "${DIR}/info-${ID}.json") LANGUAGE=$(jq -r .language.id < "${DIR}/info-${ID}.json") PRIVACY=$(jq -r .privacy.id < "${DIR}/info-${ID}.json") OLD_VIDEO="https://peertube.social/videos/watch/${ID}" mkdir "${DIR}/dl-${ID}" youtube-dl "${OLD_VIDEO}" --output="${DIR}/dl-${ID}/dl.mp4" echo "Uploading ${OLD_VIDEO}" curl "${API_PATH}/videos/upload" \ --silent \ -H "Authorization: Bearer ${token}" \ --output "${DIR}/curl-out-${ID}.txt" \ --max-time 6000 \ --form name="${NAME}" \ --form videofile=@"${DIR}/dl-${ID}/dl.mp4" \ --form channelId=${NEW_CHANNEL} \ --form category=${CATEGORY} \ --form licence=${LICENCE} \ --form description="TODO VIDEO DESCRIPTION" \ --form language=${LANGUAGE} \ --form privacy=${PRIVACY} \ --form tags="${TAG1}" \ --form tags="${TAG2}" \ --form tags="${TAG3}" done
Hello
I have also done something similar in your bash script. I would like to join forces to improve the script
You can see an old version here (I’m at version #18)
https://www.preparandonos.es/2021/02/22/importar-canales-enteros-en-peertube/https://www.preparandonos.es/2022/08/02/15-descargador-de-canales- from-youtube-to-peertube/
what I would be interested in is the option to not re-upload a video that already exists in the peertube target
If you are interested my emails are
REDACTED
Cheers
Max
Hi Max, feel free to make suggestions here but I’m not actively working on this.
btw I removed your email addresses from the above message :-)