Coder Social home page Coder Social logo

open-ani / ani Goto Github PK

View Code? Open in Web Editor NEW
964.0 5.0 35.0 216.23 MB

一站式在线弹幕追番平台:全自动 BT + 在线多数据源聚合,离线缓存,Bangumi 收藏同步,弹幕云过滤 ...

Home Page: https://myani.org

License: GNU General Public License v3.0

Kotlin 94.83% Shell 0.01% Batchfile 0.01% CMake 0.10% SWIG 0.01% C++ 3.71% ANTLR 0.03% Java 1.30%
anime compose kotlin android bangumi compose-multiplatform macos video windows bittorrent

ani's Introduction

下載量 正式版↓ 測試版↓ 討論群
GitHub downloads Stable Beta Group QQ
Ani logo

Ani

集找番、追番、看番的一站式弹幕追番平台。

Ani 的目标是提供尽可能简单且舒适的追番体验。

支持云同步观看记录 (Bangumi), 多视频数据源, 缓存, 弹幕, 以及更多功能。

我不是专业客户端开发人员, 开发纯属兴趣, 不过有点讲究代码质量, 欢迎各位指点.

技术总览

以下几点可以给你一个技术上的大概了解, 不感兴趣的可以直接看截图.

  • Kotlin 多平台架构: Android + 桌面 JVM,绝大部分代码共享在 app/shared
  • UI 100% Compose
  • Compose 弹幕引擎,自建弹幕服务器+网络弹幕源,预留接入其他弹幕数据源的接口
  • Compose 视频播放器,Android 底层为 ExoPlayer,PC 底层为 VLC
  • 独立的抽象数据源对接模块:SPI 方式加载 动漫花园acg.ripMikan 等。现阶段支持代码里扩展私有数据源,局域网缓存服务器等。未来计划开放 API

参与开发

欢迎你提交 PR 参与开发, 也欢迎加入 open-ani 组织。 有关项目技术细节请参考 CONTRIBUTING

下载

Ani 支持 Android 和桌面端 (macOS、Windows)。

下载:

功能截图

快速开发中, 我每隔几天会更一下截图. 实际样式请以最新版本为准.

管理追番

  • 同步 Bangumi 收藏, 记录观看进度

collection-dark subject-dark

collection-desktop

多数据源在线视频播放

多数据源适配, 总有一个源有你想看的番和喜欢的字幕组

  • 全自动整合多个 BT 数据源与在线数据源, 兼顾资源质量与缓冲速度
  • 自动解析资源信息, 可配置的智能选择算法完全避免找资源的麻烦
  • 记忆偏好选项

episode-player-loading episode-stats episode-media

视频弹幕

  • 弹弹play, 其他弹幕网站, 以及 Ani 弹幕服务获取弹幕
  • 自定义弹幕样式与速度
  • 发送弹幕到 Ani 的公益弹幕服务器

player-controller

你可能注意到了, 图里的 "广告位招租" 其实是开玩笑, 有其他有意思的弹幕广告词创意欢迎提交

player-danmaku

player-settings

episode-play-desktop

episode-gesture

资源偏好设置

  • 设置全局优先选择的字幕组, 字幕语言等设置
  • 在观看时修改过滤可自动记忆并应用到下次播放和自动缓存

subtitle-language.jpg

视频缓存

  • 自动根据资源偏好设置缓存观看进度的下一集
  • 管理缓存的所有视频
  • 按番剧分类管理

cache.jpg subject-cache.jpg global-caches.jpg

完全免费无广告且开放源代码

  • 使用靠谱的 Bangumi 记录追番数据, 不怕网站跑路丢失数据
  • 视频播放使用 P2P 资源, 无服务器维护成本, 即使我跑路了 Ani 也能用
  • 开放源代码, 公开自动构建, 无资料泄露风险
  • 可 PR 添加自己喜欢的功能

代理设置

Ani 自带不需要代理的数据源,无需配置代理。 若你想要,也可以设置代理后使用所有数据源。

