Skip to content

Commit 9e0bae7

Browse files
committed
Release v1.5.1: Add AniHD & AniVid servers, fix SAO & One Piece matching, resolve HLS CDNs
1 parent ecc2ca8 commit 9e0bae7

198 files changed

Lines changed: 41442 additions & 54 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ android {
77
applicationId "com.aniplay.aniplay"
88
minSdkVersion rootProject.ext.minSdkVersion
99
targetSdkVersion rootProject.ext.targetSdkVersion
10-
versionCode 15
11-
versionName "1.5"
10+
versionCode 16
11+
versionName "1.5.1"
1212
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1313
aaptOptions {
1414
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Agent Rules
2+
3+
## Git Push Confirmation
4+
- **CRITICAL**: Never push updates directly to GitHub (`git push`) without asking the user for explicit confirmation first. This is to ensure that unstable changes are not pushed to users.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Way 4: Pure Client-Side Scraping — No backend server needed.
2+
#
3+
# AniHD1 (Animetsu/swiftstream.top) HLS segments are now fetched natively
4+
# via CapacitorHttp in AniPlayer.jsx — completely bypassing CORS.
5+
# No Render HLS proxy is needed anymore.
6+
#
7+
# VITE_PROXY_URL intentionally empty — no backend calls in the app.
8+
VITE_PROXY_URL=
9+
VITE_STREAM_PROXY_URL=
10+
VITE_SUPABASE_URL=https://nokasnxvxfjcgwbujefk.supabase.co
11+
VITE_SUPABASE_ANON_KEY=sb_publishable_tsMGzQw8WAJeeYEI5-ybTg_H-1CUF7t
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
name: Build Android APK
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
workflow_dispatch:
8+
9+
jobs:
10+
build:
11+
name: Build APK
12+
runs-on: ubuntu-latest
13+
14+
steps:
15+
- name: Checkout Code
16+
uses: actions/checkout@v4
17+
18+
- name: Setup Node.js
19+
uses: actions/setup-node@v4
20+
with:
21+
node-version: 22
22+
cache: 'npm'
23+
24+
- name: Install Node Dependencies
25+
run: npm install
26+
27+
- name: Build Web Application
28+
run: npm run build
29+
30+
- name: Setup Java 21
31+
uses: actions/setup-java@v4
32+
with:
33+
distribution: 'zulu'
34+
java-version: '21'
35+
36+
- name: Setup Android SDK
37+
uses: android-actions/setup-android@v3
38+
39+
- name: Install Android SDK Packages
40+
run: |
41+
sdkmanager "platforms;android-36" "build-tools;36.0.0" "build-tools;35.0.0"
42+
43+
- name: Capacitor Sync
44+
run: npx cap sync
45+
46+
- name: Build Signed Release APK with Gradle
47+
run: |
48+
cd android
49+
chmod +x gradlew
50+
./gradlew assembleRelease
51+
mv app/build/outputs/apk/release/app-release.apk app/build/outputs/apk/release/AniPlay.apk
52+
53+
- name: Upload AniPlay APK Artifact
54+
uses: actions/upload-artifact@v4
55+
with:
56+
name: AniPlay-Android-App
57+
path: android/app/build/outputs/apk/release/AniPlay.apk
58+
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
name: Auto Release OTA Update
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
workflow_dispatch:
8+
9+
permissions:
10+
contents: write
11+
12+
jobs:
13+
release:
14+
name: Build & Release OTA Update
15+
runs-on: ubuntu-latest
16+
17+
steps:
18+
- name: Checkout Code
19+
uses: actions/checkout@v4
20+
with:
21+
token: ${{ secrets.GITHUB_TOKEN }}
22+
fetch-depth: 0
23+
24+
- name: Setup Node.js
25+
uses: actions/setup-node@v4
26+
with:
27+
node-version: 22
28+
cache: 'npm'
29+
30+
- name: Install Dependencies
31+
run: npm install
32+
33+
- name: Extract Version from Gradle
34+
id: version
35+
run: |
36+
VERSION=$(grep "versionName" android/app/build.gradle | head -n 1 | awk -F'"' '{print $2}')
37+
echo "version=${VERSION}" >> $GITHUB_OUTPUT
38+
echo "tag=v${VERSION}" >> $GITHUB_OUTPUT
39+
40+
- name: Setup Java 21
41+
uses: actions/setup-java@v4
42+
with:
43+
distribution: 'zulu'
44+
java-version: '21'
45+
46+
- name: Setup Android SDK
47+
uses: android-actions/setup-android@v3
48+
49+
- name: Install Android SDK Packages
50+
run: |
51+
sdkmanager "platforms;android-36" "build-tools;36.0.0" "build-tools;35.0.0"
52+
53+
- name: Build Web Bundle
54+
run: npm run build
55+
56+
- name: Create OTA Bundle Zip
57+
run: |
58+
cd dist && zip -r ../bundle.zip . && cd ..
59+
60+
- name: Capacitor Sync
61+
run: npx cap sync
62+
63+
- name: Build Signed APK with Gradle
64+
run: |
65+
cd android
66+
chmod +x gradlew
67+
./gradlew assembleRelease
68+
mv app/build/outputs/apk/release/app-release.apk app/build/outputs/apk/release/AniPlay.apk
69+
cd ..
70+
71+
- name: Create GitHub Release and Upload Assets
72+
id: release
73+
uses: softprops/action-gh-release@v2
74+
with:
75+
tag_name: ${{ steps.version.outputs.tag }}
76+
name: "AniPlay ${{ steps.version.outputs.version }}"
77+
body: "OTA web bundle update + standalone release APK. Install automatically via the app or download the APK directly."
78+
files: |
79+
bundle.zip
80+
android/app/build/outputs/apk/release/AniPlay.apk
81+
env:
82+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
83+
84+
85+
- name: Update update.json with new version and bundle URL
86+
run: |
87+
VERSION="${{ steps.version.outputs.version }}"
88+
TAG="${{ steps.version.outputs.tag }}"
89+
BUNDLE_URL="https://github.com/SahilKumar337/AniPlay/releases/download/${TAG}/bundle.zip"
90+
APK_URL="https://github.com/SahilKumar337/AniPlay/releases/download/${TAG}/AniPlay.apk"
91+
python3 - <<'PYEOF'
92+
import json, os
93+
with open('update.json', 'r') as f:
94+
d = json.load(f)
95+
d['latestVersion'] = os.environ['VERSION']
96+
d['bundleUrl'] = os.environ['BUNDLE_URL']
97+
d['apkUrl'] = os.environ['APK_URL']
98+
with open('update.json', 'w') as f:
99+
json.dump(d, f, indent=2)
100+
print('update.json updated to', d['latestVersion'])
101+
PYEOF
102+
env:
103+
VERSION: ${{ steps.version.outputs.version }}
104+
TAG: ${{ steps.version.outputs.tag }}
105+
BUNDLE_URL: https://github.com/SahilKumar337/AniPlay/releases/download/${{ steps.version.outputs.tag }}/bundle.zip
106+
APK_URL: https://github.com/SahilKumar337/AniPlay/releases/download/${{ steps.version.outputs.tag }}/AniPlay.apk
107+
108+
- name: Commit updated update.json back to repo
109+
run: |
110+
git config user.name "github-actions[bot]"
111+
git config user.email "github-actions[bot]@users.noreply.github.com"
112+
git add update.json
113+
git diff --staged --quiet || git commit -m "chore: bump version to ${{ steps.version.outputs.version }} [skip ci]"
114+
git push
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Logs
2+
logs
3+
*.log
4+
npm-debug.log*
5+
yarn-debug.log*
6+
yarn-error.log*
7+
pnpm-debug.log*
8+
lerna-debug.log*
9+
10+
node_modules
11+
dist
12+
dist-ssr
13+
*.local
14+
15+
# Editor directories and files
16+
.vscode/*
17+
!.vscode/extensions.json
18+
.idea
19+
.DS_Store
20+
*.suo
21+
*.ntvs*
22+
*.njsproj
23+
*.sln
24+
*.sw?
25+
*.mjs
26+
27+
# Playwright Profiles
28+
.playwright_profile_test_subs/
29+
.playwright_profile_test_subs*
30+
.playwright_profile/
31+
.playwright_profile*
32+
.playwright_profile_test/
33+
.chrome_solve_profile/
34+
.chrome_solve_profile*
35+
playwright-report/
36+
test-results/
37+
38+
# Scratch/Temporary script directories
39+
scratch/
40+
41+
# Scraper Backend and Server Files (hidden from client repo)
42+
my-anime-api/
43+
server/
44+
test_py_app.py
45+
stop_server.bat
46+
stop_server.sh
47+
run_invisible.vbs
48+
test_matching_logic.mjs
49+
50+
# Android Builds and caches
51+
android/app/build/
52+
android/build/
53+
android/.gradle/
54+
.gradle/
55+
capacitor-cordova-android-plugins/
56+
local.properties
57+
*.apk
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"$schema": "./node_modules/oxlint/configuration_schema.json",
3+
"plugins": ["react", "oxc"],
4+
"rules": {
5+
"react/rules-of-hooks": "error",
6+
"react/only-export-components": ["warn", { "allowConstantExport": true }]
7+
}
8+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
FROM node:20-slim
2+
3+
# Install latest chrome dev package and fonts to support major charsets (Chinese, Japanese, Arabic, Hebrew, Thai and a few others)
4+
RUN apt-get update \
5+
&& apt-get install -y wget gnupg \
6+
&& wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
7+
&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
8+
&& apt-get update \
9+
&& apt-get install -y google-chrome-stable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 \
10+
--no-install-recommends \
11+
&& rm -rf /var/lib/apt/lists/*
12+
13+
# Set env path for Puppeteer/Playwright
14+
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/google-chrome-stable
15+
ENV PORT=7860
16+
17+
# Switch to the pre-existing 'node' user (which already has UID 1000 in node images)
18+
USER node
19+
ENV HOME=/home/node
20+
ENV PATH=/home/node/.local/bin:$PATH
21+
22+
WORKDIR $HOME/app
23+
24+
# Copy dependency files and install (all as non-root 'node' user)
25+
COPY --chown=node:node package*.json ./
26+
RUN npm install
27+
28+
# Copy application code (all as non-root 'node' user)
29+
COPY --chown=node:node . .
30+
31+
EXPOSE 7860
32+
33+
CMD ["node", "server/proxy.mjs"]
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# 🎬 AniPlay — Premium Mobile Anime Client
2+
3+
AniPlay is a premium, open-source mobile anime streaming client designed for Android devices. Built using a hybrid web-native architecture (React + Vite + Capacitor), it offers a fluid, glassmorphic UI, responsive controls, and high-performance video playback.
4+
5+
---
6+
7+
## 📱 Screenshots & Application Walkthrough
8+
9+
AniPlay provides a sleek, modern, and intuitive user interface designed to match premium streaming platforms. Below is an overview of the key screens and features:
10+
11+
| **Welcome & Onboarding** | **Spotlight & Home** | **Discovery Feed** |
12+
| :---: | :---: | :---: |
13+
| <img src="assets/screenshots/welcome_screen.jpg" width="220" alt="Welcome Screen"> | <img src="assets/screenshots/home_screen.jpg" width="220" alt="Home Screen"> | <img src="assets/screenshots/home_feed.jpg" width="220" alt="Discovery Feed"> |
14+
| **Welcome Screen**<br>A stunning glassmorphic intro screen featuring a blurred collage of popular anime art, prompting guest access ("Watch now") or credentials sign-in. | **Featured Spotlight**<br>An immersive home banner highlighting trending titles (e.g. *Solo Leveling*) with dynamic context-aware backgrounds, quick list-adds, and recent episode updates. | **Content Discovery**<br>Scrolled home view detailing *Top Airing*, *Airing This Week*, and *Popular This Season* grids with clear video quality (HD) and rating indicators. |
15+
16+
<br>
17+
18+
| **Upcoming Release Schedule** | **Advanced Video Player** |
19+
| :---: | :---: |
20+
| <img src="assets/screenshots/schedule_screen.jpg" width="220" alt="Schedule Screen"> | <img src="assets/screenshots/player_screen.jpg" width="220" alt="Video Player"> |
21+
| **Release Calendar**<br>A chronological, timezone-aware calendar displaying upcoming episode releases, integrated with AniList metadata and quick watchlist actions. | **HLS Video Player & Episode Hub**<br>Feature-packed media player with double-tap seek, fit options, sub/dub selectors, multi-source streaming routes (e.g. *AniHD1*, *Neko*, *Waves*), and a scrolling episode drawer. |
22+
23+
---
24+
25+
## 🌟 Key Features
26+
27+
* **🎭 Elegant UI & Fluid Animations**: Modern, dark-themed user interface utilizing curated indigo/violet accent gradients, responsive carousels, and micro-interactions.
28+
* **💾 Native Device Storage (Capacitor Preferences)**: Save watchlist details, favorites, and track precise watch history directly to the native Android SharedPreferences database (cache-wipe proof).
29+
* **📺 High-Performance HLS Player**: Custom HTML5 media player tailored for mobile touchscreens, featuring double-tap seek, automatic orientation locking/unlocking, gesture controls, and clean error states.
30+
* **📡 Dynamic Server Aggregation**: Fetches and aggregates public streams on-demand, automatically parsing subtitle tracks, available resolutions, and host metadata. Designed with a zero-trust architecture that never stores user credentials locally.
31+
* **🔄 Serverless Live Updates**: Built-in background update checker that compares installed versions against GitHub releases, enabling remote updates and domain hot-swaps instantly.
32+
* **📅 Adaptive Schedule Feed**: Fully integrated with the AniList GraphQL API to fetch upcoming episode releases, schedules, and metadata.
33+
34+
---
35+
36+
## 🛠️ Architecture
37+
38+
AniPlay is built on the **Capacitor WebView Bridge** standard:
39+
* **UI Layer**: React Single Page Application (SPA) powered by Vite.
40+
* **Styling**: Vanilla CSS utilizing custom properties and modern layout elements (Flexbox/CSS Grid).
41+
* **Native Integration**: Capacitor plugins for hardware lifecycle hooks, status bar overlay, device orientation locks, and native SharedPreferences database access.
42+
43+
---
44+
45+
## 📲 Installation
46+
47+
To run AniPlay on your Android phone, download the latest build from the Releases tab:
48+
49+
1. Go to the [Releases](https://github.com/SahilKumar337/AniPlay/releases) page.
50+
2. Download the **app-release.apk** file.
51+
3. Open the downloaded file on your Android device.
52+
4. Enable *"Install from Unknown Sources"* if prompted by your system.
53+
5. Tap **Install** and launch **AniPlay**!
54+
55+
---
56+
57+
## 🔒 Privacy & Security
58+
59+
AniPlay values your privacy:
60+
* All favorites, watch history, and playlists are stored **locally** on your device.
61+
* No personal data or user accounts are sent to external databases.
62+
* Streaming connections are requested directly to aggregation endpoints, keeping the user interface completely independent.

0 commit comments

Comments
 (0)