static void Main(string[] args) { BonjourServiceResolver bsr = new BonjourServiceResolver(); bsr.ServiceFound += new Network.ZeroConf.ObjectEvent <Network.ZeroConf.IService>(bsr_ServiceFound); bsr.Resolve("_airport._tcp.local", NetworkInterface.GetAllNetworkInterfaces().SelectMany(nic => nic.GetIPProperties().UnicastAddresses.Where(ip => ip.IsDnsEligible).Select(ip => ip.Address)).Select(ip => new IPEndPoint(ip, 0)).ToArray()); Console.ReadLine(); bsr.Dispose(); //Service s = new Service(); //s.AddAddress(new Network.Dns.EndPoint() { DomainName = "AIL.local.", Port = 50508, Addresses = Network.ZeroConf.ResolverHelper.GetEndPoint().Addresses }); //s.Protocol = "_touch-remote._tcp.local."; //s.Name = "MyName"; //s.HostName = "ASPERGE.local."; //s["DvNm"] = "PC Remote"; //s["RemV"] = "10000"; //s["DvTy"] = "iPod"; //s["RemN"] = "Remote"; //s["txtvers"] = "1"; //s["Pair"] = "0000000000000001"; //s.Publish(); //Thread.Sleep(3600000); //s.Stop(); }
static void Main(string[] args) { try { var commandLineArgs = CommandLineArguments.Parse(args); if (commandLineArgs.OptionExists("h")) { PrintUsage(); return; } Console.Clear(); Console.WriteLine("Searching AppleTV ..."); BonjourServiceResolver resolver = new BonjourServiceResolver(); ManualResetEvent signal = new ManualResetEvent(false); resolver.ServiceFound += service => { var address = service.Addresses[0].Addresses.FirstOrDefault(x => x.AddressFamily == AddressFamily.InterNetwork); if (address != null) { Console.WriteLine("Apple TV Found : {0}", address); _appleTvIp = address.ToString(); signal.Set(); } }; resolver.Resolve("_airplay._tcp.local."); bool signaled = signal.WaitOne(TimeSpan.FromSeconds(30)); if (!signaled) { PrintError("Apple TV not found"); return; } var localAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(x => x.AddressFamily == AddressFamily.InterNetwork); if (localAddress == null) { PrintError("Local Ipv4 not found"); return; } _localIp = localAddress.ToString(); Player player = new Player(_appleTvIp, _localIp); player.StateChanged += (sender, eventArgs) => { _currentState = eventArgs.NewState; SetRate(player); PrintInfo(); }; player.Error += (sender, eventArgs) => { _failureReason = eventArgs.FailureReason; PrintInfo(); }; player.Progress += (sender, eventArgs) => { _position = eventArgs.Position; if (eventArgs.Position.TotalSeconds > 0) { _progress = (int)(((eventArgs.Position.TotalSeconds / eventArgs.Duration.TotalSeconds) * 100)); } PrintInfo(); }; player.Start(); if (commandLineArgs.OptionExists("i")) { player.Play(commandLineArgs.GetOptionValue("i")).ContinueWith(t => { if (t.Exception != null) { _failureReason = string.Format("{0} : {1}", t.Exception.InnerExceptions[0].GetType().Name, t.Exception.InnerExceptions[0].Message); PrintInfo(); } }); } ConsoleKeyInfo cki; do { while (!Console.KeyAvailable) { Thread.Sleep(10); } cki = Console.ReadKey(true); switch (cki.Key) { case ConsoleKey.Spacebar: if (_currentState == StateType.Paused) { player.Resume(); } else { player.Pause(); if (_currentState == StateType.Unknown) { _currentState = StateType.Paused; } } break; case ConsoleKey.LeftArrow: int lr; if (TryGetPreviousRate(_rate.GetValueOrDefault(0), out lr)) { player.SetRate(lr).ContinueWith(t => { if (t.IsCompleted) { SetRate(player); } }); } break; case ConsoleKey.RightArrow: int rr; if (TryGetNextRate(_rate.GetValueOrDefault(0), out rr)) { player.SetRate(rr).ContinueWith(t => { if (t.IsCompleted) { SetRate(player); } }); } break; } } while (cki.Key != ConsoleKey.X); player.Stop(); } catch (Exception e) { Console.Error.WriteLine(e.Message); } }