Initial version of you2peer found functionnal with SigmaTube
This commit is contained in:
parent
ca855f5c52
commit
3ea2970ab1
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
config.json
|
||||
token.sh
|
||||
data/*
|
40
README.md
40
README.md
@ -1,3 +1,41 @@
|
||||
# you2peer
|
||||
|
||||
Python script that mirrors YouTube Channels or playlist on a PeerTube instance
|
||||
Python script that mirrors YouTube Channels or playlist on a PeerTube instance
|
||||
|
||||
## Requirements
|
||||
|
||||
* youtube-dl (both on machine running this script, and on peertube host)
|
||||
* python3 requests
|
||||
* cURL (to retrieve credentials first time)
|
||||
|
||||
## Usage
|
||||
|
||||
Copy config file sample
|
||||
```bash
|
||||
cp config.json.sample config.json
|
||||
```
|
||||
|
||||
Get *Peer*Tube config: (Populate config.json with json response values..)
|
||||
```bash
|
||||
# Get client tokens
|
||||
curl https://peertube.example.com/api/v1/oauth-clients/local
|
||||
|
||||
# Get user token
|
||||
curl -X POST \
|
||||
-d "client_id=zip6rwzni6hplvtw3dp9t02hnkfugpzu&client_secret=AjWiOapPltI6EnsWQwlFarRtLh4u8tDt&grant_type=password&response_type=code&username=your_user&password=your_password" \
|
||||
https://peertube.example.com/api/v1/users/token
|
||||
```
|
||||
|
||||
First create target channels and playlists (using an admin account) and then Get channels id, and playlists id using api in navigator (to be added in `config.json`):
|
||||
* https://peertube.example.com/api/v1/accounts/{username}/video-channels
|
||||
* https://peertube.example.com/api/v1/video-playlists
|
||||
|
||||
## Contributors
|
||||
|
||||
* Samuel ORTION
|
||||
|
||||
Others are welcome !
|
||||
|
||||
## License
|
||||
|
||||
* GNU GPL v3 or later (see [LICENSE](LICENSE))
|
19
config.json.sample
Normal file
19
config.json.sample
Normal file
@ -0,0 +1,19 @@
|
||||
{
|
||||
"you2peer": {
|
||||
"channels": [{
|
||||
"name": "fouloscopie",
|
||||
"url": "https://www.youtube.com/watch?v=5CaVhGTG8eA&list=UULXDNUOO3EQ80VmD9nQBHPg&index=2",
|
||||
"channel_id": 3048,
|
||||
"playlist_id": 3478
|
||||
}]
|
||||
},
|
||||
"peertube": {
|
||||
"username": "username",
|
||||
"password": "password",
|
||||
"base_url": "peertube.example.com",
|
||||
"client_id": "client_id",
|
||||
"client_secret": "client_secret",
|
||||
"access_token": "access_token",
|
||||
"token_type": "Bearer"
|
||||
}
|
||||
}
|
70
src/mirror.py
Executable file
70
src/mirror.py
Executable file
@ -0,0 +1,70 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
"""
|
||||
Mirror YouTube playlist
|
||||
(all channel content for instance)
|
||||
into PeerTube playlist
|
||||
using PeerTube API and youtube-dl
|
||||
"""
|
||||
|
||||
import requests
|
||||
import json
|
||||
import os
|
||||
|
||||
with open("config.json", 'r') as f:
|
||||
config = json.load(f)
|
||||
|
||||
def update_mirror(channel):
|
||||
name = channel['name']
|
||||
playlist_url = channel['url']
|
||||
os.system(f"youtube-dl '{playlist_url}' --flat-playlist --dump-single-json | jq . > 'data/{name}.playlist.last.json'")
|
||||
base_yt_url = "https://www.youtube.com/watch?v="
|
||||
added_previous = []
|
||||
if os.path.exists(f"data/{name}.playlist.previous.json"):
|
||||
with open(f"data/{name}.playlist.previous.json", 'r') as f:
|
||||
playlist_previous = json.load(f)
|
||||
for entry in playlist_previous['entries']:
|
||||
video_id = entry['id']
|
||||
added_previous.append(video_id)
|
||||
urls = []
|
||||
with open(f"data/{name}.playlist.last.json", 'r') as f:
|
||||
playlist = json.load(f)
|
||||
for entry in playlist['entries']:
|
||||
if not entry['id'] in added_previous:
|
||||
url = base_yt_url + entry['url']
|
||||
urls.append(url)
|
||||
|
||||
print(urls)
|
||||
|
||||
TOKEN = config['peertube']['access_token']
|
||||
hed = {'Authorization': 'Bearer ' + TOKEN}
|
||||
i = 1
|
||||
n = len(urls)
|
||||
for url in urls:
|
||||
payload = {
|
||||
'channelId': channel['channel_id'],
|
||||
'targetUrl': url,
|
||||
'privacy': 1,
|
||||
'waitTranscoding': True
|
||||
}
|
||||
req = f"https://{config['peertube']['base_url']}/api/v1/videos/imports"
|
||||
response = requests.post(req, json=payload, headers=hed)
|
||||
# print(response.content)
|
||||
video_data = response.json()
|
||||
video_id = video_data['video']['id']
|
||||
url = f"https://{config['peertube']['base_url']}/api/v1/video-playlists/{channel['playlist_id']}/videos"
|
||||
payload = {
|
||||
'videoId': video_id
|
||||
}
|
||||
response = requests.post(url, json=payload, headers=hed)
|
||||
print(response.status_code)
|
||||
print("{0}/{1} done ({2:.2f}%)".format(i, n, i/n * 100))
|
||||
i += 1
|
||||
|
||||
def main():
|
||||
channels = config['you2peer']['channels']
|
||||
for channel in channels:
|
||||
update_mirror(channel)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in New Issue
Block a user