//This function is called every time the discoverer has information regarding one of the URIs we provided.
        static void HandleDiscovered(object disc, DiscoveredArgs args)
        {
            var info       = args.Info;
            var uri        = info.Uri;
            var result     = info.Result;
            var discoverer = (Discoverer)disc;

            switch (result)
            {
            case DiscovererResult.UriInvalid:
                Console.WriteLine("Invalid URI '{0}'", uri);
                break;

            case DiscovererResult.Error:
                var err = new GLib.GException(args.Error);
                Console.WriteLine("Discoverer error: {0}", err.Message);
                break;

            case DiscovererResult.Timeout:
                Console.WriteLine("Timeout");
                break;

            case DiscovererResult.Busy:
                Console.WriteLine("Busy");
                break;

            case DiscovererResult.MissingPlugins: {
                var s = info.Misc;

                if (s != null)
                {
                    Console.WriteLine("Missing plugins: {0}", s);
                }
                break;
            }

            case DiscovererResult.Ok:
                Console.WriteLine("Discovered '{0}'", uri);
                break;
            }

            if (result != DiscovererResult.Ok)
            {
                Console.WriteLine("This URI cannot be played");
                return;
            }

            // If we got no error, show the retrieved information
            Console.WriteLine("\nDuration: {0}", new TimeSpan((long)info.Duration));

            var tags = info.Tags;

            if (tags != null)
            {
                Console.WriteLine("Tags:");
                tags.Foreach((TagForeachFunc) delegate(TagList list, string tag) {
                    PrintTagForeach(list, tag, 1);
                });
            }

            Console.WriteLine("Seekable: {0}", (info.Seekable ? "yes" : "no"));

            Console.WriteLine();

            var sinfo = info.StreamInfo;

            if (sinfo == null)
            {
                return;
            }

            Console.WriteLine("Stream information:");

            PrintTopology(sinfo, 1);

            Console.WriteLine();
        }
        /// <summary>
        /// This function is called every time the discoverer has information regarding one of the URIs we provided.
        /// </summary>
        static void OnDiscoveredCb(object o, DiscoveredArgs args)
        {
            var discoverer = o as Discoverer;
            var info       = args.Info;
            var uri        = info.Uri;
            var result     = info.Result;

            switch (result)
            {
            case DiscovererResult.UriInvalid:
                $"Invalid uri {uri}".PrintErr();
                break;

            case DiscovererResult.Error:
                var err = new GLib.GException(args.Error);
                $"Discoverer error {err.Message}".PrintErr();
                break;

            case DiscovererResult.Timeout:
                Console.WriteLine("Timeout");
                break;

            case DiscovererResult.Busy:
                Console.WriteLine("Busy");
                break;

            case DiscovererResult.MissingPlugins:
                var s = info.Misc;
                if (s != null)
                {
                    Console.WriteLine($"Missing plugins {s}");
                }
                break;

            case DiscovererResult.Ok:
                Console.WriteLine($"Discovered {uri}");
                break;
            }
            if (result != DiscovererResult.Ok)
            {
                "This URI cannot be played".PrintErr();
                return;
            }

            // If we got no error, show the retrieved information
            var duration = new TimeSpan((long)info.Duration);

            Console.WriteLine($"Duration {duration}");

            var tags = info.Tags;

            if (tags != null)
            {
                Console.WriteLine("Tags: ");
                tags.Foreach(PrintTagForeach);
            }

            Console.WriteLine("Seekable: {0}", info.Seekable ? "yes" : "no");
            DiscovererStreamInfo sinfo = info.StreamInfo;

            if (sinfo == null)
            {
                return;
            }
            Console.WriteLine("Stream information: ");
            PrintTopology(sinfo, 1);
            Console.WriteLine();
        }