Compare commits

...

6 Commits

Author SHA1 Message Date
Benexl
8aacbcc35b Update README.md 2025-08-16 19:11:21 +03:00
Benexl
5976ab43b2 chore: correct package issues 2025-08-16 19:08:39 +03:00
Benexl
99c67a4bc0 fix: publish.yml 2025-08-16 19:00:44 +03:00
Benexl
34851fd3e4 chore: update publish.yml 2025-08-16 18:58:59 +03:00
Benexl
e74b5977bb chore: update workflow 2025-08-16 18:56:31 +03:00
Benexl
0650f45fba revert 2025-08-16 18:55:33 +03:00
248 changed files with 107 additions and 111 deletions

View File

@@ -3,6 +3,8 @@ name: Upload Python Package
on:
release:
types: [published]
workflow_dispatch:
types: [published]
permissions:
contents: read
@@ -42,12 +44,6 @@ jobs:
# IMPORTANT: this permission is mandatory for trusted publishing
id-token: write
# Dedicated environments with protections for publishing are strongly recommended.
environment:
name: pypi
# OPTIONAL: uncomment and update to include your PyPI project URL in the deployment status:
# url: https://pypi.org/p/YOURPROJECT
steps:
- name: Retrieve release distributions
uses: actions/download-artifact@v4

View File

