Paste: id3
Author: | inforichand |
Mode: | factor |
Date: | Sun, 1 Feb 2009 04:03:51 |
Plain Text |
: id3v2?
"ID3" head? ;
: id3v1?
128 tail* "TAG" head? ;
: supported-version?
dup { 4 } head? swap { 3 } head? or ;
: id3stuff
[ dup id3v2? [ 3 tail supported-version? ] [ dup id3v1? [ "id3v1" ] [ "none" ] if ] if ]
with-mapped-uchar-file ;
Author: | inforichland |
Mode: | factor |
Date: | Sun, 1 Feb 2009 04:20:02 |
Plain Text |
: id3v2?
"ID3" head? ;
: id3v1?
128 tail-slice* "TAG" head? ;
: supported-version?
[ { 4 } head? ] [ { 3 } head? ] bi or ;
: id3stuff
[
{
{ [ dup id3v2? ] [ 3 tail-slice supported-version? ] }
{ [ dup id3v1? ] [ "id3v1" ] }
[ drop "none" ]
} cond
] with-mapped-uchar-file ;
Author: | inforichland |
Mode: | factor |
Date: | Tue, 3 Feb 2009 03:55:33 |
Plain Text |
USING: sequences io io.encodings.binary io.files io.pathnames strings kernel math io.mmap io.mmap.uchar accessors syntax combinators math.ranges unicode.categories byte-arrays fry ;
IN: id3
TUPLE: id3v2header version flags size ;
TUPLE: frame frame-id size flags data ;
: <id3v2header> id3v2header new ;
: <frame> frame new ;
: id3v2?
"ID3" head? ;
: id3v1?
128 tail-slice* "TAG" head? ;
: >28bitword
0 [ swap 7 shift bitor ] reduce ;
: dips
dip swap ; inline
: valid-frame-id?
[ [ digit? ] [ LETTER? ] bi or ] all? ;
: read-frame-id
4 head-slice ;
: read-frame-size
4 8 rot subseq ;
: read-frame-flags
8 10 rot subseq ;
: read-frame-data
: read-frame
dup dup dup <frame>
[ read-frame-id ] dips >string >>frame-id
[ read-frame-flags ] dips >byte-array >>flags
[ read-frame-size ] dips >28bitword >>size
'[ _ read-frame-data ] dips >string >>data ;
: header-supported-version?
3 tail-slice [ { 4 } head? ] [ { 3 } head? ] bi or ;
: header-flags
5 swap nth ;
: header-size
6 10 rot subseq >28bitword ;
: read-v2-header
dup dup
[ header-supported-version? ]
[ header-flags ] dips >>flags
[ header-size ] dips >>size ;
: drop-header
dup 10 tail-slice swap ;
: read-v2-tag-data
drop-header read-v2-header swap read-frame ;
: id3stuff
[
{
{ [ dup id3v2? ] [ read-v2-tag-data ] }
{ [ dup id3v1? ] [ drop "id3v1" ] }
[ drop "none" ]
} cond
] with-mapped-uchar-file ;
Author: | inforichland |
Mode: | factor |
Date: | Tue, 3 Feb 2009 04:57:17 |
Plain Text |
USING: sequences io io.encodings.binary io.files io.pathnames strings kernel math io.mmap io.mmap.uchar accessors syntax combinators math.ranges unicode.categories byte-arrays fry ;
IN: id3
TUPLE: id3v2header version flags size ;
TUPLE: frame frame-id flags size data ;
: <id3v2header> id3v2header new ;
: <frame> frame new ;
: <frame-boa> frame boa ;
: id3v2?
"ID3" head? ;
: id3v1?
128 tail-slice* "TAG" head? ;
: >28bitword
0 [ swap 7 shift bitor ] reduce ;
: dips
dip swap ; inline
: valid-frame-id?
[ [ digit? ] [ LETTER? ] bi or ] all? ;
: read-frame-id
4 head-slice ;
: read-frame-size
4 8 rot subseq ;
: read-frame-flags
8 10 rot subseq ;
: read-frame-data
over size>> 10 + 11 swap rot subseq ;
: read-frame
[ <frame> ] dip
{
[ read-frame-id >string >>frame-id ]
[ read-frame-flags >byte-array >>flags ]
[ read-frame-size >28bitword >>size ]
[ read-frame-data >string >>data ]
} cleave ;
: header-supported-version?
3 tail-slice [ { 4 } head? ] [ { 3 } head? ] bi or ;
: header-flags
5 swap nth ;
: header-size
6 10 rot subseq >28bitword ;
: read-v2-header
dup dup <id3v2header>
[ header-supported-version? ] dips >>version
[ header-flags ] dips >>flags
[ header-size ] dips >>size ;
: drop-header
dup 10 tail-slice swap ;
: read-v2-tag-data
drop-header read-v2-header swap read-frame ;
: id3stuff
[
{
{ [ dup id3v2? ] [ read-v2-tag-data ] }
{ [ dup id3v1? ] [ drop "id3v1" ] }
[ drop "none" ]
} cond
] with-mapped-uchar-file ;
Author: | inforichland |
Mode: | factor |
Date: | Thu, 5 Feb 2009 02:24:15 |
Plain Text |
USING: sequences io io.encodings.binary io.files io.pathnames strings kernel math io.mmap io.mmap.uchar accessors syntax combinators math.ranges unicode.categories byte-arrays prettyprint ;
IN: id3
TUPLE: header version flags size ;
TUPLE: frame frame-id flags size data ;
: <header> header new ;
: <frame> frame new ;
: id3v2?
"ID3" head? ;
: id3v1?
128 tail-slice* "TAG" head? ;
: >28bitword
0 [ swap 7 shift bitor ] reduce ;
: valid-frame-id?
[ [ digit? ] [ LETTER? ] bi or ] all? ;
: read-frame-id
4 head-slice ;
: read-frame-size
4 8 rot subseq ;
: read-frame-flags
8 10 rot subseq ;
: read-frame-data
over size>> 10 + 10 swap rot <slice> ;
: (read-frame)
[ <frame> ] dip
{
[ read-frame-id >string >>frame-id ]
[ read-frame-flags >byte-array >>flags ]
[ read-frame-size >28bitword >>size ]
[ read-frame-data >string >>data ]
} cleave ;
: read-frame
dup read-frame-id valid-frame-id? [ (read-frame) ] [ drop f ] if ;
: (read-frames)
dup read-frame [ pick [ dup size>> ] dip rot swap push 10 + tail-slice (read-frames) ] when* ;
: read-frames
V{ } clone swap (read-frames) ;
: read-header-supported-version?
3 tail-slice [ { 4 } head? ] [ { 3 } head? ] bi or ;
: read-header-flags
5 swap nth ;
: read-header-size
6 10 rot <slice> >28bitword ;
: read-v2-header
[ <header> ] dip
{
[ read-header-supported-version? >>version ]
[ read-header-flags >>flags ]
[ read-header-size >>size ]
} cleave ;
: drop-header
dup 10 tail-slice swap ;
: read-v2-tag-data
drop-header read-v2-header swap read-frames ;
: id3stuff
[
{
{ [ dup id3v2? ] [ read-v2-tag-data ] }
{ [ dup id3v1? ] [ drop f "id3v1" ] }
[ drop f "none" ]
} cond
] with-mapped-uchar-file ;
Author: | inforichland |
Mode: | factor |
Date: | Fri, 6 Feb 2009 00:16:37 |
Plain Text |
USING: sequences io io.encodings.binary io.files io.pathnames strings kernel math io.mmap io.mmap.uchar accessors syntax combinators math.ranges unicode.categories byte-arrays prettyprint make ;
IN: id3
TUPLE: header version flags size ;
TUPLE: frame frame-id flags size data ;
: <header> header new ;
: <frame> frame new ;
: id3v2?
"ID3" head? ;
: id3v1?
128 tail-slice* "TAG" head? ;
: >28bitword
0 [ swap 7 shift bitor ] reduce ;
: valid-frame-id?
[ [ digit? ] [ LETTER? ] bi or ] all? ;
: read-frame-id
4 head-slice ;
: read-frame-size
[ 4 8 ] dip subseq ;
: read-frame-flags
[ 8 10 ] dip subseq ;
: read-frame-data
over size>> 10 + 10 swap rot <slice> ;
: (read-frame)
[ <frame> ] dip
{
[ read-frame-id >string >>frame-id ]
[ read-frame-flags >byte-array >>flags ]
[ read-frame-size >28bitword >>size ]
[ read-frame-data >string >>data ]
} cleave ;
: read-frame
dup read-frame-id valid-frame-id? [ (read-frame) ] [ drop f ] if ;
: (read-frames)
dup read-frame [ [ , ] [ size>> 10 + ] bi tail-slice (read-frames) ] when* ;
: read-frames
[ (read-frames) ] { } make nip ;
: read-header-supported-version?
3 tail-slice [ { 4 } head? ] [ { 3 } head? ] bi or ;
: read-header-flags
5 swap nth ;
: read-header-size
6 10 rot <slice> >28bitword ;
: read-v2-header
[ <header> ] dip
{
[ read-header-supported-version? >>version ]
[ read-header-flags >>flags ]
[ read-header-size >>size ]
} cleave ;
: drop-header
dup 10 tail-slice swap ;
: read-v2-tag-data
drop-header read-v2-header swap read-frames ;
: id3stuff
[
{
{ [ dup id3v2? ] [ read-v2-tag-data ] }
{ [ dup id3v1? ] [ drop f "id3v1" ] }
[ drop f "none" ]
} cond
] with-mapped-uchar-file ;
Author: | inforichland |
Mode: | factor |
Date: | Sun, 8 Feb 2009 01:41:04 |
Plain Text |
USING: sequences io io.encodings.binary io.files io.pathnames strings kernel math io.mmap io.mmap.uchar accessors syntax combinators math.ranges unicode.categories byte-arrays prettyprint make ;
IN: id3
TUPLE: header version flags size ;
TUPLE: frame frame-id flags size data ;
TUPLE: mp3v2-file header frames ;
TUPLE: mp3v1-file title artist album year comment genre ;
: <mp3v1-file> mp3v1-file new ;
: <mp3v2-file> mp3v2-file boa ;
: <header> header new ;
: <frame> frame new ;
: id3v2?
"ID3" head? ;
: id3v1?
128 tail-slice* "TAG" head? ;
: >28bitword
0 [ swap 7 shift bitor ] reduce ;
: filter-text-data
[ printable? ] filter ;
: valid-frame-id?
[ [ digit? ] [ LETTER? ] bi or ] all? ;
: read-frame-id
4 head-slice ;
: read-frame-size
[ 4 8 ] dip subseq ;
: read-frame-flags
[ 8 10 ] dip subseq ;
: read-frame-data
over size>> 10 + 10 swap rot <slice> filter-text-data ;
: (read-frame)
[ <frame> ] dip
{
[ read-frame-id >string >>frame-id ]
[ read-frame-flags >byte-array >>flags ]
[ read-frame-size >28bitword >>size ]
[ read-frame-data >string >>data ]
} cleave ;
: read-frame
dup read-frame-id valid-frame-id? [ (read-frame) ] [ drop f ] if ;
: remove-frame
size>> 10 + tail-slice ;
: (read-frames)
[ dup read-frame dup ] [ dup [ remove-frame ] dip ] [ drop ] produce ;
: read-frames
(read-frames) nip ;
: read-header-supported-version?
3 tail-slice [ { 4 } head? ] [ { 3 } head? ] bi or ;
: read-header-flags
5 swap nth ;
: read-header-size
6 10 rot <slice> >28bitword ;
: read-v2-header
[ <header> ] dip
{
[ read-header-supported-version? >>version ]
[ read-header-flags >>flags ]
[ read-header-size >>size ]
} cleave ;
: drop-header
dup 10 tail-slice swap ;
: read-v2-tag-data
drop-header read-v2-header swap read-frames <mp3v2-file> ;
: skip-to-v1-data
125 tail-slice* ;
: read-title
30 head-slice ;
: read-artist
[ 30 60 ] dip <slice> ;
: read-album
[ 60 90 ] dip <slice> ;
: read-year
[ 90 94 ] dip <slice> ;
: read-comment
[ 94 124 ] dip <slice> ;
: read-genre
[ 125 ] dip nth ;
: (read-v1-tag-data)
[ <mp3v1-file> ] dip
{
[ read-title >string >>title ]
[ read-artist >string >>artist ]
[ read-album >string >>album ]
[ read-year >string >>year ]
[ read-comment >string >>comment ]
[ read-genre >string >>genre ]
} cleave ;
: read-v1-tag-data
skip-to-v1-data (read-v1-tag-data) ;
: id3stuff
[
{
{ [ dup id3v2? ] [ read-v2-tag-data ] }
{ [ dup id3v1? ] [ read-v1-tag-data ] }
[ drop f ]
} cond
] with-mapped-uchar-file ;
Author: | inforichland |
Mode: | factor |
Date: | Sun, 8 Feb 2009 02:06:16 |
Plain Text |
USING: sequences io io.encodings.binary io.files io.pathnames strings kernel math io.mmap io.mmap.uchar accessors syntax combinators math.ranges unicode.categories byte-arrays prettyprint make ;
IN: id3
TUPLE: header version flags size ;
TUPLE: frame frame-id flags size data ;
TUPLE: mp3v2-file header frames ;
TUPLE: mp3v1-file title artist album year comment genre ;
: <mp3v1-file> mp3v1-file new ;
: <mp3v2-file> mp3v2-file boa ;
: <header> header new ;
: <frame> frame new ;
: id3v2?
"ID3" head? ;
: id3v1?
128 tail-slice* "TAG" head? ;
: >28bitword
0 [ swap 7 shift bitor ] reduce ;
: filter-text-data
[ printable? ] filter ;
: valid-frame-id?
[ [ digit? ] [ LETTER? ] bi or ] all? ;
: read-frame-id
4 head-slice ;
: read-frame-size
[ 4 8 ] dip subseq ;
: read-frame-flags
[ 8 10 ] dip subseq ;
: read-frame-data
over size>> 10 + 10 swap rot <slice> filter-text-data ;
: (read-frame)
[ <frame> ] dip
{
[ read-frame-id >string >>frame-id ]
[ read-frame-flags >byte-array >>flags ]
[ read-frame-size >28bitword >>size ]
[ read-frame-data >string >>data ]
} cleave ;
: read-frame
dup read-frame-id valid-frame-id? [ (read-frame) ] [ drop f ] if ;
: remove-frame
size>> 10 + tail-slice ;
: (read-frames)
[ dup read-frame dup ] [ dup [ remove-frame ] dip ] [ drop ] produce ;
: read-frames
(read-frames) nip ;
: read-header-supported-version?
3 tail-slice [ { 4 } head? ] [ { 3 } head? ] bi or ;
: read-header-flags
5 swap nth ;
: read-header-size
6 10 rot <slice> >28bitword ;
: read-v2-header
[ <header> ] dip
{
[ read-header-supported-version? >>version ]
[ read-header-flags >>flags ]
[ read-header-size >>size ]
} cleave ;
: drop-header
dup 10 tail-slice swap ;
: read-v2-tag-data
drop-header read-v2-header swap read-frames <mp3v2-file> ;
: skip-to-v1-data
125 tail-slice* ;
: read-title
30 head-slice ;
: read-artist
[ 30 60 ] dip subseq ;
: read-album
[ 60 90 ] dip subseq ;
: read-year
[ 90 94 ] dip subseq ;
: read-comment
[ 94 124 ] dip subseq ;
: read-genre
[ 124 ] dip nth ;
: (read-v1-tag-data)
[ <mp3v1-file> ] dip
{
[ read-title >string >>title ]
[ read-artist >string >>artist ]
[ read-album >string >>album ]
[ read-year >string >>year ]
[ read-comment >string >>comment ]
[ read-genre >fixnum >>genre ]
} cleave ;
: read-v1-tag-data
skip-to-v1-data (read-v1-tag-data) ;
: id3stuff
[
{
{ [ dup id3v2? ] [ read-v2-tag-data ] }
{ [ dup id3v1? ] [ read-v1-tag-data ] }
[ drop f ]
} cond
] with-mapped-uchar-file ;
New Annotation