server/posts: expose reverse image search

This commit is contained in:
rr- 2016-12-26 14:21:26 +01:00
parent 1a59a74d63
commit a7a5cc8180
3 changed files with 68 additions and 0 deletions

52
API.md
View file

@ -42,6 +42,7 @@
- [Removing post from favorites](#removing-post-from-favorites)
- [Getting featured post](#getting-featured-post)
- [Featuring post](#featuring-post)
- [Reverse image search](#reverse-image-search)
- Comments
- [Listing comments](#listing-comments)
- [Creating comment](#creating-comment)
@ -76,6 +77,7 @@
- [Snapshot](#snapshot)
- [Unpaged search result](#unpaged-search-result)
- [Paged search result](#paged-search-result)
- [Image search result](#image-search-result)
4. [Search](#search)
@ -1057,6 +1059,28 @@ data.
Features a post on the main page in web client.
## Reverse image search
- **Request**
`POST /posts/reverse-search`
- **Files**
- `content` - the image to search for.
- **Output**
A list of [image search results](#image-search-result).
- **Errors**
- privileges are too low
- **Description**
Retrieves posts that look like the input image. Works only on images and
animations, i.e. does not work for videos and Flash movies.
## Listing comments
- **Request**
@ -2118,6 +2142,34 @@ A result of search operation that involves paging.
details on this field, check the documentation for given API call.
## Image search result
**Description**
A result of reverse image search operation.
**Structure**
```json5
{
"results": [
{
"dist": <distance>,
"post": <post>
},
{
"dist": <distance>,
"post": <post>
},
...
]
}
```
**Field meaning**
- `<dist>`: distance from the original image (0..1). The lower this value is, the more similar the
post is.
- `<post>`: a [post resource](#post).
# Search
Search queries are built of tokens that are separated by spaces. Each token can

View file

@ -73,6 +73,7 @@ privileges:
'posts:create:anonymous': regular
'posts:create:identified': regular
'posts:list': anonymous
'posts:reverse_search': regular
'posts:view': anonymous
'posts:edit:content': power
'posts:edit:flags': regular

View file

@ -205,3 +205,18 @@ def get_posts_around(ctx, params):
_search_executor.config.user = ctx.user
return _search_executor.get_around_and_serialize(
ctx, params['post_id'], lambda post: _serialize_post(ctx, post))
@routes.post('/posts/reverse-search/?')
def get_posts_by_image(ctx, _params=None):
auth.verify_privilege(ctx.user, 'posts:reverse_search')
content = ctx.get_file('content', required=True)
return {
'results': [
{
'dist': item['dist'],
'post': _serialize_post(ctx, item['post']),
}
for item in posts.search_by_image(content)
],
}