import 'dart:async'; import 'package:flutter/material.dart'; import 'package:video_player/video_player.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:f0ckapp/models/mediaitem.dart'; import 'package:f0ckapp/widgets/video_overlay.dart'; class VideoWidget extends StatefulWidget { final MediaItem details; const VideoWidget({super.key, required this.details}); @override State createState() => _VideoWidgetState(); } class _VideoWidgetState extends State { late VideoPlayerController _controller; bool _showControls = false; @override void initState() { super.initState(); _initController(); } Future _initController() async { _controller = VideoPlayerController.networkUrl( Uri.parse(widget.details.mediaUrl), ); await _controller.initialize(); setState(() {}); _controller.addListener(() => setState(() {})); _controller.play(); _controller.setLooping(true); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { bool isAudio = widget.details.mime.startsWith('audio'); return Column( mainAxisSize: MainAxisSize.min, children: [ AspectRatio( aspectRatio: _controller.value.isInitialized ? _controller.value.aspectRatio : 9 / 16, child: Stack( alignment: Alignment.center, children: [ GestureDetector( onTap: () { setState(() { _showControls = !_showControls; }); }, child: isAudio ? CachedNetworkImage( imageUrl: widget.details.coverUrl, fit: BoxFit.cover, placeholder: (context, url) => CircularProgressIndicator(), errorWidget: (context, url, error) => Image.network( "https://f0ck.me/s/img/music.webp", fit: BoxFit.contain, ), ) : _controller.value.isInitialized ? VideoPlayer(_controller) : Center(child: CircularProgressIndicator()), ), if (_controller.value.isInitialized && _showControls) ...[ IgnorePointer( ignoring: true, child: Container( color: Colors.black.withValues(alpha: 0.5), width: double.infinity, height: double.infinity, ), ), VideoControlsOverlay(controller: _controller), ], ], ), ), ], ); } }