mirror of
https://github.com/dgtlmoon/changedetection.io.git
synced 2025-12-14 12:06:55 +00:00
WIP
This commit is contained in:
@@ -110,8 +110,16 @@ def construct_blueprint(datastore: ChangeDetectionStore):
|
|||||||
# Convert to ISO 8601 format, all date/time relative events stored as UTC time
|
# Convert to ISO 8601 format, all date/time relative events stored as UTC time
|
||||||
utc_time = datetime.now(ZoneInfo("UTC")).isoformat()
|
utc_time = datetime.now(ZoneInfo("UTC")).isoformat()
|
||||||
|
|
||||||
|
# Get active plugins
|
||||||
|
from changedetectionio.pluggy_interface import get_active_plugins
|
||||||
|
import sys
|
||||||
|
active_plugins = get_active_plugins()
|
||||||
|
python_version = f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}"
|
||||||
|
|
||||||
output = render_template("settings.html",
|
output = render_template("settings.html",
|
||||||
|
active_plugins=active_plugins,
|
||||||
api_key=datastore.data['settings']['application'].get('api_access_token'),
|
api_key=datastore.data['settings']['application'].get('api_access_token'),
|
||||||
|
python_version=python_version,
|
||||||
available_timezones=sorted(available_timezones()),
|
available_timezones=sorted(available_timezones()),
|
||||||
emailprefix=os.getenv('NOTIFICATION_MAIL_BUTTON_PREFIX', False),
|
emailprefix=os.getenv('NOTIFICATION_MAIL_BUTTON_PREFIX', False),
|
||||||
extra_notification_token_placeholder_info=datastore.get_unique_notification_token_placeholders_available(),
|
extra_notification_token_placeholder_info=datastore.get_unique_notification_token_placeholders_available(),
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
<li class="tab"><a href="#rss">RSS</a></li>
|
<li class="tab"><a href="#rss">RSS</a></li>
|
||||||
<li class="tab"><a href="#timedate">Time & Date</a></li>
|
<li class="tab"><a href="#timedate">Time & Date</a></li>
|
||||||
<li class="tab"><a href="#proxies">CAPTCHA & Proxies</a></li>
|
<li class="tab"><a href="#proxies">CAPTCHA & Proxies</a></li>
|
||||||
|
<li class="tab"><a href="#info">Info</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-wrap inner">
|
<div class="box-wrap inner">
|
||||||
@@ -352,7 +353,19 @@ nav
|
|||||||
</p>
|
</p>
|
||||||
{{ render_fieldlist_with_inline_errors(form.requests.form.extra_browsers) }}
|
{{ render_fieldlist_with_inline_errors(form.requests.form.extra_browsers) }}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tab-pane-inner" id="info">
|
||||||
|
<p><strong>Python version:</strong> {{ python_version }}</p>
|
||||||
|
<p><strong>Plugins active:</strong></p>
|
||||||
|
{% if active_plugins %}
|
||||||
|
<ul>
|
||||||
|
{% for plugin in active_plugins %}
|
||||||
|
<li><strong>{{ plugin.name }}</strong> - {{ plugin.description }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% else %}
|
||||||
|
<p>No plugins active</p>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div id="actions">
|
<div id="actions">
|
||||||
<div class="pure-control-group">
|
<div class="pure-control-group">
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
"""
|
||||||
|
Levenshtein distance and similarity plugin for text change detection.
|
||||||
|
Provides metrics for measuring text similarity between snapshots.
|
||||||
|
"""
|
||||||
import pluggy
|
import pluggy
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
"""
|
||||||
|
Word count plugin for content analysis.
|
||||||
|
Provides word count metrics for snapshot content.
|
||||||
|
"""
|
||||||
import pluggy
|
import pluggy
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
|
|
||||||
|
|||||||
@@ -232,6 +232,44 @@ def get_itemprop_availability_from_plugin(content, fetcher_name, fetcher_instanc
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def get_active_plugins():
|
||||||
|
"""Get a list of active plugins with their descriptions.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list: List of dictionaries with plugin information:
|
||||||
|
[
|
||||||
|
{'name': 'plugin_name', 'description': 'Plugin description'},
|
||||||
|
...
|
||||||
|
]
|
||||||
|
"""
|
||||||
|
active_plugins = []
|
||||||
|
|
||||||
|
# Get all registered plugins
|
||||||
|
for plugin_name, plugin_obj in plugin_manager.list_name_plugin():
|
||||||
|
# Skip built-in plugins (they start with 'builtin_')
|
||||||
|
if plugin_name.startswith('builtin_'):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Get plugin description if available
|
||||||
|
description = None
|
||||||
|
if hasattr(plugin_obj, '__doc__') and plugin_obj.__doc__:
|
||||||
|
description = plugin_obj.__doc__.strip().split('\n')[0] # First line only
|
||||||
|
elif hasattr(plugin_obj, 'description'):
|
||||||
|
description = plugin_obj.description
|
||||||
|
|
||||||
|
# Try to get a friendly name from the plugin
|
||||||
|
friendly_name = plugin_name
|
||||||
|
if hasattr(plugin_obj, 'name'):
|
||||||
|
friendly_name = plugin_obj.name
|
||||||
|
|
||||||
|
active_plugins.append({
|
||||||
|
'name': friendly_name,
|
||||||
|
'description': description or 'No description available'
|
||||||
|
})
|
||||||
|
|
||||||
|
return active_plugins
|
||||||
|
|
||||||
|
|
||||||
def get_fetcher_capabilities(watch, datastore):
|
def get_fetcher_capabilities(watch, datastore):
|
||||||
"""Get capability flags for a watch's fetcher.
|
"""Get capability flags for a watch's fetcher.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user