Metadata-Version: 2.4
Name: seekit
Version: 0.0.1
Summary: Python API for various search engines
Author-email: lexiforest <infinitesheldon@gmail.com>
License-Expression: MIT
Project-URL: repository, https://github.com/riverside-ai/seekit
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: curl-cffi>=0.14.0
Requires-Dist: lxml_html_clean>=0.4.2
Requires-Dist: lxml>=5.3.2
Requires-Dist: pydantic>=2.0.0
Requires-Dist: PyYAML>=6.0
Provides-Extra: extra
Requires-Dist: readability-lxml>=0.8.1; extra == "extra"
Requires-Dist: markdownify>=1.1.0; extra == "extra"
Provides-Extra: dev
Requires-Dist: charset_normalizer<4.0,>=3.3.2; extra == "dev"
Requires-Dist: coverage<7.0,>=6.4.1; extra == "dev"
Requires-Dist: cryptography<43.0,>=42.0.5; extra == "dev"
Requires-Dist: httpx==0.23.1; extra == "dev"
Requires-Dist: mypy<2.0,>=1.9.0; extra == "dev"
Requires-Dist: pytest<9.0,>=8.1.1; extra == "dev"
Requires-Dist: pytest-asyncio<1.0,>=0.23.6; extra == "dev"
Requires-Dist: pytest-trio<1.0,>=0.8.0; extra == "dev"
Requires-Dist: ruff<1.0,>=0.3.5; extra == "dev"
Requires-Dist: trio<1.0,>=0.25.0; extra == "dev"
Requires-Dist: trustme<2.0,>=1.1.0; extra == "dev"
Requires-Dist: uvicorn<1.0,>=0.29.0; extra == "dev"
Requires-Dist: websockets<13.0,>=12.0; extra == "dev"
Requires-Dist: typing_extensions; extra == "dev"
Provides-Extra: build
Requires-Dist: cibuildwheel; extra == "build"
Requires-Dist: wheel; extra == "build"
Provides-Extra: test
Requires-Dist: charset_normalizer<4.0,>=3.3.2; extra == "test"
Requires-Dist: cryptography<43.0,>=42.0.5; extra == "test"
Requires-Dist: fastapi<1.0,==0.110.0; extra == "test"
Requires-Dist: httpx==0.23.1; extra == "test"
Requires-Dist: proxy.py<3.0,>=2.4.3; extra == "test"
Requires-Dist: pytest<9.0,>=8.1.1; extra == "test"
Requires-Dist: pytest-asyncio<1.0,>=0.23.6; extra == "test"
Requires-Dist: pytest-trio<1.0,>=0.8.0; extra == "test"
Requires-Dist: python-multipart<1.0,>=0.0.9; extra == "test"
Requires-Dist: trio<1.0,>=0.25.0; extra == "test"
Requires-Dist: trustme<2.0,>=1.1.0; extra == "test"
Requires-Dist: uvicorn<1.0,>=0.29.0; extra == "test"
Requires-Dist: websockets<13.0,>=12.0; extra == "test"
Requires-Dist: typing_extensions; extra == "test"
Dynamic: license-file

# seekit

`seekit` wraps multiple search providers behind a common `SerpItem` model and can search
live using `curl_cffi` request templates derived from captured HAR files.

Supported providers:

- Baidu
- Bilibili
- Bing
- Brave
- Douyin
- DuckDuckGo
- Google
- Reddit
- So.com
- Sogou
- Threads
- TikTok
- Toutiao
- Weibo
- Yandex
- YouTube
- Zhihu

## Install

```bash
uv add seekit
```

For the CLI:

```bash
uv tool install seekit
```

## Usage

Search live:

```python
import seekit

results = seekit.search("latest OpenAI reasoning model", provider="google")
for item in results[:3]:
    print(item.provider, item.title, item.url)
```

CLI:

```bash
seekit tiktok OpenAI
seekit google latest OpenAI reasoning model --limit 5
```

Each parsed item uses the shared pydantic model:

```python
class SerpItem(BaseModel):
    provider: str
    title: str | None
    excerpt: str | None
    url: str | None
    author: str | None
    cover_url: str | None
```

Fixture parsing is still available for tests and parser debugging:

```python
from pathlib import Path

results = seekit.parse_har("google", Path("data/pages/google.har"))
```

## Development

```bash
uv run pytest
```

Tests read the HAR fixtures under [`data/pages`](./data/pages), verify the normalized item
shape, and validate that live request templates substitute the search keyword correctly.

## Release

```bash
make publish-testpypi
make publish-pypi
```

These targets build with `uv build` and publish with `uvx uv-publish`.
