193 lines
5.2 KiB
Markdown
193 lines
5.2 KiB
Markdown
# Seanime Development and Build Guide
|
|
|
|
## Prerequisites
|
|
|
|
- Go 1.23+
|
|
- Node.js 18+ and npm
|
|
|
|
## Build Process
|
|
|
|
### 1. Building the Web Interface
|
|
|
|
1. Build the web interface:
|
|
```bash
|
|
npm run build
|
|
```
|
|
|
|
2. After the build completes, a new `out` directory will be created inside `seanime-web`.
|
|
|
|
3. Move the contents of the `out` directory to a new `web` directory at the root of the project.
|
|
|
|
### 2. Building the Server
|
|
|
|
Choose the appropriate command based on your target platform:
|
|
|
|
1. **Windows (System Tray)**:
|
|
```bash
|
|
set CGO_ENABLED=1
|
|
go build -o seanime.exe -trimpath -ldflags="-s -w -H=windowsgui -extldflags '-static'"
|
|
```
|
|
|
|
2. **Windows (No System Tray)** - Used by the desktop app:
|
|
```bash
|
|
go build -o seanime.exe -trimpath -ldflags="-s -w" -tags=nosystray
|
|
```
|
|
|
|
3. **Linux/macOS**:
|
|
```bash
|
|
go build -o seanime -trimpath -ldflags="-s -w"
|
|
```
|
|
|
|
**Important**: The web interface must be built first before building the server.
|
|
|
|
---
|
|
|
|
## Development Guide
|
|
|
|
### Getting Started
|
|
|
|
The project is built with:
|
|
- Backend: Go server with REST API endpoints
|
|
- Frontend: React/Next.js web interface
|
|
|
|
For development, you should be familiar with both Go and React.
|
|
|
|
### Setting Up the Development Environment
|
|
|
|
#### Server Development
|
|
|
|
1. **Development environment**:
|
|
- Create a dummy directory that will be used as the data directory during development.
|
|
- Create a dummy `web` folder at the root containing at least one file, or simply do the _Building the Web Interface_ step of the build process. (This is required for the server to start.)
|
|
|
|
2. **Run the server**:
|
|
```bash
|
|
go run main.go --datadir="path/to/datadir"
|
|
```
|
|
|
|
- This will generate all the files needed in the `path/to/datadir` directory.
|
|
|
|
3. **Configure the development server**:
|
|
- Change the port in the `config.toml` located in the development data directory to `43000`. The web interface will connect to this port during development. Change the host to `0.0.0.0` to allow connections from other devices.
|
|
- Re-run the server with the updated configuration.
|
|
|
|
The server will be available at `http://127.0.0.1:43000`.
|
|
|
|
#### Web Interface Development
|
|
|
|
1. **Navigate to the web directory**:
|
|
```bash
|
|
cd seanime-web
|
|
```
|
|
|
|
2. **Install dependencies**:
|
|
```bash
|
|
npm install
|
|
```
|
|
|
|
3. **Start the development server**:
|
|
```bash
|
|
npm run dev
|
|
```
|
|
|
|
The development web interface will be accessible at `http://127.0.0.1:43210`.
|
|
|
|
**Note**: During development, the web interface is served by the Next.js development server on port `43210`.
|
|
The Next.js development environment is configured such that all requests are made to the Go server running on port `43000`.
|
|
|
|
### Understanding the Codebase Architecture
|
|
|
|
#### API and Route Handlers
|
|
|
|
The backend follows a well-defined structure:
|
|
|
|
1. **Routes Declaration**:
|
|
- All routes are registered in `internal/handlers/routes.go`
|
|
- Each route is associated with a specific handler method
|
|
|
|
2. **Handler Implementation**:
|
|
- Handler methods are defined in `internal/handlers/` directory
|
|
- Handlers are documented with comments above each declaration (similar to OpenAPI)
|
|
|
|
3. **Automated Type Generation**:
|
|
- The comments above route handlers serve as documentation for automatic type generation
|
|
- Types for the frontend are generated in:
|
|
- `seanime-web/api/generated/types.ts`
|
|
- `seanime-web/api/generated/endpoint.types.ts`
|
|
- `seanime-web/api/generated/hooks_template.ts`
|
|
|
|
#### Updating API Types
|
|
|
|
After modifying route handlers or structs used by the frontend, you must regenerate the TypeScript types:
|
|
|
|
```bash
|
|
# Run the code generator
|
|
go generate ./codegen/main.go
|
|
```
|
|
|
|
#### AniList GraphQL API Integration
|
|
|
|
The project integrates with the AniList GraphQL API:
|
|
|
|
1. **GraphQL Queries**:
|
|
- Queries are defined in `internal/anilist/queries/*.graphql`
|
|
- Generated using `gqlgenc`
|
|
|
|
2. **Updating GraphQL Schema**:
|
|
If you modify the GraphQL schema, run these commands:
|
|
|
|
```bash
|
|
go get github.com/Yamashou/gqlgenc@v0.25.4
|
|
```
|
|
```bash
|
|
cd internal/api/anilist
|
|
```
|
|
```bash
|
|
go run github.com/Yamashou/gqlgenc
|
|
```
|
|
```bash
|
|
cd ../../..
|
|
```
|
|
```bash
|
|
go mod tidy
|
|
```
|
|
|
|
3. **Client Implementation**:
|
|
- Generated queries and types are in `internal/api/anilist/client_gen.go`
|
|
- A wrapper implementation in `internal/api/anilist/client.go` provides a cleaner interface
|
|
- The wrapper also includes a mock client for testing
|
|
|
|
### Running Tests
|
|
|
|
**Important**: Run tests individually rather than all at once.
|
|
|
|
#### Test Configuration
|
|
|
|
1. Create a dummy AniList account for testing
|
|
2. Obtain an access token (from browser)
|
|
3. Create/edit `test/config.toml` using `config.example.toml` as a template
|
|
|
|
#### Writing Tests
|
|
|
|
Tests use the `test_utils` package which provides:
|
|
- `InitTestProvider` method to initialize the test configuration
|
|
- Flags to enable/disable specific test categories
|
|
|
|
Example:
|
|
```go
|
|
func TestSomething(t *testing.T) {
|
|
test_utils.InitTestProvider(t, test_utils.Anilist())
|
|
// Test code here
|
|
}
|
|
```
|
|
|
|
#### Testing with Third-Party Apps
|
|
|
|
Some tests interact with applications like Transmission and qBittorrent:
|
|
- Ensure these applications are installed and running
|
|
- Configure `test/config.toml` with appropriate connection details
|
|
|
|
## Notes and Warnings
|
|
|
|
- hls.js versions 1.6.0 and above may cause appendBuffer fatal errors
|