Compare commits
No commits in common. "c3bc6895c407d64265206f32b7648d58dbbde522" and "08d1f9b6c4bc9eabc5fc676a28c6ad8505dbb899" have entirely different histories.
c3bc6895c4
...
08d1f9b6c4
2 changed files with 5 additions and 104 deletions
91
AGENTS.md
91
AGENTS.md
|
|
@ -1,91 +0,0 @@
|
|||
# Agent Guidelines for Flickr Mail
|
||||
|
||||
This document provides context for AI agents working on this codebase.
|
||||
|
||||
## Project Overview
|
||||
|
||||
Flickr Mail is a Flask web application that helps users find photos on Flickr
|
||||
for Wikipedia articles and contact photographers to request Creative Commons
|
||||
licensing.
|
||||
|
||||
## Architecture
|
||||
|
||||
- **main.py**: Single-file Flask application containing all routes and logic
|
||||
- **templates/**: Jinja2 templates using Bootstrap 5 for styling
|
||||
- `base.html`: Base template with Bootstrap CSS/JS
|
||||
- `combined.html`: Main UI template for search, results, and message composition
|
||||
- `message.jinja`: Template for the permission request message body
|
||||
- `show_error.html`: Error display template
|
||||
|
||||
## Key Components
|
||||
|
||||
### Flickr Search (`search_flickr`, `parse_flickr_search_results`)
|
||||
|
||||
Searches Flickr by scraping the search results page. The page embeds JSON data
|
||||
in a `modelExport` JavaScript variable which contains photo metadata.
|
||||
|
||||
- Uses browser-like headers (`BROWSER_HEADERS`) to avoid blocks
|
||||
- Parses embedded JSON by counting braces (not regex) to handle nested structures
|
||||
- Returns `FlickrPhoto` dataclass instances with id, title, username, license, URLs
|
||||
|
||||
### FlickrPhoto Dataclass
|
||||
|
||||
Represents a photo with:
|
||||
- `id`, `title`, `path_alias`, `owner_nsid`, `username`, `realname`
|
||||
- `license` (int): Flickr license code (0=ARR, 4=CC BY, 5=CC BY-SA, etc.)
|
||||
- `thumb_url`, `medium_url`: Static image URLs
|
||||
- `flickr_url` property: URL to photo page
|
||||
- `license_name` property: Human-readable license name
|
||||
|
||||
### License Codes
|
||||
|
||||
Wikipedia-compatible licenses (can be used): 4 (CC BY), 5 (CC BY-SA), 7 (No
|
||||
known copyright), 8 (US Government), 9 (CC0), 10 (Public Domain).
|
||||
|
||||
Not compatible: 0 (All Rights Reserved), 1-3 (NC variants), 6 (ND).
|
||||
|
||||
### URL Validation (`is_valid_flickr_image_url`)
|
||||
|
||||
Validates that image URLs passed via query params are from legitimate Flickr
|
||||
static image servers:
|
||||
- `live.staticflickr.com`
|
||||
- `farm*.staticflickr.com`
|
||||
- `c1.staticflickr.com`, `c2.staticflickr.com`
|
||||
|
||||
### NSID Lookup (`flickr_usrename_to_nsid`)
|
||||
|
||||
Converts a Flickr username/path alias to the NSID (internal user ID) needed
|
||||
for the Flickr mail URL. Scrapes the user's profile page for embedded params.
|
||||
|
||||
## Request Flow
|
||||
|
||||
1. User enters Wikipedia article title/URL → `start()` extracts article name
|
||||
2. `search_flickr()` fetches and parses Flickr search results
|
||||
3. Results displayed as clickable photo grid with license badges
|
||||
4. User clicks photo → page reloads with `flickr` and `img` params
|
||||
5. `flickr_usrename_to_nsid()` looks up the photographer's NSID
|
||||
6. Message template rendered with photo details
|
||||
7. User copies message and clicks link to Flickr's mail compose page
|
||||
|
||||
## Testing Changes
|
||||
|
||||
Run the Flask app locally:
|
||||
```bash
|
||||
python3 main.py
|
||||
```
|
||||
Then visit http://localhost:5000/
|
||||
|
||||
Test search functionality:
|
||||
```python
|
||||
from main import search_flickr
|
||||
photos = search_flickr("Big Ben")
|
||||
print(len(photos), photos[0].title, photos[0].license_name)
|
||||
```
|
||||
|
||||
## Potential Improvements
|
||||
|
||||
- Add pagination for search results (currently shows ~25 photos)
|
||||
- Cache search results to reduce Flickr requests
|
||||
- Add filtering by license type
|
||||
- Handle Flickr rate limiting/blocks more gracefully
|
||||
- Add tests for the parsing logic
|
||||
18
README.md
18
README.md
|
|
@ -19,14 +19,7 @@ primary purpose is to simplify the process of discovering and contacting
|
|||
photographers on Flickr whose photos can be used to enhance Wikipedia articles.
|
||||
|
||||
### Key Features
|
||||
- **Integrated Flickr search**: Enter a Wikipedia article title and see Flickr
|
||||
photos directly in the interface - no need to visit Flickr's search page.
|
||||
- **Photo grid with metadata**: Search results display as a grid of thumbnails
|
||||
showing the photographer's name and license for each photo.
|
||||
- **License highlighting**: Photos with Wikipedia-compatible licenses (CC BY,
|
||||
CC BY-SA, CC0, Public Domain) are highlighted with a green badge.
|
||||
- **One-click message composition**: Click any photo to compose a permission
|
||||
request message with the photo displayed alongside.
|
||||
- Search for Flickr photos related to specific Wikipedia articles.
|
||||
- Generate messages to request permission to use photos on Wikipedia.
|
||||
- Handle exceptions gracefully and provide detailed error information.
|
||||
|
||||
|
|
@ -36,11 +29,10 @@ To use the tool, follow these steps:
|
|||
|
||||
1. Start the tool by running the script.
|
||||
2. Access the tool through a web browser.
|
||||
3. Enter the Wikipedia article title or URL.
|
||||
4. Browse the Flickr search results displayed in the interface.
|
||||
5. Click on a photo to select it and compose a permission request message.
|
||||
6. Copy the subject and message, then click "Send message on Flickr" to contact
|
||||
the photographer.
|
||||
3. Enter the Wikipedia URL for the article you want to find photos for.
|
||||
4. Optionally, provide a Flickr URL if you already have one in mind.
|
||||
5. The tool will extract relevant information and generate a message for you to
|
||||
request permission to use the photo on Wikipedia.
|
||||
|
||||
## Error Handling
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue