205 lines
8.8 KiB
Markdown
205 lines
8.8 KiB
Markdown
# Aniworld Web Application Development Instructions
|
||
|
||
This document provides detailed tasks for AI agents to implement a modern web application for the Aniworld anime download manager. All tasks should follow the coding guidelines specified in the project's copilot instructions.
|
||
|
||
## Project Overview
|
||
|
||
The goal is to create a FastAPI-based web application that provides a modern interface for the existing Aniworld anime download functionality. The core anime logic should remain in `SeriesApp.py` while the web layer provides REST API endpoints and a responsive UI.
|
||
|
||
## Architecture Principles
|
||
|
||
- **Single Responsibility**: Each file/class has one clear purpose
|
||
- **Dependency Injection**: Use FastAPI's dependency system
|
||
- **Clean Separation**: Web layer calls core logic, never the reverse
|
||
- **File Size Limit**: Maximum 500 lines per file
|
||
- **Type Hints**: Use comprehensive type annotations
|
||
- **Error Handling**: Proper exception handling and logging
|
||
|
||
## Additional Implementation Guidelines
|
||
|
||
### Code Style and Standards
|
||
|
||
- **Type Hints**: Use comprehensive type annotations throughout all modules
|
||
- **Docstrings**: Follow PEP 257 for function and class documentation
|
||
- **Error Handling**: Implement custom exception classes with meaningful messages
|
||
- **Logging**: Use structured logging with appropriate log levels
|
||
- **Security**: Validate all inputs and sanitize outputs
|
||
- **Performance**: Use async/await patterns for I/O operations
|
||
|
||
## 📞 Escalation
|
||
|
||
If you encounter:
|
||
|
||
- Architecture issues requiring design decisions
|
||
- Tests that conflict with documented requirements
|
||
- Breaking changes needed
|
||
- Unclear requirements or expectations
|
||
|
||
**Document the issue and escalate rather than guessing.**
|
||
|
||
---
|
||
|
||
## <20> Credentials
|
||
|
||
**Admin Login:**
|
||
|
||
- Username: `admin`
|
||
- Password: `Hallo123!`
|
||
|
||
---
|
||
|
||
## <20>📚 Helpful Commands
|
||
|
||
```bash
|
||
# Run all tests
|
||
conda run -n AniWorld python -m pytest tests/ -v --tb=short
|
||
|
||
# Run specific test file
|
||
conda run -n AniWorld python -m pytest tests/unit/test_websocket_service.py -v
|
||
|
||
# Run specific test class
|
||
conda run -n AniWorld python -m pytest tests/unit/test_websocket_service.py::TestWebSocketService -v
|
||
|
||
# Run specific test
|
||
conda run -n AniWorld python -m pytest tests/unit/test_websocket_service.py::TestWebSocketService::test_broadcast_download_progress -v
|
||
|
||
# Run with extra verbosity
|
||
conda run -n AniWorld python -m pytest tests/ -vv
|
||
|
||
# Run with full traceback
|
||
conda run -n AniWorld python -m pytest tests/ -v --tb=long
|
||
|
||
# Run and stop at first failure
|
||
conda run -n AniWorld python -m pytest tests/ -v -x
|
||
|
||
# Run tests matching pattern
|
||
conda run -n AniWorld python -m pytest tests/ -v -k "auth"
|
||
|
||
# Show all print statements
|
||
conda run -n AniWorld python -m pytest tests/ -v -s
|
||
|
||
#Run app
|
||
conda run -n AniWorld python -m uvicorn src.server.fastapi_app:app --host 127.0.0.1 --port 8000 --reload
|
||
```
|
||
|
||
---
|
||
|
||
## Implementation Notes
|
||
|
||
1. **Incremental Development**: Implement features incrementally, testing each component thoroughly before moving to the next
|
||
2. **Code Review**: Review all generated code for adherence to project standards
|
||
3. **Documentation**: Document all public APIs and complex logic
|
||
4. **Testing**: Maintain test coverage above 80% for all new code
|
||
5. **Performance**: Profile and optimize critical paths, especially download and streaming operations
|
||
6. **Security**: Regular security audits and dependency updates
|
||
7. **Monitoring**: Implement comprehensive monitoring and alerting
|
||
8. **Maintenance**: Plan for regular maintenance and updates
|
||
|
||
---
|
||
|
||
## Task Completion Checklist
|
||
|
||
For each task completed:
|
||
|
||
- [ ] Implementation follows coding standards
|
||
- [ ] Unit tests written and passing
|
||
- [ ] Integration tests passing
|
||
- [ ] Documentation updated
|
||
- [ ] Error handling implemented
|
||
- [ ] Logging added
|
||
- [ ] Security considerations addressed
|
||
- [ ] Performance validated
|
||
- [ ] Code reviewed
|
||
- [ ] Task marked as complete in instructions.md
|
||
- [ ] Infrastructure.md updated and other docs
|
||
- [ ] Changes committed to git; keep your messages in git short and clear
|
||
- [ ] Take the next task
|
||
|
||
---
|
||
|
||
## TODO List:
|
||
|
||
fix:
|
||
|
||
INFO: 127.0.0.1:34916 - "POST /api/anime/search HTTP/1.1" 200
|
||
INFO: 127.0.0.1:34916 - "POST /api/anime/add HTTP/1.1" 500
|
||
ERROR: Exception in ASGI application
|
||
Traceback (most recent call last):
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/anyio/streams/memory.py", line 98, in receive
|
||
return self.receive_nowait()
|
||
~~~~~~~~~~~~~~~~~~~^^
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/anyio/streams/memory.py", line 93, in receive_nowait
|
||
raise WouldBlock
|
||
anyio.WouldBlock
|
||
|
||
During handling of the above exception, another exception occurred:
|
||
|
||
Traceback (most recent call last):
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/starlette/middleware/base.py", line 78, in call_next
|
||
message = await recv_stream.receive()
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/anyio/streams/memory.py", line 118, in receive
|
||
raise EndOfStream
|
||
anyio.EndOfStream
|
||
|
||
During handling of the above exception, another exception occurred:
|
||
|
||
Traceback (most recent call last):
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/uvicorn/protocols/http/httptools_impl.py", line 426, in run_asgi
|
||
result = await app( # type: ignore[func-returns-value]
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
self.scope, self.receive, self.send
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
)
|
||
^
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/uvicorn/middleware/proxy_headers.py", line 84, in **call**
|
||
return await self.app(scope, receive, send)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/fastapi/applications.py", line 1106, in **call**
|
||
await super().**call**(scope, receive, send)
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/starlette/applications.py", line 122, in **call**
|
||
await self.middleware_stack(scope, receive, send)
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/starlette/middleware/errors.py", line 184, in **call**
|
||
raise exc
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/starlette/middleware/errors.py", line 162, in **call**
|
||
await self.app(scope, receive, \_send)
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/starlette/middleware/base.py", line 108, in **call**
|
||
response = await self.dispatch_func(request, call_next)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "/home/lukas/Volume/repo/Aniworld/src/server/middleware/auth.py", line 209, in dispatch
|
||
return await call_next(request)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/starlette/middleware/base.py", line 84, in call_next
|
||
raise app_exc
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/starlette/middleware/base.py", line 70, in coro
|
||
await self.app(scope, receive_or_disconnect, send_no_error)
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/starlette/middleware/base.py", line 108, in **call**
|
||
response = await self.dispatch_func(request, call_next)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "/home/lukas/Volume/repo/Aniworld/src/server/middleware/setup_redirect.py", line 120, in dispatch
|
||
return await call_next(request)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/starlette/middleware/base.py", line 84, in call_next
|
||
raise app_exc
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/starlette/middleware/base.py", line 70, in coro
|
||
await self.app(scope, receive_or_disconnect, send_no_error)
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/starlette/middleware/cors.py", line 91, in **call**
|
||
await self.simple_response(scope, receive, send, request_headers=headers)
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/starlette/middleware/cors.py", line 146, in simple_response
|
||
await self.app(scope, receive, send)
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/starlette/middleware/exceptions.py", line 79, in **call**
|
||
raise exc
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/starlette/middleware/exceptions.py", line 68, in **call**
|
||
await self.app(scope, receive, sender)
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/site-packages/fastapi/middleware/asyncexitstack.py", line 14, in **call**
|
||
async with AsyncExitStack() as stack:
|
||
~~~~~~~~~~~~~~^^
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/contextlib.py", line 768, in **aexit**
|
||
raise exc
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/contextlib.py", line 751, in **aexit**
|
||
cb_suppress = await cb(\*exc_details)
|
||
^^^^^^^^^^^^^^^^^^^^^^
|
||
File "/home/lukas/miniconda3/envs/AniWorld/lib/python3.13/contextlib.py", line 271, in **aexit**
|
||
raise RuntimeError("generator didn't stop after athrow()")
|
||
RuntimeError: generator didn't stop after athrow()
|