Merge pull request #21 from 0ihgk1uVBLlTBzVo7F9B/dev-indep

Add option to import subscription data from newpipe, youtube and freetube.
This commit is contained in:
PLUJA 2020-09-04 15:58:26 +02:00 committed by GitHub
commit 5c9d19f5d7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 47 additions and 7 deletions

View File

@ -12,6 +12,7 @@ from werkzeug.urls import url_parse
from youtube_dl import YoutubeDL from youtube_dl import YoutubeDL
from numerize import numerize from numerize import numerize
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from xml.dom import minidom
from app import app, db from app import app, db
from re import findall from re import findall
import random, string import random, string
@ -31,12 +32,12 @@ config = json.load(open('yotter-config.json'))
########################## ##########################
NITTERINSTANCE = config['nitterInstance'] # Must be https://.../ NITTERINSTANCE = config['nitterInstance'] # Must be https://.../
YOUTUBERSS = "https://www.youtube.com/feeds/videos.xml?channel_id=" YOUTUBERSS = "https://www.youtube.com/feeds/videos.xml?channel_id="
REGISTRATIONS = config['registrations'] REGISTRATIONS = True
########################## ##########################
#### Global variables #### #### Global variables ####
########################## ##########################
ALLOWED_EXTENSIONS = {'json'} ALLOWED_EXTENSIONS = {'json', 'db'}
######################### #########################
#### Twitter Logic ###### #### Twitter Logic ######
@ -440,13 +441,21 @@ def importdata():
if file.filename == '': if file.filename == '':
flash('No selected file') flash('No selected file')
return redirect(request.referrer) return redirect(request.referrer)
if file and allowed_file(file.filename): if file and allowed_file(file.filename) or 'subscription_manager' in file.filename:
importAccounts(file) option = request.form['import_format']
if option == 'yotter':
importYotterSubscriptions(file)
elif option == 'newpipe':
importNewPipeSubscriptions(file)
elif option == 'youtube':
importYoutubeSubscriptions(file)
elif option == 'freetube':
importFreeTubeSubscriptions(file)
return redirect(request.referrer) return redirect(request.referrer)
return redirect(request.referrer) return redirect(request.referrer)
def importAccounts(file): def importYotterSubscriptions(file):
filename = secure_filename(file.filename) filename = secure_filename(file.filename)
data = json.load(file) data = json.load(file)
for acc in data['twitter']: for acc in data['twitter']:
@ -455,6 +464,24 @@ def importAccounts(file):
for acc in data['youtube']: for acc in data['youtube']:
r = followYoutubeChannel(acc['channelId']) r = followYoutubeChannel(acc['channelId'])
def importNewPipeSubscriptions(file):
filename = secure_filename(file.filename)
data = json.load(file)
for acc in data['subscriptions']:
r = followYoutubeChannel(re.search('(UC[a-zA-Z0-9_-]{22})|(?<=user\/)[a-zA-Z0-9_-]+', acc['url']).group())
def importYoutubeSubscriptions(file):
filename = secure_filename(file.filename)
itemlist = minidom.parse(file).getElementsByTagName('outline')
for item in itemlist[1:]:
r = followYoutubeChannel(re.search('UC[a-zA-Z0-9_-]{22}', item.attributes['xmlUrl'].value).group())
def importFreeTubeSubscriptions(file):
filename = secure_filename(file.filename)
data = re.findall('UC[a-zA-Z0-9_-]{22}', file.read().decode('utf-8'))
for acc in data:
r = followYoutubeChannel(acc)
def allowed_file(filename): def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

View File

@ -40,8 +40,21 @@
<form action = "{{ url_for('importdata') }}" method = "POST" enctype = "multipart/form-data"> <form action = "{{ url_for('importdata') }}" method = "POST" enctype = "multipart/form-data">
<input type = "file" name = "file"/> <input type = "file" name = "file"/>
<input type = "submit"/> <input type = "submit"/>
</form> <br>
<div class="description">Import from JSON export.</div> <label class="radio-inline">
<input type="radio" name="import_format" id="yotter" value="yotter" checked> Yotter
</label>
<label class="radio-inline">
<input type="radio" name="import_format" id="newpipe" value="newpipe"> NewPipe
</label>
<label class="radio-inline">
<input type="radio" name="import_format" id="youtube" value="youtube"> Youtube
</label>
<label class="radio-inline">
<input type="radio" name="import_format" id="freetube" value="freetube"> FreeTube
</label>
</form>
<div class="description">Import subscription data.</div>
</div> </div>
</div> </div>