kopia lustrzana https://github.com/dgtlmoon/changedetection.io
51 wiersze
2.3 KiB
Python
51 wiersze
2.3 KiB
Python
from flask_restful import Resource, abort
|
|
from flask import request
|
|
from . import auth
|
|
|
|
class Search(Resource):
|
|
def __init__(self, **kwargs):
|
|
# datastore is a black box dependency
|
|
self.datastore = kwargs['datastore']
|
|
|
|
@auth.check_token
|
|
def get(self):
|
|
"""
|
|
@api {get} /api/v1/search Search for watches
|
|
@apiDescription Search watches by URL or title text
|
|
@apiExample {curl} Example usage:
|
|
curl "http://localhost:5000/api/v1/search?q=https://example.com/page1" -H"x-api-key:813031b16330fe25e3780cf0325daa45"
|
|
curl "http://localhost:5000/api/v1/search?q=https://example.com/page1?tag=Favourites" -H"x-api-key:813031b16330fe25e3780cf0325daa45"
|
|
curl "http://localhost:5000/api/v1/search?q=https://example.com?partial=true" -H"x-api-key:813031b16330fe25e3780cf0325daa45"
|
|
@apiName Search
|
|
@apiGroup Watch Management
|
|
@apiQuery {String} q Search query to match against watch URLs and titles
|
|
@apiQuery {String} [tag] Optional name of tag to limit results (name not UUID)
|
|
@apiQuery {String} [partial] Allow partial matching of URL query
|
|
@apiSuccess (200) {Object} JSON Object containing matched watches
|
|
"""
|
|
query = request.args.get('q', '').strip()
|
|
tag_limit = request.args.get('tag', '').strip()
|
|
from changedetectionio.strtobool import strtobool
|
|
partial = bool(strtobool(request.args.get('partial', '0'))) if 'partial' in request.args else False
|
|
|
|
# Require a search query
|
|
if not query:
|
|
abort(400, message="Search query 'q' parameter is required")
|
|
|
|
# Use the search function from the datastore
|
|
matching_uuids = self.datastore.search_watches_for_url(query=query, tag_limit=tag_limit, partial=partial)
|
|
|
|
# Build the response with watch details
|
|
results = {}
|
|
for uuid in matching_uuids:
|
|
watch = self.datastore.data['watching'].get(uuid)
|
|
results[uuid] = {
|
|
'last_changed': watch.last_changed,
|
|
'last_checked': watch['last_checked'],
|
|
'last_error': watch['last_error'],
|
|
'title': watch['title'],
|
|
'url': watch['url'],
|
|
'viewed': watch.viewed
|
|
}
|
|
|
|
return results, 200 |