Compare commits

...

246 commits
1.2.0 ... main

Author SHA1 Message Date
tapframe
4daab74e27 added contributors page 2025-10-24 02:14:50 +05:30
tapframe
a7fbd567fd Added collections ection 2025-10-23 17:31:49 +05:30
tapframe
f90752bdb7 Streamscreen new changes update 2025-10-23 14:51:41 +05:30
tapframe
c5590639b1 revert 2025-10-23 13:44:08 +05:30
tapframe
098ab73ba1 anim changes ios ksplayer 2025-10-23 13:26:43 +05:30
tapframe
060b0b927b episode poster fix 2025-10-23 13:26:31 +05:30
tapframe
786e06b27f episodes not fetching backdrop fix tablet layout 2025-10-23 01:57:04 +05:30
tapframe
ef1c34a9c0 improved animations 2025-10-23 00:38:45 +05:30
tapframe
b97481f2d9 refactor streamscreen 2025-10-23 00:34:08 +05:30
tapframe
8d74b7e7ce changes 2025-10-22 23:55:45 +05:30
tapframe
635c97b1ad more improvements 2025-10-22 23:46:50 +05:30
tapframe
673c96c917 new streamscreen layout for tabs init 2025-10-22 23:36:37 +05:30
tapframe
15fc49d84d cleanup repo 2025-10-22 22:24:27 +05:30
tapframe
54cfd194f1 added yml for sponsoring 2025-10-22 22:22:18 +05:30
tapframe
be561c6d9f adjusted android bottom tab height 2025-10-22 17:25:12 +05:30
tapframe
dc8c27dfc4 trailer service improvements 2025-10-22 17:17:20 +05:30
tapframe
ce7f92b540 Custom TTL for Stream cache 2025-10-21 23:34:35 +05:30
tapframe
f0271cd395 orientation fix 2025-10-21 23:14:51 +05:30
tapframe
2a4c076854 fixed subtitle not fetching on cahced strream link 2025-10-21 22:17:42 +05:30
tapframe
c852c56231 orientation optimization 2025-10-21 17:49:49 +05:30
tapframe
614ffc12c0 1.2.6 21 2025-10-21 16:55:53 +05:30
tapframe
d9b2545cdd streamscreen UI fix 2025-10-21 16:30:39 +05:30
tapframe
1ae6b4f108 continue watching changes 2025-10-21 16:09:35 +05:30
tapframe
373efa0564 Implemented caching stream links for faster playback. 2025-10-21 14:53:01 +05:30
tapframe
6c464abdd4 cleanup 2025-10-21 14:18:24 +05:30
tapframe
5d5d77ae1b sizing fix for playercontrols. 2025-10-21 14:12:20 +05:30
tapframe
b2cfc19e96
Merge pull request #202 from qarqun/main
Responsive Video Player Controls with animations
2025-10-21 13:58:23 +05:30
tapframe
e40e8bb7c5
Merge branch 'main' into main 2025-10-21 13:58:00 +05:30
tapframe
a3158be2bd icon change, and cinemeta removal fix 2025-10-21 13:29:17 +05:30
Qarqun
e305dee777 feat: Add responsive video player controls with animations
- Implement responsive sizing for all controls based on screen width (phone/tablet support)
- Add smooth crossfade animation for play/pause button transitions
- Add arc sweep and slide animations for seek buttons (+10/-10s)
- Add touch feedback with semi-transparent circle flash on tap
2025-10-20 19:13:46 +08:00
tapframe
415efd4e03 asepct ratio fix 2025-10-20 14:45:48 +05:30
tapframe
f027788266 ksplayer subtitle init 2025-10-20 14:08:23 +05:30
qarqun
23acda3167
Merge branch 'tapframe:main' into main 2025-10-20 15:35:59 +08:00
tapframe
a8b4dc5a01 airplay ios 2025-10-20 02:26:42 +05:30
tapframe
fd4efe6c7f catalogscreen layout fix 2025-10-19 20:42:41 +05:30
tapframe
68340eac9e update morelikethis sizing 2025-10-19 20:34:37 +05:30
tapframe
175d47f71f adaptive sizing for playercontrols,seriescontent,and commentsection 2025-10-19 20:30:24 +05:30
tapframe
0b764412b2 homescreen imrpovements for tablet screens 2025-10-19 20:08:08 +05:30
tapframe
f7c0c670d7 metadatascreen tablet layout overhaul 2025-10-19 20:08:08 +05:30
tapframe
18bd6ff3ca macos fullscreen player issue fix 2025-10-19 20:08:08 +05:30
tapframe
ac5326ba3f hero Ui changes 2025-10-19 20:08:08 +05:30
tapframe
c5af56537b
Merge pull request #197 from aazz180/main 2025-10-19 18:03:59 +05:30
aazz180
17cdd503e9
Fix the live container 2025-10-19 13:26:55 +01:00
tapframe
688950d0c2 changes 2025-10-19 15:41:02 +05:30
tapframe
eb3082cddb ui updates trakt 2025-10-19 15:37:30 +05:30
tapframe
32bec08f30 ui changes 2025-10-19 15:19:08 +05:30
tapframe
a7f850d577 trakt wathclist integration test 2025-10-19 14:20:38 +05:30
tapframe
08f356cfa4 trakt scrobble optimization 2025-10-19 13:59:40 +05:30
qarqun
6e975ffe26
Merge branch 'tapframe:main' into main 2025-10-19 15:42:24 +08:00
tapframe
64981dd110 clean 2025-10-19 12:51:07 +05:30
tapframe
b5156bcc69 cleanup 2025-10-19 12:50:14 +05:30
tapframe
9ab99a1225 ios homescreen layout shift fix 2025-10-19 12:49:10 +05:30
tapframe
d5edec025c Merge branch 'main' of https://github.com/tapframe/NuvioStreaming 2025-10-19 12:20:56 +05:30
tapframe
ef43463b99 calender screen fix 2025-10-19 12:19:28 +05:30
qarqun
ca2e95e6f4
Merge branch 'tapframe:main' into main 2025-10-19 12:04:34 +08:00
tapframe
559c50fa87
Merge pull request #193 from aazz180/main 2025-10-19 08:54:45 +05:30
aazz180
2ca0a05636
Add Infuse Livecontainer player option 2025-10-18 21:37:11 +01:00
aazz180
363de47313
Update StreamsScreen.tsx 2025-10-18 21:36:25 +01:00
aazz180
bdb2803371
Update StreamsScreen.tsx 2025-10-18 21:35:59 +01:00
aazz180
6eae438300
Update useSettings.ts 2025-10-18 21:35:28 +01:00
tapframe
707ceb711a layout anim 2025-10-18 23:34:43 +05:30
tapframe
024646579e animate catalogsec 2025-10-18 23:32:57 +05:30
Qarqun
f895428e3d Merge branch 'main' of https://github.com/qarqun/NuvioStreaming 2025-10-19 01:21:48 +08:00
Qarqun
698456c205 refactor(player): enhance video controls with modern streaming style
- Moved inline styles to playerStyles.ts for better maintainability
- Redesigned player controls for better user experience:
  - Enhanced skip buttons with rotate animations and semi-transparent backgrounds
  - Enlarged center play/pause button with improved visibility
  - Optimized touch targets and spacing for better interaction
  - Standardized button dimensions and layout

