diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index fa6e3569c..79addb43c 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -55,10 +55,14 @@ jobs: chromedriver --port=4444 & sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 & # optional + ( cd server; dart run bin/server.dart ) & flutter drive \ --driver=test_driver/integration_test.dart \ --target=integration_test/app_test.dart \ - -d web-server --web-browser-flag="--autoplay-policy=no-user-gesture-required" + -d web-server \ + --web-browser-flag="--autoplay-policy=no-user-gesture-required" \ + --web-browser-flag="--disable-web-security" \ + --dart-define USE_LOCAL_SERVER=true android: runs-on: macOS-latest @@ -109,7 +113,9 @@ jobs: echo "Emulator started" - name: Run Flutter integration tests working-directory: ./packages/audioplayers/example - run: "flutter test integration_test" + run: | + ( cd server; dart run bin/server.dart ) & + flutter test integration_test --dart-define USE_LOCAL_SERVER=true ios: runs-on: macOS-latest @@ -136,7 +142,9 @@ jobs: flutter build ios --release --no-codesign - name: Run Flutter integration tests working-directory: ./packages/audioplayers/example - run: "flutter test integration_test" + run: | + ( cd server; dart run bin/server.dart ) & + flutter test integration_test --dart-define USE_LOCAL_SERVER=true macos: runs-on: macOS-latest @@ -160,7 +168,9 @@ jobs: flutter build macos --release - name: Run Flutter integration tests working-directory: ./packages/audioplayers/example - run: "flutter test -d macos integration_test" + run: | + ( cd server; dart run bin/server.dart ) & + flutter test -d macos integration_test --dart-define USE_LOCAL_SERVER=true windows: runs-on: windows-latest @@ -186,8 +196,11 @@ jobs: Import-Certificate -FilePath Scream\Install\driver\x64\Scream.cat -CertStoreLocation Cert:\LocalMachine\TrustedPublisher Scream\Install\helpers\devcon-x64.exe install Scream\Install\driver\x64\Scream.inf *Scream - name: Run Flutter integration tests + shell: powershell working-directory: ./packages/audioplayers/example - run: "flutter test -d windows integration_test" + run: | + Start-Process -NoNewWindow -WorkingDirectory "server" dart -ArgumentList "run", "bin/server.dart" + flutter test -d windows integration_test --dart-define USE_LOCAL_SERVER=true linux: runs-on: ubuntu-latest @@ -218,4 +231,5 @@ jobs: run: | export DISPLAY=:99 sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 & - flutter test -d linux integration_test + ( cd server; dart run bin/server.dart ) & + flutter test -d linux integration_test --dart-define USE_LOCAL_SERVER=true diff --git a/packages/audioplayers/example/README.md b/packages/audioplayers/example/README.md index 1d94dab5e..3e4070f9b 100644 --- a/packages/audioplayers/example/README.md +++ b/packages/audioplayers/example/README.md @@ -4,8 +4,14 @@ This is an example usage of audioplayers plugin. It's a simple app with three tabs. - - Remote Url: Plays audio from a remote url from the Internet. - - Local File: Downloads a file to your device in order to play it from your device. - - Local Asset: Play one of the assets bundled with this app. +- Remote Url: Plays audio from a remote url from the Internet. +- Local File: Downloads a file to your device in order to play it from your device. +- Local Asset: Play one of the assets bundled with this app. -This example bundles a `PlayerWidget` that could be used as a very simple audio player interface. \ No newline at end of file +This example bundles a `PlayerWidget` that could be used as a very simple audio player interface. + +## Dart Environment Variables + +Set the following variables as additional args `--dart-define MY_VAR=xyz`: + +- `USE_LOCAL_SERVER`: uses links to local server instead of public accessible links, default: `false`. diff --git a/packages/audioplayers/example/analysis_options.yaml b/packages/audioplayers/example/analysis_options.yaml index 85732fa02..f94626741 100644 --- a/packages/audioplayers/example/analysis_options.yaml +++ b/packages/audioplayers/example/analysis_options.yaml @@ -1 +1,5 @@ include: package:flame_lint/analysis_options.yaml + +linter: + rules: + do_not_use_environment: false diff --git a/packages/audioplayers/example/assets/ambient_c_motion.mp3 b/packages/audioplayers/example/assets/ambient_c_motion.mp3 new file mode 100644 index 000000000..40a85165a Binary files /dev/null and b/packages/audioplayers/example/assets/ambient_c_motion.mp3 differ diff --git a/packages/audioplayers/example/assets/coins.wav b/packages/audioplayers/example/assets/coins.wav new file mode 100644 index 000000000..c0dc31c28 Binary files /dev/null and b/packages/audioplayers/example/assets/coins.wav differ diff --git a/packages/audioplayers/example/lib/tabs/sources.dart b/packages/audioplayers/example/lib/tabs/sources.dart index a1db59439..5ca967ac6 100644 --- a/packages/audioplayers/example/lib/tabs/sources.dart +++ b/packages/audioplayers/example/lib/tabs/sources.dart @@ -1,18 +1,27 @@ +import 'dart:io'; + import 'package:audioplayers/audioplayers.dart'; import 'package:audioplayers_example/components/btn.dart'; import 'package:audioplayers_example/components/tab_wrapper.dart'; import 'package:audioplayers_example/components/tgl.dart'; import 'package:audioplayers_example/utils.dart'; import 'package:file_picker/file_picker.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -const _wavUrl1 = 'https://luan.xyz/files/audio/coins.wav'; -const _wavUrl2 = 'https://luan.xyz/files/audio/laser.wav'; -const _mp3Url1 = 'https://luan.xyz/files/audio/ambient_c_motion.mp3'; -const _mp3Url2 = 'https://luan.xyz/files/audio/nasa_on_a_mission.mp3'; -const _m3u8StreamUrl = - 'https://a.files.bbci.co.uk/media/live/manifesto/audio/simulcast/hls/nonuk/sbr_low/ak/bbc_radio_one.m3u8'; +const useLocalServer = bool.fromEnvironment('USE_LOCAL_SERVER'); + +final localhost = kIsWeb || !Platform.isAndroid ? 'localhost' : '10.0.2.2'; +final host = useLocalServer ? 'http://$localhost:8080' : 'https://luan.xyz'; + +final _wavUrl1 = '$host/files/audio/coins.wav'; +final _wavUrl2 = '$host/files/audio/laser.wav'; +final _mp3Url1 = '$host/files/audio/ambient_c_motion.mp3'; +final _mp3Url2 = '$host/files/audio/nasa_on_a_mission.mp3'; +final _m3u8StreamUrl = useLocalServer + ? '$host/files/live_streams/nasa_power_of_the_rovers.m3u8' + : 'https://a.files.bbci.co.uk/media/live/manifesto/audio/simulcast/hls/nonuk/sbr_low/ak/bbc_radio_one.m3u8'; const _mpgaStreamUrl = 'https://timesradio.wireless.radio/stream'; const _asset1 = 'laser.wav'; diff --git a/packages/audioplayers/example/server/.gitignore b/packages/audioplayers/example/server/.gitignore new file mode 100644 index 000000000..31d3cdb68 --- /dev/null +++ b/packages/audioplayers/example/server/.gitignore @@ -0,0 +1,14 @@ +# https://dart.dev/guides/libraries/private-files +.DS_Store +.atom/ +.idea +.packages +.pub/ +.dart_tool/ +build/ +ios/.generated/ +packages +pubspec.lock +.flutter-plugins +flutter_export_environment.sh +.last_build_id diff --git a/packages/audioplayers/example/server/README.md b/packages/audioplayers/example/server/README.md new file mode 100644 index 000000000..448f8eb22 --- /dev/null +++ b/packages/audioplayers/example/server/README.md @@ -0,0 +1,14 @@ +A simple HTTP server to provide audio sources using [package:shelf](https://pub.dev/packages/shelf). +This server listens to loop-back (localhost, 127.0.0.1). + +To run this server locally, run as follows: + +```bash +$ dart run bin/server.dart +``` + +Environment variables: + +- `LATENCY`: the timeout until the server should respond in milliseconds, default: `0`. +- `PORT`: the port the server should listen on, default: `8080`. +- `LOG_REQUESTS`: log the network requests, default: `false`. diff --git a/packages/audioplayers/example/server/analysis_options.yaml b/packages/audioplayers/example/server/analysis_options.yaml new file mode 100644 index 000000000..85732fa02 --- /dev/null +++ b/packages/audioplayers/example/server/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flame_lint/analysis_options.yaml diff --git a/packages/audioplayers/example/server/bin/server.dart b/packages/audioplayers/example/server/bin/server.dart new file mode 100644 index 000000000..80a69c89b --- /dev/null +++ b/packages/audioplayers/example/server/bin/server.dart @@ -0,0 +1,51 @@ +// ignore_for_file: avoid_print +import 'dart:io'; + +import 'package:shelf/shelf.dart'; +import 'package:shelf/shelf_io.dart' as shelf_io; +import 'package:shelf_static/shelf_static.dart' as shelf_static; + +Future main() async { + final port = int.parse(Platform.environment['PORT'] ?? '8080'); + final requestTimeoutMillis = + int.parse(Platform.environment['LATENCY'] ?? '0'); + final isLogRequests = + (Platform.environment['LOG_REQUESTS'] ?? 'false') == 'true'; + + final cascade = Cascade().add(_staticHandler); + + var pipeline = const Pipeline(); + if (isLogRequests) { + pipeline = pipeline.addMiddleware(logRequests()); + } + + final handler = pipeline + .addMiddleware( + (innerHandler) => (req) async { + await Future.delayed( + Duration(milliseconds: requestTimeoutMillis), + ); + return await innerHandler(req); + }, + ) + .addHandler(cascade.handler); + + final server = await shelf_io.serve( + handler, + InternetAddress.loopbackIPv4, + port, + ); + + // TODO(Gustl22): provide an audio streaming endpoint: + // Inspiration: https://github.com/daspinola/video-stream-sample/blob/master/server.js + + print( + 'Serving at http://${server.address.host}:${server.port} with latency of $requestTimeoutMillis ms', + ); +} + +final _staticHandler = shelf_static.createStaticHandler( + 'public', + defaultDocument: 'index.html', + serveFilesOutsidePath: true, +); diff --git a/packages/audioplayers/example/server/public/favicon_64.png b/packages/audioplayers/example/server/public/favicon_64.png new file mode 100644 index 000000000..43d2ffa07 Binary files /dev/null and b/packages/audioplayers/example/server/public/favicon_64.png differ diff --git a/packages/audioplayers/example/server/public/files/LICENSE b/packages/audioplayers/example/server/public/files/LICENSE new file mode 120000 index 000000000..147761543 --- /dev/null +++ b/packages/audioplayers/example/server/public/files/LICENSE @@ -0,0 +1 @@ +../../../../LICENSE \ No newline at end of file diff --git a/packages/audioplayers/example/server/public/files/audio b/packages/audioplayers/example/server/public/files/audio new file mode 120000 index 000000000..2978ef393 --- /dev/null +++ b/packages/audioplayers/example/server/public/files/audio @@ -0,0 +1 @@ +../../../assets \ No newline at end of file diff --git a/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers.m3u8 b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers.m3u8 new file mode 100644 index 000000000..46e196934 --- /dev/null +++ b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers.m3u8 @@ -0,0 +1,25 @@ +#EXTM3U +#EXT-X-VERSION:3 +#EXT-X-TARGETDURATION:6 +#EXT-X-MEDIA-SEQUENCE:0 +#EXT-X-PLAYLIST-TYPE:VOD +#EXTINF:6.400000, +nasa_power_of_the_rovers0.ts +#EXTINF:6.400000, +nasa_power_of_the_rovers1.ts +#EXTINF:6.400000, +nasa_power_of_the_rovers2.ts +#EXTINF:6.400000, +nasa_power_of_the_rovers3.ts +#EXTINF:6.400000, +nasa_power_of_the_rovers4.ts +#EXTINF:6.400000, +nasa_power_of_the_rovers5.ts +#EXTINF:6.400000, +nasa_power_of_the_rovers6.ts +#EXTINF:6.400000, +nasa_power_of_the_rovers7.ts +#EXTINF:6.400000, +nasa_power_of_the_rovers8.ts +#EXTINF:2.410311, +nasa_power_of_the_rovers9.ts diff --git a/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers0.ts b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers0.ts new file mode 100644 index 000000000..7a17bee38 Binary files /dev/null and b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers0.ts differ diff --git a/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers1.ts b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers1.ts new file mode 100644 index 000000000..44775aaeb Binary files /dev/null and b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers1.ts differ diff --git a/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers2.ts b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers2.ts new file mode 100644 index 000000000..1212ad05c Binary files /dev/null and b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers2.ts differ diff --git a/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers3.ts b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers3.ts new file mode 100644 index 000000000..e459cba7d Binary files /dev/null and b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers3.ts differ diff --git a/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers4.ts b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers4.ts new file mode 100644 index 000000000..a89cac1c0 Binary files /dev/null and b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers4.ts differ diff --git a/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers5.ts b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers5.ts new file mode 100644 index 000000000..dcf458188 Binary files /dev/null and b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers5.ts differ diff --git a/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers6.ts b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers6.ts new file mode 100644 index 000000000..c203c04cf Binary files /dev/null and b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers6.ts differ diff --git a/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers7.ts b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers7.ts new file mode 100644 index 000000000..c46fb8088 Binary files /dev/null and b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers7.ts differ diff --git a/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers8.ts b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers8.ts new file mode 100644 index 000000000..8c9997725 Binary files /dev/null and b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers8.ts differ diff --git a/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers9.ts b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers9.ts new file mode 100644 index 000000000..5c7a0dafd Binary files /dev/null and b/packages/audioplayers/example/server/public/files/live_streams/nasa_power_of_the_rovers9.ts differ diff --git a/packages/audioplayers/example/server/public/index.html b/packages/audioplayers/example/server/public/index.html new file mode 100644 index 000000000..93e08ddc1 --- /dev/null +++ b/packages/audioplayers/example/server/public/index.html @@ -0,0 +1,85 @@ + + + + + + + + + Audioplayers Test Server + + + + + +
+ +
+ Favicon +

Audioplayers Test Server

+
+

This server provides audio files and streams to test Audioplayers + package:

+ +
+ + + + diff --git a/packages/audioplayers/example/server/pubspec.yaml b/packages/audioplayers/example/server/pubspec.yaml new file mode 100644 index 000000000..0c858f3b6 --- /dev/null +++ b/packages/audioplayers/example/server/pubspec.yaml @@ -0,0 +1,14 @@ +name: audioplayers_test_server +publish_to: none + +environment: + sdk: ">=2.12.0 <3.0.0" + +dependencies: + shelf: ^1.2.0 + shelf_router: ^1.0.0 + shelf_static: ^1.0.0 + +dev_dependencies: + flame_lint: ^0.1.0 + http: ^0.13.0