public NzbDecoder CreateDecoder(NzbPart encodedPart, string segmentsFolder, Encoding fileEncoding)
        {
            lock (encodedPart.Segments)
            {
                var segments = encodedPart.Segments;
                foreach (var currentSegment in segments)
                {
                    string filepath = null;
                    lock (currentSegment)
                    {
                        filepath = Path.Combine(segmentsFolder, currentSegment.Id);
                    }

                    using (var reader = new StreamReader(filepath, Encoding.GetEncoding("iso-8859-1")))
                    {
                        string currentLine = null;

                        while ((currentLine = reader.ReadLine()) != null)
                        {
                            if (currentLine.StartsWith("=ybegin "))
                            {
                                return new yDecoder(encodedPart, segmentsFolder, fileEncoding);
                            }
                        }

                    }
                }
            }

            return null;
        }
        public yDecoder(NzbPart encodedPart, string segmentsFolder, Encoding fileEncoding)
        {
            ArgumentChecker.ThrowIfNull("encodedPart", encodedPart);
            ArgumentChecker.ThrowIfNullOrWhitespace("segmentsFolder", segmentsFolder);
            ArgumentChecker.ThrowIfNull("fileEncoding", fileEncoding);

            _encodedPart = encodedPart;
            _segmentsFolder = segmentsFolder;
            _fileEncoding = fileEncoding;
        }
        public NzbDecoderJob(string rawSegmentsDirectory, string destinationDirectory, NzbPart part, Encoding fileEncoding, Action<NzbPart> callWhenDone)
        {
            ArgumentChecker.ThrowIfNullOrWhitespace("rawSegmentsDirectory", rawSegmentsDirectory);
            ArgumentChecker.ThrowIfNullOrWhitespace("destinationDirectory", destinationDirectory);
            ArgumentChecker.ThrowIfNull("part", part);
            ArgumentChecker.ThrowIfNull("fileEncoding", fileEncoding);
            ArgumentChecker.ThrowIfNull("callWhenDone", callWhenDone);

            this.RawSegmentsDirectory = rawSegmentsDirectory;
            this.DestinationDirectory = destinationDirectory;
            this.Part = part;
            this.FileEncoding = fileEncoding;
            this.CallWhenDone = callWhenDone;
        }