vido_ultra 1.0.0 copy "vido_ultra: ^1.0.0" to clipboard
vido_ultra: ^1.0.0 copied to clipboard

Professional universal video engine for Flutter. Supports VLC & Native backends with snapshots, custom tracks, and premium Glassmorphism UI.

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:vido_ultra/vido_ultra.dart';
import 'dart:ui';

void main() {
  runApp(const VidoUltraShowcase());
}

class VidoUltraShowcase extends StatelessWidget {
  const VidoUltraShowcase({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData.dark().copyWith(
        primaryColor: Colors.amber,
        scaffoldBackgroundColor: const Color(0xFF0A0A0A),
        cardTheme: CardThemeData(
          color: const Color(0xFF161616),
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(16),
          ),
          elevation: 0,
        ),
      ),
      home: const AdvancedVideoDemo(),
    );
  }
}

class AdvancedVideoDemo extends StatefulWidget {
  const AdvancedVideoDemo({super.key});

  @override
  State<AdvancedVideoDemo> createState() => _AdvancedVideoDemoState();
}

class _AdvancedVideoDemoState extends State<AdvancedVideoDemo> {
  late UniversalVideoController _controller;
  final List<String> _eventLogs = [];
  bool _showAnalytics = true;

  @override
  void initState() {
    super.initState();
    _controller = UniversalVideoController(
      config: VideoConfiguration(
        overlaySlots: {
          'badge': Positioned(
            top: 12,
            left: 12,
            child: _buildBadge('ULTRA ENGINE', Colors.amber),
          ),
        },
      ),
    );

    _controller.loadMedia(
      'https://www.facebook.com/facebook/videos/paint-me-like-one-of-your-facebook-reels-video-by-sams-sketchbooksmusic-by-conni/9879297875528418/',
      engineType: VideoEngineType.vlc,
    );

    _controller.eventStream.listen((event) {
      if (mounted) {
        if (event.type == VideoEventType.error &&
            event.data.toString().contains('YouTube')) {
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(
              backgroundColor: Colors.redAccent,
              content: Text('YouTube URL Detected: ${event.data}'),
              duration: const Duration(seconds: 5),
              action: SnackBarAction(
                label: 'GUIDE',
                textColor: Colors.white,
                onPressed: () {
                  // Link to documentation or resolver guide
                },
              ),
            ),
          );
        }

        setState(() {
          _eventLogs.insert(
            0,
            '[${event.timestamp.toString().split(' ').last.substring(0, 8)}] ${event.type.name.toUpperCase()}',
          );
          if (_eventLogs.length > 20) _eventLogs.removeLast();
        });
      }
    });
  }

  static Widget _buildBadge(String text, Color color) {
    return ClipRRect(
      borderRadius: BorderRadius.circular(4),
      child: BackdropFilter(
        filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
        child: Container(
          padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
          color: color.withValues(alpha: 0.2),
          child: Text(
            text,
            style: TextStyle(
              color: color,
              fontSize: 9,
              fontWeight: FontWeight.bold,
              letterSpacing: 1,
            ),
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: CustomScrollView(
        slivers: [
          _buildSliverAppBar(),
          SliverToBoxAdapter(
            child: Padding(
              padding: const EdgeInsets.all(20.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  _buildSectionTitle('Active Playback'),
                  const SizedBox(height: 12),
                  Card(
                    clipBehavior: Clip.antiAlias,
                    child: UniversalVideoPlayer(controller: _controller),
                  ),
                  const SizedBox(height: 24),
                  Row(
                    children: [
                      Expanded(child: _buildEngineControlCard()),
                      const SizedBox(width: 16),
                      Expanded(child: _buildQuickActionsCard()),
                    ],
                  ),
                  _buildSectionTitle('Pro-Tier Controls'),
                  const SizedBox(height: 12),
                  Row(
                    children: [
                      Expanded(
                        child: _buildActionButton(
                          Icons.auto_awesome,
                          'Enable ABR',
                          () {
                            // Adaptive Bitrate Toggle
                          },
                        ),
                      ),
                      const SizedBox(width: 12),
                      Expanded(
                        child: _buildActionButton(
                          Icons.filter_vintage,
                          'GPU Shader',
                          () {
                            _controller.applyShader('shaders/sepia.frag');
                          },
                        ),
                      ),
                    ],
                  ),
                  const SizedBox(height: 12),
                  Row(
                    children: [
                      Expanded(
                        child: _buildActionButton(
                          Icons.picture_in_picture,
                          'Enter PiP',
                          () {
                            // Enter PiP mode
                          },
                        ),
                      ),
                      const SizedBox(width: 12),
                      Expanded(
                        child: _buildActionButton(
                          Icons.security,
                          'Config DRM',
                          () {
                            _controller.setDRM(
                              DRMConfig(
                                licenseServerUrl: 'https://proxy.example.com',
                              ),
                            );
                          },
                        ),
                      ),
                    ],
                  ),
                  const SizedBox(height: 24),
                  _buildSectionTitle('Enterprise Suite'),
                  const SizedBox(height: 12),
                  Row(
                    children: [
                      Expanded(
                        child: _buildActionButton(Icons.link, 'Deep Link', () {
                          _controller.handleDeepLink(
                            Uri.parse('vido://play?t=45s'),
                          );
                        }),
                      ),
                      const SizedBox(width: 12),
                      Expanded(
                        child: _buildActionButton(
                          Icons.image,
                          'Auto Thumb',
                          () async {
                            final bytes = await _controller.generateThumbnail();
                            if (!context.mounted) return;
                            if (bytes != null) {
                              showDialog(
                                context: context,
                                builder: (_) => AlertDialog(
                                  title: const Text('Generated Thumbnail'),
                                  content: Image.memory(bytes),
                                ),
                              );
                            } else {
                              ScaffoldMessenger.of(context).showSnackBar(
                                const SnackBar(
                                  content: Text(
                                    'Thumbnail generation simulated (Architectural Hook)',
                                  ),
                                ),
                              );
                            }
                          },
                        ),
                      ),
                      const SizedBox(width: 12),
                      Expanded(
                        child: _buildActionButton(
                          Icons.view_in_ar,
                          'VR Panorama',
                          () => _controller.enablePanorama(),
                        ),
                      ),
                    ],
                  ),
                  const SizedBox(height: 12),
                  _buildActionButton(Icons.cast, 'Cast Discovery', () {
                    _controller.startCastingDiscovery().listen((devices) {
                      if (!context.mounted) return;
                      ScaffoldMessenger.of(context).showSnackBar(
                        SnackBar(
                          content: Text('Found Devices: ${devices.join(", ")}'),
                        ),
                      );
                    });
                  }),
                  const SizedBox(height: 24),
                  _buildSectionTitle('Track Management'),
                  const SizedBox(height: 12),
                  Row(
                    children: [
                      Expanded(
                        child: _buildActionButton(
                          Icons.audiotrack,
                          'Audio Tracks',
                          () async {
                            final tracks = await _controller.getAudioTracks();
                            debugPrint('Found ${tracks.length} audio tracks');
                          },
                        ),
                      ),
                      const SizedBox(width: 12),
                      Expanded(
                        child: _buildActionButton(
                          Icons.subtitles,
                          'Subtitles',
                          () async {
                            final tracks = await _controller
                                .getSubtitleTracks();
                            debugPrint(
                              'Found ${tracks.length} subtitle tracks',
                            );
                          },
                        ),
                      ),
                    ],
                  ),
                  const SizedBox(height: 24),
                  _buildAnalyticsHeader(),
                  if (_showAnalytics) _buildAnalyticsList(),
                  const SizedBox(height: 40),
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }

  Widget _buildSliverAppBar() {
    return SliverAppBar(
      expandedHeight: 120.0,
      floating: false,
      pinned: true,
      backgroundColor: const Color(0xFF0A0A0A),
      flexibleSpace: FlexibleSpaceBar(
        title: const Text(
          'VIDO ULTRA',
          style: TextStyle(
            fontWeight: FontWeight.w900,
            letterSpacing: 4,
            fontSize: 18,
            color: Colors.amber,
          ),
        ),
        centerTitle: true,
        background: Container(
          decoration: BoxDecoration(
            gradient: LinearGradient(
              begin: Alignment.topCenter,
              end: Alignment.bottomCenter,
              colors: [Colors.amber.withValues(alpha: 0.1), Colors.transparent],
            ),
          ),
        ),
      ),
    );
  }

  Widget _buildSectionTitle(String title) {
    return Text(
      title.toUpperCase(),
      style: const TextStyle(
        color: Colors.white38,
        fontSize: 12,
        fontWeight: FontWeight.bold,
        letterSpacing: 2,
      ),
    );
  }

  Widget _buildEngineControlCard() {
    return Card(
      child: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            const Text(
              'Engine',
              style: TextStyle(
                fontWeight: FontWeight.bold,
                color: Colors.amber,
              ),
            ),
            const SizedBox(height: 12),
            Container(
              padding: const EdgeInsets.symmetric(horizontal: 12),
              decoration: BoxDecoration(
                color: Colors.black26,
                borderRadius: BorderRadius.circular(8),
              ),
              child: DropdownButtonHideUnderline(
                child: DropdownButton<VideoEngineType>(
                  value: _controller.engineType,
                  isExpanded: true,
                  onChanged: (VideoEngineType? value) {
                    if (value != null) {
                      _controller.loadMedia(
                        'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4',
                        engineType: value,
                      );
                    }
                  },
                  items: VideoEngineType.values.map((type) {
                    return DropdownMenuItem(
                      value: type,
                      child: Text(
                        type.name.toUpperCase(),
                        style: const TextStyle(fontSize: 12),
                      ),
                    );
                  }).toList(),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildQuickActionsCard() {
    return Card(
      child: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            const Text(
              'Tools',
              style: TextStyle(
                fontWeight: FontWeight.bold,
                color: Colors.amber,
              ),
            ),
            const SizedBox(height: 12),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                _buildActionButton(Icons.camera_alt, 'Snap', () async {
                  await _controller.captureFrame();
                  if (mounted) {
                    ScaffoldMessenger.of(context).showSnackBar(
                      const SnackBar(
                        content: Text('Snapshot stored in memory'),
                      ),
                    );
                  }
                }),
                _buildActionButton(Icons.speed, '2.0x', () {
                  _controller.setPlaybackSpeed(2.0);
                }),
                _buildActionButton(Icons.refresh, 'Reload', () {
                  _controller.loadMedia(
                    'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4',
                  );
                }),
              ],
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildActionButton(IconData icon, String label, VoidCallback onTap) {
    return InkWell(
      onTap: onTap,
      borderRadius: BorderRadius.circular(8),
      child: Container(
        padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
        decoration: BoxDecoration(
          color: Colors.amber.withValues(alpha: 0.1),
          borderRadius: BorderRadius.circular(8),
        ),
        child: Row(
          mainAxisSize: MainAxisSize.min,
          children: [
            Icon(icon, color: Colors.amber, size: 16),
            const SizedBox(width: 8),
            Text(
              label,
              style: const TextStyle(
                color: Colors.amber,
                fontSize: 10,
                fontWeight: FontWeight.bold,
              ),
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildAnalyticsHeader() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: [
        _buildSectionTitle('Event Stream Analytics'),
        IconButton(
          onPressed: () => setState(() => _showAnalytics = !_showAnalytics),
          icon: Icon(
            _showAnalytics
                ? Icons.keyboard_arrow_up
                : Icons.keyboard_arrow_down,
            color: Colors.white24,
          ),
        ),
      ],
    );
  }

  Widget _buildAnalyticsList() {
    return Container(
      height: 200,
      decoration: BoxDecoration(
        color: const Color(0xFF161616),
        borderRadius: BorderRadius.circular(16),
      ),
      child: _eventLogs.isEmpty
          ? const Center(
              child: Text(
                'Waiting for events...',
                style: TextStyle(color: Colors.white12),
              ),
            )
          : ListView.builder(
              padding: const EdgeInsets.symmetric(vertical: 8),
              itemCount: _eventLogs.length,
              itemBuilder: (context, index) {
                return Padding(
                  padding: const EdgeInsets.symmetric(
                    horizontal: 16,
                    vertical: 4,
                  ),
                  child: Row(
                    children: [
                      const Icon(Icons.bolt, color: Colors.amber, size: 12),
                      const SizedBox(width: 12),
                      Text(
                        _eventLogs[index],
                        style: const TextStyle(
                          color: Colors.white60,
                          fontSize: 11,
                          fontFamily: 'monospace',
                        ),
                      ),
                    ],
                  ),
                );
              },
            ),
    );
  }
}
1
likes
160
points
11
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

Professional universal video engine for Flutter. Supports VLC & Native backends with snapshots, custom tracks, and premium Glassmorphism UI.

Repository (GitHub)

License

MIT (license)

Dependencies

chewie, cupertino_icons, flutter, flutter_cache_manager, flutter_vlc_player, path, provider, video_player, web, youtube_explode_dart

More

Packages that depend on vido_ultra