Files changed:
- src/components/player/controls/PlayerControls.tsx
- src/components/player/utils/playerStyles.ts
2025-10-19 01:11:08 +08:00
tapframe
43cf907a2e icon update 2025-10-18 20:53:42 +05:30
tapframe
0a04ba5743 cache changes 2025-10-18 14:58:22 +05:30
tapframe
8b1a40d2e2 ui changes 2025-10-18 13:22:34 +05:30
tapframe
51ae0784cf flashlist update 2025-10-18 12:09:22 +05:30
tapframe
efa5d3f629 fastimage api bug fix 2025-10-18 00:41:32 +05:30
tapframe
fd5861026d floating header logo fetch fix 2025-10-17 23:41:27 +05:30
tapframe
1535ef9aac trailer improvements 2025-10-17 23:19:55 +05:30
tapframe
bb6f1f32a0 anim changes 2025-10-17 22:18:17 +05:30
tapframe
3effdee5c0 optimzed perf 2025-10-17 22:09:42 +05:30
tapframe
bf15c5fb45 ui change 2025-10-17 22:04:28 +05:30
tapframe
5c3ba9e0d8 parallax on hero 2025-10-17 21:54:02 +05:30
tapframe
ce0b39d48b hero carousal anim changes 2025-10-17 21:44:24 +05:30
tapframe
71e3498876 ui fix 2025-10-17 21:29:15 +05:30
tapframe
e8ec05bd51 rn video init for trailers 2025-10-17 20:35:48 +05:30
tapframe
2303c32940 ui changes 2025-10-17 20:32:46 +05:30
tapframe
e9d54bf0d6 trailer section init 2025-10-17 20:18:34 +05:30
tapframe
e435a68aea UI changes 2025-10-17 15:00:36 +05:30
tapframe
d55143e6fb changes 2025-10-16 12:21:05 +05:30
tapframe
e2719c373d improved vlc behaviour 2025-10-16 01:53:30 +05:30
tapframe
b1e9f9b3f8 ui fix 2025-10-15 23:43:06 +05:30
tapframe
2d512053a8 1.2.5 20 2025-10-15 23:27:59 +05:30
tapframe
6cfddb68bb ksplayer changes 2025-10-15 23:16:14 +05:30
tapframe
12d04e84d8 icon changes 2025-10-15 22:33:41 +05:30
tapframe
829e569ccd ui changes 2025-10-15 21:54:02 +05:30
tapframe
7e300e8789 changes 2025-10-15 19:56:01 +05:30
tapframe
6a6a93aec4 glassview init 2025-10-15 16:12:55 +05:30
tapframe
13cba764cc updated readme 2025-10-15 13:25:24 +05:30
tapframe
5263005e92 update readme 2025-10-15 13:23:04 +05:30
tapframe
1a12a6c10c update readme 2025-10-15 13:21:34 +05:30
tapframe
0b134f9266 update readme 2025-10-15 13:18:34 +05:30
tapframe
07233ba9ae update expo sdk to 54 2025-10-15 02:24:20 +05:30
tapframe
92aaae40f6 test 2025-10-15 01:51:57 +05:30
tapframe
faeeaf5ecf test 2025-10-14 22:34:20 +05:30
tapframe
edfbc2d937 icon updates 2025-10-14 14:27:00 +05:30
tapframe
ab8f870e73 UI changes 2025-10-14 13:50:22 +05:30
tapframe
2a5798c107 ui fix streamscreen 2025-10-14 12:16:15 +05:30
tapframe
92441110bf ui changes 2025-10-14 02:52:07 +05:30
tapframe
1a9d59e804 UI changes 2025-10-14 02:43:21 +05:30
tapframe
9e7b9c5fe4 improved downloads 2025-10-14 01:15:37 +05:30
tapframe
615172d29c changes 2025-10-14 00:51:03 +05:30
tapframe
5671323bc1 changes 2025-10-14 00:41:43 +05:30
tapframe
c0263eb3c3 changes 2025-10-14 00:20:54 +05:30
tapframe
a5a5358f7b UI changes tmdb logo 2025-10-13 16:04:25 +05:30
tapframe
2599fd85d7 UI fix 2025-10-13 14:51:04 +05:30
tapframe
84a308e5dc UI changes 2025-10-13 14:01:05 +05:30
tapframe
569d50f25b ui changes 2025-10-13 13:52:25 +05:30
tapframe
93221b9760 added backdrop to set as default hero thumbnail 2025-10-13 13:45:40 +05:30
tapframe
81a7f63782 added backdrop gallery 2025-10-13 13:36:50 +05:30
tapframe
1c7fd533c7 added more details for tvshows/movies 2025-10-13 13:23:19 +05:30
tapframe
a0d9420be2 network logic 2025-10-13 13:16:38 +05:30
tapframe
544dc8b639 import update 2025-10-13 12:28:36 +05:30
tapframe
68f02bbc80 import update 2025-10-13 12:28:24 +05:30
tapframe
1660b0a75b clear 2025-10-13 12:15:59 +05:30
tapframe
d691189973 fixed backdrop zoom in laoding overlay. 2025-10-13 12:15:26 +05:30
tapframe
03da6c9a0c push 2025-10-13 01:48:15 +05:30
tapframe
46b0ed44bd sub timing adjust 2025-10-12 12:05:22 +05:30
tapframe
362000d6df sub default changes 2025-10-12 11:21:51 +05:30
tapframe
fb8b65e61b trailerplayer stuck after finishing fix 2025-10-12 10:44:13 +05:30
tapframe
03bded3775 1.2.4 2025-10-12 03:09:30 +05:30
tapframe
f605dd3d49 changes CP 2025-10-12 03:02:27 +05:30
tapframe
303c4c909e update dependencies 2025-10-12 00:32:18 +05:30
tapframe
8178dfc215 removed aggressive cache cleaning 2025-10-12 00:27:30 +05:30
tapframe
714226b6a5 push 2025-10-12 00:09:24 +05:30
tapframe
383ac95e90 migration from expo-image to RN Fast-image 2025-10-12 00:09:07 +05:30
tapframe
67232f5a8e ratingscreen UI fix 2025-10-11 23:34:45 +05:30
tapframe
d399c8f774 dynamic type detection 2025-10-11 01:25:43 +05:30
tapframe
4e3c9c208f type:tv addon detection fix 2025-10-11 01:20:26 +05:30
tapframe
fb316d9f37 added langauge filtering for plugnins 2025-10-11 01:06:37 +05:30
tapframe
0c14d8641d some UI fix 2025-10-11 00:16:07 +05:30
tapframe
7dceb23e3d some addon improvements 2025-10-10 23:42:28 +05:30
tapframe
704c642a8f tablet padding changes 2025-10-09 16:16:26 +05:30
tapframe
230afd7414 update image caching 2025-10-09 12:40:19 +05:30
tapframe
f146f6a312 update aimodel 2025-10-09 11:12:49 +05:30
tapframe
69d9885e30 changes 2025-10-08 17:37:46 +05:30
tapframe
ea3fe35790 fixes 2025-10-08 17:24:14 +05:30
tapframe
a67c34f8f6 fixes 2025-10-08 16:57:31 +05:30
tapframe
b5b61d05f8 ui changes 2025-10-08 16:53:56 +05:30
tapframe
581e912d4c multiple addon seach func 2025-10-08 16:31:07 +05:30
tapframe
f31942efdf UI fix 2025-10-08 13:47:56 +05:30
tapframe
238f08192f some tmdb logo fetching logic changes 2025-10-08 13:39:49 +05:30
tapframe
42c236e235 removed harcorded metahub 2025-10-08 12:50:32 +05:30
tapframe
14163513e3 some changes 2025-10-08 11:53:12 +05:30
tapframe
563208689b some addon id prefix detection improvemets 2025-10-08 11:39:40 +05:30
tapframe
106461b2b2 ui fix 2025-10-06 20:34:59 +05:30
tapframe
0f5fbdf296 trakt improvements 2025-10-06 20:32:18 +05:30
tapframe
cfa6bb8689 dropped globalcache 2025-10-05 23:49:04 +05:30
tapframe
ec23dcc3cb ui changes 2025-10-05 23:45:30 +05:30
tapframe
13d72338a5 trakt scrobble imrpovements 2025-10-05 22:59:40 +05:30
tapframe
25988bdb7b UI changes - removed VIA [provider] from player loading overlay 2025-10-05 22:45:27 +05:30
tapframe
0a840b1cb0 UI changes 2025-10-05 20:33:51 +05:30
tapframe
ce292ce9d3 UI changes 2025-10-05 20:28:04 +05:30
tapframe
90ab5e6577 fixed scrollview comment modal 2025-10-05 20:23:21 +05:30
tapframe
b15b569fce ui changes 2025-10-05 20:00:22 +05:30
tapframe
15ab70b524 UI changes 2025-10-05 19:58:24 +05:30
tapframe
6db159e944 update trakt comment 2025-10-05 19:44:16 +05:30
tapframe
35d3096ce4 streamscreen fetch issue fix 2025-10-05 18:51:13 +05:30
tapframe
cc2e0308d7 trakt comment added 2025-10-05 18:40:06 +05:30
tapframe
ca52a81141 some ui changes 2025-10-05 17:44:31 +05:30
tapframe
4f1b8103d0 1.2.3 18 2025-10-05 00:20:26 +05:30
tapframe
71487fce59 trakt list sorting order fix 2025-10-04 23:58:24 +05:30
tapframe
ff1b406c48 update app v 2025-10-04 22:06:56 +05:30
tapframe
61418186b2 Merge branch 'main' of https://github.com/tapframe/NuvioStreaming 2025-10-04 22:06:28 +05:30
tapframe
9d54ec44e4
Merge pull request #164 from CrissZollo/feature-playback-speed
Feature playback speed
2025-10-04 22:06:19 +05:30
tapframe
60e27da57d local backup improvements 2025-10-04 21:27:52 +05:30
CrissZollo
5668d40bc1 Added current speed indicator 2025-10-04 17:48:05 +02:00
CrissZollo
33720c5079 Added functionality to set playbackspeed in exoPlayer 2025-10-04 17:48:05 +02:00
tapframe
88313e6d06 changes 2025-10-04 21:01:02 +05:30
tapframe
6d4edabb46
Merge pull request #163 from CrissZollo/fix-timeline-time
Timeline corrections
2025-10-04 20:29:29 +05:30
tapframe
bfacc4a1ee local backup restore feature 2025-10-04 20:29:05 +05:30
Christoffer Kronblad
f72404e22a
Merge branch 'tapframe:main' into fix-timeline-time 2025-10-04 16:22:21 +02:00
CrissZollo
340d109e72 Increasing gap for metadata by 50% 2025-10-04 16:21:37 +02:00
tapframe
87aa913f5f update pluginscreen UI 2025-10-04 17:16:16 +05:30
tapframe
5a22ab54fb improved caching behaviour 2025-10-04 17:07:30 +05:30
tapframe
90f99985a0 localscrapers caching 2025-10-04 16:51:51 +05:30
CrissZollo
6c8502d8fe removed comment 2025-10-04 12:57:53 +02:00
CrissZollo
64c2129b1d Fixes some logic to runtime calculations format 2025-10-04 12:52:02 +02:00
tapframe
7a64851256 dedup fix streamscreen 2025-10-03 17:17:17 +05:30
tapframe
c358c794ec dedup fix localscraper 2025-10-03 16:56:58 +05:30
tapframe
028c6d2823 increased streamscreen link fetching timeout 2025-10-01 19:31:59 +05:30
tapframe
96da369f62 improved url encodng logic for ios 2025-10-01 12:09:44 +05:30
tapframe
43d4db022c
Merge pull request #157 from CrissZollo/fix-timeline-time
Small fixes to timeline time
2025-10-01 01:31:10 +05:30
tapframe
221794026e some UI changes 2025-10-01 01:28:13 +05:30
tapframe
16c460cdc2 new toast library 2025-10-01 01:13:27 +05:30
CrissZollo
89416bd714 Small fixes to timeline time 2025-09-30 21:32:00 +02:00
tapframe
56654e1ced
Merge pull request #156 from CrissZollo/fix-action-menu
Action menu fixes and utilisation
2025-10-01 00:57:09 +05:30
tapframe
7de8a86869 UI changes 2025-10-01 00:52:03 +05:30
tapframe
3220e91f1c Added TMDB Multilang Support 2025-10-01 00:41:34 +05:30
CrissZollo
2da663ecd1 Hid the 'Add to playlist' for action menu. 2025-09-30 20:51:59 +02:00
tapframe
2a89695b0b Added option to enable/disable tmdb enriched metadata for addons 2025-09-30 23:55:43 +05:30
CrissZollo
7ca74b3b0d Adding packages and updates 2025-09-30 19:29:42 +02:00
tapframe
b0b309b0f1
Merge pull request #155 from tapframe/revert-153-main
Revert "Fix trakt scrobbling algorithm"
2025-09-30 22:02:42 +05:30
tapframe
5e22f3b0da
Revert "Fix trakt scrobbling algorithm" 2025-09-30 22:01:00 +05:30
tapframe
9d32c483eb
Merge pull request #153 from aayushrautela/main
Fix trakt scrobbling algorithm
2025-09-30 18:42:47 +05:30
tapframe
78130a54aa
Merge pull request #149 from CrissZollo/feature-length-time
Feature: Changed the time to display in H:MIN instead of only MIN.
2025-09-30 18:41:18 +05:30
tapframe
1f49de9b27 TV Show stream fetching fixed 2025-09-30 18:35:15 +05:30
tapframe
1f085604ee 1.2.2 17 2025-09-30 18:00:12 +05:30
tapframe
4f593459b1 1.2.1 2025-09-30 17:17:48 +05:30
tapframe
b8d3d68b65 Added ExoPlayer FFmpeg Extension for better Codec Support 2025-09-30 17:10:59 +05:30
tapframe
004ee178a4 some VLCPLayer fixes 2025-09-30 16:03:39 +05:30
tapframe
07eab50848 addon stream fetching imrpovements 2025-09-30 15:32:29 +05:30
CrissZollo
b3b6bdee4e Added long press on search items. 2025-09-29 23:06:57 +02:00
Aayush Rautela
eea003c170
Delete .github/workflows/ci.yml 2025-09-29 23:03:28 +02:00
Aayush Rautela
1ca8813e58 C/I 2025-09-29 22:59:14 +02:00
Aayush Rautela
64c9919e28 Enhance ContinueWatchingSection to fetch and handle both watched movies and shows from Trakt, improving filtering logic for displayed content. 2025-09-29 22:56:12 +02:00
CrissZollo
04f6a0b6be Fixes for adding/removing watched/library from library/home 2025-09-29 22:35:54 +02:00
CrissZollo
35ace0214a Added the longpress menu for the library menu 2025-09-29 22:10:03 +02:00
tapframe
bbbc22f30f Pluginscreen UI changes 2025-09-30 01:39:00 +05:30
tapframe
9ae0a7010c showbox support 2025-09-30 01:21:10 +05:30
CrissZollo
7fa4d20da0 Fix for mark as watched disappearing on restart 2025-09-29 21:16:05 +02:00
CrissZollo
b49514f52b Update npm packages 2025-09-29 20:36:41 +02:00
tapframe
92973c1c7b changes 2025-09-29 16:53:10 +05:30
tapframe
271126b665 downloading feature initial commit 2025-09-29 16:02:53 +05:30
tapframe
ebb7d4cec6 Stability improvement on catalogsection 2025-09-29 14:55:22 +05:30
tapframe
f86e6256a7 small UI changes 2025-09-29 14:25:51 +05:30
CrissZollo
ebf2ea50ed Feature: Changed the time to display in H:MIN instead of only MIN. Runtimes less than 60 still shows only MIN 2025-09-28 22:38:13 +02:00
tapframe
a877f5ac13 push 2025-09-28 20:56:52 +05:30
tapframe
cbd2283bf8 Audio Lang display fix 2025-09-28 20:53:00 +05:30
tapframe
fca3c46372 perf opt for homesreen 2025-09-28 12:33:58 +05:30
tapframe
b43957e6f9 some UI optimization 2025-09-28 11:44:32 +05:30
tapframe
57036aaffb app opening glitch fix 2025-09-28 10:43:35 +05:30
tapframe
999a33f82b 1.2.1 16 2025-09-26 23:06:53 +05:30
tapframe
09256f89e5 push 2025-09-26 22:52:25 +05:30
tapframe
198828af16 UI changes 2025-09-26 22:02:46 +05:30
tapframe
a7d3a8acc7 some fixes 2025-09-26 21:58:24 +05:30
tapframe
838f74caa2 added back ksplayer files 2025-09-26 21:17:47 +05:30
tapframe
88a1399c3b push 2025-09-26 00:11:19 +05:30
tapframe
8bb6657c6b 1.2.1 16 2025-09-25 23:26:22 +05:30
tapframe
a663f58502 account loading.. fix 2025-09-25 23:13:09 +05:30
tapframe
e9659ee305 auto lock player fix 2025-09-25 23:00:07 +05:30
tapframe
0b7bcb52da addon sync fix 2025-09-25 22:26:33 +05:30
tapframe
a25ede1284 trakt fix test 2025-09-25 22:17:39 +05:30
tapframe
3d9d0f297c push 2025-09-25 21:21:34 +05:30
tapframe
fcdd13a307 push 2025-09-25 21:12:45 +05:30
tapframe
d1fbb7e90b update readme 2025-09-25 21:09:35 +05:30
tapframe
97c400130c Merge branch 'main' of https://github.com/tapframe/NuvioStreaming 2025-09-23 18:38:37 +05:30
tapframe
534823843b changes 2025-09-23 18:23:46 +05:30
tapframe
1e9c8b07ac
Merge pull request #122 from CrissZollo/url
Adding addons with stremio:// URL
2025-09-23 00:31:35 +05:30
CrissZollo
1673dfaa7a Update gradlew file permissions to make it executable 2025-09-22 20:17:12 +02:00
tapframe
8453619067 some changes 2025-09-22 23:34:15 +05:30
tapframe
cdec19db1f some changes 2025-09-22 23:02:01 +05:30
tapframe
c91546dc1e build num fix 2025-09-22 21:38:48 +05:30
CrissZollo
04d22e0eca Changing stremio addon URL to correct wanted format 2025-09-22 17:28:56 +02:00
663 changed files with 44477 additions and 73629 deletions

