nowplaying 2.1.0 copy "nowplaying: ^2.1.0" to clipboard
nowplaying: ^2.1.0 copied to clipboard

PlatformAndroidiOS
outdated

A plugin to reveal metadata for the currently playing audio track

example/lib/main.dart

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:nowplaying/nowplaying.dart';
import 'package:provider/provider.dart';

void main() {
  NowPlaying.instance.start(resolveImages: true);
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    NowPlaying.instance.isEnabled().then((bool isEnabled) async {
      if (!isEnabled) {
        final shown = await NowPlaying.instance.requestPermissions();
        print('MANAGED TO SHOW PERMS PAGE: $shown');
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return StreamProvider<NowPlayingTrack>.value(
      initialData: NowPlayingTrack.loading,
      value: NowPlaying.instance.stream,
      child: MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: const Text('NowPlaying example app'),
          ),
          body: Center(
              child: Consumer<NowPlayingTrack>(builder: (context, track, _) {
            if (track == NowPlayingTrack.loading) return Container();
            return Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                if (track.isStopped) Text('nothing playing'),
                if (!track.isStopped) ...[
                  if (track.title != null) Text(track.title!),
                  if (track.artist != null) Text(track.artist!),
                  if (track.album != null) Text(track.album!),
                  Text(track.duration
                      .toString()
                      .split('.')
                      .first
                      .padLeft(8, '0')),
                  TrackProgressIndicator(track),
                  Text(track.state.toString()),
                  Stack(
                    alignment: Alignment.center,
                    children: [
                      Container(
                          margin: const EdgeInsets.all(8.0),
                          width: 200,
                          height: 200,
                          alignment: Alignment.center,
                          color: Colors.grey,
                          child: _imageFrom(track)),
                      Positioned(bottom: 0, right: 0, child: _iconFrom(track))
                    ],
                  ),
                ]
              ],
            );
          })),
        ),
      ),
    );
  }

  Widget _imageFrom(NowPlayingTrack track) {
    if (track.hasImage)
      return Image(
          key: Key(track.id),
          image: track.image!,
          width: 200,
          height: 200,
          fit: BoxFit.contain);

    if (track.isResolvingImage)
      return Container(
          width: 50.0,
          height: 50.0,
          child: CircularProgressIndicator(
              valueColor: AlwaysStoppedAnimation<Color>(Colors.white)));

    return Text('NO\nARTWORK\nFOUND',
        textAlign: TextAlign.center,
        style: const TextStyle(fontSize: 24, color: Colors.white));
  }

  Widget _iconFrom(NowPlayingTrack track) {
    if (track.hasIcon)
      return Container(
        padding: const EdgeInsets.all(6),
        decoration: const BoxDecoration(
            color: Colors.white,
            boxShadow: [const BoxShadow(blurRadius: 5, color: Colors.black)],
            shape: BoxShape.circle),
        child: Image(
          image: track.icon!,
          width: 25,
          height: 25,
          fit: BoxFit.contain,
          color: _fgColorFor(track),
          colorBlendMode: BlendMode.srcIn,
        ),
      );
    return Container();
  }

  Color _fgColorFor(NowPlayingTrack track) {
    switch (track.source) {
      case "com.apple.music":
        return Colors.blue;
      case "com.hughesmedia.big_finish":
        return Colors.red;
      case "com.spotify.music":
        return Colors.green;
      default:
        return Colors.purpleAccent;
    }
  }
}

class TrackProgressIndicator extends StatefulWidget {
  final NowPlayingTrack track;

  TrackProgressIndicator(this.track);

  @override
  _TrackProgressIndicatorState createState() => _TrackProgressIndicatorState();
}

class _TrackProgressIndicatorState extends State<TrackProgressIndicator> {
  late Timer _timer;

  @override
  void initState() {
    _timer = Timer.periodic(const Duration(seconds: 1), (_) => setState(() {}));
    super.initState();
  }

  @override
  void dispose() {
    _timer.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final progress = widget.track.progress;
    final countdown =
        widget.track.duration - progress + const Duration(seconds: 1);
    return Column(
      children: [
        Text(progress.toString().split('.').first.padLeft(8, '0')),
        Text(countdown.toString().split('.').first.padLeft(8, '0')),
      ],
    );
  }
}
24
likes
140
points
74
downloads

Publisher

unverified uploader

Weekly Downloads

A plugin to reveal metadata for the currently playing audio track

Repository (GitHub)
View/report issues

Documentation

API reference

License

BSD-3-Clause, MIT (license)

Dependencies

flutter, package_info, path_provider, plugin_platform_interface, uuid

More

Packages that depend on nowplaying

Packages that implement nowplaying