preferences-network-proxy preferences-network-danmaku

FAQ

资源来源是什么?

全部视频数据都来自网络, Ani 本身不存储任何视频数据。 Ani 支持两大数据源类型:BT 和在线。BT 源即为公共 BitTorrent P2P 网络, 每个在 BT 网络上的人都可分享自己拥有的资源供他人下载。在线源即为其他视频资源网站分享的内容。Ani 本身并不提供任何视频资源。

本着互助精神,使用 BT 源时 Ani 会自动做种 (分享数据)。 BT 指纹为 -aniLT3000-,其中 3000 为版本号;UA 为类似 ani_libtorrent/3.0.0

弹幕来源是什么?

Ani 拥有自己的公益弹幕服务器,在 Ani 应用内发送的弹幕将会发送到弹幕服务器上。每条弹幕都会以 Bangumi 用户名绑定以防滥用(并考虑未来增加举报和屏蔽功能)。

Ani 还会从弹弹play获取关联弹幕,弹弹play还会从其他弹幕平台例如哔哩哔哩港澳台和巴哈姆特获取弹幕。 番剧每集可拥有几十到几千条不等的弹幕量。

弹幕过滤

我们已经听到了许多用户关注弹幕的质量的请求。Ani 有 AI 团队正在研发云过滤模型,将逐渐推进云过滤功能。

ani's People

Contributors

chivehao avatar cyenoch avatar hacbit avatar he0119 avatar him188 avatar jerryz233 avatar misakatat avatar nekoouo avatar nick-cjyx9 avatar nier4ever avatar rdlwicked avatar stageguard avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

ani's Issues

使用 Jar 形式启动,加载 Skiko 动态库失败

❯ sw_vers
ProductName:	macOS
ProductVersion:	12.5.1
BuildVersion:	21G83

❯ java --version
openjdk 17.0.4 2022-07-19 LTS
OpenJDK Runtime Environment Zulu17.36+13-CA (build 17.0.4+8-LTS)
OpenJDK 64-Bit Server VM Zulu17.36+13-CA (build 17.0.4+8-LTS, mixed mode, sharing)

❯ java -jar AnimationGarden-1.2.0-debian-amd64.jar
Exception in thread "main" java.lang.ExceptionInInitializerError
	at androidx.compose.ui.awt.ComposeLayer.<init>(ComposeLayer.desktop.kt:79)
	at androidx.compose.ui.awt.ComposeWindowDelegate.<init>(ComposeWindowDelegate.desktop.kt:50)
	at androidx.compose.ui.awt.ComposeWindow.<init>(ComposeWindow.desktop.kt:43)
	at androidx.compose.ui.awt.ComposeWindow.<init>(ComposeWindow.desktop.kt:40)
	at me.him188.animationgarden.app.ui.WindowExKt$WindowEx$3.invoke(WindowEx.kt:94)
	at me.him188.animationgarden.app.ui.WindowExKt$WindowEx$3.invoke(WindowEx.kt:89)
	at androidx.compose.ui.window.Window_desktopKt$Window$10$1.invoke(Window.desktop.kt:370)
	at androidx.compose.ui.window.Window_desktopKt$Window$10$1.invoke(Window.desktop.kt:369)
	at androidx.compose.ui.window.AwtWindow_desktopKt$AwtWindow$2.invoke(AwtWindow.desktop.kt:75)
	at androidx.compose.ui.window.AwtWindow_desktopKt$AwtWindow$2.invoke(AwtWindow.desktop.kt:74)
	at androidx.compose.runtime.DisposableEffectImpl.onRemembered(Effects.kt:81)
	at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1025)
	at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:786)
	at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:806)
	at androidx.compose.runtime.Recomposer.composeInitial$runtime(Recomposer.kt:827)
	at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:513)
	at androidx.compose.ui.window.Application_desktopKt$awaitApplication$2$1$2.invokeSuspend(Application.desktop.kt:219)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:771)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:741)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: org.jetbrains.skiko.LibraryLoadException: Cannot find libskiko-macos-x64.dylib.sha256, proper native dependency missing.
	at org.jetbrains.skiko.Library.findAndLoad(Library.kt:105)
	at org.jetbrains.skiko.Library.load(Library.kt:59)
	at org.jetbrains.skiko.SkiaLayer.<clinit>(SkiaLayer.awt.kt:27)
	... 32 more

