youtube_url_processor 0.1.4  youtube_url_processor: ^0.1.4 copied to clipboard
youtube_url_processor: ^0.1.4 copied to clipboard
One-stop YouTube URL processor: parse, normalize, thumbnails, metadata, widgets.
youtube_url_processor #
A Flutter-friendly, one-stop YouTube URL processor. Parse, normalize, build URLs, fetch metadata (oEmbed/OpenGraph and optional YouTube Data API v3), generate thumbnails, and render link previews or embed views.
Features #
- Core parsing and normalization
- Detect video | short | live | clip | playlist | channel | unknown
- Parse youtu.be,watch,shorts,embed,live,playlist,channel/@handle/c/vanity/user/legacy,youtube-nocookie,m.youtube.com,music.youtube.com
- Extract params: v,list,index,t,start,end
- Normalize to canonical watch/playlist/channel URLs
 
- Detect 
- URL builders
- Build watch, shorts, embed (privacy-enhanced), playlist, and live channel URLs
- Build timestamped links and playlist-context links
 
- Thumbnails
- Compute thumbnail URLs: default, mq, hq, sd, maxres; jpg/webp
- YouTubeThumbnailwidget
 
- Metadata
- No-API: oEmbed and OpenGraph fallback
- Optional: YouTube Data API v3 client (videos, playlists, channels, playlist items)
 
- Flutter widgets
- YouTubeLinkPreview(thumbnail + title + channel)
- YouTubeEmbedView(builder that supplies embed URL/iframe HTML; integrate with your WebView)
 
- Utilities
- Sanitize URLs (strip tracking params)
- Timecode format/parse helpers
- Playlist helpers, live/shorts inspection
 
Install #
dependencies:
  youtube_url_processor: ^0.1.0
Quick start #
import 'package:youtube_url_processor/youtube_url_processor.dart';
void main() {
  const extractor = YouTubeUrlExtractor();
  final result = extractor.extract('https://youtu.be/dQw4w9WgXcQ?t=43');
  if (result.isSuccess && result.value?.video != null) {
    final video = result.value!.video!;
    final canonical = YouTubeUrlNormalizer.canonicalWatchUrl(video);
    print('Canonical: $canonical');
  }
}
Thumbnails #
// URL only
final u = YouTubeThumbnails.url('dQw4w9WgXcQ', quality: YouTubeThumbnailQuality.maxres);
// Flutter widget
YouTubeThumbnail(videoId: 'dQw4w9WgXcQ', quality: YouTubeThumbnailQuality.hq)
Link preview (oEmbed/OpenGraph) #
YouTubeLinkPreview(
  videoId: 'dQw4w9WgXcQ',
  onTap: () {
    // open player or webview
  },
)
Embeds #
Use builders to generate embed URLs or iframe HTML, and render with your own WebView package (webview_flutter shown below).
// URL builder
final embedUri = buildEmbedUri(
  'dQw4w9WgXcQ',
  options: const YouTubeEmbedOptions(autoplay: true, controls: false),
  privacyEnhanced: true,
);
// HTML builder
final iframeHtml = buildIframeHtml(
  'dQw4w9WgXcQ',
  options: const YouTubeEmbedOptions(autoplay: true),
  privacyEnhanced: true,
);
Or use YouTubeEmbedView with a custom builder:
YouTubeEmbedView(
  videoId: 'dQw4w9WgXcQ',
  privacyEnhanced: true,
  builder: (context, uri, iframe) {
    // Example with webview_flutter_web (web):
    // return HtmlElementView(viewType: ...);
    // Or with webview_flutter (mobile):
    // return WebViewWidget(controller: controller..loadHtmlString(iframe));
    return SizedBox.shrink();
  },
)
Metadata #
No-API mode:
final metaClient = YouTubeMetadataClient();
final r = await metaClient.fetchForVideo('dQw4w9WgXcQ');
print(r.oembed?.title ?? r.openGraph?.title);
YouTube Data API v3 (optional):
final api = YouTubeDataApiV3(apiKey: 'YOUR_API_KEY');
final video = await api.getVideo('dQw4w9WgXcQ');
final playlist = await api.getPlaylist('PL123...');
await for (final item in api.getPlaylistItems('PL123...')) {
  print('${item.index}: ${item.title} (${item.videoId})');
}
Playlists #
final res = await fetchEntirePlaylist(api, 'PL123...');
print('Title: ${res.metadata.title} | Items: ${res.items.length}');
Live/shorts inspection #
final inspector = YouTubeInspector(api: api);
final enriched = await inspector.inspectVideo(const VideoRef(videoId: 'v', isLiveCandidate: true));
print('isLive: ${enriched.isLive}, isUpcoming: ${enriched.isUpcoming}, duration: ${enriched.duration}');
URL sanitation #
final u = Uri.parse('https://www.youtube.com/watch?v=abc&t=30&fbclid=xyz&si=abc');
final s = sanitizeYouTubeUri(u); // keeps v/t, drops tracking
License #
MIT