4
.github/FUNDING.yml vendored Normal file
View file

@ -0,0 +1,4 @@
# These are supported funding model platforms
github: [tapframe]
ko_fi: tapframe

29
.gitignore vendored
View file

@ -2,6 +2,7 @@
# dependencies
node_modules/
!node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java
# Expo
.expo/
@ -40,11 +41,14 @@ release_announcement.md
ALPHA_BUILD_2_ANNOUNCEMENT.md
CHANGELOG.md
.env.local
android/
# Android build artifacts (but keep source files)
android/app/build/
android/build/
android/.gradle/
android/app/libs/*.aar
!android/app/libs/lib-decoder-ffmpeg-release.aar
HEATING_OPTIMIZATIONS.md
android
sliderreadme.md
# sliderreadme.md
.cursor/mcp.json
local-scrapers-repo
worki.json
@ -53,4 +57,19 @@ hackintosh-emulator-fix.sh
/ota-builds
src/screens/xavio.md
/nuvio-providers
/KSPlayer
/KSPlayer
/exobase
# ffmpegreadme.md
toast.md
ffmpegreadme.md
sliderreadme.md
bottomsheet.md
fastimage.md
# Backup directories
backup_sdk54_upgrade/
SDK54_UPGRADE_SUMMARY.md
SDK54_UPGRADE_SUMMARY.md
build-and-publish-app-releases.sh
bottomnav.md
/TrailerServices

View file

@ -1,2 +1,3 @@
{
"java.compile.nullAnalysis.mode": "automatic"
}

82
App.tsx
View file

@ -10,7 +10,8 @@ import {
View,
StyleSheet,
I18nManager,
Platform
Platform,
LogBox
} from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
@ -27,14 +28,19 @@ import { GenreProvider } from './src/contexts/GenreContext';
import { TraktProvider } from './src/contexts/TraktContext';
import { ThemeProvider, useTheme } from './src/contexts/ThemeContext';
import { TrailerProvider } from './src/contexts/TrailerContext';
import { DownloadsProvider } from './src/contexts/DownloadsContext';
import SplashScreen from './src/components/SplashScreen';
import UpdatePopup from './src/components/UpdatePopup';
import MajorUpdateOverlay from './src/components/MajorUpdateOverlay';
import { useGithubMajorUpdate } from './src/hooks/useGithubMajorUpdate';
import { useUpdatePopup } from './src/hooks/useUpdatePopup';
import AsyncStorage from '@react-native-async-storage/async-storage';
import * as Sentry from '@sentry/react-native';
import UpdateService from './src/services/updateService';
import { memoryMonitorService } from './src/services/memoryMonitorService';
import { aiService } from './src/services/aiService';
import { AccountProvider, useAccount } from './src/contexts/AccountContext';
import { ToastProvider } from './src/contexts/ToastContext';
Sentry.init({
dsn: 'https://1a58bf436454d346e5852b7bfd3c95e8@o4509536317276160.ingest.de.sentry.io/4509536317734992',
@ -57,6 +63,12 @@ Sentry.init({
I18nManager.allowRTL(false);
I18nManager.forceRTL(false);
// Suppress duplicate key warnings app-wide
LogBox.ignoreLogs([
'Warning: Encountered two children with the same key',
'Keys should be unique so that components maintain their identity across updates'
]);
// This fixes many navigation layout issues by using native screen containers
enableScreens(true);
@ -83,6 +95,9 @@ const ThemedApp = () => {
handleUpdateLater,
handleDismiss,
} = useUpdatePopup();
// GitHub major/minor release overlay
const githubUpdate = useGithubMajorUpdate();
// Check onboarding status and initialize services
useEffect(() => {
@ -144,33 +159,40 @@ const ThemedApp = () => {
const initialRouteName = hasCompletedOnboarding ? 'MainTabs' : 'Onboarding';
return (
<PaperProvider theme={customDarkTheme}>
<NavigationContainer
theme={customNavigationTheme}
// Disable automatic linking which can cause layout issues
linking={undefined}
>
<View style={[styles.container, { backgroundColor: currentTheme.colors.darkBackground }]}>
<StatusBar
style="light"
/>
{!isAppReady && <SplashScreen onFinish={handleSplashComplete} />}
{shouldShowApp && <AppNavigator initialRouteName={initialRouteName} />}
{/* Update Popup */}
{Platform.OS === 'ios' && (
<UpdatePopup
visible={showUpdatePopup}
updateInfo={updateInfo}
onUpdateNow={handleUpdateNow}
onUpdateLater={handleUpdateLater}
onDismiss={handleDismiss}
isInstalling={isInstalling}
/>
)}
</View>
</NavigationContainer>
</PaperProvider>
<AccountProvider>
<PaperProvider theme={customDarkTheme}>
<NavigationContainer
theme={customNavigationTheme}
linking={undefined}
>
<DownloadsProvider>
<View style={[styles.container, { backgroundColor: currentTheme.colors.darkBackground }]}>
<StatusBar style="light" />
{!isAppReady && <SplashScreen onFinish={handleSplashComplete} />}
{shouldShowApp && <AppNavigator initialRouteName={initialRouteName} />}
{Platform.OS === 'ios' && (
<UpdatePopup
visible={showUpdatePopup}
updateInfo={updateInfo}
onUpdateNow={handleUpdateNow}
onUpdateLater={handleUpdateLater}
onDismiss={handleDismiss}
isInstalling={isInstalling}
/>
)}
<MajorUpdateOverlay
visible={githubUpdate.visible}
latestTag={githubUpdate.latestTag}
releaseNotes={githubUpdate.releaseNotes}
releaseUrl={githubUpdate.releaseUrl}
onDismiss={githubUpdate.onDismiss}
onLater={githubUpdate.onLater}
/>
</View>
</DownloadsProvider>
</NavigationContainer>
</PaperProvider>
</AccountProvider>
);
}
@ -182,7 +204,9 @@ function App(): React.JSX.Element {
<TraktProvider>
<ThemeProvider>
<TrailerProvider>
<ThemedApp />
<ToastProvider>
<ThemedApp />
</ToastProvider>
</TrailerProvider>
</ThemeProvider>
</TraktProvider>

275
README.md
View file

@ -1,153 +1,184 @@
# Nuvio Streaming App
<!-- Improved compatibility of back to top link -->
<a id="readme-top"></a>
<p align="center">
<img src="assets/titlelogo.png" alt="Nuvio Logo" width="300"/>
</p>
<!-- PROJECT SHIELDS -->
[![Contributors][contributors-shield]][contributors-url]
[![Forks][forks-shield]][forks-url]
[![Stargazers][stars-shield]][stars-url]
[![Issues][issues-shield]][issues-url]
[![License][license-shield]][license-url]
<p align="center">
A modern streaming application built with React Native and Expo, featuring comprehensive Stremio addon integration and Trakt.tv synchronization.
</p>
<!-- PROJECT LOGO -->
<br />
<div align="center">
<img src="assets/titlelogo.png" alt="Nuvio Logo" width="120" />
<h1 align="center">🎬 Nuvio Media Hub</h1>
<p align="center">
A modern media hub built with React Native and Expo
<br />
Stremio Addon ecosystem • Crossplatform • Offline metadata & sync
<br />
<br />
<a href="#getting-started"><strong>Get Started »</strong></a>
<br />
<br />
<a href="#demo">View Screenshots</a>
·
<a href="https://github.com/tapframe/NuvioStreaming/issues/new?labels=bug&template=bug_report.md">Report Bug</a>
·
<a href="https://github.com/tapframe/NuvioStreaming/issues/new?labels=enhancement&template=feature_request.md">Request Feature</a>
</p>
</div>
---
<!-- TABLE OF CONTENTS -->
<details>
<summary>Table of Contents</summary>
<ol>
<li>
<a href="#about-the-project">About The Project</a>
</li>
<li><a href="#demo">Screenshots</a></li>
<li>
<a href="#getting-started">Getting Started</a>
<ul>
<li><a href="#installation">Installation</a></li>
<li><a href="#build">Build</a></li>
</ul>
</li>
<li><a href="#contributing">Contributing</a></li>
<li><a href="#support">Support</a></li>
<li><a href="#license">License</a></li>
<li><a href="#contact">Contact</a></li>
<li><a href="#acknowledgments">Acknowledgments</a></li>
<li><a href="#built-with">Built With</a></li>
</ol>
</details>
## Stable Release
Nuvio is now available as a stable release! Version 1.0.0 brings all major features from the beta phase, refined and optimized for the best user experience.
<!-- ABOUT THE PROJECT -->
## About The Project
[Download Latest Release](https://github.com/tapframe/NuvioStreaming/tags)
Nuvio Media Hub is a crossplatform app for managing, discovering, and streaming your media via a flexible addon ecosystem. Built with React Native + Expo, it integrates providers and sync services while keeping a simple, fast UI.
---
## Installation
<!-- DEMO / SCREENSHOTS -->
## Demo
<a id="demo"></a>
### AltStore Installation
<img src="https://upload.wikimedia.org/wikipedia/commons/2/20/AltStore_logo.png" width="32" height="32" align="left"> [![Add to AltStore](https://img.shields.io/badge/Add%20to-AltStore-blue?style=for-the-badge)](https://tinyurl.com/NuvioAltstore)
| Home | Details |
|:----:|:-------:|
| ![Home](screenshots/Simulator%20Screenshot%20-%20iPhone%2016%20Pro%20-%202025-08-27%20at%2021.08.32-portrait.png) | ![Details](screenshots/WhatsApp%20Image%202025-09-02%20at%2000.24.31-portrait.png) |
### SideStore Installation
<img src="https://github.com/SideStore/assets/blob/main/icon.png?raw=true" width="32" height="32" align="left"> [![Add to SideStore](https://img.shields.io/badge/Add%20to-SideStore-green?style=for-the-badge)](https://tinyurl.com/NuvioSidestore)
<p align="right">(<a href="#readme-top">back to top</a>)</p>
**Manual URL:** `https://raw.githubusercontent.com/tapframe/NuvioStreaming/main/nuvio-source.json`
<!-- GETTING STARTED -->
## Getting Started
---
Follow the steps below to run the app locally.
## Core Features
### Installation
### Content Discovery
- **Personalized Recommendations:** Smart home screen with continue watching functionality
- **Advanced Search:** Comprehensive filtering and instant search results
- **Rich Metadata:** Detailed content information, cast, crew, and ratings
- **Calendar Integration:** Track upcoming episodes and releases
- **Library Management:** Personal collections with watch history tracking
```bash
git clone https://github.com/tapframe/NuvioStreaming.git
cd NuvioStreaming
npm install
# If you hit peer dependency conflicts:
# npm install --legacy-peer-deps
npx expo start
```
### Streaming Experience
- **Dual Player Support:** Built-in video player with gesture controls and external player integration
- **Intelligent Quality Selection:** Automatic stream optimization and subtitle support
- **Trailer Playback:** Seamless trailer integration with preloading
- **Continuous Playback:** Auto-play functionality for uninterrupted viewing
- **Progress Synchronization:** Resume playback across devices
### Build
### Platform Integrations
- **Trakt.tv Sync:** Complete watch history, ratings, and library synchronization
- **Stremio Ecosystem:** Full addon compatibility with easy management
- **TMDB Integration:** Comprehensive metadata and high-quality imagery
- **MDBList Support:** Enhanced ratings and recommendations
- **Custom Scrapers:** Local content source integration
```bash
npx expo prebuild
npx expo run:android # Android
npx expo run:ios # iOS
```
### User Interface
- **Material Design:** Clean, modern interface with smooth animations
- **Dynamic Theming:** Content-based color extraction and customization
- **Cross-Platform:** Native experience on iOS and Android
- **Performance Optimized:** Efficient rendering and image caching
<details>
<summary>Alternative iOS Installation</summary>
### Advanced Features
- **Push Notifications:** New episode alerts and content reminders
- **Background Synchronization:** Automatic data updates and content sync
### AltStore
<img src="https://upload.wikimedia.org/wikipedia/commons/2/20/AltStore_logo.png" width="24" height="24" align="left"> [![Add to AltStore](https://img.shields.io/badge/Add%20to-AltStore-blue?style=for-the-badge)](https://tinyurl.com/NuvioAltstore)
---
### SideStore
<img src="https://github.com/SideStore/assets/blob/main/icon.png?raw=true" width="24" height="24" align="left"> [![Add to SideStore](https://img.shields.io/badge/Add%20to-SideStore-green?style=for-the-badge)](https://tinyurl.com/NuvioSidestore)
## Screenshots
**Manual URL:** `https://raw.githubusercontent.com/tapframe/NuvioStreaming/main/nuvio-source.json`
| Home Screen | Details Page | Home Screen 2 |
|:-----------:|:------------:|:-------------:|
| ![Home Screen](screesnhots/Simulator%20Screenshot%20-%20iPhone%2016%20Pro%20-%202025-08-27%20at%2021.08.32-portrait.png) | ![Details Page](screesnhots/WhatsApp%20Image%202025-09-02%20at%2000.24.31-portrait.png) | ![Home Screen 2](screesnhots/Simulator%20Screenshot%20-%20iPhone%2016%20Pro%20-%202025-08-27%20at%2021.09.43-portrait.png) |
</details>
| Library | Player Loading | Video Player |
|:-------:|:--------------:|:------------:|
| ![Library](screesnhots/Simulator%20Screenshot%20-%20iPhone%2016%20Pro%20-%202025-08-27%20at%2021.10.14-portrait.png) | ![Player Loading](screesnhots/Simulator%20Screenshot%20-%20iPhone%2016%20Pro%20-%202025-08-27%20at%2021.12.41-landscape.png) | ![Video Player](screesnhots/Simulator%20Screenshot%20-%20iPhone%2016%20Pro%20-%202025-08-27%20at%2021.13.36-landscape.png) |
<p align="right">(<a href="#readme-top">back to top</a>)</p>
| Ratings | Episodes & Seasons | Search & Details |
|:-------:|:------------------:|:----------------:|
| ![Ratings](screesnhots/ratingscreen-portrait.png) | ![Episodes & Seasons](screesnhots/seasonandepisode-portrait.png) | ![Search & Details](screesnhots/search-portrait.png) |
---
## Contributing
## Tools & Technologies
Contributions make the opensource community amazing! Any contributions are greatly appreciated.
1. Fork the project
2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
4. Push to the branch (`git push origin feature/AmazingFeature`)
5. Open a Pull Request
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Support
If you find Nuvio helpful, consider supporting development:
* **KoFi** `https://ko-fi.com/tapframe`
* **GitHub Star** Star the repo to show support
* **Share** Tell others about the project
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## License
Distributed under the GNU GPLv3 License. See `LICENSE` for more information.
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Contact
**Project Links:**
* GitHub: `https://github.com/tapframe`
* Issues: `https://github.com/tapframe/NuvioStreaming/issues`
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Acknowledgments
* [React Native](https://reactnative.dev/)
* [Expo](https://expo.dev/)
* [TypeScript](https://www.typescriptlang.org/)
* Community contributors and testers
**Disclaimer:** This application functions as a media hub with addon/plugin support. It does not contain any builtin content or host media content. Content access is only available through userinstalled plugins and addons. Any legal concerns should be directed to the specific websites providing the content.
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Built With
<p align="left">
<a href="https://skillicons.dev">
<img src="https://skillicons.dev/icons?i=react,typescript,nodejs,expo,github,githubactions&theme=light&perline=6" />
</a>
</p>
<br/>
React Native • Expo • TypeScript
</p>
---
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Development
### Prerequisites
- Node.js 18+
- npm or yarn
- Expo CLI
### Setup
```bash
git clone https://github.com/tapframe/NuvioStreaming.git
cd NuvioStreaming
npm install
npx expo start
```
### Build Commands
```bash
npx expo run:android # Android build
npx expo run:ios # iOS build
```
---
## Contributing
1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Submit a pull request
---
## Issues
Report bugs and request features via [GitHub Issues](https://github.com/tapframe/NuvioStreaming/issues)
---
## License
[![GNU GPLv3](https://www.gnu.org/graphics/gplv3-127x51.png)](http://www.gnu.org/licenses/gpl-3.0.en.html)
This project is licensed under the GNU General Public License v3.0 - see the [LICENSE](LICENSE) file for details.
---
## Disclaimer
This application functions as a content aggregator, accessing publicly available streams from third-party sources. No media content is hosted by this application. Users are responsible for compliance with applicable laws and regulations.
---
## Acknowledgments
Built with support from:
- React Native & Expo
- TMDB API
- Trakt.tv
- Stremio
<!-- MARKDOWN LINKS & IMAGES -->
[contributors-shield]: https://img.shields.io/github/contributors/tapframe/NuvioStreaming.svg?style=for-the-badge
[contributors-url]: https://github.com/tapframe/NuvioStreaming/graphs/contributors
[forks-shield]: https://img.shields.io/github/forks/tapframe/NuvioStreaming.svg?style=for-the-badge
[forks-url]: https://github.com/tapframe/NuvioStreaming/network/members
[stars-shield]: https://img.shields.io/github/stars/tapframe/NuvioStreaming.svg?style=for-the-badge
[stars-url]: https://github.com/tapframe/NuvioStreaming/stargazers
[issues-shield]: https://img.shields.io/github/issues/tapframe/NuvioStreaming.svg?style=for-the-badge
[issues-url]: https://github.com/tapframe/NuvioStreaming/issues
[license-shield]: https://img.shields.io/github/license/tapframe/NuvioStreaming.svg?style=for-the-badge
[license-url]: http://www.gnu.org/licenses/gpl-3.0.en.html

View file

@ -14,6 +14,7 @@ react {
hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc"
codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile()
enableBundleCompression = (findProperty('android.enableBundleCompression') ?: false).toBoolean()
// Use Expo CLI to bundle the app, this ensures the Metro config
// works correctly with Expo projects.
cliFile = new File(["node", "--print", "require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })"].execute(null, rootDir).text.trim())
@ -63,9 +64,9 @@ react {
}
/**
* Set this to true to Run Proguard on Release builds to minify the Java bytecode.
* Set this to true in release builds to optimize the app using [R8](https://developer.android.com/topic/performance/app-optimization/enable-app-optimization).
*/
def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInReleaseBuilds') ?: false).toBoolean()
def enableMinifyInReleaseBuilds = (findProperty('android.enableMinifyInReleaseBuilds') ?: false).toBoolean()
/**
* The preferred build flavor of JavaScriptCore (JSC)
@ -78,9 +79,9 @@ def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInRelea
* give correct results when using with locales other than en-US. Note that
* this variant is about 6MiB larger per architecture than default.
*/
def jscFlavor = 'org.webkit:android-jsc:+'
def jscFlavor = 'io.github.react-native-community:jsc-android:2026004.+'
apply from: new File(["node", "--print", "require('path').dirname(require.resolve('@sentry/react-native/package.json'))"].execute().text.trim(), "sentry.gradle")
// apply from: new File(["node", "--print", "require('path').dirname(require.resolve('@sentry/react-native/package.json'))"].execute().text.trim(), "sentry.gradle")
android {
ndkVersion rootProject.ext.ndkVersion
@ -93,16 +94,39 @@ android {
applicationId 'com.nuvio.app'
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 16
versionName "1.2.0"
versionCode 21
versionName "1.2.6"
buildConfigField "String", "REACT_NATIVE_RELEASE_LEVEL", "\"${findProperty('reactNativeReleaseLevel') ?: 'stable'}\""
}
// Split APKs by architecture only for smaller downloads
splits {
abi {
reset()
enable true
universalApk false // If true, also generate a universal APK
include "arm64-v8a", "armeabi-v7a", "x86", "x86_64"
reset()
include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
universalApk true
}
density {
enable false
}
}
// Generate unique version codes for each split APK
def abiVersionCodes = ['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]
applicationVariants.all { variant ->
variant.outputs.each { output ->
def baseVersionCode = 21 // Current versionCode 21 from defaultConfig
def abiName = output.getFilter(com.android.build.OutputFile.ABI)
def versionCode = baseVersionCode * 100 // Base multiplier
if (abiName != null) {
versionCode += abiVersionCodes.get(abiName)
}
output.versionCodeOverride = versionCode
}
}
signingConfigs {
@ -121,15 +145,18 @@ android {
// Caution! In production, you need to generate your own keystore file.
// see https://reactnative.dev/docs/signed-apk-android.
signingConfig signingConfigs.debug
shrinkResources (findProperty('android.enableShrinkResourcesInReleaseBuilds')?.toBoolean() ?: false)
minifyEnabled enableProguardInReleaseBuilds
def enableShrinkResources = findProperty('android.enableShrinkResourcesInReleaseBuilds') ?: 'false'
shrinkResources enableShrinkResources.toBoolean()
minifyEnabled enableMinifyInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
crunchPngs (findProperty('android.enablePngCrunchInReleaseBuilds')?.toBoolean() ?: true)
def enablePngCrunchInRelease = findProperty('android.enablePngCrunchInReleaseBuilds') ?: 'true'
crunchPngs enablePngCrunchInRelease.toBoolean()
}
}
packagingOptions {
jniLibs {
useLegacyPackaging (findProperty('expo.useLegacyPackaging')?.toBoolean() ?: false)
def enableLegacyPackaging = findProperty('expo.useLegacyPackaging') ?: 'false'
useLegacyPackaging enableLegacyPackaging.toBoolean()
}
}
androidResources {
@ -167,15 +194,15 @@ dependencies {
if (isGifEnabled) {
// For animated gif support
implementation("com.facebook.fresco:animated-gif:${reactAndroidLibs.versions.fresco.get()}")
implementation("com.facebook.fresco:animated-gif:${expoLibs.versions.fresco.get()}")
}
if (isWebpEnabled) {
// For webp support
implementation("com.facebook.fresco:webpsupport:${reactAndroidLibs.versions.fresco.get()}")
implementation("com.facebook.fresco:webpsupport:${expoLibs.versions.fresco.get()}")
if (isWebpAnimatedEnabled) {
// Animated webp support
implementation("com.facebook.fresco:animated-webp:${reactAndroidLibs.versions.fresco.get()}")
implementation("com.facebook.fresco:animated-webp:${expoLibs.versions.fresco.get()}")
}
}
@ -184,4 +211,7 @@ dependencies {
} else {
implementation jscFlavor
}
// Include only FFmpeg decoder AAR to avoid duplicates with Maven Media3
implementation files("libs/lib-decoder-ffmpeg-release.aar")
}

Binary file not shown.

View file

@ -12,3 +12,17 @@
-keep class com.facebook.react.turbomodule.** { *; }
# Add any project specific keep options here:
# Media3 / ExoPlayer keep (extensions and reflection)
-keep class androidx.media3.** { *; }
-dontwarn androidx.media3.**
# FastImage / Glide ProGuard rules
-keep public class com.dylanvann.fastimage.* {*;}
-keep public class com.dylanvann.fastimage.** {*;}
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}

View file

@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application android:usesCleartextTraffic="true" tools:targetApi="28" tools:ignore="GoogleAppIndexingWarning" tools:replace="android:usesCleartextTraffic" />
</manifest>

View file

@ -13,7 +13,7 @@
<data android:scheme="https"/>
</intent>
</queries>
<application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="true" android:theme="@style/AppTheme" android:supportsRtl="true">
<application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="true" android:theme="@style/AppTheme" android:supportsRtl="true" android:enableOnBackInvokedCallback="false">
<meta-data android:name="expo.modules.updates.ENABLED" android:value="true"/>
<meta-data android:name="expo.modules.updates.EXPO_RUNTIME_VERSION" android:value="@string/expo_runtime_version"/>
<meta-data android:name="expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH" android:value="ERROR_RECOVERY_ONLY"/>
@ -29,7 +29,6 @@
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="nuvio"/>
<data android:scheme="com.nuvio.app"/>
<data android:scheme="exp+nuvio"/>
</intent-filter>
</activity>

View file

@ -5,13 +5,13 @@ import android.content.res.Configuration
import com.facebook.react.PackageList
import com.facebook.react.ReactApplication
import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative
import com.facebook.react.ReactNativeHost
import com.facebook.react.ReactPackage
import com.facebook.react.ReactHost
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load
import com.facebook.react.common.ReleaseLevel
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint
import com.facebook.react.defaults.DefaultReactNativeHost
import com.facebook.react.soloader.OpenSourceMergedSoMapping
import com.facebook.soloader.SoLoader
import expo.modules.ApplicationLifecycleDispatcher
import expo.modules.ReactNativeHostWrapper
@ -19,21 +19,19 @@ import expo.modules.ReactNativeHostWrapper
class MainApplication : Application(), ReactApplication {
override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper(
this,
object : DefaultReactNativeHost(this) {
override fun getPackages(): List<ReactPackage> {
val packages = PackageList(this).packages
// Packages that cannot be autolinked yet can be added manually here, for example:
// packages.add(new MyReactNativePackage());
return packages
}
this,
object : DefaultReactNativeHost(this) {
override fun getPackages(): List<ReactPackage> =
PackageList(this).packages.apply {
// Packages that cannot be autolinked yet can be added manually here, for example:
// add(MyReactNativePackage())
}
override fun getJSMainModuleName(): String = ".expo/.virtual-metro-entry"
override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG
override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
}
)
@ -42,11 +40,12 @@ class MainApplication : Application(), ReactApplication {
override fun onCreate() {
super.onCreate()
SoLoader.init(this, OpenSourceMergedSoMapping)
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
// If you opted-in for the New Architecture, we load the native entry point for this app.
load()
DefaultNewArchitectureEntryPoint.releaseLevel = try {
ReleaseLevel.valueOf(BuildConfig.REACT_NATIVE_RELEASE_LEVEL.uppercase())
} catch (e: IllegalArgumentException) {
ReleaseLevel.STABLE
}
loadReactNative(this)
ApplicationLifecycleDispatcher.onApplicationCreate(this)
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

After

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View file

@ -3,5 +3,5 @@
<string name="expo_splash_screen_resize_mode" translatable="false">contain</string>
<string name="expo_splash_screen_status_bar_translucent" translatable="false">false</string>
<string name="expo_system_ui_user_interface_style" translatable="false">dark</string>
<string name="expo_runtime_version">1.2.0</string>
<string name="expo_runtime_version">1.2.6</string>
</resources>

View file

@ -1,17 +1,11 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:textColor">@android:color/black</item>
<item name="android:editTextStyle">@style/ResetEditText</item>
<style name="AppTheme" parent="Theme.Material3.DayNight.NoActionBar">
<item name="android:enforceNavigationBarContrast" tools:targetApi="29">true</item>
<item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="android:statusBarColor">#020404</item>
<item name="android:windowBackground">@color/activityBackground</item>
</style>
<style name="ResetEditText" parent="@android:style/Widget.EditText">
<item name="android:padding">0dp</item>
<item name="android:textColorHint">#c8c8c8</item>
<item name="android:textColor">@android:color/black</item>
</style>
<style name="Theme.App.SplashScreen" parent="AppTheme">
<item name="android:windowBackground">@drawable/ic_launcher_background</item>
</style>

View file

@ -1,41 +1,24 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext {
buildToolsVersion = findProperty('android.buildToolsVersion') ?: '35.0.0'
minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '24')
compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '35')
targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '34')
kotlinVersion = findProperty('android.kotlinVersion') ?: '1.9.25'
ndkVersion = "26.1.10909125"
}
repositories {
google()
mavenCentral()
}
dependencies {
classpath('com.android.tools.build:gradle')
classpath('com.facebook.react:react-native-gradle-plugin')
classpath('org.jetbrains.kotlin:kotlin-gradle-plugin')
}
repositories {
google()
mavenCentral()
}
dependencies {
classpath('com.android.tools.build:gradle')
classpath('com.facebook.react:react-native-gradle-plugin')
classpath('org.jetbrains.kotlin:kotlin-gradle-plugin')
}
}
apply plugin: "com.facebook.react.rootproject"
allprojects {
repositories {
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url(new File(['node', '--print', "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), '../android'))
}
maven {
// Android JSC is installed from npm
url(new File(['node', '--print', "require.resolve('jsc-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), '../dist'))
}
google()
mavenCentral()
maven { url 'https://www.jitpack.io' }
}
repositories {
google()
mavenCentral()
maven { url 'https://www.jitpack.io' }
}
}
apply plugin: "expo-root-project"
apply plugin: "com.facebook.react.rootproject"

View file

@ -10,12 +10,12 @@
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=1024m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
@ -41,6 +41,11 @@ newArchEnabled=true
# If set to false, you will be using JSC instead.
hermesEnabled=true
# Use this property to enable edge-to-edge display support.
# This allows your app to draw behind system bars for an immersive UI.
# Note: Only works with ReactActivity and should not be used with custom Activity.
edgeToEdgeEnabled=true
# Enable GIF support in React Native images (~200 B increase)
expo.gif.enabled=true
# Enable webp support in React Native images (~85 KB increase)
@ -54,7 +59,7 @@ EX_DEV_CLIENT_NETWORK_INSPECTOR=true
# Use legacy packaging to compress native libraries in the resulting APK.
expo.useLegacyPackaging=false
android.minSdkVersion=26
# Whether the app is configured to use edge-to-edge via the app config or `react-native-edge-to-edge` plugin
expo.edgeToEdgeEnabled=false
# Specifies whether the app is configured to use edge-to-edge via the app config or plugin
# WARNING: This property has been deprecated and will be removed in Expo SDK 55. Use `edgeToEdgeEnabled` or `react.edgeToEdgeEnabled` to determine whether the project is using edge-to-edge.
expo.edgeToEdgeEnabled=true

Binary file not shown.

View file

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

7
android/gradlew vendored Normal file → Executable file
View file

@ -86,8 +86,7 @@ done
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
' "$PWD" ) || exit
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@ -115,7 +114,7 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM.
@ -214,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
# Stop when "xargs" is not available.

4
android/gradlew.bat vendored
View file

@ -70,11 +70,11 @@ goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
set CLASSPATH=
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell

View file

@ -1,38 +1,39 @@
pluginManagement {
includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().toString())
def reactNativeGradlePlugin = new File(
providers.exec {
workingDir(rootDir)
commandLine("node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })")
}.standardOutput.asText.get().trim()
).getParentFile().absolutePath
includeBuild(reactNativeGradlePlugin)
def expoPluginsPath = new File(
providers.exec {
workingDir(rootDir)
commandLine("node", "--print", "require.resolve('expo-modules-autolinking/package.json', { paths: [require.resolve('expo/package.json')] })")
}.standardOutput.asText.get().trim(),
"../android/expo-gradle-plugin"
).absolutePath
includeBuild(expoPluginsPath)
}
plugins {
id("com.facebook.react.settings")
id("expo-autolinking-settings")
}
plugins { id("com.facebook.react.settings") }
extensions.configure(com.facebook.react.ReactSettingsExtension) { ex ->
if (System.getenv('EXPO_USE_COMMUNITY_AUTOLINKING') == '1') {
ex.autolinkLibrariesFromCommand()
} else {
def command = [
'node',
'--no-warnings',
'--eval',
'require(require.resolve(\'expo-modules-autolinking\', { paths: [require.resolve(\'expo/package.json\')] }))(process.argv.slice(1))',
'react-native-config',
'--json',
'--platform',
'android'
].toList()
ex.autolinkLibrariesFromCommand(command)
ex.autolinkLibrariesFromCommand(expoAutolinking.rnConfigCommand)
}
}
expoAutolinking.useExpoModules()
rootProject.name = 'Nuvio'
dependencyResolutionManagement {
versionCatalogs {
reactAndroidLibs {
from(files(new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../gradle/libs.versions.toml")))
}
}
}
apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle");
useExpoModules()
expoAutolinking.useExpoVersionCatalog()
include ':app'
includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile())
includeBuild(expoAutolinking.reactNativeGradlePlugin)

View file

@ -2,7 +2,7 @@
"expo": {
"name": "Nuvio",
"slug": "nuvio",
"version": "1.2.0",
"version": "1.2.6",
"orientation": "default",
"backgroundColor": "#020404",
"icon": "./assets/ios/AppIcon.appiconset/Icon-App-60x60@3x.png",
@ -10,14 +10,14 @@
"scheme": "nuvio",
"newArchEnabled": true,
"splash": {
"image": "./assets/splash-icon.png",
"image": "./src/assets/splash-icon-new.png",
"resizeMode": "contain",
"backgroundColor": "#020404"
},
"ios": {
"supportsTablet": true,
"icon": "./assets/ios/AppIcon.appiconset/Icon-App-60x60@3x.png",
"buildNumber": "16",
"buildNumber": "21",
"infoPlist": {
"NSAppTransportSecurity": {
"NSAllowsArbitraryLoads": true
@ -48,7 +48,7 @@
"WAKE_LOCK"
],
"package": "com.nuvio.app",
"versionCode": 16,
"versionCode": 21,
"architectures": [
"arm64-v8a",
"armeabi-v7a",
@ -86,7 +86,8 @@
"localNetworkPermission": "Allow $(PRODUCT_NAME) to access your local network",
"supportsBackgroundPlayback": true
}
]
],
"react-native-bottom-tabs"
],
"updates": {
"enabled": true,
@ -94,6 +95,6 @@
"fallbackToCacheTimeout": 30000,
"url": "https://grim-reyna-tapframe-69970143.koyeb.app/api/manifest"
},
"runtimeVersion": "1.2.0"
"runtimeVersion": "1.2.6"
}
}

1
app/Streams.tsx Normal file
View file

@ -0,0 +1 @@

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7 KiB

After

Width:  |  Height:  |  Size: 8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 85 KiB

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#151515</color>
<color name="ic_launcher_background">#2f2f2f</color>
</resources>

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 718 B

After

Width:  |  Height:  |  Size: 785 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 KiB

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 KiB

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 423 KiB

After

Width:  |  Height:  |  Size: 583 KiB

View file

@ -3,7 +3,8 @@ module.exports = function (api) {
return {
presets: ['babel-preset-expo'],
plugins: [
'react-native-reanimated/plugin',
'react-native-worklets/plugin',
'react-native-boost/plugin',
],
env: {
production: {

View file

@ -0,0 +1,173 @@
# Native Modifications Guide - SDK 54 Upgrade
**Created:** October 14, 2025
**From SDK:** 52
**To SDK:** 54
## Overview
This document records all custom native modifications made to the Nuvio app that need to be preserved during the Expo SDK 54 upgrade.
---
## iOS Modifications
### 1. KSPlayer Bridge Integration
**Purpose:** Custom video player for iOS using KSPlayer library
**Files Added/Modified:**
- `ios/KSPlayerManager.m` - Objective-C bridge header
- `ios/KSPlayerModule.swift` - Swift module for KSPlayer
- `ios/KSPlayerView.swift` - Main player view implementation
- `ios/KSPlayerViewManager.swift` - React Native view manager
**Location in Xcode Project:**
- Files are in `ios/Nuvio/` directory
- Referenced in `ios/Nuvio.xcodeproj/project.pbxproj`
**Podfile Dependencies (lines 52-56):**
```ruby
# KSPlayer dependencies
pod 'KSPlayer',:git => 'https://github.com/kingslay/KSPlayer.git', :branch => 'main', :modular_headers => true
pod 'DisplayCriteria',:git => 'https://github.com/kingslay/KSPlayer.git', :branch => 'main', :modular_headers => true
pod 'FFmpegKit',:git => 'https://github.com/kingslay/FFmpegKit.git', :branch => 'main', :modular_headers => true
pod 'Libass',:git => 'https://github.com/kingslay/FFmpegKit.git', :branch => 'main', :modular_headers => true
```
**Features:**
- Custom video player with multi-codec support
- Audio track selection
- Subtitle track selection
- Advanced playback controls
- Header injection for streaming
- Multi-channel audio downmixing
**Restoration Steps:**
1. Copy KSPlayer bridge files to `ios/` directory after prebuild
2. Add Podfile dependencies
3. Run `pod install`
4. Ensure files are linked in Xcode project
---
## Android Modifications
### 1. FFmpeg Audio Decoder Extension
**Purpose:** Enable ExoPlayer to play AC3, E-AC3, DTS, TrueHD audio codecs via FFmpeg
**Files Added:**
- `android/app/libs/lib-decoder-ffmpeg-release.aar` - FFmpeg decoder AAR from Media3
**build.gradle Modifications (line 189):**
```gradle
// Include only FFmpeg decoder AAR to avoid duplicates with Maven Media3
implementation files("libs/lib-decoder-ffmpeg-release.aar")
```
**proguard-rules.pro Additions (lines 16-18):**
```proguard
# Media3 / ExoPlayer keep (extensions and reflection)
-keep class androidx.media3.** { *; }
-dontwarn androidx.media3.**
```
**Node Modules Modification:**
- File: `node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java`
- Change: Set extension renderer mode to PREFER to use FFmpeg decoders
```java
new DefaultRenderersFactory(getContext())
.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER)
```
**Important Notes:**
- FFmpeg module provides AUDIO decoders only (AC3, E-AC3, DTS, TrueHD)
- Does NOT provide video decoders (HEVC/Dolby Vision rely on device hardware or VLC fallback)
- The AAR is from Just Player base (`exobase/app/libs`)
**Restoration Steps:**
1. Copy `lib-decoder-ffmpeg-release.aar` to `android/app/libs/`
2. Add implementation line to `android/app/build.gradle`
3. Add keep rules to `android/app/proguard-rules.pro`
4. Modify `ReactExoplayerView.java` in node_modules (after npm install)
---
## Application Logic Changes
### Player Fallback Strategy
**Modified Files:**
- `src/screens/StreamsScreen.tsx` - Removed MKV pre-forcing to VLC
- `src/components/player/AndroidVideoPlayer.tsx` - Error handler toggles `forceVlc`
**Behavior:**
- Start with ExoPlayer + FFmpeg audio decoders by default
- On decoder errors (codec not supported), automatically switch to VLC
- Do not pre-force VLC based on file extension
---
## Backup Location
All backups are stored in: `/Users/nayifnoushad/Documents/Projects/NuvioStreaming/backup_sdk54_upgrade/`
**Backup Contents:**
- `android_original/` - Complete Android directory
- `ios_original/` - Complete iOS directory (partial - Pods symlinks failed)
- `KSPlayerManager.m` - iOS bridge file
- `KSPlayerModule.swift` - iOS module file
- `KSPlayerView.swift` - iOS view file
- `KSPlayerViewManager.swift` - iOS view manager file
- `lib-decoder-ffmpeg-release.aar` - FFmpeg AAR
- `build.gradle.backup` - Android build.gradle
- `proguard-rules.pro.backup` - ProGuard rules
- `Podfile.backup` - iOS Podfile
- `package.json.backup` - Original package.json
- `ReactExoplayerView.java.backup` - Modified react-native-video file
---
## SDK 54 Upgrade Process
### Pre-Upgrade Checklist
- ✅ All native files backed up
- ✅ Custom modifications documented
- ✅ FFmpeg AAR preserved
- ✅ KSPlayer bridge files preserved
- ✅ Build configuration files backed up
### Upgrade Steps
1. Update package.json to SDK 54
2. Run `npx expo install` to update compatible packages
3. Run `npx expo prebuild --clean` to regenerate native projects
4. Restore Android FFmpeg integration
5. Restore iOS KSPlayer integration
6. Test builds on both platforms
### Post-Upgrade Verification
- [ ] Android: FFmpeg audio decoders working (test AC3/DTS stream)
- [ ] iOS: KSPlayer bridge working
- [ ] Audio track selection functional
- [ ] Subtitle track selection functional
- [ ] VLC fallback working on decoder errors
- [ ] App builds successfully for both platforms
---
## Critical Notes
1. **react-native-video modification:** This must be reapplied after every `npm install` or package update
2. **FFmpeg limitations:** Audio codecs only - video codecs require hardware decoder or VLC
3. **KSPlayer Podfile:** Uses git branches, may need version pinning for stability
4. **Xcode project:** KSPlayer files must be linked in project.pbxproj after prebuild
---
## References
- FFmpeg integration guide: `ffmpegreadme.md`
- KSPlayer repo: https://github.com/kingslay/KSPlayer
- Expo SDK 54 changelog: https://expo.dev/changelog/2025/

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