public static PlaylistList FromBrowseResponse(BrowseResponse response)
        {
            PlaylistList list = new PlaylistList();

            List <Content> contents;

            if (response.ContinuationContents != null)
            {
                contents = response.ContinuationContents.GridContinuation.Items;

                if (response.ContinuationContents.GridContinuation.Continuations != null)
                {
                    list.Continuation = response.ContinuationContents.GridContinuation.Continuations[0].NextContinuationData.Continuation;
                }
            }
            else
            {
                var renderer = response.Contents.SingleColumnBrowseResultsRenderer.Tabs[0].TabRenderer.Content.SectionListRenderer.Contents[1].ItemSectionRenderer.Contents[0].GridRenderer;

                contents          = renderer.Items;
                list.Continuation = renderer.Continuations[0].NextContinuationData.Continuation;
            }

            foreach (var item in contents)
            {
                // the first item in the list might not be a playlist, but the "createplaylist"
                // ... not sure what this is, but we want to skip it
                if (item.MusicTwoRowItemRenderer.NavigationEndpoint.CreatePlaylistEndpoint == null)
                {
                    list.Playlists.Add(Playlist.FromMusicTwoRowItemRenderer(item.MusicTwoRowItemRenderer));
                }
            }

            return(list);
        }
Example #2
0
        public async Task BrowseInternalAsync_Returns_Expected_Response_On_Success(string username, IPAddress ip, int port, string localUsername, List <Directory> directories)
        {
            var response = new BrowseResponse(directories.Count, directories);

            var waiter = new Mock <IWaiter>();

            waiter.Setup(m => m.WaitIndefinitely <BrowseResponse>(It.IsAny <WaitKey>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(response));
            waiter.Setup(m => m.Wait <GetPeerAddressResponse>(It.IsAny <WaitKey>(), null, It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(new GetPeerAddressResponse(username, ip, port)));

            var conn = new Mock <IMessageConnection>();

            conn.Setup(m => m.State)
            .Returns(ConnectionState.Connected);
            conn.Setup(m => m.WriteMessageAsync(It.IsAny <Message>(), It.IsAny <CancellationToken>()))
            .Returns(Task.CompletedTask);

            var connManager = new Mock <IConnectionManager>();

            connManager.Setup(m => m.GetOrAddUnsolicitedConnectionAsync(It.IsAny <ConnectionKey>(), localUsername, It.IsAny <EventHandler <Message> >(), It.IsAny <ConnectionOptions>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(conn.Object));

            var s = new SoulseekClient("127.0.0.1", 1, waiter: waiter.Object, serverConnection: conn.Object, connectionManager: connManager.Object);

            s.SetProperty("Username", localUsername);
            s.SetProperty("State", SoulseekClientStates.Connected | SoulseekClientStates.LoggedIn);

            var result = await s.BrowseAsync(username);

            Assert.Equal(response, result);
        }
        public BrowseResponse CreateFor(string actionXNamespace, string xml)
        {
            var xElement = XDocument.Parse(xml);

            var browseResponseElement = xElement.Descendants(XName.Get("BrowseResponse", actionXNamespace)).First();

            int.TryParse(browseResponseElement.Element("NumberReturned")?.Value, out var numberReturned);
            int.TryParse(browseResponseElement.Element("TotalMatches")?.Value, out var totalMatches);
            int.TryParse(browseResponseElement.Element("UpdateID")?.Value, out var updateId);

            var didlElement = browseResponseElement.Element("Result")?.Value;

            var browseResponse = new BrowseResponse
            {
                NumberReturned = numberReturned,
                TotalMatches   = totalMatches,
                UpdateId       = updateId,
                DidlRaw        = didlElement
            };

            if ((browseResponse.NumberReturned > 0) && (didlElement != null))
            {
                IEnumerable <XElement> itemElements = XElement.Parse(didlElement).Elements();

                foreach (var itemElement in itemElements)
                {
                    browseResponse.Items.Add(CreateItem(itemElement));
                }
            }

            return(browseResponse);
        }
Example #4
0
        public async Task <ServiceResult <BrowseResponse <CourseResponse> > > GetCourses(CourseBrowseRequest request)
        {
            IQueryable <Course> query;
            var studentId = request.StudentId.GetValueOrDefault();

            if (request.StudentId.HasValue)
            {
                query = _unitOfWork.EnrollmentRepository.
                        Get(e => e.StudentId == studentId).
                        Select(e => e.Course);
            }
            else
            {
                query = _unitOfWork.CourseRepository.Get();
            }

            var response = new BrowseResponse <CourseResponse>
            {
                PageInfo   = request.PageInfo,
                PageResult = await query.ToPageResultAsync <Course, CourseResponse>(request.PageInfo.Offset, request.PageInfo.Limit)
            };

            return(new ServiceResult <BrowseResponse <CourseResponse> > {
                Data = response
            });
        }
Example #5
0
        public async Task BrowseInternalAsync_Throws_BrowseException_On_Disconnect(string username, IPAddress ip, int port, string localUsername)
        {
            var waiter = new Mock <IWaiter>();

            waiter.Setup(m => m.Wait <GetPeerAddressResponse>(It.IsAny <WaitKey>(), null, It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(new GetPeerAddressResponse(username, ip, port)));
            waiter.Setup(m => m.WaitIndefinitely <BrowseResponse>(It.IsAny <WaitKey>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromException <BrowseResponse>(new ConnectionException("disconnected unexpectedly")));

            var conn = new Mock <IMessageConnection>();

            conn.Setup(m => m.WriteMessageAsync(It.IsAny <Message>(), It.IsAny <CancellationToken>()))
            .Returns(Task.CompletedTask)
            .Raises(m => m.Disconnected += null, conn.Object, string.Empty);

            var connManager = new Mock <IConnectionManager>();

            connManager.Setup(m => m.GetOrAddUnsolicitedConnectionAsync(It.IsAny <ConnectionKey>(), localUsername, It.IsAny <EventHandler <Message> >(), It.IsAny <ConnectionOptions>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(conn.Object));

            var s = new SoulseekClient("127.0.0.1", 1, waiter: waiter.Object, serverConnection: conn.Object, connectionManager: connManager.Object);

            s.SetProperty("Username", localUsername);
            s.SetProperty("State", SoulseekClientStates.Connected | SoulseekClientStates.LoggedIn);

            BrowseResponse result = null;
            var            ex     = await Record.ExceptionAsync(async() => result = await s.BrowseAsync(username));

            Assert.NotNull(ex);
            Assert.IsType <BrowseException>(ex);
            Assert.IsType <ConnectionException>(ex.InnerException);
            Assert.Contains("disconnected unexpectedly", ex.InnerException.Message, StringComparison.InvariantCultureIgnoreCase);
        }
        public void Sends_Resolved_BrowseResponse()
        {
            var files = new List <File>()
            {
                new File(1, "1", 1, "1", 1, new List <FileAttribute>()
                {
                    new FileAttribute(FileAttributeType.BitDepth, 1)
                }),
                new File(2, "2", 2, "2", 1, new List <FileAttribute>()
                {
                    new FileAttribute(FileAttributeType.BitRate, 2)
                }),
            };

            IEnumerable <Directory> dirs = new List <Directory>()
            {
                new Directory("1", 2, files),
                new Directory("2", 2, files),
            };

            var response = new BrowseResponse(dirs);
            var options  = new SoulseekClientOptions(browseResponseResolver: (u, i) => Task.FromResult(response));

            var(handler, mocks) = GetFixture(options: options);

            var msg = new BrowseRequest().ToByteArray();

            handler.HandleMessageRead(mocks.PeerConnection.Object, msg);

            mocks.PeerConnection.Verify(
                m => m.WriteAsync(It.Is <byte[]>(b => Encoding.UTF8.GetString(b) == Encoding.UTF8.GetString(response.ToByteArray())), null), Times.Once);
        }
        public void Parse_Handles_Empty_Directory()
        {
            var name = Guid.NewGuid().ToString();

            var msg = new MessageBuilder()
                      .Code(MessageCode.PeerBrowseResponse)
                      .WriteInteger(1)   // directory count
                      .WriteString(name) // first directory name
                      .WriteInteger(0)   // first directory file count
                      .Compress()
                      .Build();

            BrowseResponse r = default(BrowseResponse);

            var ex = Record.Exception(() => r = BrowseResponse.Parse(msg));

            Assert.Null(ex);
            Assert.Equal(1, r.DirectoryCount);
            Assert.Single(r.Directories);

            var d = r.Directories.ToList();

            Assert.Equal(name, d[0].Directoryname);
            Assert.Equal(0, d[0].FileCount);
            Assert.Empty(d[0].Files);
        }
Example #8
0
        public async Task BrowseInternalAsync_Throws_BrowseException_On_Write_Exception(string username, IPAddress ip, int port, string localUsername)
        {
            var waiter = new Mock <IWaiter>();

            waiter.Setup(m => m.Wait <GetPeerAddressResponse>(It.IsAny <WaitKey>(), null, It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(new GetPeerAddressResponse(username, ip, port)));

            var conn = new Mock <IMessageConnection>();

            conn.Setup(m => m.WriteMessageAsync(It.IsAny <Message>(), It.IsAny <CancellationToken>()))
            .Throws(new ConnectionWriteException());

            var connManager = new Mock <IConnectionManager>();

            connManager.Setup(m => m.GetOrAddUnsolicitedConnectionAsync(It.IsAny <ConnectionKey>(), localUsername, It.IsAny <EventHandler <Message> >(), It.IsAny <ConnectionOptions>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(conn.Object));

            var s = new SoulseekClient("127.0.0.1", 1, waiter: waiter.Object, serverConnection: conn.Object, connectionManager: connManager.Object);

            s.SetProperty("Username", localUsername);
            s.SetProperty("State", SoulseekClientStates.Connected | SoulseekClientStates.LoggedIn);

            BrowseResponse result = null;
            var            ex     = await Record.ExceptionAsync(async() => result = await s.BrowseAsync(username));

            Assert.NotNull(ex);
            Assert.IsType <BrowseException>(ex);
            Assert.IsType <ConnectionWriteException>(ex.InnerException);
        }
Example #9
0
        public async Task BrowseInternalAsync_Throws_BrowseException_On_Cancellation(string username, IPAddress ip, int port, string localUsername)
        {
            var waiter = new Mock <IWaiter>();

            waiter.Setup(m => m.WaitIndefinitely <BrowseResponse>(It.IsAny <WaitKey>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromException <BrowseResponse>(new OperationCanceledException()));
            waiter.Setup(m => m.Wait <GetPeerAddressResponse>(It.IsAny <WaitKey>(), null, It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(new GetPeerAddressResponse(username, ip, port)));

            var conn = new Mock <IMessageConnection>();

            conn.Setup(m => m.State)
            .Returns(ConnectionState.Connected);
            conn.Setup(m => m.WriteAsync(It.IsAny <byte[]>(), It.IsAny <CancellationToken>()))
            .Returns(Task.CompletedTask);

            var connManager = new Mock <IPeerConnectionManager>();

            connManager.Setup(m => m.GetOrAddMessageConnectionAsync(username, ip, port, It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(conn.Object));

            using (var s = new SoulseekClient("127.0.0.1", 1, waiter: waiter.Object, serverConnection: conn.Object, peerConnectionManager: connManager.Object))
            {
                s.SetProperty("Username", localUsername);
                s.SetProperty("State", SoulseekClientStates.Connected | SoulseekClientStates.LoggedIn);

                BrowseResponse result = null;
                var            ex     = await Record.ExceptionAsync(async() => result = await s.BrowseAsync(username));

                Assert.NotNull(ex);
                Assert.IsType <BrowseException>(ex);
                Assert.IsType <OperationCanceledException>(ex.InnerException);
            }
        }
        public void Parse_Handles_An_Overflowed_File_Size_From_Soulseek_NS(long given, long expected)
        {
            var msg = new MessageBuilder()
                      .WriteCode(MessageCode.Peer.BrowseResponse)
                      .WriteInteger(1)    // directory count
                      .WriteString("dir") // first directory name
                      .WriteInteger(1)    // first directory file count
                      .WriteByte(0x0)     // file code
                      .WriteString("foo") // name
                      .WriteLong(given)   // size
                      .WriteString("bar") // extension
                      .WriteInteger(0)    // attribute count
                      .Compress()
                      .Build();

            BrowseResponse r = default;

            var ex = Record.Exception(() => r = BrowseResponseFactory.FromByteArray(msg));

            Assert.Null(ex);

            var d = r.Directories.ToList();
            var f = d[0].Files.ToList();

            Assert.Equal(expected, f[0].Size);
        }
        public void Parse_Handles_A_Complete_Response()
        {
            var dirs = new List <Directory>();

            for (int i = 0; i < 5; i++)
            {
                dirs.Add(GetRandomDirectory(i));
            }

            var builder = new MessageBuilder()
                          .Code(MessageCode.PeerBrowseResponse)
                          .WriteInteger(dirs.Count);

            foreach (var dir in dirs)
            {
                BuildDirectory(builder, dir);
            }

            var msg = builder
                      .Compress()
                      .Build();

            BrowseResponse r = default(BrowseResponse);

            var ex = Record.Exception(() => r = BrowseResponse.Parse(msg));

            Assert.Null(ex);
            Assert.Equal(dirs.Count, r.DirectoryCount);
            Assert.Equal(dirs.Count, r.Directories.Count);

            var msgDirs = r.Directories.ToList();

            for (int i = 0; i < msgDirs.Count; i++)
            {
                Assert.Equal(dirs[i].Directoryname, msgDirs[i].Directoryname);
                Assert.Equal(dirs[i].FileCount, msgDirs[i].FileCount);

                var files    = dirs[i].Files.ToList();
                var msgFiles = msgDirs[i].Files.ToList();

                for (int j = 0; j < msgDirs[i].FileCount; j++)
                {
                    Assert.Equal(files[j].Code, msgFiles[j].Code);
                    Assert.Equal(files[j].Filename, msgFiles[j].Filename);
                    Assert.Equal(files[j].Size, msgFiles[j].Size);
                    Assert.Equal(files[j].Extension, msgFiles[j].Extension);
                    Assert.Equal(files[j].AttributeCount, msgFiles[j].AttributeCount);

                    var attr    = files[j].Attributes.ToList();
                    var msgAttr = files[j].Attributes.ToList();

                    for (int k = 0; k < msgFiles[j].AttributeCount; k++)
                    {
                        Assert.Equal(attr[k].Type, msgAttr[k].Type);
                        Assert.Equal(attr[k].Value, msgAttr[k].Value);
                    }
                }
            }
        }
        public void Instantiates_With_Given_Data()
        {
            var num = new Random().Next();
            var a   = new BrowseResponse(num);

            Assert.Equal(num, a.DirectoryCount);
            Assert.Empty(a.Directories);
        }
Example #13
0
        public void BrowseAsyncNull()
        {
            var response = new BrowseResponse();
            var channel  = new TestRequestChannel(response);

            channel.Invoking(c => c.BrowseAsync(null))
            .Should().Throw <ArgumentNullException>();
        }
Example #14
0
        public void Instantiates_With_No_Data()
        {
            var a = new BrowseResponse();

            Assert.Empty(a.Directories);
            Assert.Equal(0, a.DirectoryCount);
            Assert.Empty(a.LockedDirectories);
            Assert.Equal(0, a.LockedDirectoryCount);
        }
        public void ToByteArray_Returns_Expected_Data_When_Only_Locked_Files_Given()
        {
            var list = new List <File>()
            {
                new File(1, "1", 1, ".1", 1, new List <FileAttribute>()
                {
                    new FileAttribute(FileAttributeType.BitDepth, 1)
                }),
                new File(2, "2", 2, ".2", 1, new List <FileAttribute>()
                {
                    new FileAttribute(FileAttributeType.BitRate, 2)
                }),
            };

            var dirs = new List <Directory>()
            {
                new Directory("dir1", 2, list),
            };

            var r = new BrowseResponse(lockedDirectoryList: dirs);

            var bytes = r.ToByteArray();

            var m = new MessageReader <MessageCode.Peer>(bytes);

            m.Decompress();

            Assert.Equal(MessageCode.Peer.BrowseResponse, m.ReadCode());
            Assert.Equal(0, m.ReadInteger());
            Assert.Equal(0, m.ReadInteger()); // unknown
            Assert.Equal(1, m.ReadInteger()); // locked directory count

            // dir 1
            Assert.Equal("dir1", m.ReadString());
            Assert.Equal(2, m.ReadInteger());

            // file 1
            Assert.Equal(1, m.ReadByte());      // code
            Assert.Equal("1", m.ReadString());  // name
            Assert.Equal(1, m.ReadLong());      // length
            Assert.Equal(".1", m.ReadString()); // ext
            Assert.Equal(1, m.ReadInteger());   // attribute count

            Assert.Equal(FileAttributeType.BitDepth, (FileAttributeType)m.ReadInteger());
            Assert.Equal(1, m.ReadInteger());

            // file 2
            Assert.Equal(2, m.ReadByte());      // code
            Assert.Equal("2", m.ReadString());  // name
            Assert.Equal(2, m.ReadLong());      // length
            Assert.Equal(".2", m.ReadString()); // ext
            Assert.Equal(1, m.ReadInteger());   // attribute count

            Assert.Equal(FileAttributeType.BitRate, (FileAttributeType)m.ReadInteger());
            Assert.Equal(2, m.ReadInteger());
        }
        public static SearchResult FromBrowseResponse(BrowseResponse result, SearchResultType filter)
        {
            SearchResult ret = new SearchResult();

            if (result.Contents == null)
            {
                // no response
                return(ret);
            }

            SectionListRenderer renderer = result.Contents.SectionListRenderer;

            if (renderer == null)
            {
                int indexToUse = filter == SearchResultType.Upload ? 1 : 0;

                if (result.Contents.TabbedSearchResultsRenderer != null)
                {
                    renderer = result.Contents.TabbedSearchResultsRenderer.Tabs[indexToUse].TabRenderer.Content.SectionListRenderer;
                }
                else if (result.Contents.SingleColumnBrowseResultsRenderer != null)
                {
                    renderer = result.Contents.SingleColumnBrowseResultsRenderer.Tabs[indexToUse].TabRenderer.Content.SectionListRenderer;
                }

                if (renderer == null)
                {
                    // TODO: error ? throw ?
                    return(ret);
                }
            }

            List <Content> results = renderer.Contents;

            //if (results.Count == 1)
            //{
            //    // no results?
            //    return ret;
            //}

            foreach (var res in results)
            {
                if (res.MusicShelfRenderer == null)
                {
                    continue;
                }

                var innerResults = res.MusicShelfRenderer.Contents;
                foreach (var innerContent in innerResults)
                {
                    ParseInnerContent(ret, innerContent, filter);
                }
            }

            return(ret);
        }
Example #17
0
        public void Instantiates_With_The_Given_Locked_Directory_List()
        {
            var dir  = new Directory("foo", 1);
            var list = new List <Directory>(new[] { dir });

            var a = new BrowseResponse(lockedDirectoryList: list);

            Assert.Equal(list.Count, a.LockedDirectoryCount);
            Assert.Single(a.LockedDirectories);
            Assert.Equal(dir, a.LockedDirectories.ToList()[0]);
        }
        public void Parse_Throws_MessageException_On_Code_Mismatch()
        {
            var msg = new MessageBuilder()
                      .Code(MessageCode.PeerTransferResponse)
                      .Build();

            var ex = Record.Exception(() => BrowseResponse.Parse(msg));

            Assert.NotNull(ex);
            Assert.IsType <MessageException>(ex);
        }
        public void Completes_BrowseResponseConnection_Wait_On_Browse_Response_Receipt(string username, IPEndPoint endpoint)
        {
            var(handler, mocks) = GetFixture(username, endpoint);

            var request = new BrowseResponse(Enumerable.Empty <Directory>());
            var message = request.ToByteArray();
            var args    = new MessageReceivedEventArgs(message.Length, message.Skip(4).Take(4).ToArray());

            handler.HandleMessageReceived(mocks.PeerConnection.Object, args);

            mocks.Waiter.Verify(m => m.Complete(new WaitKey(Constants.WaitKey.BrowseResponseConnection, username), It.IsAny <(MessageReceivedEventArgs, IMessageConnection)>()), Times.Once);
        }
        public void Instantiates_With_The_Given_Directory_List()
        {
            var num = new Random().Next();

            var dir  = new Directory("foo", 1);
            var list = new List <Directory>(new[] { dir });

            var a = new BrowseResponse(num, list);

            Assert.Equal(num, a.DirectoryCount);
            Assert.Single(a.Directories);
            Assert.Equal(dir, a.Directories.ToList()[0]);
        }
        public void Parse_Throws_MessageCompressionException_On_Uncompressed_Payload()
        {
            var msg = new MessageBuilder()
                      .Code(MessageCode.PeerBrowseResponse)
                      .WriteBytes(new byte[] { 0x0, 0x1, 0x2, 0x3 })
                      .Build();

            var ex = Record.Exception(() => BrowseResponse.Parse(msg));

            Assert.NotNull(ex);
            Assert.IsType <MessageCompressionException>(ex);
            Assert.IsType <ZStreamException>(ex.InnerException);
        }
Example #22
0
        public async Task BrowseAsync()
        {
            var response = new BrowseResponse();
            var request  = new BrowseRequest();
            var channel  = new TestRequestChannel(response);

            var ret = await channel.BrowseAsync(request);

            ret
            .Should().BeSameAs(response);

            channel.Request
            .Should().BeSameAs(request);
        }
Example #23
0
        public static User FromBrowseResponse(BrowseResponse response)
        {
            User user = new User();

            user.Name = response.Header.MusicVisualHeaderRenderer.Title.Runs[0].Text;

            var contents = response.Contents.SingleColumnBrowseResultsRenderer.Tabs[0].TabRenderer.Content.SectionListRenderer.Contents[0].MusicCarouselShelfRenderer.Contents;

            foreach (var content in contents)
            {
                user.Playlists.Add(Playlist.FromMusicTwoRowItemRenderer(content.MusicTwoRowItemRenderer));
            }

            return(user);
        }
        public void Creates_Diagnostic_On_Exception_Handling_BrowseResponse_Receipt(string username, IPEndPoint endpoint)
        {
            var(handler, mocks) = GetFixture(username, endpoint);

            var request = new BrowseResponse(Enumerable.Empty <Directory>());
            var message = request.ToByteArray();
            var args    = new MessageReceivedEventArgs(message.Length, message.Skip(4).Take(4).ToArray());

            mocks.Waiter.Setup(m => m.Complete(new WaitKey(Constants.WaitKey.BrowseResponseConnection, username), It.IsAny <(MessageReceivedEventArgs, IMessageConnection)>()))
            .Throws(new Exception("foo"));

            handler.HandleMessageReceived(mocks.PeerConnection.Object, args);

            mocks.Diagnostic.Verify(m => m.Warning(It.Is <string>(s => s.ContainsInsensitive("Error handling peer message")), It.IsAny <Exception>()), Times.Once);
        }
        public void Parse_Returns_Empty_Response_Given_Empty_Message()
        {
            var msg = new MessageBuilder()
                      .Code(MessageCode.PeerBrowseResponse)
                      .WriteInteger(0)
                      .Compress()
                      .Build();

            BrowseResponse r = default(BrowseResponse);

            var ex = Record.Exception(() => r = BrowseResponse.Parse(msg));

            Assert.Null(ex);
            Assert.Equal(0, r.DirectoryCount);
            Assert.Empty(r.Directories);
        }
        public void Parse_Throws_MessageReadException_On_Missing_Data()
        {
            var name = Guid.NewGuid().ToString();

            var msg = new MessageBuilder()
                      .WriteCode(MessageCode.Peer.BrowseResponse)
                      .WriteInteger(1)   // directory count
                      .WriteString(name) // first directory name
                      .Compress()        // count is missing
                      .Build();

            BrowseResponse r  = default;
            var            ex = Record.Exception(() => r = BrowseResponseFactory.FromByteArray(msg));

            Assert.NotNull(ex);
            Assert.IsType <MessageReadException>(ex);
        }
Example #27
0
        /// <summary>
        /// Search uploaded songs, artists, albums
        ///
        /// The YTM api does not return results with mixes of uploads and non uploaded tracks, so you
        /// have to search for uploads specifically
        /// </summary>
        /// <param name="search"></param>
        /// <returns></returns>
        public async Task <SearchResult> SearchUploads(string search)
        {
            string url = GetYTMUrl("search");

            JObject data = JObject.FromObject(new
            {
                query = search
            });

            string parameters = GetSearchParamStringFromFilter(SearchResultType.Upload);

            data.Add("params", parameters);

            BrowseResponse response = await Post <BrowseResponse>(url, data, authRequired : true);

            return(SearchResult.FromBrowseResponse(response, SearchResultType.Upload));
        }
Example #28
0
        private async Task <IList <ReferenceDescription> > BrowseTree(NodeId tree)
        {
            if (connection == null)
            {
                return(new ReferenceDescription[0]);
            }

            var browseRequest = new BrowseRequest {
                NodesToBrowse = new[] {
                    new BrowseDescription {
                        NodeId          = tree,
                        ReferenceTypeId = NodeId.Parse(ReferenceTypeIds.HierarchicalReferences),
                        ResultMask      = (uint)BrowseResultMask.TargetInfo,
                        NodeClassMask   = (uint)NodeClass.Object | (int)NodeClass.Variable,
                        BrowseDirection = BrowseDirection.Forward,
                        IncludeSubtypes = true
                    }
                },
                RequestedMaxReferencesPerNode = 1000
            };

            var            rds            = new List <ReferenceDescription>();
            BrowseResponse browseResponse = await connection.BrowseAsync(browseRequest);

            Workstation.ServiceModel.Ua.BrowseResult[] results = CleanNulls(browseResponse.Results).ToArray();
            rds.AddRange(results.SelectMany(result => CleanNulls(result.References)));

            var continuationPoints = results.Select(br => br.ContinuationPoint).Where(cp => cp != null).ToArray();

            while (continuationPoints.Length > 0 && connection != null)
            {
                var browseNextRequest = new BrowseNextRequest {
                    ContinuationPoints = continuationPoints, ReleaseContinuationPoints = false
                };
                var browseNextResponse = await connection.BrowseNextAsync(browseNextRequest);

                Workstation.ServiceModel.Ua.BrowseResult[] nextResults = CleanNulls(browseNextResponse.Results).ToArray();
                rds.AddRange(nextResults.SelectMany(result => CleanNulls(result.References)));
                continuationPoints = nextResults.Select(br => br.ContinuationPoint).Where(cp => cp != null).ToArray();
            }

            return(rds);
        }
Example #29
0
        public async Task BrowseAsync_Raises_BrowseProgressUpdated_Event_At_Least_Twice(string username, IPEndPoint endpoint, string localUsername, List <Directory> directories, int length)
        {
            var response = new BrowseResponse(directories.Count, directories);

            var waiter = new Mock <IWaiter>();

            waiter.Setup(m => m.WaitIndefinitely <BrowseResponse>(It.IsAny <WaitKey>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(response));
            waiter.Setup(m => m.Wait <UserAddressResponse>(It.IsAny <WaitKey>(), null, It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(new UserAddressResponse(username, endpoint.Address, endpoint.Port)));

            var conn = new Mock <IMessageConnection>();

            conn.Setup(m => m.State)
            .Returns(ConnectionState.Connected);
            conn.Setup(m => m.WriteAsync(It.IsAny <byte[]>(), It.IsAny <CancellationToken>()))
            .Returns(Task.CompletedTask);

            var connManager = new Mock <IPeerConnectionManager>();

            connManager.Setup(m => m.GetOrAddMessageConnectionAsync(username, endpoint, It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(conn.Object));

            waiter.Setup(m => m.Wait <(MessageReceivedEventArgs, IMessageConnection)>(It.IsAny <WaitKey>(), It.IsAny <int?>(), It.IsAny <CancellationToken?>()))
            .Returns(Task.FromResult((new MessageReceivedEventArgs(length, new byte[] { 0x0 }), conn.Object)));

            using (var s = new SoulseekClient("127.0.0.1", 1, waiter: waiter.Object, serverConnection: conn.Object, peerConnectionManager: connManager.Object))
            {
                s.SetProperty("Username", localUsername);
                s.SetProperty("State", SoulseekClientStates.Connected | SoulseekClientStates.LoggedIn);

                var events = new List <BrowseProgressUpdatedEventArgs>();
                s.BrowseProgressUpdated += (sender, args) => events.Add(args);

                await s.BrowseAsync(username);

                Assert.NotEmpty(events);
                Assert.Equal(2, events.Count);
                Assert.Equal(0, events[0].PercentComplete);
                Assert.Equal(100, events[1].PercentComplete);
            }
        }
        public void Parse_Handles_Files_With_No_Attributes()
        {
            var name = Guid.NewGuid().ToString();

            var msg = new MessageBuilder()
                      .Code(MessageCode.PeerBrowseResponse)
                      .WriteInteger(1)    // directory count
                      .WriteString(name)  // first directory name
                      .WriteInteger(1)    // first directory file count
                      .WriteByte(0x0)     // file code
                      .WriteString("foo") // name
                      .WriteLong(12)      // size
                      .WriteString("bar") // extension
                      .WriteInteger(0)    // attribute count
                      .Compress()
                      .Build();

            BrowseResponse r = default(BrowseResponse);

            var ex = Record.Exception(() => r = BrowseResponse.Parse(msg));

            Assert.Null(ex);
            Assert.Equal(1, r.DirectoryCount);
            Assert.Single(r.Directories);

            var d = r.Directories.ToList();

            Assert.Equal(name, d[0].Directoryname);
            Assert.Equal(1, d[0].FileCount);
            Assert.Single(d[0].Files);

            var f = d[0].Files.ToList();

            Assert.Equal(0x0, f[0].Code);
            Assert.Equal("foo", f[0].Filename);
            Assert.Equal(12, f[0].Size);
            Assert.Equal("bar", f[0].Extension);
            Assert.Equal(0, f[0].AttributeCount);
            Assert.Empty(f[0].Attributes);
        }
Example #31
0
        /// <summary cref="IServiceMessage.CreateResponse" />
        public object CreateResponse(IServiceResponse response)
        {
            BrowseResponse body = response as BrowseResponse;

            if (body == null)
            {
                body = new BrowseResponse();
                body.ResponseHeader = ((ServiceFault)response).ResponseHeader;
            }

            return new BrowseResponseMessage(body);
        }
Example #32
0
 /// <summary>
 /// Initializes the message with the body.
 /// </summary>
 public BrowseResponseMessage(BrowseResponse BrowseResponse)
 {
     this.BrowseResponse = BrowseResponse;
 }
Example #33
0
        /// <summary>
        /// Initializes the message with a service fault.
        /// </summary>
        public BrowseResponseMessage(ServiceFault ServiceFault)
        {
            this.BrowseResponse = new BrowseResponse();

            if (ServiceFault != null)
            {
                this.BrowseResponse.ResponseHeader = ServiceFault.ResponseHeader;
            }
        }
Example #34
0
 private void ParseBrowseResponse(BrowseResponse resp)
 {
     foreach (BrowseItem itm in resp.RootItem.Items)
         foreach (string ns in itm.Namespaces)
             if (ns.Equals(RegisteredJabberNamespaces.MultiUserChat) || ns.Equals(MUCDiscoFeatures.GroupChat))
             {
                 //todo: dig into this item to search for rooms
                 AddChatServerMenuItem(itm.JabberID);
                 break;
             }
 }
Example #35
0
        /// <summary>
        /// Invokes the Browse service.
        /// </summary>
        public IServiceResponse Browse(IServiceRequest incoming)
        {
            BrowseResponse response = null;

            BrowseRequest request = (BrowseRequest)incoming;

            BrowseResultCollection results = null;
            DiagnosticInfoCollection diagnosticInfos = null;

            response = new BrowseResponse();

            response.ResponseHeader = ServerInstance.Browse(
               request.RequestHeader,
               request.View,
               request.RequestedMaxReferencesPerNode,
               request.NodesToBrowse,
               out results,
               out diagnosticInfos);

            response.Results         = results;
            response.DiagnosticInfos = diagnosticInfos;

            return response;
        }