重构收藏列表

  • 在移动端考虑不要直接展示剧集列表, 或者不要更新, 否则会很卡. 更新的时候也会导致滑动进度丢失, 体验不佳

  • 桌面端的副标题会根据窗口大小调整位置, 窗口足够大时副标题展示在主标题后面, 不够大时展示在独立一行. 但用户滚动列表时会有重复副标题切换动画. 需要避免在滚动时有动画

关于动漫花园与ipv6

你好
我是一位动漫花园的使用者,最近正为无法直接连接到动漫花园而烦恼,请问改如何使用ipv6连接动漫花园(已经有ipv6,可是ping网站返回的地址均是ipv4的)

data 目录不应为工作目录

这至少将导致 macOS 平台无法直接打开,而要手动于命令行执行 AnimationGarden.app/Contents/MacOS/AnimationGarden

按照各平台规范,存放至特定目录。

建议使用 directories-jvm

优化 BT 视频下载速度

me.him188.ani.app.torrent.TorrentDownloadSessionImpl

// TODO: 做一个状态, 最初只下载头尾区块, 然后根据当前下载进度, 只请求最近的区块. 优先确保即将要播放的区块下载完成.

视频播放需要首尾区块读取元数据, 因此在下载时需优先下载首尾区块.
现在有做社会自首尾区块为最高优先级, 但经实际测试发现这并不会让 libtorrent 一定集中资源先下载首尾区块, 它仍然会选择中间区块.

经测试, 把需要下载的区块设置为 TOP_PRIORITY, 其他区块设置为 IGNORE 可以非常快.

需要给 TorrentDownloadSessionImpl 做一个状态, 首先下载首尾区块, 然后再按顺序只请求进度条接下来需要的内容. 以最大化下载速度和效果

支持选择搜索合集或单集

老番看合集, 新番看单集

可通过每个帖子自带的属性来识别。不过注意有的字幕组不会按照规范发布。

关于数据存放路径

Hi, 目前 Linux 版本的 app.ymlsettings.yml 数据默认放在 data/ 文件夹中,是否可以转移到符合 XDG 文件夹规范的路径中?

app.yml 应存放在 $XDG_DATA_HOME/animationgarden 目录中,settings.yml 则存放在 $XDG_CONFIG_HOME/animationgarden 目录中。

默认情况下

$XDG_DATA_HOME=~/.local/share
$XDG_CONFIG_HOME=~/.config

具体参考:https://wiki.archlinux.org/title/XDG_Base_Directory

[bug] 收藏功能无法正常使用

rt,每次启动时都会提示数据损坏
删除所有数据后不显示数据损坏,但收藏功能依旧失效

仅开启了本地保存,没有启用服务器同步

打包 zip 时不应包含父文件夹

现在目录结构如下(以 debian 为例,其他系统类似):

├── AnimationGarden-1.2.0-debian-amd64.zip
└── desktop
   └── build
      └── compose
         └── binaries
            └── main
               └── app
                  └── AnimationGarden
                     ├── bin
                     └── lib

理应为:

├── AnimationGarden
│  ├── bin
│  └── lib
└── AnimationGarden-1.2.0-debian-amd64.zip

是否有考虑添加proxy的选项

如题,在大陆地区https://www.dmhy.org/topics/list是无法正常访问的(明明之前还可以),就导致必须挂梯子才能正常使用。
但是软件似乎不走梯子流量。
即使我是用参数启动也无法正常使用。(梯子已开全局)

大陆不开梯子访问结果:
image
软件内结果:
image
使用启动参数启动app:
image
与上条相同环境下网页端正常使用:
image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.