Add Flickr search term override field
Allow users to edit the Flickr search query without changing the Wikipedia article. Shows a text field with the current search term (including quotes for phrase search) that can be modified and re-submitted. The search term persists across pagination and photo selection. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
57b2e474df
commit
7b741e951f
2 changed files with 32 additions and 12 deletions
12
main.py
12
main.py
|
|
@ -491,7 +491,7 @@ def is_valid_flickr_image_url(url: str) -> bool:
|
||||||
|
|
||||||
def search_flickr(search_term: str, page: int = 1) -> SearchResult:
|
def search_flickr(search_term: str, page: int = 1) -> SearchResult:
|
||||||
"""Search Flickr for photos matching the search term."""
|
"""Search Flickr for photos matching the search term."""
|
||||||
encoded_term = quote(f'"{search_term}"')
|
encoded_term = quote(search_term)
|
||||||
url = f"https://flickr.com/search/?view_all=1&text={encoded_term}&page={page}"
|
url = f"https://flickr.com/search/?view_all=1&text={encoded_term}&page={page}"
|
||||||
|
|
||||||
response = requests.get(url, headers=BROWSER_HEADERS)
|
response = requests.get(url, headers=BROWSER_HEADERS)
|
||||||
|
|
@ -711,20 +711,24 @@ def start() -> str:
|
||||||
# Get category param if coming from category search
|
# Get category param if coming from category search
|
||||||
cat = flask.request.args.get("cat")
|
cat = flask.request.args.get("cat")
|
||||||
|
|
||||||
|
# Allow overriding the Flickr search term (default includes quotes for phrase search)
|
||||||
|
flickr_search = flask.request.args.get("flickr_search") or f'"{name}"'
|
||||||
|
|
||||||
flickr_url = flask.request.args.get("flickr")
|
flickr_url = flask.request.args.get("flickr")
|
||||||
if not flickr_url:
|
if not flickr_url:
|
||||||
# Search Flickr for photos
|
# Search Flickr for photos
|
||||||
page = flask.request.args.get("page", 1, type=int)
|
page = flask.request.args.get("page", 1, type=int)
|
||||||
page = max(1, page) # Ensure page is at least 1
|
page = max(1, page) # Ensure page is at least 1
|
||||||
if page == 1:
|
if page == 1:
|
||||||
log_interaction("search_article", query=name, wikipedia_url=wikipedia_url)
|
log_interaction("search_article", query=flickr_search, wikipedia_url=wikipedia_url)
|
||||||
search_result = search_flickr(name, page)
|
search_result = search_flickr(flickr_search, page)
|
||||||
return flask.render_template(
|
return flask.render_template(
|
||||||
"combined.html",
|
"combined.html",
|
||||||
name=name,
|
name=name,
|
||||||
enwp=enwp,
|
enwp=enwp,
|
||||||
search_result=search_result,
|
search_result=search_result,
|
||||||
cat=cat,
|
cat=cat,
|
||||||
|
flickr_search=flickr_search,
|
||||||
)
|
)
|
||||||
|
|
||||||
if "/in/" in flickr_url:
|
if "/in/" in flickr_url:
|
||||||
|
|
@ -778,6 +782,7 @@ def start() -> str:
|
||||||
flickr_user_url=flickr_user_url,
|
flickr_user_url=flickr_user_url,
|
||||||
cat=cat,
|
cat=cat,
|
||||||
previous_messages=previous_messages,
|
previous_messages=previous_messages,
|
||||||
|
flickr_search=flickr_search,
|
||||||
)
|
)
|
||||||
|
|
||||||
log_interaction(
|
log_interaction(
|
||||||
|
|
@ -818,6 +823,7 @@ def start() -> str:
|
||||||
flickr_user_url=flickr_user_url,
|
flickr_user_url=flickr_user_url,
|
||||||
cat=cat,
|
cat=cat,
|
||||||
previous_messages=previous_messages,
|
previous_messages=previous_messages,
|
||||||
|
flickr_search=flickr_search,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,13 +63,20 @@
|
||||||
<p><a href="{{ url_for('category_search', cat=cat) }}">← Back to category</a></p>
|
<p><a href="{{ url_for('category_search', cat=cat) }}">← Back to category</a></p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<p>Wikipedia article: {{ name }}</p>
|
<p>Wikipedia article: {{ name }}</p>
|
||||||
|
<form action="{{ url_for(request.endpoint) }}" class="mb-3 d-flex align-items-center gap-2">
|
||||||
|
<input type="hidden" name="enwp" value="{{ enwp }}">
|
||||||
|
{% if cat %}<input type="hidden" name="cat" value="{{ cat }}">{% endif %}
|
||||||
|
<label for="flickr_search" class="form-label mb-0 text-nowrap">Flickr search:</label>
|
||||||
|
<input type="text" class="form-control form-control-sm" id="flickr_search" name="flickr_search" value="{{ flickr_search }}" style="max-width: 300px;">
|
||||||
|
<button type="submit" class="btn btn-sm btn-primary">Search</button>
|
||||||
|
</form>
|
||||||
<p>Select a photo to compose a message ({{ search_result.total_photos | default(0) }} results):</p>
|
<p>Select a photo to compose a message ({{ search_result.total_photos | default(0) }} results):</p>
|
||||||
|
|
||||||
<div class="row row-cols-2 row-cols-md-3 row-cols-lg-4 g-3 mb-3">
|
<div class="row row-cols-2 row-cols-md-3 row-cols-lg-4 g-3 mb-3">
|
||||||
{% for photo in search_result.photos %}
|
{% for photo in search_result.photos %}
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<div class="card h-100">
|
<div class="card h-100">
|
||||||
<a href="{{ url_for(request.endpoint, enwp=enwp, flickr=photo.flickr_url, img=photo.medium_url, license=photo.license, flickr_user=photo.realname or photo.username, cat=cat) }}">
|
<a href="{{ url_for(request.endpoint, enwp=enwp, flickr=photo.flickr_url, img=photo.medium_url, license=photo.license, flickr_user=photo.realname or photo.username, cat=cat, flickr_search=flickr_search) }}">
|
||||||
<img src="{{ photo.thumb_url }}" alt="{{ photo.title }}" class="card-img-top" style="aspect-ratio: 1; object-fit: cover;">
|
<img src="{{ photo.thumb_url }}" alt="{{ photo.title }}" class="card-img-top" style="aspect-ratio: 1; object-fit: cover;">
|
||||||
</a>
|
</a>
|
||||||
<div class="card-body p-2">
|
<div class="card-body p-2">
|
||||||
|
|
@ -86,7 +93,7 @@
|
||||||
<ul class="pagination justify-content-center">
|
<ul class="pagination justify-content-center">
|
||||||
{% if search_result.current_page > 1 %}
|
{% if search_result.current_page > 1 %}
|
||||||
<li class="page-item">
|
<li class="page-item">
|
||||||
<a class="page-link" href="{{ url_for(request.endpoint, enwp=enwp, page=search_result.current_page - 1, cat=cat) }}">Previous</a>
|
<a class="page-link" href="{{ url_for(request.endpoint, enwp=enwp, flickr_search=flickr_search, page=search_result.current_page - 1, cat=cat) }}">Previous</a>
|
||||||
</li>
|
</li>
|
||||||
{% else %}
|
{% else %}
|
||||||
<li class="page-item disabled">
|
<li class="page-item disabled">
|
||||||
|
|
@ -99,7 +106,7 @@
|
||||||
|
|
||||||
{% if start_page > 1 %}
|
{% if start_page > 1 %}
|
||||||
<li class="page-item">
|
<li class="page-item">
|
||||||
<a class="page-link" href="{{ url_for(request.endpoint, enwp=enwp, page=1, cat=cat) }}">1</a>
|
<a class="page-link" href="{{ url_for(request.endpoint, enwp=enwp, flickr_search=flickr_search, page=1, cat=cat) }}">1</a>
|
||||||
</li>
|
</li>
|
||||||
{% if start_page > 2 %}
|
{% if start_page > 2 %}
|
||||||
<li class="page-item disabled"><span class="page-link">...</span></li>
|
<li class="page-item disabled"><span class="page-link">...</span></li>
|
||||||
|
|
@ -108,7 +115,7 @@
|
||||||
|
|
||||||
{% for p in range(start_page, end_page + 1) %}
|
{% for p in range(start_page, end_page + 1) %}
|
||||||
<li class="page-item {{ 'active' if p == search_result.current_page else '' }}">
|
<li class="page-item {{ 'active' if p == search_result.current_page else '' }}">
|
||||||
<a class="page-link" href="{{ url_for(request.endpoint, enwp=enwp, page=p, cat=cat) }}">{{ p }}</a>
|
<a class="page-link" href="{{ url_for(request.endpoint, enwp=enwp, flickr_search=flickr_search, page=p, cat=cat) }}">{{ p }}</a>
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
|
|
@ -117,13 +124,13 @@
|
||||||
<li class="page-item disabled"><span class="page-link">...</span></li>
|
<li class="page-item disabled"><span class="page-link">...</span></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<li class="page-item">
|
<li class="page-item">
|
||||||
<a class="page-link" href="{{ url_for(request.endpoint, enwp=enwp, page=search_result.total_pages, cat=cat) }}">{{ search_result.total_pages }}</a>
|
<a class="page-link" href="{{ url_for(request.endpoint, enwp=enwp, flickr_search=flickr_search, page=search_result.total_pages, cat=cat) }}">{{ search_result.total_pages }}</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if search_result.current_page < search_result.total_pages %}
|
{% if search_result.current_page < search_result.total_pages %}
|
||||||
<li class="page-item">
|
<li class="page-item">
|
||||||
<a class="page-link" href="{{ url_for(request.endpoint, enwp=enwp, page=search_result.current_page + 1, cat=cat) }}">Next</a>
|
<a class="page-link" href="{{ url_for(request.endpoint, enwp=enwp, flickr_search=flickr_search, page=search_result.current_page + 1, cat=cat) }}">Next</a>
|
||||||
</li>
|
</li>
|
||||||
{% else %}
|
{% else %}
|
||||||
<li class="page-item disabled">
|
<li class="page-item disabled">
|
||||||
|
|
@ -135,7 +142,7 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<p class="text-muted small">
|
<p class="text-muted small">
|
||||||
<a href="https://flickr.com/search/?view_all=1&text={{ '"' + name + '"' | urlencode }}" target="_blank">View full search on Flickr</a>
|
<a href="https://flickr.com/search/?view_all=1&text={{ flickr_search | urlencode }}" target="_blank">View full search on Flickr</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
{% elif name and not flickr_url %}
|
{% elif name and not flickr_url %}
|
||||||
|
|
@ -144,8 +151,15 @@
|
||||||
<p><a href="{{ url_for('category_search', cat=cat) }}">← Back to category</a></p>
|
<p><a href="{{ url_for('category_search', cat=cat) }}">← Back to category</a></p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<p>Wikipedia article: {{ name }}</p>
|
<p>Wikipedia article: {{ name }}</p>
|
||||||
|
<form action="{{ url_for(request.endpoint) }}" class="mb-3 d-flex align-items-center gap-2">
|
||||||
|
<input type="hidden" name="enwp" value="{{ enwp }}">
|
||||||
|
{% if cat %}<input type="hidden" name="cat" value="{{ cat }}">{% endif %}
|
||||||
|
<label for="flickr_search_empty" class="form-label mb-0 text-nowrap">Flickr search:</label>
|
||||||
|
<input type="text" class="form-control form-control-sm" id="flickr_search_empty" name="flickr_search" value="{{ flickr_search }}" style="max-width: 300px;">
|
||||||
|
<button type="submit" class="btn btn-sm btn-primary">Search</button>
|
||||||
|
</form>
|
||||||
<div class="alert alert-warning">No photos found. Try a different search term.</div>
|
<div class="alert alert-warning">No photos found. Try a different search term.</div>
|
||||||
<p><a href="https://flickr.com/search/?view_all=1&text={{ '"' + name + '"' | urlencode }}" target="_blank">Search on Flickr directly</a></p>
|
<p><a href="https://flickr.com/search/?view_all=1&text={{ flickr_search | urlencode }}" target="_blank">Search on Flickr directly</a></p>
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
@ -201,7 +215,7 @@
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<p class="mt-3">
|
<p class="mt-3">
|
||||||
<a href="{{ url_for('start', enwp=enwp, cat=cat) if cat else url_for('start', enwp=enwp) }}">← Back to search results</a>
|
<a href="{{ url_for('start', enwp=enwp, cat=cat, flickr_search=flickr_search) }}">← Back to search results</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue