From d0dc2c2410b1593a3ca67b512ef2e611d800cd4f Mon Sep 17 00:00:00 2001 From: Madari Developers Date: Thu, 9 Jan 2025 06:35:44 +0000 Subject: [PATCH] Project import generated by Copybara. GitOrigin-RevId: aa7a2fadfab104fd54c1507c3c4446357e176e70 --- .github/workflows/build-deploy.yaml | 57 +++++++++++++++++++ Makefile | 5 +- .../doc_viewer/container/video_viewer.dart | 31 ++++++---- lib/features/trakt/service/trakt.service.dart | 4 +- 4 files changed, 85 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build-deploy.yaml b/.github/workflows/build-deploy.yaml index b6edc3c..b73927f 100644 --- a/.github/workflows/build-deploy.yaml +++ b/.github/workflows/build-deploy.yaml @@ -108,6 +108,63 @@ jobs: source-dir: build/app/outputs/flutter-apk destination-dir: nightly/${{ github.run_id }}/android + build_android_tv: + runs-on: ubuntu-latest + environment: prod + steps: + - uses: actions/checkout@v3 + + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + channel: 'stable' + + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: '17' + + - name: Install dependencies + run: flutter pub get + + - name: Set up environment variables + run: | + touch .env + dart run build_runner build --delete-conflicting-outputs + + - name: Create key.properties file + run: | + echo "storePassword=${{ secrets.STORE_PASSWORD }}" >> android/key.properties + echo "keyPassword=${{ secrets.KEY_PASSWORD }}" >> android/key.properties + echo "keyAlias=${{ secrets.KEY_ALIAS }}" >> android/key.properties + echo "storeFile=key.jks" >> android/key.properties + + - name: Decode and save keystore file + run: | + echo "${{ secrets.STORE_FILE_BASE64 }}" | base64 --decode > android/app/key.jks + + - run: | + sudo apt install ninja-build + name: install ninja + + - name: Build Android + run: make build_android_tv + + - name: Upload Android artifact + uses: actions/upload-artifact@v4 + with: + name: android-build + path: build/app/outputs/flutter-apk/app-release-tv.apk + + - uses: ryand56/r2-upload-action@v1.4 + with: + r2-account-id: ${{ secrets.R2_ACCOUNT_ID }} + r2-access-key-id: ${{ secrets.R2_ACCESS_KEY_ID }} + r2-secret-access-key: ${{ secrets.R2_SECRET_ACCESS_KEY }} + r2-bucket: ${{ secrets.R2_BUCKET }} + source-dir: build/app/outputs/flutter-apk + destination-dir: nightly/${{ github.run_id }}/android-tv + build_ipa: runs-on: macos-latest environment: prod diff --git a/Makefile b/Makefile index 213681f..4f9d342 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: build schema build_web build_mac build_android build_windows build_ipa build_linux +.PHONY: build schema build_web build_mac build_android build_windows build_ipa build_linux build_android_tv BUILD_ID := $(or $(GITHUB_RUN_ID),dev) @@ -17,6 +17,9 @@ build_mac: build_android: flutter build apk --release --dart-define=BUILD_ID=$(BUILD_ID) +build_android_tv: + flutter build apk --release --dart-define=BUILD_ID=$(BUILD_ID) --dart-define=IS_TV=true + build_windows: flutter build windows --release --dart-define=BUILD_ID=$(BUILD_ID) diff --git a/lib/features/doc_viewer/container/video_viewer.dart b/lib/features/doc_viewer/container/video_viewer.dart index f6cfd3e..02d533c 100644 --- a/lib/features/doc_viewer/container/video_viewer.dart +++ b/lib/features/doc_viewer/container/video_viewer.dart @@ -74,16 +74,17 @@ class _VideoViewerState extends State { if (player.state.playing) { TraktService.instance!.startScrobbling( meta: widget.meta as types.Meta, - progress: progress.toDouble(), + progress: currentProgressInPercentage, ); } else { TraktService.instance!.stopScrobbling( meta: widget.meta as types.Meta, - progress: progress.toDouble(), + progress: currentProgressInPercentage, ); } } catch (e) { print(e); + TraktService.instance!.debugLogs.add(e.toString()); } } @@ -163,11 +164,19 @@ class _VideoViewerState extends State { }); } + bool canCallOnce = false; + setDurationFromTrakt() async { if (player.state.duration.inSeconds < 2) { return; } + if (canCallOnce) { + return; + } + + canCallOnce = true; + if (!TraktService.instance!.isEnabled() || traktProgress == null) { player.play(); return; @@ -287,7 +296,7 @@ class _VideoViewerState extends State { }); } - _timer = Timer.periodic(const Duration(minutes: 1), (timer) { + _timer = Timer.periodic(const Duration(seconds: 30), (timer) { saveWatchHistory(); }); @@ -389,13 +398,6 @@ class _VideoViewerState extends State { @override void dispose() { - if (traktIntegration && widget.meta is types.Meta) { - TraktService.instance!.stopScrobbling( - meta: widget.meta as types.Meta, - progress: currentProgressInPercentage, - ); - } - SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, @@ -414,7 +416,16 @@ class _VideoViewerState extends State { _streamComplete.cancel(); _streamListen.cancel(); _duration.cancel(); + + if (traktIntegration && widget.meta is types.Meta) { + TraktService.instance!.stopScrobbling( + meta: widget.meta as types.Meta, + progress: currentProgressInPercentage, + ); + } + player.dispose(); + super.dispose(); } diff --git a/lib/features/trakt/service/trakt.service.dart b/lib/features/trakt/service/trakt.service.dart index d482a3e..006a9d9 100644 --- a/lib/features/trakt/service/trakt.service.dart +++ b/lib/features/trakt/service/trakt.service.dart @@ -158,7 +158,7 @@ class TraktService { if (response.statusCode != 200) { debugLogs.add( "Failed to fetch data from ${url.replaceFirst("https://api.trakt.tv/", "")} ${response.statusCode}"); - throw Exception('Failed to fetch data from $url'); + throw Exception('Failed to fetch data from $url ${response.statusCode}'); } debugLogs.add( @@ -319,6 +319,8 @@ class TraktService { }).toList(); } catch (e, stack) { print('Error fetching up next movies: $e'); + debugLogs.add('Error fetching up next movies: $e'); + debugLogs.add(stack.toString()); print(stack); return []; }