From adda5e5ea71caf4c057e88a640eaf88892df8313 Mon Sep 17 00:00:00 2001 From: unleed Date: Tue, 5 Nov 2024 15:58:00 -0300 Subject: [PATCH 1/2] feature: vimeo video fixed --- README.md | 4 +- analysis_options.yaml | 1 - example/android/app/build.gradle | 2 +- example/android/build.gradle | 2 +- .../lib/examples/load_vimeo_from_urls.dart | 3 +- .../lib/screens/cutom_video_controllers.dart | 7 ++- example/lib/screens/from_vimeo_id.dart | 8 ++- .../lib/screens/from_vimeo_private_id.dart | 5 +- .../pod_getx_video_controller.dart | 2 + .../controllers/pod_player_controller.dart | 5 +- .../pod_video_quality_controller.dart | 4 +- lib/src/models/play_video_from.dart | 10 +++- lib/src/utils/video_apis.dart | 59 +++++++++---------- 13 files changed, 63 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index e5515225..4d2d0aae 100644 --- a/README.md +++ b/README.md @@ -362,7 +362,7 @@ class _PlayVideoFromVimeoState extends State { @override void initState() { controller = PodPlayerController( - playVideoFrom: PlayVideoFrom.vimeo('518228118'), + playVideoFrom: PlayVideoFrom.vimeo('1022609948'), )..initialise(); super.initState(); } @@ -404,7 +404,7 @@ class _PlayVideoFromVimeoState extends State { @override void initState() { controller = PodPlayerController( - playVideoFrom: PlayVideoFrom.vimeo('518228118', hash: '7cc595e1f8'), + playVideoFrom: PlayVideoFrom.vimeo('1022609948', hash: '7cc595e1f8'), )..initialise(); super.initState(); } diff --git a/analysis_options.yaml b/analysis_options.yaml index 18aea978..13024eef 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -4,7 +4,6 @@ analyzer: missing_required_param: error prefer_const_declarations: warning prefer_const_constructors: warning - import_of_legacy_library_into_null_safe: warning public_member_api_docs: ignore language: strict-casts: true diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 7f0f1a52..0833ecfc 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -47,7 +47,7 @@ android { applicationId "com.example.example" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. - minSdkVersion 19 + minSdkVersion flutter.minSdkVersion targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/example/android/build.gradle b/example/android/build.gradle index 3cdaac95..6617c1e9 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.6.10' + ext.kotlin_version = '1.7.0' repositories { google() mavenCentral() diff --git a/example/lib/examples/load_vimeo_from_urls.dart b/example/lib/examples/load_vimeo_from_urls.dart index c5c87fd2..8cf33c48 100644 --- a/example/lib/examples/load_vimeo_from_urls.dart +++ b/example/lib/examples/load_vimeo_from_urls.dart @@ -36,7 +36,8 @@ class VimeoVideoViewerState extends State { } void loadVideo() async { - final urls = await PodPlayerController.getVimeoUrls('518228118'); + final urls = + await PodPlayerController.getVimeoUrls('1022609948', '{token}'); setState(() => isLoading = false); controller = PodPlayerController( playVideoFrom: PlayVideoFrom.networkQualityUrls(videoUrls: urls!), diff --git a/example/lib/screens/cutom_video_controllers.dart b/example/lib/screens/cutom_video_controllers.dart index ce511edb..2a8fb7b7 100644 --- a/example/lib/screens/cutom_video_controllers.dart +++ b/example/lib/screens/cutom_video_controllers.dart @@ -19,7 +19,7 @@ class _CustomVideoControllsState extends State { 'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4', ); final vimeoTextFieldCtr = TextEditingController( - text: '518228118', + text: '1022609948', ); final youtubeTextFieldCtr = TextEditingController( text: 'https://youtu.be/A3ltMaM6noM', @@ -39,7 +39,7 @@ class _CustomVideoControllsState extends State { // 'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4', // 'https://user-images.githubusercontent.com/85326522/140480457-ab21345a-76e2-4b0e-b4ec-027c89f0e712.mp4', // 'http://techslides.com/demos/sample-videos/small.mp4', - // fromVimeoVideoId: '518228118', + // fromVimeoVideoId: '1022609948', )..initialise().then((value) { setState(() { isVideoPlaying = controller.isVideoPlaying; @@ -255,7 +255,8 @@ class _CustomVideoControllsState extends State { snackBar('Loading....'); FocusScope.of(context).unfocus(); await controller.changeVideo( - playVideoFrom: PlayVideoFrom.vimeo(vimeoTextFieldCtr.text), + playVideoFrom: + PlayVideoFrom.vimeo(vimeoTextFieldCtr.text, '{token}'), ); controller.addListener(_listner); controller.onVideoQualityChanged( diff --git a/example/lib/screens/from_vimeo_id.dart b/example/lib/screens/from_vimeo_id.dart index 93a67efb..06724ab5 100644 --- a/example/lib/screens/from_vimeo_id.dart +++ b/example/lib/screens/from_vimeo_id.dart @@ -16,7 +16,10 @@ class _PlayVideoFromVimeoIdState extends State { @override void initState() { controller = PodPlayerController( - playVideoFrom: PlayVideoFrom.vimeo('518228118'), + playVideoFrom: PlayVideoFrom.vimeo( + '1022609948', + '{token}', + ), )..initialise(); super.initState(); } @@ -56,7 +59,7 @@ class _PlayVideoFromVimeoIdState extends State { decoration: const InputDecoration( labelText: 'Enter vimeo id', floatingLabelBehavior: FloatingLabelBehavior.always, - hintText: 'ex: 518228118', + hintText: 'ex: 1022609948', border: OutlineInputBorder(), ), ), @@ -89,6 +92,7 @@ class _PlayVideoFromVimeoIdState extends State { await controller.changeVideo( playVideoFrom: PlayVideoFrom.vimeo( videoTextFieldCtr.text, + controller.playVideoFrom.token ?? '', hash: vimeoHash.isNotEmpty ? vimeoHash : null, ), ); diff --git a/example/lib/screens/from_vimeo_private_id.dart b/example/lib/screens/from_vimeo_private_id.dart index da1baec0..4062de37 100644 --- a/example/lib/screens/from_vimeo_private_id.dart +++ b/example/lib/screens/from_vimeo_private_id.dart @@ -18,7 +18,7 @@ class _PlayVideoFromVimeoPrivateIdState @override void initState() { controller = PodPlayerController( - playVideoFrom: PlayVideoFrom.vimeo('518228118'), + playVideoFrom: PlayVideoFrom.vimeo('1022609948', '{token}'), )..initialise(); super.initState(); } @@ -58,7 +58,7 @@ class _PlayVideoFromVimeoPrivateIdState decoration: const InputDecoration( labelText: 'Enter vimeo private id', floatingLabelBehavior: FloatingLabelBehavior.always, - hintText: 'ex: 518228118', + hintText: 'ex: 1022609948', border: OutlineInputBorder(), ), ), @@ -98,6 +98,7 @@ class _PlayVideoFromVimeoPrivateIdState await controller.changeVideo( playVideoFrom: PlayVideoFrom.vimeoPrivateVideos( videoTextFieldCtr.text, + '{token}', httpHeaders: headers, ), ); diff --git a/lib/src/controllers/pod_getx_video_controller.dart b/lib/src/controllers/pod_getx_video_controller.dart index 7a46d30d..fed2ed7f 100644 --- a/lib/src/controllers/pod_getx_video_controller.dart +++ b/lib/src/controllers/pod_getx_video_controller.dart @@ -42,6 +42,7 @@ class PodGetXVideoController extends _PodGesturesController { void config({ required PlayVideoFrom playVideoFrom, required PodPlayerConfig playerConfig, + String? token, }) { this.playVideoFrom = playVideoFrom; _videoPlayerType = playVideoFrom.playerType; @@ -135,6 +136,7 @@ class PodGetXVideoController extends _PodGesturesController { case PodVideoPlayerType.vimeo: await getQualityUrlsFromVimeoId( playVideoFrom.dataSource!, + playVideoFrom.token ?? '', hash: playVideoFrom.hash, ); final url = await getUrlFromVideoQualityUrls( diff --git a/lib/src/controllers/pod_player_controller.dart b/lib/src/controllers/pod_player_controller.dart index 229ce884..0709f452 100644 --- a/lib/src/controllers/pod_player_controller.dart +++ b/lib/src/controllers/pod_player_controller.dart @@ -257,10 +257,11 @@ class PodPlayerController { } static Future?> getVimeoUrls( - String videoId, { + String videoId, + String token, { String? hash, }) { - return VideoApis.getVimeoVideoQualityUrls(videoId, hash); + return VideoApis.getVimeoVideoQualityUrls(videoId, token, hash); } /// Hide overlay of video diff --git a/lib/src/controllers/pod_video_quality_controller.dart b/lib/src/controllers/pod_video_quality_controller.dart index f841e018..0ab82e76 100644 --- a/lib/src/controllers/pod_video_quality_controller.dart +++ b/lib/src/controllers/pod_video_quality_controller.dart @@ -15,13 +15,15 @@ class _PodVideoQualityController extends _PodVideoController { /// ///get all `quality urls` Future getQualityUrlsFromVimeoId( - String videoId, { + String videoId, + String token, { String? hash, }) async { try { podVideoStateChanger(PodVideoState.loading); final vimeoVideoUrls = await VideoApis.getVimeoVideoQualityUrls( videoId, + token, hash, ); diff --git a/lib/src/models/play_video_from.dart b/lib/src/models/play_video_from.dart index d3927bbb..571273dc 100644 --- a/lib/src/models/play_video_from.dart +++ b/lib/src/models/play_video_from.dart @@ -4,6 +4,7 @@ import '../../pod_player.dart'; class PlayVideoFrom { final String? dataSource; + final String? token; final String? hash; final PodVideoPlayerType playerType; final VideoFormat? formatHint; @@ -19,6 +20,7 @@ class PlayVideoFrom { required this.playerType, this.live = false, this.dataSource, + this.token, this.hash, this.formatHint, this.package, @@ -77,7 +79,8 @@ class PlayVideoFrom { } factory PlayVideoFrom.vimeo( - String dataSource, { + String dataSource, + String token, { String? hash, VideoFormat? formatHint, Future? closedCaptionFile, @@ -87,6 +90,7 @@ class PlayVideoFrom { return PlayVideoFrom._( playerType: PodVideoPlayerType.vimeo, dataSource: dataSource, + token: token, hash: hash, formatHint: formatHint, closedCaptionFile: closedCaptionFile, @@ -96,7 +100,8 @@ class PlayVideoFrom { } factory PlayVideoFrom.vimeoPrivateVideos( - String dataSource, { + String dataSource, + String token, { VideoFormat? formatHint, Future? closedCaptionFile, VideoPlayerOptions? videoPlayerOptions, @@ -105,6 +110,7 @@ class PlayVideoFrom { return PlayVideoFrom._( playerType: PodVideoPlayerType.vimeoPrivateVideos, dataSource: dataSource, + token: token, formatHint: formatHint, closedCaptionFile: closedCaptionFile, videoPlayerOptions: videoPlayerOptions, diff --git a/lib/src/utils/video_apis.dart b/lib/src/utils/video_apis.dart index 69153a19..197792ab 100644 --- a/lib/src/utils/video_apis.dart +++ b/lib/src/utils/video_apis.dart @@ -12,48 +12,46 @@ String podErrorString(String val) { } class VideoApis { - static Future _makeRequestHash(String videoId, String? hash) { - if (hash == null) { - return http.get( - Uri.parse('https://player.vimeo.com/video/$videoId/config'), - ); - } else { - return http.get( - Uri.parse('https://player.vimeo.com/video/$videoId/config?h=$hash'), - ); - } + static Future _makeRequestHash( + String videoId, + String token, + String? hash, + ) { + return http.get( + Uri.parse('https://api.vimeo.com/videos/$videoId?fields=play'), + headers: { + 'Authorization': 'Bearer $token', + 'Accept': 'application/vnd.vimeo.*+json;version=3.4', + // 'Content-Type': 'application/json', + }, + ); } static Future?> getVimeoVideoQualityUrls( String videoId, + String token, String? hash, ) async { try { - final response = await _makeRequestHash(videoId, hash); - final jsonData = jsonDecode(response.body)['request']['files']; - final dashData = jsonData['dash']; - final hlsData = jsonData['hls']; - final defaultCDN = hlsData['default_cdn']; - final cdnVideoUrl = (hlsData['cdns'][defaultCDN]['url'] as String?) ?? ''; + print(videoId); + print('token: $token'); + final response = await _makeRequestHash(videoId, token, hash); + final jsonData = jsonDecode(response.body)['play']; + // final dashData = jsonData['dash']; + // final hlsData = jsonData['hls']; + print(response.statusCode); + print(response.body); + print('progressive'); + print(jsonData); final List rawStreamUrls = - (dashData['streams'] as List?) ?? []; - + (jsonData['progressive'] as List?) ?? []; final List vimeoQualityUrls = []; for (final item in rawStreamUrls) { - final sepList = cdnVideoUrl.split('/sep/video/'); - final firstUrlPiece = sepList.firstOrNull ?? ''; - final lastUrlPiece = - ((sepList.lastOrNull ?? '').split('/').lastOrNull) ?? - (sepList.lastOrNull ?? ''); - final String urlId = - ((item['id'] ?? '') as String).split('-').firstOrNull ?? ''; vimeoQualityUrls.add( VideoQalityUrls( - quality: int.parse( - (item['quality'] as String?)?.split('p').first ?? '0', - ), - url: '$firstUrlPiece/sep/video/$urlId/$lastUrlPiece', + quality: (item['height'] as int?) ?? 0, + url: item['link'] as String, ), ); } @@ -61,11 +59,10 @@ class VideoApis { vimeoQualityUrls.add( VideoQalityUrls( quality: 720, - url: cdnVideoUrl, + url: '', ), ); } - return vimeoQualityUrls; } catch (error) { if (error.toString().contains('XMLHttpRequest')) { From 524981c9bf6f7a64da1966aefb74a09e6dd00d98 Mon Sep 17 00:00:00 2001 From: unleed Date: Tue, 5 Nov 2024 16:28:43 -0300 Subject: [PATCH 2/2] chore: removed prints from code --- lib/src/utils/video_apis.dart | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/src/utils/video_apis.dart b/lib/src/utils/video_apis.dart index 197792ab..d368c574 100644 --- a/lib/src/utils/video_apis.dart +++ b/lib/src/utils/video_apis.dart @@ -33,16 +33,8 @@ class VideoApis { String? hash, ) async { try { - print(videoId); - print('token: $token'); final response = await _makeRequestHash(videoId, token, hash); final jsonData = jsonDecode(response.body)['play']; - // final dashData = jsonData['dash']; - // final hlsData = jsonData['hls']; - print(response.statusCode); - print(response.body); - print('progressive'); - print(jsonData); final List rawStreamUrls = (jsonData['progressive'] as List?) ?? []; final List vimeoQualityUrls = [];