Ejemplo n.º 1
0
        public void MinimalNzbDataShouldBeParsed()
        {
            const string nzbText        = @"<nzb xmlns=""http://www.newzbin.com/DTD/2003/nzb""></nzb>";
            NzbDocument  actualDocument = NzbParser.Parse(nzbText);

            Assert.Empty(actualDocument.MetaData);
            Assert.Empty(actualDocument.Files);
        }
Ejemplo n.º 2
0
        public void InvalidFileDateShouldThrow()
        {
            const string nzbText = @"
<nzb xmlns=""http://www.newzbin.com/DTD/2003/nzb"">
  <file date=""1496xxx753""></file>
</nzb>";

            Assert.Throws <InvalidNzbDataException>(() => NzbParser.Parse(nzbText));
        }
Ejemplo n.º 3
0
        public void ValidNzbDataShouldBeParsed(string fileName)
        {
            string      nzbData        = testData.GetEmbeddedFile(fileName).ReadAllText(UsenetEncoding.Default);
            NzbDocument actualDocument = NzbParser.Parse(nzbData);

            Assert.Equal("Your File!", actualDocument.MetaData["title"].Single());
            Assert.Equal("secret", actualDocument.MetaData["password"].Single());
            Assert.Equal("HD", actualDocument.MetaData["tag"].Single());
            Assert.Equal("TV", actualDocument.MetaData["category"].Single());
            Assert.Equal(106895, actualDocument.Size);
        }
Ejemplo n.º 4
0
        public void FileShouldBeExtractedFromSubjectWhenQuoted()
        {
            const string nzbText = @"
<nzb xmlns=""http://www.newzbin.com/DTD/2003/nzb"">
  <file subject=""(TWD151 - 153)[2 / 9] - &quot;TWD151 - 153.rar&quot; yEnc (001 / 249)""></file>
</nzb>";

            NzbDocument actualDocument = NzbParser.Parse(nzbText);

            Assert.Equal("TWD151 - 153.rar", actualDocument.Files.Single().FileName);
        }
Ejemplo n.º 5
0
        public void FileShouldBeExtractedFromSubjectWhenNotQuotedAndNoParenthesis()
        {
            const string nzbText = @"
<nzb xmlns=""http://www.newzbin.com/DTD/2003/nzb"">
  <file subject=""[2 / 9] - TWD151 - 153.rar yEnc""></file>
</nzb>";

            NzbDocument actualDocument = NzbParser.Parse(nzbText);

            Assert.Equal("[2 / 9] - TWD151 - 153.rar", actualDocument.Files.Single().FileName);
        }
Ejemplo n.º 6
0
        public void FileDateShouldBeParsed()
        {
            DateTimeOffset expected = DateTimeOffset.Parse(@"2017-06-01T06:49:13+00:00");
            const string   nzbText  = @"
<nzb xmlns=""http://www.newzbin.com/DTD/2003/nzb"">
  <file date=""1496299753""></file>
</nzb>";

            NzbDocument actualDocument = NzbParser.Parse(nzbText);

            Assert.Equal(expected, actualDocument.Files[0].Date);
        }
Ejemplo n.º 7
0
        public void MissingSegmentSizeShouldThrow()
        {
            const string nzbText = @"
<nzb xmlns=""http://www.newzbin.com/DTD/2003/nzb"">
  <file>
    <segments>
      <segment number=""1""></segment>
    </segments>
  </file>
</nzb>";

            Assert.Throws <InvalidNzbDataException>(() => NzbParser.Parse(nzbText));
        }
Ejemplo n.º 8
0
        private static void TestDownloadNzbStreaming(NntpClient client, string nzbFileName)
        {
            string fullPath = Path.Combine(nzbFileName);
            string nzbData = File.ReadAllText(fullPath, UsenetEncoding.Default);
            NzbDocument nzbDocument = NzbParser.Parse(nzbData);

            string downloadDir = Path.Combine("downloads", nzbFileName);
            Directory.CreateDirectory(downloadDir);

            var sw = new Stopwatch();
            sw.Restart();

            log.LogInformation("Downloading nzb {nzbFileName}", nzbFileName);
            foreach (NzbFile file in nzbDocument.Files)
            {
                log.LogInformation("Downloading file {subject}", file.Subject);
                foreach (NzbSegment segment in file.Segments)
                {
                    log.LogInformation("Downloading article {messageId}", segment.MessageId);
                    NntpArticleResponse response = client.Article(segment.MessageId);
                    using (YencStream yencStream = YencStreamDecoder.Decode(response.Article.Body))
                    {
                        YencHeader header = yencStream.Header;

                        string fileName = Path.Combine(downloadDir, header.FileName);
                        if (!File.Exists(fileName))
                        {
                            log.LogInformation("Creating file {fileName}", fileName);
                            // create file and pre-allocate disk space for it
                            using (FileStream stream = File.Create(fileName))
                            {
                                stream.SetLength(header.FileSize);
                            }
                        }

                        log.LogInformation("Writing {size} bytes to file {fileName} at offset {offset}",
                            header.PartSize, fileName, header.PartOffset);

                        using (FileStream stream = File.Open(
                            fileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))
                        {
                            stream.Seek(header.PartOffset, SeekOrigin.Begin);
                            yencStream.CopyTo(stream);
                        }
                    }
                }
            }
            log.LogInformation("Nzb downloaded in {elapsed}", sw.Elapsed);
        }
Ejemplo n.º 9
0
        public void MultipleMetaDataKeysShouldBeParsed()
        {
            const string nzbText        = @"
<nzb xmlns=""http://www.newzbin.com/DTD/2003/nzb"">
  <head>
    <meta type=""tag"">SD</meta>
    <meta type=""tag"">avi</meta>
  </head>
</nzb>";
            NzbDocument  actualDocument = NzbParser.Parse(nzbText);

            Assert.Single(actualDocument.MetaData);
            Assert.Equal(2, actualDocument.MetaData["tag"].Count);
            Assert.NotNull(actualDocument.MetaData["tag"].SingleOrDefault(m => m == "SD"));
            Assert.NotNull(actualDocument.MetaData["tag"].SingleOrDefault(m => m == "avi"));
        }
Ejemplo n.º 10
0
        public void ShouldWriteDocumentToFile(string fileName)
        {
            IFileInfo   file     = testData.GetEmbeddedFile(fileName);
            NzbDocument expected = NzbParser.Parse(file.ReadAllText(UsenetEncoding.Default));

            using var stream = new MemoryStream();
            using var writer = new StreamWriter(stream, UsenetEncoding.Default);
            using var reader = new StreamReader(stream, UsenetEncoding.Default);

            // write to file and read back for comparison
            writer.WriteNzbDocument(expected);
            stream.Position = 0;
            NzbDocument actual = NzbParser.Parse(reader.ReadToEnd());

            // compare
            Assert.Equal(expected, actual);
        }
Ejemplo n.º 11
0
        public void InvalidNzbShouldThrow()
        {
            const string nzbText = @"<html></html>";

            Assert.Throws <InvalidNzbDataException>(() => NzbParser.Parse(nzbText));
        }
Ejemplo n.º 12
0
        public void InvalidXmlShouldThrow()
        {
            const string nzbText = @"sdfsfasfasdfasdf";

            Assert.Throws <XmlException>(() => NzbParser.Parse(nzbText));
        }