Add autorefresh to Channel to include/exclude in refresh_all loop.
This commit is contained in:
parent
0418cae57a
commit
6068d644b9
8 changed files with 112 additions and 8 deletions
|
@ -159,6 +159,20 @@ def post_set_automark(channel_id):
|
||||||
|
|
||||||
return flasktools.make_json_response({})
|
return flasktools.make_json_response({})
|
||||||
|
|
||||||
|
@flasktools.required_fields(['autorefresh'], forbid_whitespace=True)
|
||||||
|
@site.route('/channel/<channel_id>/set_autorefresh', methods=['POST'])
|
||||||
|
def post_set_autorefresh(channel_id):
|
||||||
|
autorefresh = request.form['autorefresh']
|
||||||
|
channel = common.ycdldb.get_channel(channel_id)
|
||||||
|
|
||||||
|
try:
|
||||||
|
autorefresh = stringtools.truthystring(autorefresh)
|
||||||
|
channel.set_autorefresh(autorefresh)
|
||||||
|
except (ValueError, TypeError):
|
||||||
|
flask.abort(400)
|
||||||
|
|
||||||
|
return flasktools.make_json_response({})
|
||||||
|
|
||||||
@site.route('/channel/<channel_id>/set_download_directory', methods=['POST'])
|
@site.route('/channel/<channel_id>/set_download_directory', methods=['POST'])
|
||||||
def post_set_download_directory(channel_id):
|
def post_set_download_directory(channel_id):
|
||||||
download_directory = request.form['download_directory']
|
download_directory = request.form['download_directory']
|
||||||
|
|
|
@ -43,6 +43,14 @@ function set_automark(channel_id, state, callback)
|
||||||
return common.post(url, data, callback);
|
return common.post(url, data, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
api.channels.set_autorefresh =
|
||||||
|
function set_autorefresh(channel_id, autorefresh, callback)
|
||||||
|
{
|
||||||
|
const url = `/channel/${channel_id}/set_autorefresh`;
|
||||||
|
const data = {"autorefresh": autorefresh};
|
||||||
|
return common.post(url, data, callback);
|
||||||
|
}
|
||||||
|
|
||||||
api.channels.set_download_directory =
|
api.channels.set_download_directory =
|
||||||
function set_download_directory(channel_id, download_directory, callback)
|
function set_download_directory(channel_id, download_directory, callback)
|
||||||
{
|
{
|
||||||
|
|
|
@ -259,6 +259,11 @@ https://stackoverflow.com/a/35153397
|
||||||
</div> <!-- tab-videos -->
|
</div> <!-- tab-videos -->
|
||||||
|
|
||||||
<div class="tab" data-tab-title="Settings">
|
<div class="tab" data-tab-title="Settings">
|
||||||
|
<div>
|
||||||
|
<label><input type="checkbox" id="set_autorefresh_checkbox" {{"checked" if channel.autorefresh else ""}} onchange="return set_autorefresh_form(event);"/> Automatically refresh this channel regularly.</label>
|
||||||
|
<span id="set_autorefresh_spinner" class="hidden">Working...</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
New videos are:
|
New videos are:
|
||||||
<select onchange="return set_automark_form(event);">
|
<select onchange="return set_automark_form(event);">
|
||||||
|
@ -615,6 +620,21 @@ function set_automark_callback(response)
|
||||||
set_automark_spinner.hide();
|
set_automark_spinner.hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function set_autorefresh_form(event)
|
||||||
|
{
|
||||||
|
set_autorefresh_spinner.show();
|
||||||
|
api.channels.set_autorefresh(CHANNEL_ID, event.target.checked, set_autorefresh_callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
function set_autorefresh_callback(response)
|
||||||
|
{
|
||||||
|
if (response.meta.status != 200)
|
||||||
|
{
|
||||||
|
alert(JSON.stringify(response));
|
||||||
|
}
|
||||||
|
set_autorefresh_spinner.hide();
|
||||||
|
}
|
||||||
|
|
||||||
function set_download_directory_form(event)
|
function set_download_directory_form(event)
|
||||||
{
|
{
|
||||||
const download_directory = set_download_directory_input.value.trim();
|
const download_directory = set_download_directory_input.value.trim();
|
||||||
|
@ -653,6 +673,9 @@ if (CHANNEL_ID)
|
||||||
|
|
||||||
var set_automark_spinner = document.getElementById("set_automark_spinner");
|
var set_automark_spinner = document.getElementById("set_automark_spinner");
|
||||||
set_automark_spinner = new spinner.Spinner(set_automark_spinner);
|
set_automark_spinner = new spinner.Spinner(set_automark_spinner);
|
||||||
|
|
||||||
|
var set_autorefresh_spinner = document.getElementById("set_autorefresh_spinner");
|
||||||
|
set_autorefresh_spinner = new spinner.Spinner(set_autorefresh_spinner);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -63,7 +63,10 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="/channel/{{channel.id}}">{{channel.name}}</a> <a href="/channel/{{channel.id}}/pending">(p)</a>
|
<a href="/channel/{{channel.id}}">{{channel.name}}</a> <a href="/channel/{{channel.id}}/pending">(p)</a>
|
||||||
{% if channel.automark not in [none, "pending"] %}
|
{% if channel.automark not in [none, "pending"] %}
|
||||||
<span>automark: {{channel.automark}}</span>
|
<span>(automark: {{channel.automark}})</span>
|
||||||
|
{% endif %}
|
||||||
|
{% if not channel.autorefresh %}
|
||||||
|
<span>(autorefresh: no)</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
@ -284,6 +284,37 @@ def upgrade_8_to_9(ycdldb):
|
||||||
|
|
||||||
m.go()
|
m.go()
|
||||||
|
|
||||||
|
def upgrade_9_to_10(ycdldb):
|
||||||
|
'''
|
||||||
|
In this version, the `autorefresh` column was added to the channels table.
|
||||||
|
'''
|
||||||
|
m = Migrator(ycdldb)
|
||||||
|
|
||||||
|
m.tables['channels']['create'] = '''
|
||||||
|
CREATE TABLE IF NOT EXISTS channels(
|
||||||
|
id TEXT,
|
||||||
|
name TEXT,
|
||||||
|
uploads_playlist TEXT,
|
||||||
|
download_directory TEXT COLLATE NOCASE,
|
||||||
|
queuefile_extension TEXT COLLATE NOCASE,
|
||||||
|
automark TEXT,
|
||||||
|
autorefresh INT
|
||||||
|
);
|
||||||
|
'''
|
||||||
|
m.tables['channels']['transfer'] = '''
|
||||||
|
INSERT INTO channels SELECT
|
||||||
|
id,
|
||||||
|
name,
|
||||||
|
uploads_playlist,
|
||||||
|
download_directory,
|
||||||
|
queuefile_extension,
|
||||||
|
automark,
|
||||||
|
1
|
||||||
|
FROM channels_old;
|
||||||
|
'''
|
||||||
|
|
||||||
|
m.go()
|
||||||
|
|
||||||
def upgrade_all(data_directory):
|
def upgrade_all(data_directory):
|
||||||
'''
|
'''
|
||||||
Given the directory containing a ycdl database, apply all of the
|
Given the directory containing a ycdl database, apply all of the
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
from voussoirkit import sqlhelpers
|
from voussoirkit import sqlhelpers
|
||||||
|
|
||||||
DATABASE_VERSION = 9
|
DATABASE_VERSION = 10
|
||||||
DB_VERSION_PRAGMA = f'''
|
DB_VERSION_PRAGMA = f'''
|
||||||
PRAGMA user_version = {DATABASE_VERSION};
|
PRAGMA user_version = {DATABASE_VERSION};
|
||||||
'''
|
'''
|
||||||
|
@ -21,7 +21,8 @@ CREATE TABLE IF NOT EXISTS channels(
|
||||||
uploads_playlist TEXT,
|
uploads_playlist TEXT,
|
||||||
download_directory TEXT COLLATE NOCASE,
|
download_directory TEXT COLLATE NOCASE,
|
||||||
queuefile_extension TEXT COLLATE NOCASE,
|
queuefile_extension TEXT COLLATE NOCASE,
|
||||||
automark TEXT
|
automark TEXT,
|
||||||
|
autorefresh INT
|
||||||
);
|
);
|
||||||
CREATE TABLE IF NOT EXISTS videos(
|
CREATE TABLE IF NOT EXISTS videos(
|
||||||
id TEXT,
|
id TEXT,
|
||||||
|
|
|
@ -2,6 +2,7 @@ import datetime
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
from voussoirkit import pathclass
|
from voussoirkit import pathclass
|
||||||
|
from voussoirkit import stringtools
|
||||||
|
|
||||||
from . import constants
|
from . import constants
|
||||||
from . import exceptions
|
from . import exceptions
|
||||||
|
@ -42,6 +43,7 @@ class Channel(Base):
|
||||||
)
|
)
|
||||||
self.queuefile_extension = self.normalize_queuefile_extension(db_row['queuefile_extension'])
|
self.queuefile_extension = self.normalize_queuefile_extension(db_row['queuefile_extension'])
|
||||||
self.automark = db_row['automark'] or 'pending'
|
self.automark = db_row['automark'] or 'pending'
|
||||||
|
self.autorefresh = stringtools.truthystring(db_row['autorefresh'])
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f'Channel:{self.id}'
|
return f'Channel:{self.id}'
|
||||||
|
@ -204,6 +206,25 @@ class Channel(Base):
|
||||||
if commit:
|
if commit:
|
||||||
self.ycdldb.commit()
|
self.ycdldb.commit()
|
||||||
|
|
||||||
|
def set_autorefresh(self, autorefresh, commit=True):
|
||||||
|
if isinstance(autorefresh, int):
|
||||||
|
if autorefresh not in {0, 1}:
|
||||||
|
raise ValueError(f'autorefresh should be a boolean, not {autorefresh}.')
|
||||||
|
autorefresh = bool(autorefresh)
|
||||||
|
|
||||||
|
if not isinstance(autorefresh, bool):
|
||||||
|
raise TypeError(f'autorefresh should be a boolean, not {autorefresh}.')
|
||||||
|
|
||||||
|
pairs = {
|
||||||
|
'id': self.id,
|
||||||
|
'autorefresh': autorefresh,
|
||||||
|
}
|
||||||
|
self.ycdldb.sql_update(table='channels', pairs=pairs, where_key='id')
|
||||||
|
self.autorefresh = autorefresh
|
||||||
|
|
||||||
|
if commit:
|
||||||
|
self.ycdldb.commit()
|
||||||
|
|
||||||
def set_download_directory(self, download_directory, commit=True):
|
def set_download_directory(self, download_directory, commit=True):
|
||||||
download_directory = self.normalize_download_directory(download_directory)
|
download_directory = self.normalize_download_directory(download_directory)
|
||||||
|
|
||||||
|
|
|
@ -146,7 +146,8 @@ class YCDLDBChannelMixin:
|
||||||
'uploads_playlist': self.youtube.get_user_uploads_playlist_id(channel_id),
|
'uploads_playlist': self.youtube.get_user_uploads_playlist_id(channel_id),
|
||||||
'download_directory': download_directory.absolute_path if download_directory else None,
|
'download_directory': download_directory.absolute_path if download_directory else None,
|
||||||
'queuefile_extension': queuefile_extension,
|
'queuefile_extension': queuefile_extension,
|
||||||
'automark': "pending",
|
'automark': 'pending',
|
||||||
|
'autorefresh': True,
|
||||||
}
|
}
|
||||||
self.sql_insert(table='channels', data=data)
|
self.sql_insert(table='channels', data=data)
|
||||||
|
|
||||||
|
@ -169,7 +170,7 @@ class YCDLDBChannelMixin:
|
||||||
def get_channels_by_sql(self, query, bindings=None):
|
def get_channels_by_sql(self, query, bindings=None):
|
||||||
return self.get_things_by_sql('channel', query, bindings)
|
return self.get_things_by_sql('channel', query, bindings)
|
||||||
|
|
||||||
def _rss_assisted_refresh(self, skip_failures=False, commit=True):
|
def _rss_assisted_refresh(self, channels, skip_failures=False, commit=True):
|
||||||
'''
|
'''
|
||||||
Youtube provides RSS feeds for every channel. These feeds do not
|
Youtube provides RSS feeds for every channel. These feeds do not
|
||||||
require the API token and seem to have generous ratelimits, or
|
require the API token and seem to have generous ratelimits, or
|
||||||
|
@ -216,7 +217,7 @@ class YCDLDBChannelMixin:
|
||||||
)
|
)
|
||||||
traditional(channel)
|
traditional(channel)
|
||||||
|
|
||||||
new_ids = (id for channel in self.get_channels() for id in assisted(channel))
|
new_ids = (id for channel in channels for id in assisted(channel))
|
||||||
for video in self.youtube.get_videos(new_ids):
|
for video in self.youtube.get_videos(new_ids):
|
||||||
self.ingest_video(video, commit=False)
|
self.ingest_video(video, commit=False)
|
||||||
|
|
||||||
|
@ -235,11 +236,13 @@ class YCDLDBChannelMixin:
|
||||||
):
|
):
|
||||||
self.log.info('Refreshing all channels.')
|
self.log.info('Refreshing all channels.')
|
||||||
|
|
||||||
|
channels = self.get_channels_by_sql('SELECT * FROM channels WHERE autorefresh == 1')
|
||||||
|
|
||||||
if rss_assisted and not force:
|
if rss_assisted and not force:
|
||||||
return self._rss_assisted_refresh(skip_failures=skip_failures, commit=commit)
|
return self._rss_assisted_refresh(channels, skip_failures=skip_failures, commit=commit)
|
||||||
|
|
||||||
excs = []
|
excs = []
|
||||||
for channel in self.get_channels():
|
for channel in channels:
|
||||||
try:
|
try:
|
||||||
channel.refresh(force=force, commit=commit)
|
channel.refresh(force=force, commit=commit)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
|
|
Loading…
Reference in a new issue