@@ -8,8 +8,8 @@
</p>
<div align="center">
[![PyPI - Version](https://img.shields.io/pypi/v/viu)](https://pypi.org/project/viu/)
[![PyPI - Downloads](https://img.shields.io/pypi/dm/viu)](https://pypi.org/project/viu/)
[![PyPI - Version](https://img.shields.io/pypi/v/viu)](https://pypi.org/project/viu_cli/)
[![PyPI - Downloads](https://img.shields.io/pypi/dm/viu_cli)](https://pypi.org/project/viu_cli/)
[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/Benexl/Viu/test.yml?label=Tests)](https://github.com/Benexl/Viu/actions)
[![Discord](https://img.shields.io/discord/1250887070906323096?label=Discord&logo=discord)](https://discord.gg/HBEmAwvbHV)
[![GitHub Issues](https://img.shields.io/github/issues/Benexl/Viu)](https://github.com/Benexl/Viu/issues)
@@ -98,13 +98,13 @@ The best way to install Viu is with [**uv**](https://github.com/astral-sh/uv), a
```bash
# Install with all optional features for the full experience
uv tool install "viu[standard]"
uv tool install "viu_cli[standard]"
# Or, pick and choose the extras you need:
uv tool install viu # Core functionality only
uv tool install "viu[download]" # For advanced downloading with yt-dlp
uv tool install "viu[discord]" # For Discord Rich Presence
uv tool install "viu[notifications]" # For desktop notifications
uv tool install viu_cli # Core functionality only
uv tool install "viu_cli[download]" # For advanced downloading with yt-dlp
uv tool install "viu_cli[discord]" # For Discord Rich Presence
uv tool install "viu_cli[notifications]" # For desktop notifications
```
### Other Installation Methods
@@ -129,12 +129,12 @@ uv tool install "viu[notifications]" # For desktop notifications
#### Using pipx (for isolated environments)
```bash
pipx install "viu[standard]"
pipx install "viu_cli[standard]"
```
#### Using pip
```bash
pip install "viu[standard]"
pip install "viu_cli[standard]"
```
</details>

2
fa
View File

@@ -3,4 +3,4 @@ provider_type=$1
provider_name=$2
[ -z "$provider_type" ] && echo "Please specify provider type" && exit
[ -z "$provider_name" ] && echo "Please specify provider type" && exit
uv run python -m viu.libs.provider.${provider_type}.${provider_name}.provider
uv run python -m viu_cli.libs.provider.${provider_type}.${provider_name}.provider

View File

@@ -1,5 +1,5 @@
[project]
name = "viu-cli"
name = "viu_cli"
version = "3.1.0"
description = "A browser anime site experience from the terminal"
license = "UNLICENSE"
@@ -14,7 +14,7 @@ dependencies = [
]
[project.scripts]
viu = 'viu:Cli'
viu = 'viu_cli:Cli'
[project.optional-dependencies]
standard = [

View File

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

Before

Width:  |  Height:  |  Size: 276 KiB

After

Width:  |  Height:  |  Size: 276 KiB

View File

@@ -44,7 +44,7 @@ commands = {
@click.group(
cls=LazyGroup,
root="viu.cli.commands",
root="viu_cli.cli.commands",
invoke_without_command=True,
lazy_subcommands=commands,
context_settings=dict(auto_envvar_prefix=PROJECT_NAME),

View File

@@ -18,7 +18,7 @@ commands = {
@click.group(
cls=LazyGroup,
name="anilist",
root="viu.cli.commands.anilist.commands",
root="viu_cli.cli.commands.anilist.commands",
invoke_without_command=True,
help="A beautiful interface that gives you access to a commplete streaming experience",
short_help="Access all streaming options",

View File

@@ -1,10 +1,10 @@
from typing import TYPE_CHECKING, Dict, List
import click
from viu.cli.utils.completion import anime_titles_shell_complete
from viu.core.config import AppConfig
from viu.core.exceptions import ViuError
from viu.libs.media_api.types import (
from viu_cli.cli.utils.completion import anime_titles_shell_complete
from viu_cli.core.config import AppConfig
from viu_cli.core.exceptions import ViuError
from viu_cli.libs.media_api.types import (
MediaFormat,
MediaGenre,
MediaItem,
@@ -112,15 +112,15 @@ if TYPE_CHECKING:
)
@click.pass_obj
def download(config: AppConfig, **options: "Unpack[DownloadOptions]"):
from viu.cli.service.download.service import DownloadService
from viu.cli.service.feedback import FeedbackService
from viu.cli.service.registry import MediaRegistryService
from viu.cli.service.watch_history import WatchHistoryService
from viu.cli.utils.parser import parse_episode_range
from viu.libs.media_api.api import create_api_client
from viu.libs.media_api.params import MediaSearchParams
from viu.libs.provider.anime.provider import create_provider
from viu.libs.selectors import create_selector
from viu_cli.cli.service.download.service import DownloadService
from viu_cli.cli.service.feedback import FeedbackService
from viu_cli.cli.service.registry import MediaRegistryService
from viu_cli.cli.service.watch_history import WatchHistoryService
from viu_cli.cli.utils.parser import parse_episode_range
from viu_cli.libs.media_api.api import create_api_client
from viu_cli.libs.media_api.params import MediaSearchParams
from viu_cli.libs.provider.anime.provider import create_provider
from viu_cli.libs.selectors import create_selector
from rich.progress import Progress
feedback = FeedbackService(config)

View File

@@ -1,5 +1,5 @@
import click
from viu.core.config import AppConfig
from viu_cli.core.config import AppConfig
from rich.console import Console
from rich.table import Table
@@ -11,8 +11,8 @@ def notifications(config: AppConfig):
Displays unread notifications from AniList.
Running this command will also mark the notifications as read on the AniList website.
"""
from viu.cli.service.feedback import FeedbackService
from viu.libs.media_api.api import create_api_client
from viu_cli.cli.service.feedback import FeedbackService
from viu_cli.libs.media_api.api import create_api_client
from ....service.auth import AuthService

View File

@@ -3,7 +3,7 @@ from typing import TYPE_CHECKING
import click
if TYPE_CHECKING:
from viu.core.config import AppConfig
from viu_cli.core.config import AppConfig
@click.command(help="Print out your anilist stats")

View File

@@ -11,7 +11,7 @@ if TYPE_CHECKING:
from pathlib import Path
from typing import TypedDict
from viu.cli.service.feedback.service import FeedbackService
from viu_cli.cli.service.feedback.service import FeedbackService
from typing_extensions import Unpack
from ...libs.provider.anime.base import BaseAnimeProvider
@@ -103,7 +103,7 @@ if TYPE_CHECKING:
)
@click.pass_obj
def download(config: AppConfig, **options: "Unpack[Options]"):
from viu.cli.service.feedback.service import FeedbackService
from viu_cli.cli.service.feedback.service import FeedbackService
from ...core.exceptions import ViuError
from ...libs.provider.anime.params import (

View File

@@ -1,7 +1,7 @@
import click
from viu.core.config import AppConfig
from viu.core.exceptions import ViuError
from viu.libs.media_api.types import (
from viu_cli.core.config import AppConfig
from viu_cli.core.exceptions import ViuError
from viu_cli.libs.media_api.types import (
MediaFormat,
MediaGenre,
MediaItem,
@@ -72,14 +72,14 @@ def queue(config: AppConfig, **options):
and queue the specified episode range for background download.
The background worker should be running to process the queue.
"""
from viu.cli.service.download.service import DownloadService
from viu.cli.service.feedback import FeedbackService
from viu.cli.service.registry import MediaRegistryService
from viu.cli.utils.parser import parse_episode_range
from viu.libs.media_api.params import MediaSearchParams
from viu.libs.media_api.api import create_api_client
from viu.libs.provider.anime.provider import create_provider
from viu.libs.selectors import create_selector
from viu_cli.cli.service.download.service import DownloadService
from viu_cli.cli.service.feedback import FeedbackService
from viu_cli.cli.service.registry import MediaRegistryService
from viu_cli.cli.utils.parser import parse_episode_range
from viu_cli.libs.media_api.params import MediaSearchParams
from viu_cli.libs.media_api.api import create_api_client
from viu_cli.libs.provider.anime.provider import create_provider
from viu_cli.libs.selectors import create_selector
from rich.progress import Progress
feedback = FeedbackService(config)

View File

@@ -13,7 +13,7 @@ commands = {
@click.group(
cls=LazyGroup,
name="queue",
root="viu.cli.commands.queue.commands",
root="viu_cli.cli.commands.queue.commands",
invoke_without_command=False,
help="Manage the download queue (add, list, resume, clear).",
short_help="Manage the download queue.",

View File

@@ -1,7 +1,7 @@
import click
from viu.core.config import AppConfig
from viu.core.exceptions import ViuError
from viu.libs.media_api.types import (
from viu_cli.core.config import AppConfig
from viu_cli.core.exceptions import ViuError
from viu_cli.libs.media_api.types import (
MediaFormat,
MediaGenre,
MediaItem,
@@ -70,14 +70,14 @@ from viu.libs.media_api.types import (
)
@click.pass_obj
def add(config: AppConfig, **options):
from viu.cli.service.download import DownloadService
from viu.cli.service.feedback import FeedbackService
from viu.cli.service.registry import MediaRegistryService
from viu.cli.utils.parser import parse_episode_range
from viu.libs.media_api.api import create_api_client
from viu.libs.media_api.params import MediaSearchParams
from viu.libs.provider.anime.provider import create_provider
from viu.libs.selectors import create_selector
from viu_cli.cli.service.download import DownloadService
from viu_cli.cli.service.feedback import FeedbackService
from viu_cli.cli.service.registry import MediaRegistryService
from viu_cli.cli.utils.parser import parse_episode_range
from viu_cli.libs.media_api.api import create_api_client
from viu_cli.libs.media_api.params import MediaSearchParams
from viu_cli.libs.provider.anime.provider import create_provider
from viu_cli.libs.selectors import create_selector
from rich.progress import Progress
feedback = FeedbackService(config)
@@ -149,7 +149,7 @@ def add(config: AppConfig, **options):
}
preview_command = None
if config.general.preview != "none":
from viu.cli.utils.preview import create_preview_context
from viu_cli.cli.utils.preview import create_preview_context
with create_preview_context() as preview_ctx:
preview_command = preview_ctx.get_anime_preview(

View File

@@ -1,14 +1,14 @@
import click
from viu.core.config import AppConfig
from viu_cli.core.config import AppConfig
@click.command(name="clear", help="Clear queued items from the registry (QUEUED -> NOT_DOWNLOADED).")
@click.option("--force", is_flag=True, help="Do not prompt for confirmation.")
@click.pass_obj
def clear_cmd(config: AppConfig, force: bool):
from viu.cli.service.feedback import FeedbackService
from viu.cli.service.registry import MediaRegistryService
from viu.cli.service.registry.models import DownloadStatus
from viu_cli.cli.service.feedback import FeedbackService
from viu_cli.cli.service.registry import MediaRegistryService
from viu_cli.cli.service.registry.models import DownloadStatus
feedback = FeedbackService(config)
registry = MediaRegistryService(config.general.media_api, config.media_registry)

View File

@@ -1,5 +1,5 @@
import click
from viu.core.config import AppConfig
from viu_cli.core.config import AppConfig
@click.command(name="list", help="List items in the download queue and their statuses.")
@@ -10,9 +10,9 @@ from viu.core.config import AppConfig
@click.option("--detailed", is_flag=True)
@click.pass_obj
def list_cmd(config: AppConfig, status: str | None, detailed: bool | None):
from viu.cli.service.feedback import FeedbackService
from viu.cli.service.registry import MediaRegistryService
from viu.cli.service.registry.models import DownloadStatus
from viu_cli.cli.service.feedback import FeedbackService
from viu_cli.cli.service.registry import MediaRegistryService
from viu_cli.cli.service.registry.models import DownloadStatus
feedback = FeedbackService(config)
registry = MediaRegistryService(config.general.media_api, config.media_registry)

View File

@@ -1,15 +1,15 @@
import click
from viu.core.config import AppConfig
from viu_cli.core.config import AppConfig
@click.command(name="resume", help="Submit any queued or in-progress downloads to the worker.")
@click.pass_obj
def resume(config: AppConfig):
from viu.cli.service.download.service import DownloadService
from viu.cli.service.feedback import FeedbackService
from viu.cli.service.registry import MediaRegistryService
from viu.libs.media_api.api import create_api_client
from viu.libs.provider.anime.provider import create_provider
from viu_cli.cli.service.download.service import DownloadService
from viu_cli.cli.service.feedback import FeedbackService
from viu_cli.cli.service.registry import MediaRegistryService
from viu_cli.libs.media_api.api import create_api_client
from viu_cli.libs.provider.anime.provider import create_provider
feedback = FeedbackService(config)
media_api = create_api_client(config.general.media_api, config)

View File

@@ -19,7 +19,7 @@ commands = {
@click.group(
cls=LazyGroup,
name="registry",
root="viu.cli.commands.registry.commands",
root="viu_cli.cli.commands.registry.commands",
invoke_without_command=True,
help="Manage your local media registry - sync, search, backup and maintain your anime database",
short_help="Local media registry management",

View File

@@ -3,8 +3,8 @@ Registry sync command - synchronize local registry with remote media API
"""
import click
from viu.cli.service.feedback.service import FeedbackService
from viu.cli.service.registry.service import MediaRegistryService
from viu_cli.cli.service.feedback.service import FeedbackService
from viu_cli.cli.service.registry.service import MediaRegistryService
from .....core.config import AppConfig

View File

@@ -10,7 +10,7 @@ from . import examples
if TYPE_CHECKING:
from typing import TypedDict
from viu.cli.service.feedback.service import FeedbackService
from viu_cli.cli.service.feedback.service import FeedbackService
from typing_extensions import Unpack
from ...libs.provider.anime.base import BaseAnimeProvider
@@ -42,7 +42,7 @@ if TYPE_CHECKING:
)
@click.pass_obj
def search(config: AppConfig, **options: "Unpack[Options]"):
from viu.cli.service.feedback.service import FeedbackService
from viu_cli.cli.service.feedback.service import FeedbackService
from ...core.exceptions import ViuError
from ...libs.provider.anime.params import (
@@ -134,7 +134,7 @@ def stream_anime(
episode: str,
anime_title: str,
):
from viu.cli.service.player.service import PlayerService
from viu_cli.cli.service.player.service import PlayerService
from ...libs.player.params import PlayerParams
from ...libs.provider.anime.params import EpisodeStreamsParams

View File

@@ -1,5 +1,5 @@
import click
from viu.core.config import AppConfig
from viu_cli.core.config import AppConfig
@click.command(help="Run the background worker for notifications and downloads.")
@@ -11,14 +11,14 @@ def worker(config: AppConfig):
process any queued downloads. It's recommended to run this in the
background (e.g., 'viu worker &') or as a system service.
"""
from viu.cli.service.auth import AuthService
from viu.cli.service.download.service import DownloadService
from viu.cli.service.feedback import FeedbackService
from viu.cli.service.notification.service import NotificationService
from viu.cli.service.registry.service import MediaRegistryService
from viu.cli.service.worker.service import BackgroundWorkerService
from viu.libs.media_api.api import create_api_client
from viu.libs.provider.anime.provider import create_provider
from viu_cli.cli.service.auth import AuthService
from viu_cli.cli.service.download.service import DownloadService
from viu_cli.cli.service.feedback import FeedbackService
from viu_cli.cli.service.notification.service import NotificationService
from viu_cli.cli.service.registry.service import MediaRegistryService
from viu_cli.cli.service.worker.service import BackgroundWorkerService
from viu_cli.libs.media_api.api import create_api_client
from viu_cli.libs.provider.anime.provider import create_provider
feedback = FeedbackService(config)
if not config.worker.enabled:

Some files were not shown because too many files have changed in this diff Show More