Common lisp tools for decoding yenc files. It uses split-sequence.

(ql:quickload :trivial-yenc)

(trivial-yenc:decode-part instream directory) => part number or nil

  • instream is a binary input stream (:element-type '(unsigned-byte 8))

  • directory is a path prefix for the output file

See examples test1 and test2.

test1 opens a yenc file (two roads), decodes and displays the poem from the file.

test2 decodes a multi-part binary, joystick.jpg.

(defun test2 ()
  "decode multipart messages to create joystick.jpg"
  (with-open-file (in  (asdf:system-relative-pathname 'trivial-yenc "test/yenc2/00000020.ntx" )
               :element-type '(unsigned-byte 8))
    (decode-part in (asdf:system-relative-pathname 'trivial-yenc "test/yenc2/")))
  (with-open-file (in  (asdf:system-relative-pathname 'trivial-yenc "test/yenc2/00000021.ntx" )
               :element-type '(unsigned-byte 8))
   (decode-part in (asdf:system-relative-pathname 'trivial-yenc "test/yenc2/")))   )

decode-part skips message headers, parses =ybegin line. If it's a multipart, it parses the next =ypart line. With enough information, it yydecodes the data that follows and writes it to a file in the directory specified. (test2) reads yenc files, but in real life you can stream the data right from the newsserver...

See: *

Todo: * general cleanup * handle crc * check part size * return mutivalue status, part, ofparts, filename, etc...

Stacksmith <>