From 6a78fc508ed2c30cade2b4660fd8fb90031d4966 Mon Sep 17 00:00:00 2001 From: svollbehr Date: Sat, 30 May 2009 11:58:10 +0000 Subject: [PATCH] Add Zend_Media_Id3v2 class proposal git-svn-id: http://php-reader.googlecode.com/svn/branches/zend@153 51a70ab9-7547-0410-9469-37e369ee0574 --- src/ID3/Encoding.php | 79 --- src/ID3/Exception.php | 51 -- src/ID3/ExtendedHeader.php | 324 ---------- src/ID3/Frame.php | 299 ---------- src/ID3/Frame/AENC.php | 171 ------ src/ID3/Frame/APIC.php | 274 --------- src/ID3/Frame/ASPI.php | 160 ----- src/ID3/Frame/AbstractLink.php | 96 --- src/ID3/Frame/AbstractText.php | 188 ------ src/ID3/Frame/COMM.php | 254 -------- src/ID3/Frame/COMR.php | 400 ------------- src/ID3/Frame/ENCR.php | 156 ----- src/ID3/Frame/EQU2.php | 193 ------ src/ID3/Frame/EQUA.php | 142 ----- src/ID3/Frame/ETCO.php | 168 ------ src/ID3/Frame/GEOB.php | 253 -------- src/ID3/Frame/GRID.php | 152 ----- src/ID3/Frame/IPLS.php | 191 ------ src/ID3/Frame/LINK.php | 173 ------ src/ID3/Frame/MCDI.php | 86 --- src/ID3/Frame/MLLT.php | 172 ------ src/ID3/Frame/OWNE.php | 238 -------- src/ID3/Frame/PCNT.php | 111 ---- src/ID3/Frame/POPM.php | 161 ----- src/ID3/Frame/POSS.php | 132 ----- src/ID3/Frame/PRIV.php | 126 ---- src/ID3/Frame/RBUF.php | 181 ------ src/ID3/Frame/RVA2.php | 217 ------- src/ID3/Frame/RVAD.php | 254 -------- src/ID3/Frame/RVRB.php | 314 ---------- src/ID3/Frame/SEEK.php | 104 ---- src/ID3/Frame/SIGN.php | 122 ---- src/ID3/Frame/SYLT.php | 340 ----------- src/ID3/Frame/SYTC.php | 161 ----- src/ID3/Frame/TALB.php | 53 -- src/ID3/Frame/TBPM.php | 53 -- src/ID3/Frame/TCOM.php | 52 -- src/ID3/Frame/TCON.php | 62 -- src/ID3/Frame/TCOP.php | 59 -- src/ID3/Frame/TDAT.php | 55 -- src/ID3/Frame/TDEN.php | 56 -- src/ID3/Frame/TDLY.php | 54 -- src/ID3/Frame/TDOR.php | 57 -- src/ID3/Frame/TDRC.php | 56 -- src/ID3/Frame/TDRL.php | 56 -- src/ID3/Frame/TDTG.php | 56 -- src/ID3/Frame/TENC.php | 54 -- src/ID3/Frame/TEXT.php | 53 -- src/ID3/Frame/TFLT.php | 69 --- src/ID3/Frame/TIME.php | 55 -- src/ID3/Frame/TIPL.php | 55 -- src/ID3/Frame/TIT1.php | 54 -- src/ID3/Frame/TIT2.php | 53 -- src/ID3/Frame/TIT3.php | 54 -- src/ID3/Frame/TKEY.php | 56 -- src/ID3/Frame/TLAN.php | 57 -- src/ID3/Frame/TLEN.php | 53 -- src/ID3/Frame/TMCL.php | 56 -- src/ID3/Frame/TMOO.php | 55 -- src/ID3/Frame/TOAL.php | 54 -- src/ID3/Frame/TOFN.php | 54 -- src/ID3/Frame/TOLY.php | 54 -- src/ID3/Frame/TOPE.php | 54 -- src/ID3/Frame/TORY.php | 57 -- src/ID3/Frame/TOWN.php | 53 -- src/ID3/Frame/TPE1.php | 53 -- src/ID3/Frame/TPE2.php | 53 -- src/ID3/Frame/TPE3.php | 52 -- src/ID3/Frame/TPE4.php | 54 -- src/ID3/Frame/TPOS.php | 56 -- src/ID3/Frame/TPRO.php | 61 -- src/ID3/Frame/TPUB.php | 53 -- src/ID3/Frame/TRCK.php | 55 -- src/ID3/Frame/TRDA.php | 57 -- src/ID3/Frame/TRSN.php | 53 -- src/ID3/Frame/TRSO.php | 53 -- src/ID3/Frame/TSIZ.php | 55 -- src/ID3/Frame/TSOA.php | 55 -- src/ID3/Frame/TSOP.php | 55 -- src/ID3/Frame/TSOT.php | 55 -- src/ID3/Frame/TSRC.php | 53 -- src/ID3/Frame/TSSE.php | 54 -- src/ID3/Frame/TSST.php | 55 -- src/ID3/Frame/TXXX.php | 159 ----- src/ID3/Frame/TYER.php | 55 -- src/ID3/Frame/USER.php | 205 ------- src/ID3/Frame/USLT.php | 251 -------- src/ID3/Frame/Unknown.php | 60 -- src/ID3/Frame/WCOM.php | 54 -- src/ID3/Frame/WCOP.php | 53 -- src/ID3/Frame/WOAF.php | 53 -- src/ID3/Frame/WOAR.php | 54 -- src/ID3/Frame/WOAS.php | 53 -- src/ID3/Frame/WORS.php | 53 -- src/ID3/Frame/WPAY.php | 53 -- src/ID3/Frame/WPUB.php | 53 -- src/ID3/Frame/WXXX.php | 181 ------ src/ID3/Header.php | 174 ------ src/ID3/Language.php | 69 --- src/ID3/Object.php | 303 ---------- src/ID3/Timing.php | 73 --- src/ID3v2.php | 555 ------------------ src/Zend/Io/FileReader.php | 3 +- src/Zend/Io/FileWriter.php | 3 +- src/Zend/Io/Reader.php | 6 +- src/Zend/Io/StringReader.php | 25 +- src/Zend/Io/StringWriter.php | 27 +- src/Zend/Io/Writer.php | 31 +- src/Zend/Media/Exception.php | 4 +- src/Zend/Media/Id3/DateFrame.php | 111 ++++ src/Zend/Media/Id3/Encoding.php | 82 +++ src/Zend/Media/Id3/Exception.php | 4 +- src/Zend/Media/Id3/ExtendedHeader.php | 348 +++++++++++ src/Zend/Media/Id3/Frame.php | 315 ++++++++++ src/Zend/Media/Id3/Frame/Aenc.php | 178 ++++++ src/Zend/Media/Id3/Frame/Apic.php | 290 +++++++++ src/Zend/Media/Id3/Frame/Aspi.php | 160 +++++ src/Zend/Media/Id3/Frame/Comm.php | 155 +++++ src/Zend/Media/Id3/Frame/Comr.php | 490 ++++++++++++++++ src/Zend/Media/Id3/Frame/Encr.php | 165 ++++++ src/Zend/Media/Id3/Frame/Equ2.php | 195 ++++++ src/Zend/Media/Id3/Frame/Equa.php | 133 +++++ src/Zend/Media/Id3/Frame/Etco.php | 168 ++++++ src/Zend/Media/Id3/Frame/Geob.php | 264 +++++++++ src/Zend/Media/Id3/Frame/Grid.php | 160 +++++ src/Zend/Media/Id3/Frame/Ipls.php | 200 +++++++ src/Zend/Media/Id3/Frame/Link.php | 188 ++++++ src/Zend/Media/Id3/Frame/Mcdi.php | 102 ++++ src/Zend/Media/Id3/Frame/Mllt.php | 187 ++++++ src/Zend/Media/Id3/Frame/Owne.php | 258 ++++++++ src/Zend/Media/Id3/Frame/Pcnt.php | 110 ++++ src/Zend/Media/Id3/Frame/Popm.php | 176 ++++++ src/Zend/Media/Id3/Frame/Poss.php | 129 ++++ src/Zend/Media/Id3/Frame/Priv.php | 125 ++++ src/Zend/Media/Id3/Frame/Rbuf.php | 190 ++++++ src/Zend/Media/Id3/Frame/Rva2.php | 213 +++++++ src/Zend/Media/Id3/Frame/Rvad.php | 238 ++++++++ src/Zend/Media/Id3/Frame/Rvrb.php | 331 +++++++++++ src/Zend/Media/Id3/Frame/Seek.php | 95 +++ src/Zend/Media/Id3/Frame/Sign.php | 123 ++++ src/Zend/Media/Id3/Frame/Sylt.php | 371 ++++++++++++ src/Zend/Media/Id3/Frame/Sytc.php | 157 +++++ src/Zend/Media/Id3/Frame/Talb.php | 40 ++ src/Zend/Media/Id3/Frame/Tbpm.php | 40 ++ src/Zend/Media/Id3/Frame/Tcom.php | 39 ++ src/Zend/Media/Id3/Frame/Tcon.php | 49 ++ src/Zend/Media/Id3/Frame/Tcop.php | 46 ++ src/Zend/Media/Id3/Frame/Tdat.php | 42 ++ src/Zend/Media/Id3/Frame/Tden.php | 42 ++ src/Zend/Media/Id3/Frame/Tdly.php | 41 ++ src/Zend/Media/Id3/Frame/Tdor.php | 42 ++ src/Zend/Media/Id3/Frame/Tdrc.php | 43 ++ src/Zend/Media/Id3/Frame/Tdrl.php | 42 ++ src/Zend/Media/Id3/Frame/Tdtg.php | 42 ++ src/Zend/Media/Id3/Frame/Tenc.php | 41 ++ src/Zend/Media/Id3/Frame/Text.php | 40 ++ src/Zend/Media/Id3/Frame/Tflt.php | 57 ++ src/Zend/Media/Id3/Frame/Time.php | 105 ++++ src/Zend/Media/Id3/Frame/Tipl.php | 43 ++ src/Zend/Media/Id3/Frame/Tit1.php | 41 ++ src/Zend/Media/Id3/Frame/Tit2.php | 40 ++ src/Zend/Media/Id3/Frame/Tit3.php | 41 ++ src/Zend/Media/Id3/Frame/Tkey.php | 43 ++ src/Zend/Media/Id3/Frame/Tlan.php | 43 ++ src/Zend/Media/Id3/Frame/Tlen.php | 40 ++ src/Zend/Media/Id3/Frame/Tmcl.php | 44 ++ .../Media/Id3/Frame/Tmed.php} | 59 +- src/Zend/Media/Id3/Frame/Tmoo.php | 42 ++ src/Zend/Media/Id3/Frame/Toal.php | 41 ++ src/Zend/Media/Id3/Frame/Tofn.php | 41 ++ src/Zend/Media/Id3/Frame/Toly.php | 41 ++ src/Zend/Media/Id3/Frame/Tope.php | 41 ++ src/Zend/Media/Id3/Frame/Tory.php | 76 +++ src/Zend/Media/Id3/Frame/Town.php | 40 ++ src/Zend/Media/Id3/Frame/Tpe1.php | 40 ++ src/Zend/Media/Id3/Frame/Tpe2.php | 40 ++ src/Zend/Media/Id3/Frame/Tpe3.php | 39 ++ src/Zend/Media/Id3/Frame/Tpe4.php | 41 ++ src/Zend/Media/Id3/Frame/Tpos.php | 114 ++++ src/Zend/Media/Id3/Frame/Tpro.php | 48 ++ src/Zend/Media/Id3/Frame/Tpub.php | 40 ++ src/Zend/Media/Id3/Frame/Trck.php | 113 ++++ src/Zend/Media/Id3/Frame/Trda.php | 45 ++ src/Zend/Media/Id3/Frame/Trsn.php | 40 ++ src/Zend/Media/Id3/Frame/Trso.php | 40 ++ src/Zend/Media/Id3/Frame/Tsiz.php | 42 ++ src/Zend/Media/Id3/Frame/Tsoa.php | 43 ++ src/Zend/Media/Id3/Frame/Tsop.php | 43 ++ src/Zend/Media/Id3/Frame/Tsot.php | 43 ++ src/Zend/Media/Id3/Frame/Tsrc.php | 206 +++++++ src/Zend/Media/Id3/Frame/Tsse.php | 41 ++ src/Zend/Media/Id3/Frame/Tsst.php | 42 ++ src/Zend/Media/Id3/Frame/Txxx.php | 144 +++++ src/Zend/Media/Id3/Frame/Tyer.php | 73 +++ src/Zend/Media/Id3/Frame/Unknown.php | 48 ++ src/Zend/Media/Id3/Frame/User.php | 43 ++ src/Zend/Media/Id3/Frame/Uslt.php | 154 +++++ src/Zend/Media/Id3/Frame/Wcom.php | 41 ++ src/Zend/Media/Id3/Frame/Wcop.php | 40 ++ src/Zend/Media/Id3/Frame/Woaf.php | 40 ++ src/Zend/Media/Id3/Frame/Woar.php | 41 ++ src/Zend/Media/Id3/Frame/Woas.php | 40 ++ src/Zend/Media/Id3/Frame/Wors.php | 40 ++ src/Zend/Media/Id3/Frame/Wpay.php | 40 ++ src/Zend/Media/Id3/Frame/Wpub.php | 40 ++ src/Zend/Media/Id3/Frame/Wxxx.php | 180 ++++++ src/Zend/Media/Id3/Header.php | 179 ++++++ src/Zend/Media/Id3/Language.php | 56 ++ src/Zend/Media/Id3/LanguageTextFrame.php | 222 +++++++ src/Zend/Media/Id3/LinkFrame.php | 92 +++ src/Zend/Media/Id3/NumberFrame.php | 93 +++ src/Zend/Media/Id3/Object.php | 366 ++++++++++++ src/Zend/Media/Id3/TextFrame.php | 195 ++++++ src/Zend/Media/Id3/Timing.php | 60 ++ src/Zend/Media/Id3v1.php | 4 +- 215 files changed, 11203 insertions(+), 11720 deletions(-) delete mode 100644 src/ID3/Encoding.php delete mode 100644 src/ID3/Exception.php delete mode 100644 src/ID3/ExtendedHeader.php delete mode 100644 src/ID3/Frame.php delete mode 100644 src/ID3/Frame/AENC.php delete mode 100644 src/ID3/Frame/APIC.php delete mode 100644 src/ID3/Frame/ASPI.php delete mode 100644 src/ID3/Frame/AbstractLink.php delete mode 100644 src/ID3/Frame/AbstractText.php delete mode 100644 src/ID3/Frame/COMM.php delete mode 100644 src/ID3/Frame/COMR.php delete mode 100644 src/ID3/Frame/ENCR.php delete mode 100644 src/ID3/Frame/EQU2.php delete mode 100644 src/ID3/Frame/EQUA.php delete mode 100644 src/ID3/Frame/ETCO.php delete mode 100644 src/ID3/Frame/GEOB.php delete mode 100644 src/ID3/Frame/GRID.php delete mode 100644 src/ID3/Frame/IPLS.php delete mode 100644 src/ID3/Frame/LINK.php delete mode 100644 src/ID3/Frame/MCDI.php delete mode 100644 src/ID3/Frame/MLLT.php delete mode 100644 src/ID3/Frame/OWNE.php delete mode 100644 src/ID3/Frame/PCNT.php delete mode 100644 src/ID3/Frame/POPM.php delete mode 100644 src/ID3/Frame/POSS.php delete mode 100644 src/ID3/Frame/PRIV.php delete mode 100644 src/ID3/Frame/RBUF.php delete mode 100644 src/ID3/Frame/RVA2.php delete mode 100644 src/ID3/Frame/RVAD.php delete mode 100644 src/ID3/Frame/RVRB.php delete mode 100644 src/ID3/Frame/SEEK.php delete mode 100644 src/ID3/Frame/SIGN.php delete mode 100644 src/ID3/Frame/SYLT.php delete mode 100644 src/ID3/Frame/SYTC.php delete mode 100644 src/ID3/Frame/TALB.php delete mode 100644 src/ID3/Frame/TBPM.php delete mode 100644 src/ID3/Frame/TCOM.php delete mode 100644 src/ID3/Frame/TCON.php delete mode 100644 src/ID3/Frame/TCOP.php delete mode 100644 src/ID3/Frame/TDAT.php delete mode 100644 src/ID3/Frame/TDEN.php delete mode 100644 src/ID3/Frame/TDLY.php delete mode 100644 src/ID3/Frame/TDOR.php delete mode 100644 src/ID3/Frame/TDRC.php delete mode 100644 src/ID3/Frame/TDRL.php delete mode 100644 src/ID3/Frame/TDTG.php delete mode 100644 src/ID3/Frame/TENC.php delete mode 100644 src/ID3/Frame/TEXT.php delete mode 100644 src/ID3/Frame/TFLT.php delete mode 100644 src/ID3/Frame/TIME.php delete mode 100644 src/ID3/Frame/TIPL.php delete mode 100644 src/ID3/Frame/TIT1.php delete mode 100644 src/ID3/Frame/TIT2.php delete mode 100644 src/ID3/Frame/TIT3.php delete mode 100644 src/ID3/Frame/TKEY.php delete mode 100644 src/ID3/Frame/TLAN.php delete mode 100644 src/ID3/Frame/TLEN.php delete mode 100644 src/ID3/Frame/TMCL.php delete mode 100644 src/ID3/Frame/TMOO.php delete mode 100644 src/ID3/Frame/TOAL.php delete mode 100644 src/ID3/Frame/TOFN.php delete mode 100644 src/ID3/Frame/TOLY.php delete mode 100644 src/ID3/Frame/TOPE.php delete mode 100644 src/ID3/Frame/TORY.php delete mode 100644 src/ID3/Frame/TOWN.php delete mode 100644 src/ID3/Frame/TPE1.php delete mode 100644 src/ID3/Frame/TPE2.php delete mode 100644 src/ID3/Frame/TPE3.php delete mode 100644 src/ID3/Frame/TPE4.php delete mode 100644 src/ID3/Frame/TPOS.php delete mode 100644 src/ID3/Frame/TPRO.php delete mode 100644 src/ID3/Frame/TPUB.php delete mode 100644 src/ID3/Frame/TRCK.php delete mode 100644 src/ID3/Frame/TRDA.php delete mode 100644 src/ID3/Frame/TRSN.php delete mode 100644 src/ID3/Frame/TRSO.php delete mode 100644 src/ID3/Frame/TSIZ.php delete mode 100644 src/ID3/Frame/TSOA.php delete mode 100644 src/ID3/Frame/TSOP.php delete mode 100644 src/ID3/Frame/TSOT.php delete mode 100644 src/ID3/Frame/TSRC.php delete mode 100644 src/ID3/Frame/TSSE.php delete mode 100644 src/ID3/Frame/TSST.php delete mode 100644 src/ID3/Frame/TXXX.php delete mode 100644 src/ID3/Frame/TYER.php delete mode 100644 src/ID3/Frame/USER.php delete mode 100644 src/ID3/Frame/USLT.php delete mode 100644 src/ID3/Frame/Unknown.php delete mode 100644 src/ID3/Frame/WCOM.php delete mode 100644 src/ID3/Frame/WCOP.php delete mode 100644 src/ID3/Frame/WOAF.php delete mode 100644 src/ID3/Frame/WOAR.php delete mode 100644 src/ID3/Frame/WOAS.php delete mode 100644 src/ID3/Frame/WORS.php delete mode 100644 src/ID3/Frame/WPAY.php delete mode 100644 src/ID3/Frame/WPUB.php delete mode 100644 src/ID3/Frame/WXXX.php delete mode 100644 src/ID3/Header.php delete mode 100644 src/ID3/Language.php delete mode 100644 src/ID3/Object.php delete mode 100644 src/ID3/Timing.php delete mode 100644 src/ID3v2.php create mode 100644 src/Zend/Media/Id3/DateFrame.php create mode 100644 src/Zend/Media/Id3/Encoding.php create mode 100644 src/Zend/Media/Id3/ExtendedHeader.php create mode 100644 src/Zend/Media/Id3/Frame.php create mode 100644 src/Zend/Media/Id3/Frame/Aenc.php create mode 100644 src/Zend/Media/Id3/Frame/Apic.php create mode 100644 src/Zend/Media/Id3/Frame/Aspi.php create mode 100644 src/Zend/Media/Id3/Frame/Comm.php create mode 100644 src/Zend/Media/Id3/Frame/Comr.php create mode 100644 src/Zend/Media/Id3/Frame/Encr.php create mode 100644 src/Zend/Media/Id3/Frame/Equ2.php create mode 100644 src/Zend/Media/Id3/Frame/Equa.php create mode 100644 src/Zend/Media/Id3/Frame/Etco.php create mode 100644 src/Zend/Media/Id3/Frame/Geob.php create mode 100644 src/Zend/Media/Id3/Frame/Grid.php create mode 100644 src/Zend/Media/Id3/Frame/Ipls.php create mode 100644 src/Zend/Media/Id3/Frame/Link.php create mode 100644 src/Zend/Media/Id3/Frame/Mcdi.php create mode 100644 src/Zend/Media/Id3/Frame/Mllt.php create mode 100644 src/Zend/Media/Id3/Frame/Owne.php create mode 100644 src/Zend/Media/Id3/Frame/Pcnt.php create mode 100644 src/Zend/Media/Id3/Frame/Popm.php create mode 100644 src/Zend/Media/Id3/Frame/Poss.php create mode 100644 src/Zend/Media/Id3/Frame/Priv.php create mode 100644 src/Zend/Media/Id3/Frame/Rbuf.php create mode 100644 src/Zend/Media/Id3/Frame/Rva2.php create mode 100644 src/Zend/Media/Id3/Frame/Rvad.php create mode 100644 src/Zend/Media/Id3/Frame/Rvrb.php create mode 100644 src/Zend/Media/Id3/Frame/Seek.php create mode 100644 src/Zend/Media/Id3/Frame/Sign.php create mode 100644 src/Zend/Media/Id3/Frame/Sylt.php create mode 100644 src/Zend/Media/Id3/Frame/Sytc.php create mode 100644 src/Zend/Media/Id3/Frame/Talb.php create mode 100644 src/Zend/Media/Id3/Frame/Tbpm.php create mode 100644 src/Zend/Media/Id3/Frame/Tcom.php create mode 100644 src/Zend/Media/Id3/Frame/Tcon.php create mode 100644 src/Zend/Media/Id3/Frame/Tcop.php create mode 100644 src/Zend/Media/Id3/Frame/Tdat.php create mode 100644 src/Zend/Media/Id3/Frame/Tden.php create mode 100644 src/Zend/Media/Id3/Frame/Tdly.php create mode 100644 src/Zend/Media/Id3/Frame/Tdor.php create mode 100644 src/Zend/Media/Id3/Frame/Tdrc.php create mode 100644 src/Zend/Media/Id3/Frame/Tdrl.php create mode 100644 src/Zend/Media/Id3/Frame/Tdtg.php create mode 100644 src/Zend/Media/Id3/Frame/Tenc.php create mode 100644 src/Zend/Media/Id3/Frame/Text.php create mode 100644 src/Zend/Media/Id3/Frame/Tflt.php create mode 100644 src/Zend/Media/Id3/Frame/Time.php create mode 100644 src/Zend/Media/Id3/Frame/Tipl.php create mode 100644 src/Zend/Media/Id3/Frame/Tit1.php create mode 100644 src/Zend/Media/Id3/Frame/Tit2.php create mode 100644 src/Zend/Media/Id3/Frame/Tit3.php create mode 100644 src/Zend/Media/Id3/Frame/Tkey.php create mode 100644 src/Zend/Media/Id3/Frame/Tlan.php create mode 100644 src/Zend/Media/Id3/Frame/Tlen.php create mode 100644 src/Zend/Media/Id3/Frame/Tmcl.php rename src/{ID3/Frame/TMED.php => Zend/Media/Id3/Frame/Tmed.php} (50%) create mode 100644 src/Zend/Media/Id3/Frame/Tmoo.php create mode 100644 src/Zend/Media/Id3/Frame/Toal.php create mode 100644 src/Zend/Media/Id3/Frame/Tofn.php create mode 100644 src/Zend/Media/Id3/Frame/Toly.php create mode 100644 src/Zend/Media/Id3/Frame/Tope.php create mode 100644 src/Zend/Media/Id3/Frame/Tory.php create mode 100644 src/Zend/Media/Id3/Frame/Town.php create mode 100644 src/Zend/Media/Id3/Frame/Tpe1.php create mode 100644 src/Zend/Media/Id3/Frame/Tpe2.php create mode 100644 src/Zend/Media/Id3/Frame/Tpe3.php create mode 100644 src/Zend/Media/Id3/Frame/Tpe4.php create mode 100644 src/Zend/Media/Id3/Frame/Tpos.php create mode 100644 src/Zend/Media/Id3/Frame/Tpro.php create mode 100644 src/Zend/Media/Id3/Frame/Tpub.php create mode 100644 src/Zend/Media/Id3/Frame/Trck.php create mode 100644 src/Zend/Media/Id3/Frame/Trda.php create mode 100644 src/Zend/Media/Id3/Frame/Trsn.php create mode 100644 src/Zend/Media/Id3/Frame/Trso.php create mode 100644 src/Zend/Media/Id3/Frame/Tsiz.php create mode 100644 src/Zend/Media/Id3/Frame/Tsoa.php create mode 100644 src/Zend/Media/Id3/Frame/Tsop.php create mode 100644 src/Zend/Media/Id3/Frame/Tsot.php create mode 100644 src/Zend/Media/Id3/Frame/Tsrc.php create mode 100644 src/Zend/Media/Id3/Frame/Tsse.php create mode 100644 src/Zend/Media/Id3/Frame/Tsst.php create mode 100644 src/Zend/Media/Id3/Frame/Txxx.php create mode 100644 src/Zend/Media/Id3/Frame/Tyer.php create mode 100644 src/Zend/Media/Id3/Frame/Unknown.php create mode 100644 src/Zend/Media/Id3/Frame/User.php create mode 100644 src/Zend/Media/Id3/Frame/Uslt.php create mode 100644 src/Zend/Media/Id3/Frame/Wcom.php create mode 100644 src/Zend/Media/Id3/Frame/Wcop.php create mode 100644 src/Zend/Media/Id3/Frame/Woaf.php create mode 100644 src/Zend/Media/Id3/Frame/Woar.php create mode 100644 src/Zend/Media/Id3/Frame/Woas.php create mode 100644 src/Zend/Media/Id3/Frame/Wors.php create mode 100644 src/Zend/Media/Id3/Frame/Wpay.php create mode 100644 src/Zend/Media/Id3/Frame/Wpub.php create mode 100644 src/Zend/Media/Id3/Frame/Wxxx.php create mode 100644 src/Zend/Media/Id3/Header.php create mode 100644 src/Zend/Media/Id3/Language.php create mode 100644 src/Zend/Media/Id3/LanguageTextFrame.php create mode 100644 src/Zend/Media/Id3/LinkFrame.php create mode 100644 src/Zend/Media/Id3/NumberFrame.php create mode 100644 src/Zend/Media/Id3/Object.php create mode 100644 src/Zend/Media/Id3/TextFrame.php create mode 100644 src/Zend/Media/Id3/Timing.php diff --git a/src/ID3/Encoding.php b/src/ID3/Encoding.php deleted file mode 100644 index 06fa1ae..0000000 --- a/src/ID3/Encoding.php +++ /dev/null @@ -1,79 +0,0 @@ -Encoding interface implies that the ID3v2 frame supports - * content encoding. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -interface ID3_Encoding -{ - /** The ISO-8859-1 encoding. */ - const ISO88591 = 0; - - /** The UTF-16 Unicode encoding with BOM. */ - const UTF16 = 1; - - /** The UTF-16LE Unicode encoding without BOM. */ - const UTF16LE = 4; - - /** The UTF-16BE Unicode encoding without BOM. */ - const UTF16BE = 2; - - /** The UTF-8 Unicode encoding. */ - const UTF8 = 3; - - /** - * Returns the text encoding. - * - * @return integer - */ - public function getEncoding(); - - /** - * Sets the text encoding. - * - * @param integer $encoding The text encoding. - */ - public function setEncoding($encoding); -} diff --git a/src/ID3/Exception.php b/src/ID3/Exception.php deleted file mode 100644 index 95d55d2..0000000 --- a/src/ID3/Exception.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -class ID3_Exception extends Exception -{ -} diff --git a/src/ID3/ExtendedHeader.php b/src/ID3/ExtendedHeader.php deleted file mode 100644 index 35ca410..0000000 --- a/src/ID3/ExtendedHeader.php +++ /dev/null @@ -1,324 +0,0 @@ - - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_ExtendedHeader extends ID3_Object -{ - /** - * A flag to denote that the present tag is an update of a tag found earlier - * in the present file or stream. If frames defined as unique are found in - * the present tag, they are to override any corresponding ones found in the - * earlier tag. This flag has no corresponding data. - * - * @since ID3v2.4.0 - */ - const UPDATE = 64; - - /** - * @since ID3v2.4.0 A flag to denote that a CRC-32 data is included in the - * extended header. The CRC is calculated on all the data between the header - * and footer as indicated by the header's tag length field, minus the - * extended header. Note that this includes the padding (if there is any), but - * excludes the footer. The CRC-32 is stored as an 35 bit synchsafe integer, - * leaving the upper four bits always zeroed. - * - * @since ID3v2.3.0 The CRC is calculated before unsynchronisation on the data - * between the extended header and the padding, i.e. the frames and only the - * frames. - */ - const CRC32 = 32; - - /** - * A flag to denote whether or not the tag has restrictions applied on it. - * - * @since ID3v2.4.0 - */ - const RESTRICTED = 16; - - /** @var integer */ - private $_size; - - /** @var integer */ - private $_flags = 0; - - /** @var integer */ - private $_padding; - - /** @var integer */ - private $_crc; - - /** @var integer */ - private $_restrictions = 0; - - /** - * Constructs the class with given parameters and reads object related data - * from the ID3v2 tag. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - $offset = $this->_reader->getOffset(); - $this->_size = $this->_reader->readUInt32BE(); - - /* ID3v2.3.0 ExtendedHeader */ - if ($this->getOption("version", 4) < 4) { - if ($this->_reader->readUInt16BE() == 0x8000) - $this->_flags = self::CRC32; - $this->_padding = $this->_reader->readUInt32BE(); - if ($this->hasFlag(self::CRC32)) - $this->_crc = Transform::readUInt32BE(); - } - - /* ID3v2.4.0 ExtendedHeader */ - else { - $this->_size = $this->_decodeSynchsafe32($this->_size); - $this->_reader->skip(1); - $this->_flags = $this->_reader->readInt8(); - if ($this->hasFlag(self::UPDATE)) - $this->_reader->skip(1); - if ($this->hasFlag(self::CRC32)) { - $this->_reader->skip(1); - $this->_crc = - Transform::fromInt8($this->_reader->read(1)) * (0xfffffff + 1) + - _decodeSynchsafe32(Transform::fromUInt32BE($this->_reader->read(4))); - } - if ($this->hasFlag(self::RESTRICTED)) { - $this->_reader->skip(1); - $this->_restrictions = $this->_reader->readInt8(1); - } - } - } - - /** - * Returns the extended header size in bytes. - * - * @return integer - */ - public function getSize() { return $this->_size; } - - /** - * Checks whether or not the flag is set. Returns true if the flag - * is set, false otherwise. - * - * @param integer $flag The flag to query. - * @return boolean - */ - public function hasFlag($flag) { return ($this->_flags & $flag) == $flag; } - - /** - * Returns the flags byte. - * - * @return integer - */ - public function getFlags($flags) { return $this->_flags; } - - /** - * Sets the flags byte. - * - * @param integer $flags The flags byte. - */ - public function setFlags($flags) { $this->_flags = $flags; } - - /** - * Returns the CRC-32 data. - * - * @return integer - */ - public function getCrc() - { - if ($this->hasFlag(self::CRC32)) - return $this->_crc; - return false; - } - - /** - * Sets whether the CRC-32 should be generated upon tag write. - * - * @param boolean $useCrc Whether CRC-32 should be generated. - */ - public function useCrc($useCrc) - { - if ($useCrc) - $this->setFlags($this->getFlags() | self::CRC32); - else - $this->setFlags($this->getFlags() & ~self::CRC32); - } - - /** - * Sets the CRC-32. The CRC-32 value is calculated of all the frames in the - * tag and includes padding. - * - * @param integer $crc The 32-bit CRC value. - */ - public function setCrc($crc) - { - if (is_bool($crc)) - $this->useCrc($crc); - else - $this->_crc = $crc; - } - - /** - * Returns the restrictions. For some applications it might be desired to - * restrict a tag in more ways than imposed by the ID3v2 specification. Note - * that the presence of these restrictions does not affect how the tag is - * decoded, merely how it was restricted before encoding. If this flag is set - * the tag is restricted as follows: - * - *
-   * Restrictions %ppqrrstt
-   *
-   * p - Tag size restrictions
-   *
-   *   00   No more than 128 frames and 1 MB total tag size.
-   *   01   No more than 64 frames and 128 KB total tag size.
-   *   10   No more than 32 frames and 40 KB total tag size.
-   *   11   No more than 32 frames and 4 KB total tag size.
-   *
-   * q - Text encoding restrictions
-   *
-   *   0    No restrictions
-   *   1    Strings are only encoded with ISO-8859-1 or UTF-8.
-   *
-   * r - Text fields size restrictions
-   *
-   *   00   No restrictions
-   *   01   No string is longer than 1024 characters.
-   *   10   No string is longer than 128 characters.
-   *   11   No string is longer than 30 characters.
-   *
-   *   Note that nothing is said about how many bytes is used to represent those
-   *   characters, since it is encoding dependent. If a text frame consists of
-   *   more than one string, the sum of the strungs is restricted as stated.
-   *
-   * s - Image encoding restrictions
-   *
-   *   0   No restrictions
-   *   1   Images are encoded only with PNG [PNG] or JPEG [JFIF].
-   *
-   * t - Image size restrictions
-   *
-   *   00  No restrictions
-   *   01  All images are 256x256 pixels or smaller.
-   *   10  All images are 64x64 pixels or smaller.
-   *   11  All images are exactly 64x64 pixels, unless required otherwise.
-   * 
- * - * @return integer - */ - public function getRestrictions() { return $this->_restrictions; } - - /** - * Sets the restrictions byte. See {@link #getRestrictions} for more. - * - * @param integer $restrictions The restrictions byte. - */ - public function setRestrictions($restrictions) - { - $this->_restrictions = $restrictions; - } - - /** - * Returns the total padding size, or simply the total tag size excluding the - * frames and the headers. - * - * @return integer - * @deprecated ID3v2.3.0 - */ - public function getPadding() { return $this->_padding; } - - /** - * Sets the total padding size, or simply the total tag size excluding the - * frames and the headers. - * - * @param integer $padding The padding size. - * @deprecated ID3v2.3.0 - */ - public function setPadding($padding) { return $this->_padding = $padding; } - - /** - * Returns the header data. - * - * @return string - */ - public function __toString() - { - /* ID3v2.3.0 ExtendedHeader */ - if ($this->getOption("version", 4) < 4) { - return Transform::toUInt32BE($this->_size) . - Transform::toUInt16BE($this->hasFlag(self::CRC32) ? 0x8000 : 0) . - Transform::toUInt32BE($this->_padding) . - ($this->hasFlag(self::CRC32) ? Transform::toUInt32BE($this->_crc) : ""); - } - - /* ID3v2.4.0 ExtendedHeader */ - else { - return Transform::toUInt32BE($this->_encodeSynchsafe32($this->_size)) . - Transform::toInt8(1) . Transform::toInt8($this->_flags) . - ($this->hasFlag(self::UPDATE) ? "\0" : "") . - ($this->hasFlag(self::CRC32) ? Transform::toInt8(5) . - Transform::toInt8($this->_crc & 0xf0000000 >> 28 & 0xf /*eq >>> 28*/) . - Transform::toUInt32BE($this->_encodeSynchsafe32($this->_crc)) : "") . - ($this->hasFlag(self::RESTRICTED) ? - Transform::toInt8(1) . Transform::toInt8($this->_restrictions) : ""); - } - } -} diff --git a/src/ID3/Frame.php b/src/ID3/Frame.php deleted file mode 100644 index 638b218..0000000 --- a/src/ID3/Frame.php +++ /dev/null @@ -1,299 +0,0 @@ - - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -abstract class ID3_Frame extends ID3_Object -{ - /** - * This flag tells the tag parser what to do with this frame if it is unknown - * and the tag is altered in any way. This applies to all kinds of - * alterations, including adding more padding and reordering the frames. - */ - const DISCARD_ON_TAGCHANGE = 16384; - - /** - * This flag tells the tag parser what to do with this frame if it is unknown - * and the file, excluding the tag, is altered. This does not apply when the - * audio is completely replaced with other audio data. - */ - const DISCARD_ON_FILECHANGE = 8192; - - /** - * This flag, if set, tells the software that the contents of this frame are - * intended to be read only. Changing the contents might break something, - * e.g. a signature. - */ - const READ_ONLY = 4096; - - /** - * This flag indicates whether or not this frame belongs in a group with - * other frames. If set, a group identifier byte is added to the frame. Every - * frame with the same group identifier belongs to the same group. - */ - const GROUPING_IDENTITY = 32; - - /** - * This flag indicates whether or not the frame is compressed. A Data - * Length Indicator byte is included in the frame. - * - * @see DATA_LENGTH_INDICATOR - */ - const COMPRESSION = 8; - - /** - * This flag indicates whether or not the frame is encrypted. If set, one byte - * indicating with which method it was encrypted will be added to the frame. - * See description of the {@link ID3_Frame_ENCR} frame for more information - * about encryption method registration. Encryption should be done after - * compression. Whether or not setting this flag requires the presence of a - * Data Length Indicator depends on the specific algorithm used. - * - * @see DATA_LENGTH_INDICATOR - */ - const ENCRYPTION = 4; - - /** - * This flag indicates whether or not unsynchronisation was applied to this - * frame. - * - * @since ID3v2.4.0 - */ - const UNSYNCHRONISATION = 2; - - /** - * This flag indicates that a data length indicator has been added to the - * frame. - * - * @since ID3v2.4.0 - */ - const DATA_LENGTH_INDICATOR = 1; - - /** @var integer */ - private $_identifier; - - /** @var integer */ - private $_size = 0; - - /** @var integer */ - private $_flags = 0; - - /** - * Raw content of the frame. - * - * @var string - */ - protected $_data = ""; - - /** - * Constructs the class with given parameters and reads object related data - * from the ID3v2 tag. - * - * @todo Only limited subset of flags are processed. - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) { - $this->_identifier = substr(get_class($this), -4); - } else { - $this->_identifier = $this->_reader->readString8(4); - - /* ID3v2.3.0 size and flags; convert flags to 2.4.0 format */ - if ($this->getOption("version", 4) < 4) { - $this->_size = $this->_reader->readUInt32BE(); - $flags = $this->_reader->readUInt16BE(); - if (($flags & 0x8000) == 0x8000) - $this->_flags |= self::DISCARD_ON_TAGCHANGE; - if (($flags & 0x4000) == 0x4000) - $this->_flags |= self::DISCARD_ON_FILECHANGE; - if (($flags & 0x2000) == 0x2000) - $this->_flags |= self::READ_ONLY; - if (($flags & 0x80) == 0x80) - $this->_flags |= self::COMPRESSION; - if (($flags & 0x40) == 0x40) - $this->_flags |= self::ENCRYPTION; - if (($flags & 0x20) == 0x20) - $this->_flags |= self::GROUPING_IDENTITY; - } - - /* ID3v2.4.0 size and flags */ - else { - $this->_size = - $this->_decodeSynchsafe32($this->_reader->readUInt32BE()); - $this->_flags = $this->_reader->readUInt16BE(); - } - - $dataLength = $this->_size; - if ($this->hasFlag(self::DATA_LENGTH_INDICATOR)) { - $dataLength = $this->_decodeSynchsafe32($this->_reader->readUInt32BE()); - $this->_size -= 4; - } - $this->_data = $this->_reader->read($this->_size); - $this->_size = $dataLength; - - if ($this->hasFlag(self::UNSYNCHRONISATION) || - $this->getOption("unsynchronisation", false) === true) - $this->_data = $this->_decodeUnsynchronisation($this->_data); - } - } - - /** - * Returns the frame identifier string. - * - * @return string - */ - public final function getIdentifier() { return $this->_identifier; } - - /** - * Sets the frame identifier. - * - * @param string $identifier The identifier. - */ - public final function setIdentifier($identifier) - { - $this->_identifier = $identifier; - } - - /** - * Returns the size of the data in the final frame, after encryption, - * compression and unsynchronisation. The size is excluding the frame header. - * - * @return integer - */ - public final function getSize() { return $this->_size; } - - /** - * Checks whether or not the flag is set. Returns true if the flag - * is set, false otherwise. - * - * @param integer $flag The flag to query. - * @return boolean - */ - public final function hasFlag($flag) - { - return ($this->_flags & $flag) == $flag; - } - - /** - * Returns the frame flags byte. - * - * @return integer - */ - public final function getFlags($flags) { return $this->_flags; } - - /** - * Sets the frame flags byte. - * - * @param string $flags The flags byte. - */ - public final function setFlags($flags) { $this->_flags = $flags; } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - abstract protected function _getData(); - - /** - * Returns the frame data with the header. - * - * @return string - */ - public function __toString() - { - /* ID3v2.3.0 Flags; convert from 2.4.0 format */ - if ($this->getOption("version", 4) < 4) { - $flags = 0; - if ($this->hasFlag(self::DISCARD_ON_TAGCHANGE)) - $flags = $flags | 0x8000; - if ($this->hasFlag(self::DISCARD_ON_FILECHANGE)) - $flags = $flags | 0x4000; - if ($this->hasFlag(self::READ_ONLY)) - $flags = $flags | 0x2000; - if ($this->hasFlag(self::COMPRESSION)) - $flags = $flags | 0x80; - if ($this->hasFlag(self::ENCRYPTION)) - $flags = $flags | 0x40; - if ($this->hasFlag(self::GROUPING_IDENTITY)) - $flags = $flags | 0x20; - } - - /* ID3v2.4.0 Flags */ - else - $flags = $this->_flags; - - if ($this->getOption("version", 4) < 4) { - $data = $this->_data = $this->_getData(); - $size = $this->_size = strlen($data); - } else { - $data = $this->_data = $this->_getData(); - $size = $this->_size = strlen($data); - $data = $this->_encodeUnsynchronisation($data); - if (($dataLength = strlen($data)) != $size) { - $size = 4 + $dataLength; - $data = Transform::toUInt32BE($this->_encodeSynchsafe32($this->_size)) . - $data; - $flags |= self::DATA_LENGTH_INDICATOR | self::UNSYNCHRONISATION; - $this->setOption("unsynchronisation", true); - } else - $flags &= ~(self::DATA_LENGTH_INDICATOR | self::UNSYNCHRONISATION); - } - return Transform::toString8(substr($this->_identifier, 0, 4), 4) . - Transform::toUInt32BE($this->_encodeSynchsafe32($size)) . - Transform::toUInt16BE($flags) . $data; - } -} diff --git a/src/ID3/Frame/AENC.php b/src/ID3/Frame/AENC.php deleted file mode 100644 index a454887..0000000 --- a/src/ID3/Frame/AENC.php +++ /dev/null @@ -1,171 +0,0 @@ -Audio encryption indicates if the actual audio stream is - * encrypted, and by whom. - * - * The identifier is a URL containing an email address, or a link to a location - * where an email address can be found, that belongs to the organisation - * responsible for this specific encrypted audio file. Questions regarding the - * encrypted audio should be sent to the email address specified. There may be - * more than one AENC frame in a tag, but only one with the same owner - * identifier. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_AENC extends ID3_Frame -{ - /** @var string */ - private $_owner; - - /** @var integer */ - private $_previewStart; - - /** @var integer */ - private $_previewLength; - - /** @var string */ - private $_encryptionInfo; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - list($this->_owner, $this->_data) = $this->_explodeString8($this->_data, 2); - $this->_previewStart = Transform::fromUInt16BE(substr($this->_data, 0, 2)); - $this->_previewLength = Transform::fromUInt16BE(substr($this->_data, 2, 2)); - $this->_encryptionInfo = substr($this->_data, 4); - } - - /** - * Returns the owner identifier string. - * - * @return string - */ - public function getOwner() { return $this->_owner; } - - /** - * Sets the owner identifier string. - * - * @param string $owner The owner identifier string. - */ - public function setOwner($owner) { $this->_owner = $owner; } - - /** - * Returns the pointer to an unencrypted part of the audio in frames. - * - * @return integer - */ - public function getPreviewStart() { return $this->_previewStart; } - - /** - * Sets the pointer to an unencrypted part of the audio in frames. - * - * @param integer $previewStart The pointer to an unencrypted part. - */ - public function setPreviewStart($previewStart) - { - $this->_previewStart = $previewStart; - } - - /** - * Returns the length of the preview in frames. - * - * @return integer - */ - public function getPreviewLength() { return $this->_previewLength; } - - /** - * Sets the length of the preview in frames. - * - * @param integer $previewLength The length of the preview. - */ - public function setPreviewLength($previewLength) - { - $this->_previewLength = $previewLength; - } - - /** - * Returns the encryption info. - * - * @return string - */ - public function getEncryptionInfo() { return $this->_encryptionInfo; } - - /** - * Sets the encryption info binary string. - * - * @param string $encryptionInfo The data string. - */ - public function setEncryptionInfo($encryptionInfo) - { - $this->_encryptionInfo = $encryptionInfo; - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - return - $this->_owner . "\0" . Transform::toUInt16BE($this->_previewStart) . - Transform::toUInt16BE($this->_previewLength) . $this->_encryptionInfo; - } -} diff --git a/src/ID3/Frame/APIC.php b/src/ID3/Frame/APIC.php deleted file mode 100644 index 322a8d1..0000000 --- a/src/ID3/Frame/APIC.php +++ /dev/null @@ -1,274 +0,0 @@ -Attached picture frame contains a picture directly related to the - * audio file. Image format is the MIME type and subtype for the image. - * - * There may be several pictures attached to one file, each in their individual - * APIC frame, but only one with the same content descriptor. There may only - * be one picture with the same picture type. There is the possibility to put - * only a link to the image file by using the MIME type "-->" and having a - * complete URL instead of picture data. - * - * The use of linked files should however be used sparingly since there is the - * risk of separation of files. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_APIC extends ID3_Frame - implements ID3_Encoding -{ - /** - * The list of image types. - * - * @var Array - */ - public static $types = array - ("Other", "32x32 pixels file icon (PNG only)", "Other file icon", - "Cover (front)", "Cover (back)", "Leaflet page", - "Media (e.g. label side of CD)", "Lead artist/lead performer/soloist", - "Artist/performer", "Conductor", "Band/Orchestra", "Composer", - "Lyricist/text writer", "Recording Location", "During recording", - "During performance", "Movie/video screen capture", - "A bright coloured fish", "Illustration", "Band/artist logotype", - "Publisher/Studio logotype"); - - /** @var integer */ - private $_encoding; - - /** @var string */ - private $_mimeType = "image/unknown"; - - /** @var integer */ - private $_imageType = 0; - - /** @var string */ - private $_description; - - /** @var string */ - private $_imageData; - - /** @var integer */ - private $_imageSize = 0; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - $this->_encoding = $this->getOption("encoding", ID3_Encoding::UTF8); - - if ($reader === null) - return; - - $encoding = Transform::fromUInt8($this->_data[0]); - $this->_mimeType = substr - ($this->_data, 1, ($pos = strpos($this->_data, "\0", 1)) - 1); - $this->_imageType = Transform::fromUInt8($this->_data[++$pos]); - $this->_data = substr($this->_data, $pos + 1); - - switch ($encoding) { - case self::UTF16: - list ($this->_description, $this->_imageData) = - $this->_explodeString16($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16"); - break; - case self::UTF16BE: - list ($this->_description, $this->_imageData) = - $this->_explodeString16($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16be"); - break; - case self::UTF8: - list ($this->_description, $this->_imageData) = - $this->_explodeString8($this->_data, 2); - $this->_description = $this->_convertString - ($this->_description, "utf-8"); - break; - default: - list ($this->_description, $this->_imageData) = - $this->_explodeString8($this->_data, 2); - $this->_description = $this->_convertString - ($this->_description, "iso-8859-1"); - } - - $this->_imageSize = strlen($this->_imageData); - } - - /** - * Returns the text encoding. - * - * All the strings read from a file are automatically converted to the - * character encoding specified with the encoding option. See - * {@link ID3v2} for details. This method returns the original text encoding - * used to write the frame. - * - * @return integer - */ - public function getEncoding() { return $this->_encoding; } - - /** - * Sets the text encoding. - * - * All the string written to the frame are done so using given character - * encoding. No conversions of existing data take place upon the call to this - * method thus all texts must be given in given character encoding. - * - * The default character encoding used to write the frame is UTF-8. - * - * @see ID3_Encoding - * @param integer $encoding The text encoding. - */ - public function setEncoding($encoding) { $this->_encoding = $encoding; } - - /** - * Returns the MIME type. The MIME type is always ISO-8859-1 encoded. - * - * @return string - */ - public function getMimeType() { return $this->_mimeType; } - - /** - * Sets the MIME type. The MIME type is always ISO-8859-1 encoded. - * - * @param string $mimeType The MIME type. - */ - public function setMimeType($mimeType) { $this->_mimeType = $mimeType; } - - /** - * Returns the image type. - * - * @return integer - */ - public function getImageType() { return $this->_imageType; } - - /** - * Sets the image type code. - * - * @param integer $imageType The image type code. - */ - public function setImageType($imageType) { $this->_imageType = $imageType; } - - /** - * Returns the file description. - * - * @return string - */ - public function getDescription() { return $this->_description; } - - /** - * Sets the content description text using given encoding. - * - * @param string $description The content description text. - * @param integer $encoding The text encoding. - */ - public function setDescription($description, $encoding = false) - { - $this->_description = $description; - if ($encoding !== false) - $this->_encoding = $encoding; - } - - /** - * Returns the embedded image data. - * - * @return string - */ - public function getImageData() { return $this->_imageData; } - - /** - * Sets the embedded image data. Also updates the image size field to - * correspond the new data. - * - * @param string $imageData The image data. - */ - public function setImageData($imageData) - { - $this->_imageData = $imageData; - $this->_imageSize = strlen($imageData); - } - - /** - * Returns the size of the embedded image data. - * - * @return integer - */ - public function getImageSize() { return $this->_imageSize; } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = Transform::toUInt8($this->_encoding) . $this->_mimeType . "\0" . - Transform::toUInt8($this->_imageType); - switch ($this->_encoding) { - case self::UTF16LE: - $data .= Transform::toString16 - ($this->_description, Transform::LITTLE_ENDIAN_ORDER, 1); - break; - case self::UTF16: - case self::UTF16BE: - $data .= Transform::toString16($this->_description, false, 1); - break; - default: - $data .= $this->_description . "\0"; - } - return $data . $this->_imageData; - } -} diff --git a/src/ID3/Frame/ASPI.php b/src/ID3/Frame/ASPI.php deleted file mode 100644 index 2c141a7..0000000 --- a/src/ID3/Frame/ASPI.php +++ /dev/null @@ -1,160 +0,0 @@ -Audio seek point index or - * ASPI frame makes seeking easier by providing a list a seek points within the - * audio file. The seek points are a fractional offset within the audio data, - * providing a starting point from which to find an appropriate point to start - * decoding. The presence of an ASPI frame requires the existence of a - * {@link ID3_Frame_TLEN} frame, indicating the duration of the file in - * milliseconds. There may only be one audio seek point index frame in a tag. - * - * @todo Data parsing and write support - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_ASPI extends ID3_Frame -{ - /** @var integer */ - private $_dataStart; - - /** @var integer */ - private $_dataLength; - - /** @var integer */ - private $_size; - - /** @var Array */ - private $_fractions = array(); - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) { - require_once("ID3/Exception.php"); - throw new ID3_Exception("Write not supported yet"); - } - - $this->_dataStart = Transform::fromInt32BE(substr($this->_data, 0, 4)); - $this->_dataLength = Transform::fromInt32BE(substr($this->_data, 4, 4)); - $this->_size = Transform::fromInt16BE(substr($this->_data, 8, 2)); - - $bitsPerPoint = Transform::fromInt8($this->_data[10]); - /*for ($i = 0, $offset = 11; $i < $this->_size; $i++) { - if ($bitsPerPoint == 16) { - $this->_fractions[$i] = substr($this->_data, $offset, 2); - $offset += 2; - } else { - $this->_fractions[$i] = substr($this->_data, $offset, 1); - $offset ++; - } - }*/ - } - - /** - * Returns the byte offset from the beginning of the file. - * - * @return integer - */ - public function getDataStart() { return $this->_dataStart; } - - /** - * Sets the byte offset from the beginning of the file. - * - * @param integer $dataStart The offset. - */ - public function setDataStart($dataStart) { $this->_dataStart = $dataStart; } - - /** - * Returns the byte length of the audio data being indexed. - * - * @return integer - */ - public function getDataLength() { return $this->_dataLength; } - - /** - * Sets the byte length of the audio data being indexed. - * - * @param integer $dataLength The length. - */ - public function setDataLength($dataLength) - { - $this->_dataLength = $dataLength; - } - - /** - * Returns the number of index points in the frame. - * - * @return integer - */ - public function getSize() { return count($this->_fractions); } - - /** - * Returns the numerator of the fraction representing a relative position in - * the data or false if index not defined. The denominator is 2 - * to the power of b. - * - * @param integer $index The fraction numerator. - * @return integer - */ - public function getFractionAt($index) - { - if (isset($this->_fractions[$index])) - return $this->_fractions[$index]; - return false; - } -} diff --git a/src/ID3/Frame/AbstractLink.php b/src/ID3/Frame/AbstractLink.php deleted file mode 100644 index 73650ed..0000000 --- a/src/ID3/Frame/AbstractLink.php +++ /dev/null @@ -1,96 +0,0 @@ - - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -abstract class ID3_Frame_AbstractLink extends ID3_Frame -{ - /** @var string */ - protected $_link; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader !== null) - $this->_link = implode($this->_explodeString8($this->_data, 1), ""); - } - - /** - * Returns the link associated with the frame. - * - * @return string - */ - public function getLink() { return $this->_link; } - - /** - * Sets the link. The link encoding is always ISO-8859-1. - * - * @param string $link The link. - */ - public function setLink($link) { $this->_link = $link; } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - return $this->_link; - } -} diff --git a/src/ID3/Frame/AbstractText.php b/src/ID3/Frame/AbstractText.php deleted file mode 100644 index cf7753f..0000000 --- a/src/ID3/Frame/AbstractText.php +++ /dev/null @@ -1,188 +0,0 @@ - - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -abstract class ID3_Frame_AbstractText extends ID3_Frame - implements ID3_Encoding -{ - /** - * The text encoding. - * - * @var integer - */ - protected $_encoding; - - /** - * The text array. - * - * @var string - */ - protected $_text; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - $this->_encoding = $this->getOption("encoding", ID3_Encoding::UTF8); - - if ($reader === null) - return; - - $encoding = Transform::fromUInt8($this->_data[0]); - $this->_data = substr($this->_data, 1); - switch ($encoding) { - case self::UTF16: - $this->_text = $this->_convertString - ($this->_explodeString16(Transform::fromString16($this->_data)), - "utf-16"); - break; - case self::UTF16BE: - $this->_text = $this->_convertString - ($this->_explodeString16(Transform::fromString16($this->_data)), - "utf-16be"); - break; - case self::UTF8: - $this->_text = $this->_convertString - ($this->_explodeString8(Transform::fromString8($this->_data)), "utf-8"); - break; - default: - $this->_text = $this->_convertString - ($this->_explodeString8(Transform::fromString8($this->_data)), - "iso-8859-1"); - } - } - - /** - * Returns the text encoding. - * - * All the strings read from a file are automatically converted to the - * character encoding specified with the encoding option. See - * {@link ID3v2} for details. This method returns the original text encoding - * used to write the frame. - * - * @return integer - */ - public function getEncoding() { return $this->_encoding; } - - /** - * Sets the text encoding. - * - * All the string written to the frame are done so using given character - * encoding. No conversions of existing data take place upon the call to this - * method thus all texts must be given in given character encoding. - * - * The default character encoding used to write the frame is UTF-8. - * - * @see ID3_Encoding - * @param integer $encoding The text encoding. - */ - public function setEncoding($encoding) { $this->_encoding = $encoding; } - - /** - * Returns the first text chunk the frame contains. - * - * @return string - */ - public function getText() { return $this->_text[0]; } - - /** - * Returns an array of texts the frame contains. - * - * @return Array - */ - public function getTexts() { return $this->_text; } - - /** - * Sets the text using given encoding. - * - * @param mixed $text The test string or an array of strings. - * @param integer $encoding The text encoding. - */ - public function setText($text, $encoding = false) - { - $this->_text = is_array($text) ? $text : array($text); - if ($encoding !== false) - $this->_encoding = $encoding; - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = Transform::toUInt8($this->_encoding); - switch ($this->_encoding) { - case self::UTF16LE: - $array = $this->_text; - foreach ($array as &$text) - $text = Transform::toString16($text, Transform::LITTLE_ENDIAN_ORDER); - $data .= implode("\0\0", $array); - break; - case self::UTF16: - case self::UTF16BE: - $data .= implode("\0\0", $this->_text); - break; - default: - $data .= implode("\0", $this->_text); - } - return $data; - } -} diff --git a/src/ID3/Frame/COMM.php b/src/ID3/Frame/COMM.php deleted file mode 100644 index d11e4ab..0000000 --- a/src/ID3/Frame/COMM.php +++ /dev/null @@ -1,254 +0,0 @@ -Comments frame is intended for any kind of full text information - * that does not fit in any other frame. It consists of a frame header followed - * by encoding, language and content descriptors and is ended with the actual - * comment as a text string. Newline characters are allowed in the comment text - * string. There may be more than one comment frame in each tag, but only one - * with the same language and content descriptor. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_COMM extends ID3_Frame - implements ID3_Encoding, ID3_Language -{ - /** @var integer */ - private $_encoding; - - /** @var string */ - private $_language = "und"; - - /** @var string */ - private $_description; - - /** @var string */ - private $_text; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - $this->_encoding = $this->getOption("encoding", ID3_Encoding::UTF8); - - if ($reader === null) - return; - - $encoding = Transform::fromUInt8($this->_data[0]); - $this->_language = substr($this->_data, 1, 3); - if ($this->_language == "XXX") - $this->_language = "und"; - $this->_data = substr($this->_data, 4); - - switch ($encoding) { - case self::UTF16: - list ($this->_description, $this->_text) = - $this->_explodeString16($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16"); - $this->_text = $this->_convertString - (Transform::fromString16($this->_text), "utf-16"); - break; - case self::UTF16BE: - list ($this->_description, $this->_text) = - $this->_explodeString16($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16be"); - $this->_text = $this->_convertString - (Transform::fromString16($this->_text), "utf-16be"); - break; - case self::UTF8: - list ($this->_description, $this->_text) = - $this->_explodeString8($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString8($this->_description), "utf-8"); - $this->_text = $this->_convertString - (Transform::fromString8($this->_text), "utf-8"); - break; - default: - list ($this->_description, $this->_text) = - $this->_explodeString8($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString8($this->_description), "iso-8859-1"); - $this->_text = $this->_convertString - (Transform::fromString8($this->_text), "iso-8859-1"); - } - } - - /** - * Returns the text encoding. - * - * All the strings read from a file are automatically converted to the - * character encoding specified with the encoding option. See - * {@link ID3v2} for details. This method returns the original text encoding - * used to write the frame. - * - * @return integer - */ - public function getEncoding() { return $this->_encoding; } - - /** - * Sets the text encoding. - * - * All the string written to the frame are done so using given character - * encoding. No conversions of existing data take place upon the call to this - * method thus all texts must be given in given character encoding. - * - * The default character encoding used to write the frame is UTF-8. - * - * @see ID3_Encoding - * @param integer $encoding The text encoding. - */ - public function setEncoding($encoding) { $this->_encoding = $encoding; } - - /** - * Returns the language code as specified in the - * {@link http://www.loc.gov/standards/iso639-2/ ISO-639-2} standard. - * - * @return string - */ - public function getLanguage() { return $this->_language; } - - /** - * Sets the text language code as specified in the - * {@link http://www.loc.gov/standards/iso639-2/ ISO-639-2} standard. - * - * @see ID3_Language - * @param string $language The language code. - */ - public function setLanguage($language) - { - if ($language == "XXX") - $language = "und"; - $this->_language = substr($language, 0, 3); - } - - /** - * Returns the short content description. - * - * @return string - */ - public function getDescription() { return $this->_description; } - - /** - * Sets the content description text using given encoding. The description - * language and encoding must be that of the actual text. - * - * @param string $description The content description text. - * @param string $language The language code. - * @param integer $encoding The text encoding. - */ - public function setDescription($description, $language = false, - $encoding = false) - { - $this->_description = $description; - if ($language !== false) - $this->setLanguage($language); - if ($encoding !== false) - $this->setEncoding($encoding); - } - - /** - * Returns the comment text. - * - * @return string - */ - public function getText() { return $this->_text; } - - /** - * Sets the text using given encoding. The text language and encoding must be - * that of the description text. - * - * @param mixed $text The test string. - * @param string $language The language code. - * @param integer $encoding The text encoding. - */ - public function setText($text, $language = false, $encoding = false) - { - $this->_text = $text; - if ($language !== false) - $this->setLanguage($language); - if ($encoding !== false) - $this->setEncoding($encoding); - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = Transform::toUInt8($this->_encoding) . $this->_language; - switch ($this->_encoding) { - case self::UTF16LE: - $data .= Transform::toString16 - ($this->_description, Transform::LITTLE_ENDIAN_ORDER, 1) . - Transform::toString16($this->_text, Transform::LITTLE_ENDIAN_ORDER); - break; - case self::UTF16: - case self::UTF16BE: - $data .= Transform::toString16($this->_description, false, 1) . - Transform::toString16($this->_text); - break; - default: - $data .= $this->_description . "\0" . $this->_text; - } - return $data; - } -} diff --git a/src/ID3/Frame/COMR.php b/src/ID3/Frame/COMR.php deleted file mode 100644 index 29d54a1..0000000 --- a/src/ID3/Frame/COMR.php +++ /dev/null @@ -1,400 +0,0 @@ -Commercial frame enables several competing offers in the same tag - * by bundling all needed information. That makes this frame rather complex but - * it's an easier solution than if one tries to achieve the same result with - * several frames. - * - * There may be more than one commercial frame in a tag, but no two may be - * identical. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_COMR extends ID3_Frame - implements ID3_Encoding -{ - /** - * The delivery types. - * - * @var Array - */ - public static $types = array - ("Other", "Standard CD album with other songs", "Compressed audio on CD", - "File over the Internet", "Stream over the Internet", "As note sheets", - "As note sheets in a book with other sheets", "Music on other media", - "Non-musical merchandise"); - - /** @var integer */ - private $_encoding; - - /** @var string */ - private $_currency = "EUR"; - - /** @var string */ - private $_price; - - /** @var string */ - private $_date; - - /** @var string */ - private $_contact; - - /** @var integer */ - private $_delivery = 0; - - /** @var string */ - private $_seller; - - /** @var string */ - private $_description; - - /** @var string */ - private $_mimeType = false; - - /** @var string */ - private $_imageData; - - /** @var integer */ - private $_imageSize = 0; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - $this->_encoding = $this->getOption("encoding", ID3_Encoding::UTF8); - - if ($reader === null) - return; - - $encoding = Transform::fromUInt8($this->_data[0]); - list($pricing, $this->_data) = - $this->_explodeString8(substr($this->_data, 1), 2); - $this->_currency = substr($pricing, 0, 3); - $this->_price = substr($pricing, 3); - $this->_date = substr($this->_data, 0, 8); - list($this->_contact, $this->_data) = - $this->_explodeString8(substr($this->_data, 8), 2); - $this->_delivery = Transform::fromUInt8($this->_data[0]); - $this->_data = substr($this->_data, 1); - - switch ($encoding) { - case self::UTF16: - list ($this->_seller, $this->_description, $this->_data) = - $this->_explodeString16($this->_data, 3); - $this->_seller = $this->_convertString - (Transform::fromString16($this->_seller), "utf-16"); - $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16"); - break; - case self::UTF16BE: - list ($this->_seller, $this->_description, $this->_data) = - $this->_explodeString16($this->_data, 3); - $this->_seller = $this->_convertString - (Transform::fromString16($this->_seller), "utf-16be"); - $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16be"); - break; - case self::UTF8: - list ($this->_seller, $this->_description, $this->_data) = - $this->_explodeString8($this->_data, 3); - $this->_seller = $this->_convertString - (Transform::fromString8($this->_seller), "utf-8"); - $this->_description = $this->_convertString - (Transform::fromString8($this->_description), "utf-8"); - break; - default: - list ($this->_seller, $this->_description, $this->_data) = - $this->_explodeString8($this->_data, 3); - $this->_seller = $this->_convertString - (Transform::fromString8($this->_seller), "iso-8859-1"); - $this->_description = $this->_convertString - (Transform::fromString8($this->_description), "iso-8859-1"); - } - - if (strlen($this->_data) == 0) - return; - - list($this->_mimeType, $this->_imageData) = - $this->_explodeString8($this->_data, 2); - - $this->_imageSize = strlen($this->_imageData); - } - - /** - * Returns the text encoding. - * - * All the strings read from a file are automatically converted to the - * character encoding specified with the encoding option. See - * {@link ID3v2} for details. This method returns the original text encoding - * used to write the frame. - * - * @return integer - */ - public function getEncoding() { return $this->_encoding; } - - /** - * Sets the text encoding. - * - * All the string written to the frame are done so using given character - * encoding. No conversions of existing data take place upon the call to this - * method thus all texts must be given in given character encoding. - * - * The default character encoding used to write the frame is UTF-8. - * - * @see ID3_Encoding - * @param integer $encoding The text encoding. - */ - public function setEncoding($encoding) { $this->_encoding = $encoding; } - - /** - * Returns the currency code, encoded according to - * {@link http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/currency_codes/currency_codes_list-1.htm - * ISO 4217} alphabetic currency code. - * - * @return string - */ - public function getCurrency() { return $this->_currency; } - - /** - * Sets the currency used in transaction, encoded according to - * {@link http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/currency_codes/currency_codes_list-1.htm - * ISO 4217} alphabetic currency code. - * - * @param string $currency The currency code. - */ - public function setCurrency($currency) { $this->_currency = $currency; } - - /** - * Returns the price as a numerical string using "." as the decimal separator. - * - * In the price string several prices may be concatenated, separated by a "/" - * character, but there may only be one currency of each type. - * - * @return string - */ - public function getPrice() { return $this->_price; } - - /** - * Sets the price. The price must use "." as the decimal separator and have - * multiple values be separated by a "/" character. - * - * @param string $price The price. - */ - public function setPrice($price) - { - $this->_price = $price; - } - - /** - * Returns the date as an 8 character date string (YYYYMMDD), describing for - * how long the price is valid. - * - * @return string - */ - public function getDate() { return $this->_date; } - - /** - * Sets the date describing for how long the price is valid for. The date must - * be an 8 character date string (YYYYMMDD). - * - * @param string $date The date string. - */ - public function setDate($date) { $this->_date = $date; } - - /** - * Returns the contact URL, with which the user can contact the seller. - * - * @return string - */ - public function getContact() { return $this->_contact; } - - /** - * Sets the contact URL, with which the user can contact the seller. - * - * @param string $contact The contact URL. - */ - public function setContact($contact) { $this->_contact = $contact; } - - /** - * Returns the delivery type with whitch the audio was delivered when bought. - * - * @return integer - */ - public function getDelivery() { return $this->_delivery; } - - /** - * Sets the delivery type with whitch the audio was delivered when bought. - * - * @param integer $delivery The delivery type code. - */ - public function setDelivery($delivery) { $this->_delivery = $delivery; } - - /** - * Returns the name of the seller. - * - * @return string - */ - public function getSeller() { return $this->_seller; } - - /** - * Sets the name of the seller using given encoding. The seller text encoding - * must be that of the description text. - * - * @param string $seller The name of the seller. - * @param integer $encoding The text encoding. - */ - public function setSeller($seller, $encoding = false) - { - $this->_seller = $seller; - if ($encoding !== false) - $this->_encoding = $encoding; - } - - /** - * Returns the short description of the product. - * - * @return string - */ - public function getDescription() { return $this->_description; } - - /** - * Sets the content description text using given encoding. The description - * encoding must be that of the seller text. - * - * @param string $description The content description text. - * @param integer $encoding The text encoding. - */ - public function setDescription($description, $encoding = false) - { - $this->_description = $description; - if ($encoding !== false) - $this->_encoding = $encoding; - } - - /** - * Returns the MIME type of the seller's company logo, if attached, or - * false otherwise. Currently only "image/png" and "image/jpeg" - * are allowed. - * - * @return string - */ - public function getMimeType() { return $this->_mimeType; } - - /** - * Sets the MIME type. Currently only "image/png" and "image/jpeg" are - * allowed. The MIME type is always ISO-8859-1 encoded. - * - * @param string $mimeType The MIME type. - */ - public function setMimeType($mimeType) { $this->_mimeType = $mimeType; } - - /** - * Returns the embedded image binary data. - * - * @return string - */ - public function getImageData() { return $this->_imageData; } - - /** - * Sets the embedded image data. Also updates the image size to correspond the - * new data. - * - * @param string $imageData The image data. - */ - public function setImageData($imageData) - { - $this->_imageData = $imageData; - $this->_imageSize = strlen($imageData); - } - - /** - * Returns the size of the embedded image data. - * - * @return integer - */ - public function getImageSize() { return $this->_imageSize; } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = Transform::toUInt8($this->_encoding) . $this->_currency . - $this->_price . "\0" . $this->_date . $this->_contact . "\0" . - Transform::toUInt8($this->_delivery); - switch ($this->_encoding) { - case self::UTF16LE: - $data .= Transform::toString16 - ($this->_seller, Transform::LITTLE_ENDIAN_ORDER, 1) . - Transform::toString16 - ($this->_description, Transform::LITTLE_ENDIAN_ORDER, 1); - break; - case self::UTF16: - case self::UTF16BE: - $data .= Transform::toString16($this->_seller, false, 1) . - Transform::toString16($this->_description, false, 1); - break; - default: - $data .= $this->_seller . "\0" . $this->_description . "\0"; - } - return - $data . ($this->_mimeType ? - $this->_mimeType . "\0" . $this->_imageData : ""); - } -} diff --git a/src/ID3/Frame/ENCR.php b/src/ID3/Frame/ENCR.php deleted file mode 100644 index b3cccc4..0000000 --- a/src/ID3/Frame/ENCR.php +++ /dev/null @@ -1,156 +0,0 @@ -Encryption method - * registration frame. - * - * The owner identifier a URL containing an email address, or a link to a - * location where an email address can be found, that belongs to the - * organisation responsible for this specific encryption method. Questions - * regarding the encryption method should be sent to the indicated email - * address. - * - * The method symbol contains a value that is associated with this method - * throughout the whole tag, in the range $80-F0. All other values are reserved. - * The method symbol may optionally be followed by encryption specific data. - * - * There may be several ENCR frames in a tag but only one containing the same - * symbol and only one containing the same owner identifier. The method must be - * used somewhere in the tag. See {@link ID3_Frame#ENCRYPTION} for more - * information. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_ENCR extends ID3_Frame -{ - /** @var string */ - private $_owner; - - /** @var integer */ - private $_method; - - /** @var string */ - private $_encryptionData; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - list($this->_owner, $this->_data) = $this->_explodeString8($this->_data, 2); - $this->_method = Transform::fromInt8($this->_data[0]); - $this->_encryptionData = substr($this->_data, 1); - } - - /** - * Returns the owner identifier string. - * - * @return string - */ - public function getOwner() { return $this->_owner; } - - /** - * Sets the owner identifier string. - * - * @param string $owner The owner identifier string. - */ - public function setOwner($owner) { $this->_owner = $owner; } - - /** - * Returns the method symbol. - * - * @return integer - */ - public function getMethod() { return $this->_method; } - - /** - * Sets the method symbol. - * - * @param integer $method The method symbol byte. - */ - public function setMethod($method) { $this->_method = $method; } - - /** - * Returns the encryption data. - * - * @return string - */ - public function getEncryptionData() { return $this->_encryptionData; } - - /** - * Sets the encryption data. - * - * @param string $encryptionData The encryption data string. - */ - public function setEncryptionData($encryptionData) - { - $this->_encryptionData = $encryptionData; - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - return - $this->_owner . "\0" . Transform::toInt8($this->_method) . - $this->_encryptionData; - } -} diff --git a/src/ID3/Frame/EQU2.php b/src/ID3/Frame/EQU2.php deleted file mode 100644 index 323064d..0000000 --- a/src/ID3/Frame/EQU2.php +++ /dev/null @@ -1,193 +0,0 @@ -Equalisation (2) is another subjective, alignment frame. It allows - * the user to predefine an equalisation curve within the audio file. There may - * be more than one EQU2 frame in each tag, but only one with the same - * identification string. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_EQU2 extends ID3_Frame -{ - /** - * Interpolation type that defines that no interpolation is made. A jump from - * one adjustment level to another occurs in the middle between two adjustment - * points. - */ - const BAND = 0; - - /** - * Interpolation type that defines that interpolation between adjustment - * points is linear. - */ - const LINEAR = 1; - - /** @var integer */ - private $_interpolation; - - /** @var string */ - private $_device; - - /** @var Array */ - private $_adjustments; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - $this->_interpolation = Transform::fromInt8($this->_data[0]); - list ($this->_device, $this->_data) = - $this->_explodeString8(substr($this->_data, 1), 2); - - for ($i = 0; $i < strlen($this->_data); $i += 4) - $this->_adjustments - [(int)(Transform::fromUInt16BE(substr($this->_data, $i, 2)) / 2)] = - Transform::fromInt16BE(substr($this->_data, $i + 2, 2)) / 512.0; - ksort($this->_adjustments); - } - - /** - * Returns the interpolation method. The interpolation method describes which - * method is preferred when an interpolation between the adjustment point that - * follows. - * - * @return integer - */ - public function getInterpolation() { return $this->_interpolation; } - - /** - * Sets the interpolation method. The interpolation method describes which - * method is preferred when an interpolation between the adjustment point that - * follows. - * - * @param integer $interpolation The interpolation method code. - */ - public function setInterpolation($interpolation) - { - $this->_interpolation = $interpolation; - } - - /** - * Returns the device where the adjustments should apply. - * - * @return string - */ - public function getDevice() { return $this->_device; } - - /** - * Sets the device where the adjustments should apply. - * - * @param string $device The device. - */ - public function setDevice($device) { $this->_device = $device; } - - /** - * Returns the array containing adjustments having frequencies as keys and - * their corresponding adjustments as values. - * - * Adjustment points are ordered by frequency. - * - * @return Array - */ - public function getAdjustments() { return $this->_adjustments; } - - /** - * Adds a volume adjustment setting for given frequency. The frequency can - * have a value from 0 to 32767 Hz, and the adjustment +/- 64 dB with a - * precision of 0.001953125 dB. - * - * @param integer $frequency The frequency, in hertz. - * @param integer $adjustment The adjustment, in dB. - */ - public function addAdjustment($frequency, $adjustment) - { - $this->_adjustments[$frequency] = $adjustment; - ksort($this->_adjustments); - } - - /** - * Sets the adjustments array. The array must have frequencies as keys and - * their corresponding adjustments as values. The frequency can have a value - * from 0 to 32767 Hz, and the adjustment +/- 64 dB with a precision of - * 0.001953125 dB. One frequency should only be described once in the frame. - * - * @param Array $adjustments The adjustments array. - */ - public function setAdjustments($adjustments) - { - $this->_adjustments = $adjustments; - ksort($this->_adjustments); - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = Transform::toInt8($this->_interpolation) . $this->_device . "\0"; - foreach ($this->_adjustments as $frequency => $adjustment) - $data .= Transform::toUInt16BE($frequency * 2) . - Transform::toInt16BE($adjustment * 512); - return $data; - } -} diff --git a/src/ID3/Frame/EQUA.php b/src/ID3/Frame/EQUA.php deleted file mode 100644 index 2ac5136..0000000 --- a/src/ID3/Frame/EQUA.php +++ /dev/null @@ -1,142 +0,0 @@ -Equalisation frame is another subjective, alignment frame. It - * allows the user to predefine an equalisation curve within the audio file. - * There may only be one EQUA frame in each tag. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @deprecated ID3v2.3.0 - */ -final class ID3_Frame_EQUA extends ID3_Frame -{ - /** @var Array */ - private $_adjustments; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - $adjustmentBits = Transform::fromInt8($this->_data[0]); - if ($adjustmentBits <= 8 || $adjustmentBits > 16) { - require_once("ID3/Exception.php"); - throw new ID3_Exception - ("Unsupported adjustment bit size of: " . $adjustmentBits); - } - - for ($i = 1; $i < strlen($this->_data); $i += 4) { - $frequency = Transform::fromUInt16BE(substr($this->_data, $i, 2)); - $this->_adjustments[($frequency & 0x7fff)] = - ($frequency & 0x8000) == 0x8000 ? - Transform::fromUInt16BE(substr($this->_data, $i + 2, 2)) : - -Transform::fromUInt16BE(substr($this->_data, $i + 2, 2)); - } - ksort($this->_adjustments); - } - - /** - * Returns the array containing adjustments having frequencies as keys and - * their corresponding adjustments as values. - * - * @return Array - */ - public function getAdjustments() { return $this->_adjustments; } - - /** - * Adds a volume adjustment setting for given frequency. The frequency can - * have a value from 0 to 32767 Hz. - * - * @param integer $frequency The frequency, in hertz. - * @param integer $adjustment The adjustment, in dB. - */ - public function addAdjustment($frequency, $adjustment) - { - $this->_adjustments[$frequency] = $adjustment; - ksort($this->_adjustments); - } - - /** - * Sets the adjustments array. The array must have frequencies as keys and - * their corresponding adjustments as values. The frequency can have a value - * from 0 to 32767 Hz. One frequency should only be described once in the - * frame. - * - * @param Array $adjustments The adjustments array. - */ - public function setAdjustments($adjustments) - { - $this->_adjustments = $adjustments; - ksort($this->_adjustments); - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = Transform::toInt8(16); - foreach ($this->_adjustments as $frequency => $adjustment) - $data .= Transform::toUInt16BE - ($adjustment > 0 ? $frequency | 0x8000 : $frequency & ~0x8000) . - Transform::toUInt16BE(abs($adjustment)); - return $data; - } -} diff --git a/src/ID3/Frame/ETCO.php b/src/ID3/Frame/ETCO.php deleted file mode 100644 index 95a4e69..0000000 --- a/src/ID3/Frame/ETCO.php +++ /dev/null @@ -1,168 +0,0 @@ -Event timing codes allows synchronisation with key events in the - * audio. - * - * The events are an array of timestamp and type pairs. The time stamp is set to - * zero if directly at the beginning of the sound or after the previous event. - * All events are sorted in chronological order. - * - * The events $E0-EF are for user events. You might want to synchronise your - * music to something, like setting off an explosion on-stage, activating a - * screensaver etc. - * - * There may only be one ETCO frame in each tag. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_ETCO extends ID3_Frame - implements ID3_Timing -{ - /** - * The list of event types. - * - * @var Array - */ - public static $types = array - ("Padding", "End of initial silence", "Intro start", "Main part start", - "Outro start", "Outro end", "Verse start","Refrain start", - "Interlude start", "Theme start", "Variation start", "Key change", - "Time change", "Momentary unwanted noise", "Sustained noise", - "Sustained noise end", "Intro end", "Main part end", "Verse end", - "Refrain end", "Theme end", "Profanity", "Profanity end", - - 0xe0 => "User event", "User event", "User event", "User event", - "User event", "User event", "User event", "User event", "User event", - "User event", "User event", "User event", "User event", "User event", - - 0xfd => "Audio end (start of silence)", "Audio file ends", - "One more byte of events follows"); - - /** @var integer */ - private $_format = ID3_Timing::MPEG_FRAMES; - - /** @var Array */ - private $_events = array(); - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - $this->_format = Transform::fromUInt8($this->_data[0]); - for ($i = 1; $i < $this->getSize(); $i += 5) { - $this->_events[Transform::fromUInt32BE(substr($this->_data, $i + 1, 4))] = - $data = Transform::fromUInt8($this->_data[$i]); - if ($data == 0xff) - break; - } - ksort($this->_events); - } - - /** - * Returns the timing format. - * - * @return integer - */ - public function getFormat() { return $this->_format; } - - /** - * Sets the timing format. - * - * @see ID3_Timing - * @param integer $format The timing format. - */ - public function setFormat($format) { $this->_format = $format; } - - /** - * Returns the events as an associated array having the timestamps as keys and - * the event types as values. - * - * @return Array - */ - public function getEvents() { return $this->_events; } - - /** - * Sets the events using given format. The value must be an associated array - * having the timestamps as keys and the event types as values. - * - * @param Array $events The events array. - * @param integer $format The timing format. - */ - public function setEvents($events, $format = false) - { - $this->_events = $events; - if ($format !== false) - $this->_format = $format; - ksort($this->_events); - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = Transform::toUInt8($this->_format); - foreach ($this->_events as $timestamp => $type) - $data .= Transform::toUInt8($type) . Transform::toUInt32BE($timestamp); - return $data; - } -} diff --git a/src/ID3/Frame/GEOB.php b/src/ID3/Frame/GEOB.php deleted file mode 100644 index 0a3c674..0000000 --- a/src/ID3/Frame/GEOB.php +++ /dev/null @@ -1,253 +0,0 @@ -General encapsulated object frame any type of file can be - * encapsulated. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_GEOB extends ID3_Frame - implements ID3_Encoding -{ - /** @var integer */ - private $_encoding; - - /** @var string */ - private $_mimeType; - - /** @var string */ - private $_filename; - - /** @var string */ - private $_description; - - /** @var string */ - private $_objectData; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - $this->_encoding = $this->getOption("encoding", ID3_Encoding::UTF8); - - if ($reader === null) - return; - - $encoding = Transform::fromUInt8($this->_data[0]); - $this->_mimeType = substr - ($this->_data, 1, ($pos = strpos($this->_data, "\0", 1)) - 1); - $this->_data = substr($this->_data, $pos + 1); - - switch ($encoding) { - case self::UTF16: - list ($this->_filename, $this->_description, $this->_objectData) = - $this->_explodeString16($this->_data, 3); - $this->_filename = $this->_convertString - (Transform::fromString16($this->_filename), "utf-16"); - $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16"); - break; - case self::UTF16BE: - list ($this->_filename, $this->_description, $this->_objectData) = - $this->_explodeString16($this->_data, 3); - $this->_filename = $this->_convertString - (Transform::fromString16($this->_filename), "utf-16be"); - $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16be"); - break; - case self::UTF8: - list ($this->_filename, $this->_description, $this->_objectData) = - $this->_explodeString8($this->_data, 3); - $this->_filename = $this->_convertString - (Transform::fromString8($this->_filename), "utf-8"); - $this->_description = $this->_convertString - (Transform::fromString8($this->_description), "utf-8"); - break; - default: - list ($this->_filename, $this->_description, $this->_objectData) = - $this->_explodeString8($this->_data, 3); - $this->_filename = $this->_convertString - (Transform::fromString8($this->_filename), "iso-8859-1"); - $this->_description = $this->_convertString - (Transform::fromString8($this->_description), "iso-8859-1"); - } - } - - /** - * Returns the text encoding. - * - * All the strings read from a file are automatically converted to the - * character encoding specified with the encoding option. See - * {@link ID3v2} for details. This method returns the original text encoding - * used to write the frame. - * - * @return integer - */ - public function getEncoding() { return $this->_encoding; } - - /** - * Sets the text encoding. - * - * All the string written to the frame are done so using given character - * encoding. No conversions of existing data take place upon the call to this - * method thus all texts must be given in given character encoding. - * - * The default character encoding used to write the frame is UTF-8. - * - * @see ID3_Encoding - * @param integer $encoding The text encoding. - */ - public function setEncoding($encoding) { $this->_encoding = $encoding; } - - /** - * Returns the MIME type. The MIME type is always encoded with ISO-8859-1. - * - * @return string - */ - public function getMimeType() { return $this->_mimeType; } - - /** - * Sets the MIME type. The MIME type is always ISO-8859-1 encoded. - * - * @param string $mimeType The MIME type. - */ - public function setMimeType($mimeType) { $this->_mimeType = $mimeType; } - - /** - * Returns the file name. - * - * @return string - */ - public function getFilename() { return $this->_filename; } - - /** - * Sets the file name using given encoding. The file name encoding must be - * that of the description text. - * - * @param string $description The file description text. - * @param integer $encoding The text encoding. - */ - public function setFilename($filename, $encoding = false) - { - $this->_filename = $filename; - if ($encoding !== false) - $this->_encoding = $encoding; - } - - /** - * Returns the file description. - * - * @return string - */ - public function getDescription() { return $this->_description; } - - /** - * Sets the file description text using given encoding. The description - * encoding must be that of the file name. - * - * @param string $description The file description text. - * @param integer $encoding The text encoding. - */ - public function setDescription($description, $encoding = false) - { - $this->_description = $description; - if ($encoding !== false) - $this->_encoding = $encoding; - } - - /** - * Returns the embedded object binary data. - * - * @return string - */ - public function getObjectData() { return $this->_objectData; } - - /** - * Sets the embedded object binary data. - * - * @param string $objectData The object data. - */ - public function setObjectData($objectData) - { - $this->_objectData = $objectData; - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = Transform::toUInt8($this->_encoding) . $this->_mimeType . "\0"; - switch ($this->_encoding) { - case self::UTF16LE: - $data .= Transform::toString16 - ($this->_filename, Transform::LITTLE_ENDIAN_ORDER, 1) . - Transform::toString16 - ($this->_description, Transform::LITTLE_ENDIAN_ORDER, 1); - break; - case self::UTF16: - case self::UTF16BE: - $data .= Transform::toString16($this->_filename, false, 1) . - Transform::toString16($this->_description, false, 1); - break; - default: - $data .= $this->_filename . "\0" . $this->_description . "\0"; - } - return $data . $this->_objectData; - } -} diff --git a/src/ID3/Frame/GRID.php b/src/ID3/Frame/GRID.php deleted file mode 100644 index faac81c..0000000 --- a/src/ID3/Frame/GRID.php +++ /dev/null @@ -1,152 +0,0 @@ -Group identification registration frame enables grouping of - * otherwise unrelated frames. This can be used when some frames are to be - * signed. To identify which frames belongs to a set of frames a group - * identifier must be registered in the tag with this frame. - * - * The owner identifier is a URL containing an email address, or a link to a - * location where an email address can be found, that belongs to the - * organisation responsible for this grouping. Questions regarding the grouping - * should be sent to the indicated email address. - * - * The group symbol contains a value that associates the frame with this group - * throughout the whole tag, in the range $80-F0. All other values are reserved. - * The group symbol may optionally be followed by some group specific data, e.g. - * a digital signature. There may be several GRID frames in a tag but only one - * containing the same symbol and only one containing the same owner identifier. - * The group symbol must be used somewhere in the tag. See - * {@link ID3_Frame#GROUPING_ownerENTITY} for more information. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_GRID extends ID3_Frame -{ - /** @var string */ - private $_owner; - - /** @var integer */ - private $_group; - - /** @var string */ - private $_groupData; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - list($this->_owner, $this->_data) = $this->_explodeString8($this->_data, 2); - $this->_group = Transform::fromUInt8($this->_data[0]); - $this->_groupData = substr($this->_data, 1); - } - - /** - * Returns the owner identifier string. - * - * @return string - */ - public function getOwner() { return $this->_owner; } - - /** - * Sets the owner identifier string. - * - * @param string $owner The owner identifier string. - */ - public function setOwner($owner) { $this->_owner = $owner; } - - /** - * Returns the group symbol. - * - * @return integer - */ - public function getGroup() { return $this->_group; } - - /** - * Sets the group symbol. - * - * @param integer $group The group symbol. - */ - public function setGroup($group) { $this->_group = $group; } - - /** - * Returns the group dependent data. - * - * @return string - */ - public function getGroupData() { return $this->_groupData; } - - /** - * Sets the group dependent data. - * - * @param string $groupData The data. - */ - public function setGroupData($groupData) { $this->_groupData = $groupData; } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - return - $this->_owner . "\0" . Transform::toUInt8($this->_group) . - $this->_groupData; - } -} diff --git a/src/ID3/Frame/IPLS.php b/src/ID3/Frame/IPLS.php deleted file mode 100644 index b789605..0000000 --- a/src/ID3/Frame/IPLS.php +++ /dev/null @@ -1,191 +0,0 @@ -Involved people list is a frame containing the names of those - * involved, and how they were involved. There may only be one IPLS frame in - * each tag. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @deprecated ID3v2.3.0 - */ -final class ID3_Frame_IPLS extends ID3_Frame - implements ID3_Encoding -{ - /** @var integer */ - private $_encoding; - - /** @var Array */ - private $_people = array(); - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - $this->_encoding = $this->getOption("encoding", ID3_Encoding::UTF8); - - if ($reader === null) - return; - - $encoding = Transform::fromUInt8($this->_data[0]); - $data = substr($this->_data, 1); - $order = Transform::MACHINE_ENDIAN_ORDER; - switch ($encoding) { - case self::UTF16: - $data = $this->_explodeString16($data); - foreach ($data as &$str) - $str = $this->_convertString - (Transform::fromString16($str, $order), "utf-16"); - break; - case self::UTF16BE: - $data = $this->_explodeString16($data); - foreach ($data as &$str) - $str = $this->_convertString - (Transform::fromString16($str), "utf-16be"); - break; - case self::UTF8: - $data = $this->_convertString($this->_explodeString8($data), "utf-8"); - break; - default: - $data = $this->_convertString($this->_explodeString8($data), "iso-8859-1"); - } - - for ($i = 0; $i < count($data) - 1; $i += 2) - $this->_people[] = array($data[$i] => @$data[$i + 1]); - } - - /** - * Returns the text encoding. - * - * All the strings read from a file are automatically converted to the - * character encoding specified with the encoding option. See - * {@link ID3v2} for details. This method returns the original text encoding - * used to write the frame. - * - * @return integer - */ - public function getEncoding() { return $this->_encoding; } - - /** - * Sets the text encoding. - * - * All the string written to the frame are done so using given character - * encoding. No conversions of existing data take place upon the call to this - * method thus all texts must be given in given character encoding. - * - * The default character encoding used to write the frame is UTF-8. - * - * @see ID3_Encoding - * @param integer $encoding The text encoding. - */ - public function setEncoding($encoding) { $this->_encoding = $encoding; } - - /** - * Returns the involved people list as an array. For each person, the array - * contains an entry, which too is an associate array with involvement as its - * key and involvee as its value. - * - * @return Array - */ - public function getPeople() { return $this->_people; } - - /** - * Adds a person with his involvement. - * - * @return string - */ - public function addPerson($involvement, $person) - { - $this->_people[] = array($involvement => $person); - } - - /** - * Sets the involved people list array. For each person, the array must - * contain an associate array with involvement as its key and involvee as its - * value. - * - * @param Array $people The involved people list. - */ - public function setPeople($people) { $this->_people = $people; } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = Transform::toUInt8($this->_encoding); - foreach ($this->_people as $entry) { - foreach ($entry as $key => $val) { - switch ($this->_encoding) { - case self::UTF16LE: - $data .= Transform::toString16 - ($key, Transform::LITTLE_ENDIAN_ORDER, 1) . - Transform::toString16($val, Transform::LITTLE_ENDIAN_ORDER, 1); - case self::UTF16: - case self::UTF16BE: - $data .= Transform::toString16($key, false, 1) . - Transform::toString16($val, false, 1); - break; - default: - $data .= $key . "\0" . $val . "\0"; - } - } - } - return $data; - } -} diff --git a/src/ID3/Frame/LINK.php b/src/ID3/Frame/LINK.php deleted file mode 100644 index 341eeb4..0000000 --- a/src/ID3/Frame/LINK.php +++ /dev/null @@ -1,173 +0,0 @@ -Linked information frame is used to keep information duplication - * as low as possible by linking information from another ID3v2 tag that might - * reside in another audio file or alone in a binary file. It is recommended - * that this method is only used when the files are stored on a CD-ROM or other - * circumstances when the risk of file separation is low. - * - * Data should be retrieved from the first tag found in the file to which this - * link points. There may be more than one LINK frame in a tag, but only one - * with the same contents. - * - * A linked frame is to be considered as part of the tag and has the same - * restrictions as if it was a physical part of the tag (i.e. only one - * {@link ID3_Frame_RVRB} frame allowed, whether it's linked or not). - * - * Frames that may be linked and need no additional data are - * {@link ID3_Frame_ASPI}, {@link ID3_Frame_ETCO}, {@link ID3_Frame_EQU2}, - * {@link ID3_Frame_MCDI}, {@link ID3_Frame_MLLT}, {@link ID3_Frame_OWNE}, - * {@link ID3_Frame_RVA2}, {@link ID3_Frame_RVRB}, {@link ID3_Frame_SYTC}, the - * text information frames (ie frames descendats of - * {@link ID3_Frame_AbstractText}) and the URL link frames (ie frames descendants - * of {@link ID3_Frame_AbstractLink}). - * - * The {@link ID3_Frame_AENC}, {@link ID3_Frame_APIC}, {@link ID3_Frame_GEOB} - * and {@link ID3_Frame_TXXX} frames may be linked with the content descriptor - * as additional ID data. - * - * The {@link ID3_Frame_USER} frame may be linked with the language field as - * additional ID data. - * - * The {@link ID3_Frame_PRIV} frame may be linked with the owner identifier as - * additional ID data. - * - * The {@link ID3_Frame_COMM}, {@link ID3_Frame_SYLT} and {@link ID3_Frame_USLT} - * frames may be linked with three bytes of language descriptor directly - * followed by a content descriptor as additional ID data. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_LINK extends ID3_Frame -{ - /** @var string */ - private $_target; - - /** @var string */ - private $_url; - - /** @var string */ - private $_qualifier; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - $this->_target = substr($this->_data, 0, 4); - list($this->_url, $this->_qualifier) = - $this->_explodeString8(substr($this->_data, 4), 2); - } - - /** - * Returns the target tag identifier. - * - * @return string - */ - public function getTarget() { return $this->_target; } - - /** - * Sets the target tag identifier. - * - * @param string $target The target tag identifier. - */ - public function setTarget($target) { $this->_target = $target; } - - /** - * Returns the target tag URL. - * - * @return string - */ - public function getUrl() { return $this->_url; } - - /** - * Sets the target tag URL. - * - * @param string $url The target URL. - */ - public function setUrl($url) { $this->_url = $url; } - - /** - * Returns the additional data to identify further the tag. - * - * @return string - */ - public function getQualifier() { return $this->_qualifier; } - - /** - * Sets the additional data to be used in tag identification. - * - * @param string $identifier The qualifier. - */ - public function setQualifier($qualifier) - { - $this->_qualifier = $qualifier; - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - return - Transform::toString8(substr($this->_target, 0, 4), 4) . - $this->_url . "\0" . $this->_qualifier; - } -} diff --git a/src/ID3/Frame/MCDI.php b/src/ID3/Frame/MCDI.php deleted file mode 100644 index 625fd6f..0000000 --- a/src/ID3/Frame/MCDI.php +++ /dev/null @@ -1,86 +0,0 @@ - - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_MCDI extends ID3_Frame -{ - /** - * Returns the CD TOC binary dump. - * - * @return string - */ - public function getData() { return $this->_data; } - - /** - * Sets the CD TOC binary dump. - * - * @param string $data The CD TOC binary dump string. - */ - public function setData($data) { $this->_data = $data; } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() { return $this->_data; } -} diff --git a/src/ID3/Frame/MLLT.php b/src/ID3/Frame/MLLT.php deleted file mode 100644 index ee1218f..0000000 --- a/src/ID3/Frame/MLLT.php +++ /dev/null @@ -1,172 +0,0 @@ -MPEG location lookup table frame includes references that the - * software can use to calculate positions in the file. - * - * The MPEG frames between reference describes how much the frame counter should - * be increased for every reference. If this value is two then the first - * reference points out the second frame, the 2nd reference the 4th frame, the - * 3rd reference the 6th frame etc. In a similar way the bytes between reference - * and milliseconds between reference points out bytes and milliseconds - * respectively. - * - * Each reference consists of two parts; a certain number of bits that describes - * the difference between what is said in bytes between reference and the - * reality and a certain number of bits that describes the difference between - * what is said in milliseconds between reference and the reality. - * - * There may only be one MLLT frame in each tag. - * - * @todo Data parsing and write support - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_MLLT extends ID3_Frame -{ - /** @var integer */ - private $_frames; - - /** @var integer */ - private $_bytes; - - /** @var integer */ - private $_milliseconds; - - /** @var Array */ - private $_deviation = array(); - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) { - require_once("ID3/Exception.php"); - throw new ID3_Exception("Write not supported yet"); - } - - $this->_frames = Transform::fromInt16BE(substr($this->_data, 0, 2)); - $this->_bytes = Transform::fromInt32BE(substr($this->_data, 2, 3)); - $this->_milliseconds = Transform::fromInt32BE(substr($this->_data, 5, 3)); - - $byteDevBits = Transform::fromInt8($this->_data[8]); - $millisDevBits = Transform::fromInt8($this->_data[9]); - - // $data = substr($this->_data, 10); - } - - /** - * Returns the number of MPEG frames between reference. - * - * @return integer - */ - public function getFrames() { return $this->_frames; } - - /** - * Sets the number of MPEG frames between reference. - * - * @param integer $frames The number of MPEG frames. - */ - public function setFrames($frames) { $this->_frames = $frames; } - - /** - * Returns the number of bytes between reference. - * - * @return integer - */ - public function getBytes() { return $this->_bytes; } - - /** - * Sets the number of bytes between reference. - * - * @param integer $bytes The number of bytes. - */ - public function setBytes($bytes) { $this->_bytes = $bytes; } - - /** - * Returns the number of milliseconds between references. - * - * @return integer - */ - public function getMilliseconds() { return $this->_milliseconds; } - - /** - * Sets the number of milliseconds between references. - * - * @param integer $milliseconds The number of milliseconds. - */ - public function setMilliseconds($milliseconds) - { - return $this->_milliseconds; - } - - /** - * Returns the deviations as an array. Each value is an array containing two - * values, ie the deviation in bytes, and the deviation in milliseconds, - * respectively. - * - * @return Array - */ - public function getDeviation() { return $this->_deviation; } - - /** - * Sets the deviations array. The array must consist of arrays, each of which - * having two values, the deviation in bytes, and the deviation in - * milliseconds, respectively. - * - * @param Array $deviation The deviations array. - */ - public function setDeviation($deviation) { $this->_deviation = $deviation; } -} diff --git a/src/ID3/Frame/OWNE.php b/src/ID3/Frame/OWNE.php deleted file mode 100644 index 4af0048..0000000 --- a/src/ID3/Frame/OWNE.php +++ /dev/null @@ -1,238 +0,0 @@ -Ownership frame might be used as a reminder of a made transaction - * or, if signed, as proof. Note that the {@link ID3_Frame_USER} and - * {@link ID3_Frame_TOWN} frames are good to use in conjunction with this one. - * - * There may only be one OWNE frame in a tag. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_OWNE extends ID3_Frame - implements ID3_Encoding -{ - /** @var integer */ - private $_encoding; - - /** @var string */ - private $_currency = "EUR"; - - /** @var string */ - private $_price; - - /** @var string */ - private $_date; - - /** @var string */ - private $_seller; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - $this->_encoding = $this->getOption("encoding", ID3_Encoding::UTF8); - - if ($reader === null) - return; - - $encoding = Transform::fromUInt8($this->_data[0]); - list($tmp, $this->_data) = - $this->_explodeString8(substr($this->_data, 1), 2); - $this->_currency = substr($tmp, 0, 3); - $this->_price = substr($tmp, 3); - $this->_date = substr($this->_data, 0, 8); - $this->_data = substr($this->_data, 8); - - switch ($encoding) { - case self::UTF16: - $this->_seller = $this->_convertString - (Transform::fromString16($this->_data), "utf-16"); - break; - case self::UTF16BE: - $this->_seller = $this->_convertString - (Transform::fromString16($this->_data), "utf-16be"); - break; - case self::UTF8: - $this->_seller = $this->_convertString - (Transform::fromString8($this->_data), "utf-8"); - break; - default: - $this->_seller = $this->_convertString - (Transform::fromString8($this->_data), "iso-8859-1"); - } - } - - /** - * Returns the text encoding. - * - * All the strings read from a file are automatically converted to the - * character encoding specified with the encoding option. See - * {@link ID3v2} for details. This method returns the original text encoding - * used to write the frame. - * - * @return integer - */ - public function getEncoding() { return $this->_encoding; } - - /** - * Sets the text encoding. - * - * All the string written to the frame are done so using given character - * encoding. No conversions of existing data take place upon the call to this - * method thus all texts must be given in given character encoding. - * - * The default character encoding used to write the frame is UTF-8. - * - * @see ID3_Encoding - * @param integer $encoding The text encoding. - */ - public function setEncoding($encoding) { $this->_encoding = $encoding; } - - /** - * Returns the currency used in transaction, encoded according to - * {@link http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/currency_codes/currency_codes_list-1.htm - * ISO 4217} alphabetic currency code. - * - * @return string - */ - public function getCurrency() { return $this->_currency; } - - /** - * Sets the currency used in transaction, encoded according to - * {@link http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/currency_codes/currency_codes_list-1.htm - * ISO 4217} alphabetic currency code. - * - * @param string $currency The currency code. - */ - public function setCurrency($currency) { $this->_currency = $currency; } - - /** - * Returns the price as a numerical string using "." as the decimal separator. - * - * @return string - */ - public function getPrice() { return $this->_price; } - - /** - * Sets the price. - * - * @param integer $price The price. - */ - public function setPrice($price) - { - $this->_price = number_format($price, 2, ".", ""); - } - - /** - * Returns the date of purchase as an 8 character date string (YYYYMMDD). - * - * @return string - */ - public function getDate() { return $this->_date; } - - /** - * Sets the date of purchase. The date must be an 8 character date string - * (YYYYMMDD). - * - * @param string $date The date string. - */ - public function setDate($date) { $this->_date = $date; } - - /** - * Returns the name of the seller. - * - * @return string - */ - public function getSeller() { return $this->_seller; } - - /** - * Sets the name of the seller using given encoding. - * - * @param string $seller The name of the seller. - * @param integer $encoding The text encoding. - */ - public function setSeller($seller, $encoding = false) - { - $this->_seller = $seller; - if ($encoding !== false) - $this->_encoding = $encoding; - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = Transform::toUInt8($this->_encoding) . $this->_currency . - $this->_price . "\0" . $this->_date; - switch ($this->_encoding) { - case self::UTF16LE: - $data .= Transform::toString16 - ($this->_seller, Transform::LITTLE_ENDIAN_ORDER); - break; - case self::UTF16: - case self::UTF16BE: - $data .= Transform::toString16($this->_seller); - break; - default: - $data .= Transform::toString8($this->_seller); - } - return $data; - } -} diff --git a/src/ID3/Frame/PCNT.php b/src/ID3/Frame/PCNT.php deleted file mode 100644 index 233412f..0000000 --- a/src/ID3/Frame/PCNT.php +++ /dev/null @@ -1,111 +0,0 @@ -Play counter is simply a counter of the number of times a file has - * been played. The value is increased by one every time the file begins to - * play. There may only be one PCNT frame in each tag. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_PCNT extends ID3_Frame -{ - /** @var integer */ - private $_counter = 0; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - if (strlen($this->_data) > 4) - $this->_counter = Transform::fromInt64BE($this->_data); // UInt64 - else - $this->_counter = Transform::fromUInt32BE($this->_data); - } - - /** - * Returns the counter. - * - * @return integer - */ - public function getCounter() { return $this->_counter; } - - /** - * Adds counter by one. - */ - public function addCounter() { $this->_counter++; } - - /** - * Sets the counter value. - * - * @param integer $counter The counter value. - */ - public function setCounter($counter) { $this->_counter = $counter; } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - return - $this->_counter > 4294967295 ? - Transform::toInt64BE($this->_counter) : // UInt64 - Transform::toUInt32BE($this->_counter); - } -} diff --git a/src/ID3/Frame/POPM.php b/src/ID3/Frame/POPM.php deleted file mode 100644 index b182a7b..0000000 --- a/src/ID3/Frame/POPM.php +++ /dev/null @@ -1,161 +0,0 @@ -Popularimeter frame is to specify how good an audio - * file is. Many interesting applications could be found to this frame such as a - * playlist that features better audio files more often than others or it could - * be used to profile a person's taste and find other good files by comparing - * people's profiles. The frame contains the email address to the user, one - * rating byte and a four byte play counter, intended to be increased with one - * for every time the file is played. - * - * The rating is 1-255 where 1 is worst and 255 is best. 0 is unknown. If no - * personal counter is wanted it may be omitted. When the counter reaches all - * one's, one byte is inserted in front of the counter thus making the counter - * eight bits bigger in the same away as the play counter - * {@link ID3_Frame_PCNT}. There may be more than one POPM frame in each tag, - * but only one with the same email address. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_POPM extends ID3_Frame -{ - /** @var string */ - private $_owner; - - /** @var integer */ - private $_rating = 0; - - /** @var integer */ - private $_counter = 0; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - list($this->_owner, $this->_data) = $this->_explodeString8($this->_data, 2); - $this->_rating = Transform::fromUInt8($this->_data[0]); - $this->_data = substr($this->_data, 1); - - if (strlen($this->_data) > 4) - $this->_counter = Transform::fromInt64BE($this->_data); // UInt64 - else if (strlen($this->_data) > 0) - $this->_counter = Transform::fromUInt32BE($this->_data); - } - - /** - * Returns the owner identifier string. - * - * @return string - */ - public function getOwner() { return $this->_owner; } - - /** - * Sets the owner identifier string. - * - * @param string $owner The owner identifier string. - */ - public function setOwner($owner) { return $this->_owner = $owner; } - - /** - * Returns the user rating. - * - * @return integer - */ - public function getRating() { return $this->_rating; } - - /** - * Sets the user rating. - * - * @param integer $rating The user rating. - */ - public function setRating($rating) { $this->_rating = $rating; } - - /** - * Returns the counter. - * - * @return integer - */ - public function getCounter() { return $this->_counter; } - - /** - * Adds counter by one. - */ - public function addCounter() { $this->_counter++; } - - /** - * Sets the counter value. - * - * @param integer $counter The counter value. - */ - public function setCounter($counter) { $this->_counter = $counter; } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - return - $this->_owner . "\0" . Transform::toInt8($this->_rating) . - ($this->_counter > 0xffffffff ? - Transform::toInt64BE($this->_counter) : - ($this->_counter > 0 ? Transform::toUInt32BE($this->_counter) : 0)); - } -} diff --git a/src/ID3/Frame/POSS.php b/src/ID3/Frame/POSS.php deleted file mode 100644 index 5b0f67a..0000000 --- a/src/ID3/Frame/POSS.php +++ /dev/null @@ -1,132 +0,0 @@ -Position synchronisation frame delivers information to the - * listener of how far into the audio stream he picked up; in effect, it states - * the time offset from the first frame in the stream. There may only be one - * POSS frame in each tag. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_POSS extends ID3_Frame - implements ID3_Timing -{ - /** @var integer */ - private $_format = ID3_Timing::MPEG_FRAMES; - - /** @var integer */ - private $_position; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - $this->_format = Transform::fromUInt8($this->_data[0]); - $this->_position = Transform::fromUInt32BE(substr($this->_data, 1, 4)); - } - - /** - * Returns the timing format. - * - * @return integer - */ - public function getFormat() { return $this->_format; } - - /** - * Sets the timing format. - * - * @see ID3_Timing - * @param integer $format The timing format. - */ - public function setFormat($format) { $this->_format = $format; } - - /** - * Returns the position where in the audio the listener starts to receive, - * i.e. the beginning of the next frame. - * - * @return integer - */ - public function getPosition() { return $this->_position; } - - /** - * Sets the position where in the audio the listener starts to receive, - * i.e. the beginning of the next frame, using given format. - * - * @param integer $position The position. - * @param integer $format The timing format. - */ - public function setPosition($position, $format = false) - { - $this->_position = $position; - if ($format !== false) - $this->_format = $format; - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - return - Transform::toUInt8($this->_format) . - Transform::toUInt32BE($this->_position); - } -} diff --git a/src/ID3/Frame/PRIV.php b/src/ID3/Frame/PRIV.php deleted file mode 100644 index e340591..0000000 --- a/src/ID3/Frame/PRIV.php +++ /dev/null @@ -1,126 +0,0 @@ -Private frame is used to contain information from a software - * producer that its program uses and does not fit into the other frames. The - * frame consists of an owner identifier string and the binary data. The owner - * identifier is URL containing an email address, or a link to a location where - * an email address can be found, that belongs to the organisation responsible - * for the frame. Questions regarding the frame should be sent to the indicated - * email address. The tag may contain more than one PRIV frame but only with - * different contents. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_PRIV extends ID3_Frame -{ - /** @var string */ - private $_owner; - - /** @var string */ - private $_privateData; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - list($this->_owner, $this->_privateData) = - $this->_explodeString8($this->_data, 2); - } - - /** - * Returns the owner identifier string. - * - * @return string - */ - public function getOwner() { return $this->_owner; } - - /** - * Sets the owner identifier string. - * - * @param string $owner The owner identifier string. - */ - public function setOwner($owner) { $this->_owner = $owner; } - - /** - * Returns the private binary data associated with the frame. - * - * @return string - */ - public function getPrivateData() { return $this->_privateData; } - - /** - * Sets the private binary data associated with the frame. - * - * @param string $privateData The private binary data string. - */ - public function setPrivateData($privateData) - { - $this->_privateData = $privateData; - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - return $this->_owner . "\0" . $this->_privateData; - } -} diff --git a/src/ID3/Frame/RBUF.php b/src/ID3/Frame/RBUF.php deleted file mode 100644 index 87095bf..0000000 --- a/src/ID3/Frame/RBUF.php +++ /dev/null @@ -1,181 +0,0 @@ -Recommended buffer size frame. If the embedded info - * flag is set then this indicates that an ID3 tag with the maximum size - * described in buffer size may occur in the audio stream. In such case the tag - * should reside between two MPEG frames, if the audio is MPEG encoded. If the - * position of the next tag is known, offset to next tag may be used. The offset - * is calculated from the end of tag in which this frame resides to the first - * byte of the header in the next. This field may be omitted. Embedded tags are - * generally not recommended since this could render unpredictable behaviour - * from present software/hardware. - * - * For applications like streaming audio it might be an idea to embed tags into - * the audio stream though. If the clients connects to individual connections - * like HTTP and there is a possibility to begin every transmission with a tag, - * then this tag should include a recommended buffer size frame. If the client - * is connected to a arbitrary point in the stream, such as radio or multicast, - * then the recommended buffer size frame should be included in every tag. - * - * The buffer size should be kept to a minimum. There may only be one RBUF - * frame in each tag. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_RBUF extends ID3_Frame -{ - /** - * A flag to denote that an ID3 tag with the maximum size described in buffer - * size may occur in the audio stream. - */ - const EMBEDDED = 0x1; - - /** @var integer */ - private $_bufferSize; - - /** @var integer */ - private $_infoFlags; - - /** @var integer */ - private $_offset = 0; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - $this->_bufferSize = - Transform::fromUInt32BE("\0" . substr($this->_data, 0, 3)); - $this->_infoFlags = Transform::fromInt8($this->_data[3]); - if ($this->getSize() > 4) - $this->_offset = Transform::fromInt32BE(substr($this->_data, 4, 4)); - } - - /** - * Returns the buffer size. - * - * @return integer - */ - public function getBufferSize() { return $this->_bufferSize; } - - /** - * Sets the buffer size. - * - * @param integer $size The buffer size. - */ - public function setBufferSize($bufferSize) - { - $this->_bufferSize = $bufferSize; - } - - /** - * Checks whether or not the flag is set. Returns true if the flag - * is set, false otherwise. - * - * @param integer $flag The flag to query. - * @return boolean - */ - public function hasInfoFlag($flag) - { - return ($this->_infoFlags & $flag) == $flag; - } - - /** - * Returns the flags byte. - * - * @return integer - */ - public function getInfoFlags() { return $this->_infoFlags; } - - /** - * Sets the flags byte. - * - * @param string $flags The flags byte. - */ - public function setInfoFlags($infoFlags) { $this->_infoFlags = $infoFlags; } - - /** - * Returns the offset to next tag. - * - * @return integer - */ - public function getOffset() { return $this->_offset; } - - /** - * Sets the offset to next tag. - * - * @param integer $offset The offset. - */ - public function setOffset($offset) { $this->_offset = $offset; } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - return - substr(Transform::toUInt32BE($this->_bufferSize), 1, 3) . - Transform::toInt8($this->_infoFlags) . - Transform::toInt32BE($this->_offset); - } -} diff --git a/src/ID3/Frame/RVA2.php b/src/ID3/Frame/RVA2.php deleted file mode 100644 index f54dda1..0000000 --- a/src/ID3/Frame/RVA2.php +++ /dev/null @@ -1,217 +0,0 @@ -Relative volume adjustment (2) frame is a more subjective frame than - * the previous ones. It allows the user to say how much he wants to - * increase/decrease the volume on each channel when the file is played. The - * purpose is to be able to align all files to a reference volume, so that you - * don't have to change the volume constantly. This frame may also be used to - * balance adjust the audio. The volume adjustment is encoded as a fixed point - * decibel value, 16 bit signed integer representing (adjustment*512), giving - * +/- 64 dB with a precision of 0.001953125 dB. E.g. +2 dB is stored as $04 00 - * and -2 dB is $FC 00. - * - * There may be more than one RVA2 frame in each tag, but only one with the same - * identification string. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_RVA2 extends ID3_Frame -{ - /** - * The channel type key. - * - * @see $types - * @var string - */ - const channelType = "channelType"; - - /** - * The volume adjustment key. Adjustments are +/- 64 dB with a precision of - * 0.001953125 dB. - * - * @var string - */ - const volumeAdjustment = "volumeAdjustment"; - - /** - * The peak volume key. - * - * @var string - */ - const peakVolume = "peakVolume"; - - /** - * The list of channel types. - * - * @var Array - */ - public static $types = array - ("Other", "Master volume", "Front right", "Front left", "Back right", - "Back left", "Front centre", "Back centre", "Subwoofer"); - - /** @var string */ - private $_device; - - /** @var Array */ - private $_adjustments; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - list ($this->_device, $this->_data) = - $this->_explodeString8($this->_data, 2); - - for ($i = $j = 0; $i < 9; $i++) { - $this->_adjustments[$i] = array - (self::channelType => Transform::fromInt8($this->_data[$j++]), - self::volumeAdjustment => - Transform::fromInt16BE(substr($this->_data, $j++, 2)) / 512.0); - $j++; - $bitsInPeak = Transform::fromInt8($this->_data[$j++]); - $bytesInPeak = $bitsInPeak > 0 ? ceil($bitsInPeak / 8) : 0; - switch ($bytesInPeak) { - case 8: - case 7: - case 6: - case 5: - $this->_adjustments[$i][self::peakVolume] = - Transform::fromInt64BE(substr($this->_data, $j, $bytesInPeak)); - break; - case 4: - case 3: - $this->_adjustments[$i][self::peakVolume] = - Transform::fromUInt32BE(substr($this->_data, $j, $bytesInPeak)); - break; - case 2: - $this->_adjustments[$i][self::peakVolume] = - Transform::fromUInt16BE(substr($this->_data, $j, $bytesInPeak)); - break; - case 1: - $this->_adjustments[$i][self::peakVolume] = - Transform::fromUInt8(substr($this->_data, $j, $bytesInPeak)); - } - $j += $bytesInPeak; - } - } - - /** - * Returns the device where the adjustments should apply. - * - * @return string - */ - public function getDevice() { return $this->_device; } - - /** - * Sets the device where the adjustments should apply. - * - * @param string $device The device. - */ - public function setDevice($device) { $this->_device = $device; } - - /** - * Returns the array containing volume adjustments for each channel. Volume - * adjustments are arrays themselves containing the following keys: - * channelType, volumeAdjustment, peakVolume. - * - * @return Array - */ - public function getAdjustments() { return $this->_adjustments; } - - /** - * Sets the array of volume adjustments for each channel. Each volume - * adjustment is an array too containing the following keys: channelType, - * volumeAdjustment, peakVolume. - * - * @param Array $adjustments The volume adjustments array. - */ - public function setAdjustments($adjustments) - { - $this->_adjustments = $adjustments; - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = $this->_device . "\0"; - foreach ($this->_adjustments as $channel) { - $data .= Transform::toInt8($channel[self::channelType]) . - Transform::toInt16BE($channel[self::volumeAdjustment] * 512); - if (abs($channel[self::peakVolume]) <= 0xff) - $data .= Transform::toInt8(8) . - Transform::toUInt8($channel[self::peakVolume]); - else if (abs($channel[self::peakVolume]) <= 0xffff) - $data .= Transform::toInt8(16) . - Transform::toUInt16BE($channel[self::peakVolume]); - else if (abs($channel[self::peakVolume]) <= 0xffffffff) - $data .= Transform::toInt8(32) . - Transform::toUInt32BE($channel[self::peakVolume]); - else - $data .= Transform::toInt8(64) . - Transform::toInt64BE($channel[self::peakVolume]); // UInt64 - } - return $data; - } -} diff --git a/src/ID3/Frame/RVAD.php b/src/ID3/Frame/RVAD.php deleted file mode 100644 index 0e0d4e1..0000000 --- a/src/ID3/Frame/RVAD.php +++ /dev/null @@ -1,254 +0,0 @@ -Relative volume adjustment frame is a more subjective function - * than the previous ones. It allows the user to say how much he wants to - * increase/decrease the volume on each channel while the file is played. The - * purpose is to be able to align all files to a reference volume, so that you - * don't have to change the volume constantly. This frame may also be used to - * balance adjust the audio. - * - * There may only be one RVAD frame in each tag. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @deprecated ID3v2.3.0 - */ -final class ID3_Frame_RVAD extends ID3_Frame -{ - /* The required keys. */ - - /** @var string */ - const right = "right"; - - /** @var string */ - const left = "left"; - - /** @var string */ - const peakRight = "peakRight"; - - /** @var string */ - const peakLeft = "peakLeft"; - - /* The optional keys. */ - - /** @var string */ - const rightBack = "rightBack"; - - /** @var string */ - const leftBack = "leftBack"; - - /** @var string */ - const peakRightBack = "peakRightBack"; - - /** @var string */ - const peakLeftBack = "peakLeftBack"; - - /** @var string */ - const center = "center"; - - /** @var string */ - const peakCenter = "peakCenter"; - - /** @var string */ - const bass = "bass"; - - /** @var string */ - const peakBass = "peakBass"; - - /** @var Array */ - private $_adjustments; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - $flags = Transform::fromInt8($this->_data[0]); - $descriptionBits = Transform::fromInt8($this->_data[1]); - if ($descriptionBits <= 8 || $descriptionBits > 16) { - require_once("ID3/Exception.php"); - throw new ID3_Exception - ("Unsupported description bit size of: " . $descriptionBits); - } - - $this->_adjustments[self::right] = - ($flags & 0x1) == 0x1 ? - Transform::fromUInt16BE(substr($this->_data, 2, 2)) : - -Transform::fromUInt16BE(substr($this->_data, 2, 2)); - $this->_adjustments[self::left] = - ($flags & 0x2) == 0x2 ? - Transform::fromUInt16BE(substr($this->_data, 4, 2)) : - -Transform::fromUInt16BE(substr($this->_data, 4, 2)); - $this->_adjustments[self::peakRight] = - Transform::fromUInt16BE(substr($this->_data, 6, 2)); - $this->_adjustments[self::peakLeft] = - Transform::fromUInt16BE(substr($this->_data, 8, 2)); - - if ($this->getSize() <= 10) - return; - - $this->_adjustments[self::rightBack] = - ($flags & 0x4) == 0x4 ? - Transform::fromUInt16BE(substr($this->_data, 10, 2)) : - -Transform::fromUInt16BE(substr($this->_data, 10, 2)); - $this->_adjustments[self::leftBack] = - ($flags & 0x8) == 0x8 ? - Transform::fromUInt16BE(substr($this->_data, 12, 2)) : - -Transform::fromUInt16BE(substr($this->_data, 12, 2)); - $this->_adjustments[self::peakRightBack] = - Transform::fromUInt16BE(substr($this->_data, 14, 2)); - $this->_adjustments[self::peakLeftBack] = - Transform::fromUInt16BE(substr($this->_data, 16, 2)); - - if ($this->getSize() <= 18) - return; - - $this->_adjustments[self::center] = - ($flags & 0x10) == 0x10 ? - Transform::fromUInt16BE(substr($this->_data, 18, 2)) : - -Transform::fromUInt16BE(substr($this->_data, 18, 2)); - $this->_adjustments[self::peakCenter] = - Transform::fromUInt16BE(substr($this->_data, 20, 2)); - - if ($this->getSize() <= 22) - return; - - $this->_adjustments[self::bass] = - ($flags & 0x20) == 0x20 ? - Transform::fromUInt16BE(substr($this->_data, 22, 2)) : - -Transform::fromUInt16BE(substr($this->_data, 22, 2)); - $this->_adjustments[self::peakBass] = - Transform::fromUInt16BE(substr($this->_data, 24, 2)); - } - - /** - * Returns the array containing the volume adjustments. The array must contain - * the following keys: right, left, peakRight, peakLeft. It may optionally - * contain the following keys: rightBack, leftBack, peakRightBack, - * peakLeftBack, center, peakCenter, bass, and peakBass. - * - * @return Array - */ - public function getAdjustments() { return $this->_adjustments; } - - /** - * Sets the array of volume adjustments. The array must contain the following - * keys: right, left, peakRight, peakLeft. It may optionally contain the - * following keys: rightBack, leftBack, peakRightBack, peakLeftBack, center, - * peakCenter, bass, and peakBass. - * - * @param Array $adjustments The volume adjustments array. - */ - public function setAdjustments($adjustments) - { - $this->_adjustments = $adjustments; - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $flags = 0; - if ($this->_adjustments[self::right] > 0) - $flags = $flags | 0x1; - if ($this->_adjustments[self::left] > 0) - $flags = $flags | 0x2; - $data = Transform::toInt8(16) . - Transform::toUInt16BE(abs($this->_adjustments[self::right])) . - Transform::toUInt16BE(abs($this->_adjustments[self::left])) . - Transform::toUInt16BE(abs($this->_adjustments[self::peakRight])) . - Transform::toUInt16BE(abs($this->_adjustments[self::peakLeft])); - - if (isset($this->_adjustments[self::rightBack]) && - isset($this->_adjustments[self::leftBack]) && - isset($this->_adjustments[self::peakRightBack]) && - isset($this->_adjustments[self::peakLeftBack])) { - if ($this->_adjustments[self::rightBack] > 0) - $flags = $flags | 0x4; - if ($this->_adjustments[self::leftBack] > 0) - $flags = $flags | 0x8; - $data .= - Transform::toUInt16BE(abs($this->_adjustments[self::rightBack])) . - Transform::toUInt16BE(abs($this->_adjustments[self::leftBack])) . - Transform::toUInt16BE(abs($this->_adjustments[self::peakRightBack])) . - Transform::toUInt16BE(abs($this->_adjustments[self::peakLeftBack])); - } - - if (isset($this->_adjustments[self::center]) && - isset($this->_adjustments[self::peakCenter])) { - if ($this->_adjustments[self::center] > 0) - $flags = $flags | 0x10; - $data .= - Transform::toUInt16BE(abs($this->_adjustments[self::center])) . - Transform::toUInt16BE(abs($this->_adjustments[self::peakCenter])); - } - - if (isset($this->_adjustments[self::bass]) && - isset($this->_adjustments[self::peakBass])) { - if ($this->_adjustments[self::bass] > 0) - $flags = $flags | 0x20; - $data .= - Transform::toUInt16BE(abs($this->_adjustments[self::bass])) . - Transform::toUInt16BE(abs($this->_adjustments[self::peakBass])); - } - return Transform::toInt8($flags) . $data; - } -} diff --git a/src/ID3/Frame/RVRB.php b/src/ID3/Frame/RVRB.php deleted file mode 100644 index 3443c6d..0000000 --- a/src/ID3/Frame/RVRB.php +++ /dev/null @@ -1,314 +0,0 @@ -Reverb is yet another subjective frame, with which you can adjust - * echoes of different kinds. Reverb left/right is the delay between every - * bounce in milliseconds. Reverb bounces left/right is the number of bounces - * that should be made. $FF equals an infinite number of bounces. Feedback is - * the amount of volume that should be returned to the next echo bounce. $00 is - * 0%, $FF is 100%. If this value were $7F, there would be 50% volume reduction - * on the first bounce, 50% of that on the second and so on. Left to left means - * the sound from the left bounce to be played in the left speaker, while left - * to right means sound from the left bounce to be played in the right speaker. - * - * Premix left to right is the amount of left sound to be mixed in the right - * before any reverb is applied, where $00 id 0% and $FF is 100%. Premix right - * to left does the same thing, but right to left. Setting both premix to $FF - * would result in a mono output (if the reverb is applied symmetric). There may - * only be one RVRB frame in each tag. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_RVRB extends ID3_Frame -{ - /** @var integer */ - private $_reverbLeft; - - /** @var integer */ - private $_reverbRight; - - /** @var integer */ - private $_reverbBouncesLeft; - - /** @var integer */ - private $_reverbBouncesRight; - - /** @var integer */ - private $_reverbFeedbackLtoL; - - /** @var integer */ - private $_reverbFeedbackLtoR; - - /** @var integer */ - private $_reverbFeedbackRtoR; - - /** @var integer */ - private $_reverbFeedbackRtoL; - - /** @var integer */ - private $_premixLtoR; - - /** @var integer */ - private $_premixRtoL; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - $this->_reverbLeft = Transform::fromUInt16BE(substr($this->_data, 0, 2)); - $this->_reverbRight = Transform::fromUInt16BE(substr($this->_data, 2, 2)); - $this->_reverbBouncesLeft = Transform::fromUInt8($this->_data[4]); - $this->_reverbBouncesRight = Transform::fromUInt8($this->_data[5]); - $this->_reverbFeedbackLtoL = Transform::fromUInt8($this->_data[6]); - $this->_reverbFeedbackLtoR = Transform::fromUInt8($this->_data[7]); - $this->_reverbFeedbackRtoR = Transform::fromUInt8($this->_data[8]); - $this->_reverbFeedbackRtoL = Transform::fromUInt8($this->_data[9]); - $this->_premixLtoR = Transform::fromUInt8($this->_data[10]); - $this->_premixRtoL = Transform::fromUInt8($this->_data[11]); - } - - /** - * Returns the left reverb. - * - * @return integer - */ - public function getReverbLeft() { return $this->_reverbLeft; } - - /** - * Sets the left reverb. - * - * @param integer $reverbLeft The left reverb. - */ - public function setReverbLeft($reverbLeft) - { - return $this->_reverbLeft = $reverbLeft; - } - - /** - * Returns the right reverb. - * - * @return integer - */ - public function getReverbRight() { return $this->_reverbRight; } - - /** - * Sets the right reverb. - * - * @param integer $reverbRight The right reverb. - */ - public function setReverbRight($reverbRight) - { - return $this->_reverbRight = $reverbRight; - } - - /** - * Returns the left reverb bounces. - * - * @return integer - */ - public function getReverbBouncesLeft() { return $this->_reverbBouncesLeft; } - - /** - * Sets the left reverb bounces. - * - * @param integer $reverbBouncesLeft The left reverb bounces. - */ - public function setReverbBouncesLeft($reverbBouncesLeft) - { - $this->_reverbBouncesLeft = $reverbBouncesLeft; - } - - /** - * Returns the right reverb bounces. - * - * @return integer - */ - public function getReverbBouncesRight() { return $this->_reverbBouncesRight; } - - /** - * Sets the right reverb bounces. - * - * @param integer $reverbBouncesRight The right reverb bounces. - */ - public function setReverbBouncesRight($reverbBouncesRight) - { - $this->_reverbBouncesRight = $reverbBouncesRight; - } - - /** - * Returns the left-to-left reverb feedback. - * - * @return integer - */ - public function getReverbFeedbackLtoL() { return $this->_reverbFeedbackLtoL; } - - /** - * Sets the left-to-left reverb feedback. - * - * @param integer $reverbFeedbackLtoL The left-to-left reverb feedback. - */ - public function setReverbFeedbackLtoL($reverbFeedbackLtoL) - { - $this->_reverbFeedbackLtoL = $reverbFeedbackLtoL; - } - - /** - * Returns the left-to-right reverb feedback. - * - * @return integer - */ - public function getReverbFeedbackLtoR() { return $this->_reverbFeedbackLtoR; } - - /** - * Sets the left-to-right reverb feedback. - * - * @param integer $reverbFeedbackLtoR The left-to-right reverb feedback. - */ - public function setReverbFeedbackLtoR($reverbFeedbackLtoR) - { - $this->_reverbFeedbackLtoR = $reverbFeedbackLtoR; - } - - /** - * Returns the right-to-right reverb feedback. - * - * @return integer - */ - public function getReverbFeedbackRtoR() { return $this->_reverbFeedbackRtoR; } - - /** - * Sets the right-to-right reverb feedback. - * - * @param integer $reverbFeedbackRtoR The right-to-right reverb feedback. - */ - public function setReverbFeedbackRtoR($reverbFeedbackRtoR) - { - $this->_reverbFeedbackRtoR = $reverbFeedbackRtoR; - } - - /** - * Returns the right-to-left reverb feedback. - * - * @return integer - */ - public function getReverbFeedbackRtoL() { return $this->_reverbFeedbackRtoL; } - - /** - * Sets the right-to-left reverb feedback. - * - * @param integer $reverbFeedbackRtoL The right-to-left reverb feedback. - */ - public function setReverbFeedbackRtoL($reverbFeedbackRtoL) - { - $this->_reverbFeedbackRtoL = $reverbFeedbackRtoL; - } - - /** - * Returns the left-to-right premix. - * - * @return integer - */ - public function getPremixLtoR() { return $this->_premixLtoR; } - - /** - * Sets the left-to-right premix. - * - * @param integer $premixLtoR The left-to-right premix. - */ - public function setPremixLtoR($premixLtoR) - { - $this->_premixLtoR = $premixLtoR; - } - - /** - * Returns the right-to-left premix. - * - * @return integer - */ - public function getPremixRtoL() { return $this->_premixRtoL; } - - /** - * Sets the right-to-left premix. - * - * @param integer $premixRtoL The right-to-left premix. - */ - public function setPremixRtoL($premixRtoL) - { - $this->_premixRtoL = $premixRtoL; - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - return - Transform::toUInt16BE($this->_reverbLeft) . - Transform::toUInt16BE($this->_reverbRight) . - Transform::toUInt8($this->_reverbBouncesLeft) . - Transform::toUInt8($this->_reverbBouncesRight) . - Transform::toUInt8($this->_reverbFeedbackLtoL) . - Transform::toUInt8($this->_reverbFeedbackLtoR) . - Transform::toUInt8($this->_reverbFeedbackRtoR) . - Transform::toUInt8($this->_reverbFeedbackRtoL) . - Transform::toUInt8($this->_premixLtoR) . - Transform::toUInt8($this->_premixRtoL); - } -} diff --git a/src/ID3/Frame/SEEK.php b/src/ID3/Frame/SEEK.php deleted file mode 100644 index 380be46..0000000 --- a/src/ID3/Frame/SEEK.php +++ /dev/null @@ -1,104 +0,0 @@ -Seek frame indicates where other tags in a file/stream can be - * found. The minimum offset to next tag is calculated from the end of this tag - * to the beginning of the next. There may only be one seek frame in a tag. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_SEEK extends ID3_Frame -{ - /** @var integer */ - private $_minOffset; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - $this->_minOffset = Transform::fromInt32BE($this->_data); - } - - /** - * Returns the minimum offset to next tag in bytes. - * - * @return integer - */ - public function getMinimumOffset() { return $this->_minOffset; } - - /** - * Sets the minimum offset to next tag in bytes. - * - * @param integer $minOffset The minimum offset. - */ - public function setMinimumOffset($minOffset) - { - $this->_minOffset = $minOffset; - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - return Transform::toInt32BE($this->_minOffset); - } -} diff --git a/src/ID3/Frame/SIGN.php b/src/ID3/Frame/SIGN.php deleted file mode 100644 index 9a14060..0000000 --- a/src/ID3/Frame/SIGN.php +++ /dev/null @@ -1,122 +0,0 @@ -Group identification registration, to be signed. Although signatures - * can reside inside the registration frame, it might be desired to store the - * signature elsewhere, e.g. in watermarks. There may be more than one signature - * frame in a tag, but no two may be identical. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_SIGN extends ID3_Frame -{ - /** @var integer */ - private $_group; - - /** @var string */ - private $_signature; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - $this->_group = Transform::fromUInt8(substr($this->_data, 0, 1)); - $this->_signature = substr($this->_data, 1); - } - - /** - * Returns the group symbol byte. - * - * @return integer - */ - public function getGroup() { return $this->_group; } - - /** - * Sets the group symbol byte. - * - * @param integer $group The group symbol byte. - */ - public function setGroup($group) { $this->_group = $group; } - - /** - * Returns the signature binary data. - * - * @return string - */ - public function getSignature() { return $this->_signature; } - - /** - * Sets the signature binary data. - * - * @param string $signature The signature binary data string. - */ - public function setSignature($signature) { $this->_signature = $signature; } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - return Transform::toUInt8($this->_group) . $this->_signature; - } -} diff --git a/src/ID3/Frame/SYLT.php b/src/ID3/Frame/SYLT.php deleted file mode 100644 index a92866c..0000000 --- a/src/ID3/Frame/SYLT.php +++ /dev/null @@ -1,340 +0,0 @@ -Synchronised lyrics/text frame is another way of incorporating the - * words, said or sung lyrics, in the audio file as text, this time, however, - * in sync with the audio. It might also be used to describing events e.g. - * occurring on a stage or on the screen in sync with the audio. - * - * There may be more than one SYLT frame in each tag, but only one with the - * same language and content descriptor. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_SYLT extends ID3_Frame - implements ID3_Encoding, ID3_Language, ID3_Timing -{ - /** - * The list of content types. - * - * @var Array - */ - public static $types = array - ("Other", "Lyrics", "Text transcription", "Movement/Part name", "Events", - "Chord", "Trivia", "URLs to webpages", "URLs to images"); - - /** @var integer */ - private $_encoding; - - /** @var string */ - private $_language = "und"; - - /** @var integer */ - private $_format = ID3_Timing::MPEG_FRAMES; - - /** @var integer */ - private $_type = 0; - - /** @var string */ - private $_description; - - /** @var Array */ - private $_events = array(); - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - $this->_encoding = $this->getOption("encoding", ID3_Encoding::UTF8); - - if ($reader === null) - return; - - $encoding = Transform::fromUInt8($this->_data[0]); - $this->_language = substr($this->_data, 1, 3); - if ($this->_language == "XXX") - $this->_language = "und"; - $this->_format = Transform::fromUInt8($this->_data[4]); - $this->_type = Transform::fromUInt8($this->_data[5]); - $this->_data = substr($this->_data, 6); - - switch ($encoding) { - case self::UTF16: - list($this->_description, $this->_data) = - $this->_explodeString16($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16"); - break; - case self::UTF16BE: - list($this->_description, $this->_data) = - $this->_explodeString16($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16be"); - break; - case self::UTF8: - list($this->_description, $this->_data) = - $this->_explodeString8($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString8($this->_description), "utf-8"); - break; - default: - list($this->_description, $this->_data) = - $this->_explodeString8($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString8($this->_description), "iso-8859-1"); - } - - while (strlen($this->_data) > 0) { - switch ($encoding) { - case self::UTF16: - list($syllable, $this->_data) = - $this->_explodeString16($this->_data, 2); - $syllable = $this->_convertString - (Transform::fromString16($syllable), "utf-16"); - break; - case self::UTF16BE: - list($syllable, $this->_data) = - $this->_explodeString16($this->_data, 2); - $syllable = $this->_convertString - (Transform::fromString16($syllable), "utf-16be"); - break; - case self::UTF8: - list($syllable, $this->_data) = - $this->_explodeString8($this->_data, 2); - $syllable = $this->_convertString - (Transform::fromString8($syllable), "utf-8"); - break; - default: - list($syllable, $this->_data) = - $this->_explodeString8($this->_data, 2); - $syllable = $this->_convertString - (Transform::fromString8($syllable), "iso-8859-1"); - } - $this->_events[Transform::fromUInt32BE(substr($this->_data, 0, 4))] = - $syllable; - $this->_data = substr($this->_data, 4); - } - ksort($this->_events); - } - - /** - * Returns the text encoding. - * - * All the strings read from a file are automatically converted to the - * character encoding specified with the encoding option. See - * {@link ID3v2} for details. This method returns the original text encoding - * used to write the frame. - * - * @return integer - */ - public function getEncoding() { return $this->_encoding; } - - /** - * Sets the text encoding. - * - * All the string written to the frame are done so using given character - * encoding. No conversions of existing data take place upon the call to this - * method thus all texts must be given in given character encoding. - * - * The default character encoding used to write the frame is UTF-8. - * - * @see ID3_Encoding - * @param integer $encoding The text encoding. - */ - public function setEncoding($encoding) { $this->_encoding = $encoding; } - - /** - * Returns the language code as specified in the - * {@link http://www.loc.gov/standards/iso639-2/ ISO-639-2} standard. - * - * @return string - */ - public function getLanguage() { return $this->_language; } - - /** - * Sets the text language code as specified in the - * {@link http://www.loc.gov/standards/iso639-2/ ISO-639-2} standard. - * - * @see ID3_Language - * @param string $language The language code. - */ - public function setLanguage($language) - { - if ($language == "XXX") - $language = "und"; - $this->_language = substr($language, 0, 3); - } - - /** - * Returns the timing format. - * - * @return integer - */ - public function getFormat() { return $this->_format; } - - /** - * Sets the timing format. - * - * @see ID3_Timing - * @param integer $format The timing format. - */ - public function setFormat($format) { $this->_format = $format; } - - /** - * Returns the content type code. - * - * @return integer - */ - public function getType() { return $this->_type; } - - /** - * Sets the content type code. - * - * @param integer $type The content type code. - */ - public function setType($type) { $this->_type = $type; } - - /** - * Returns the content description. - * - * @return string - */ - public function getDescription() { return $this->_description; } - - /** - * Sets the content description text using given encoding. The description - * language and encoding must be that of the actual text. - * - * @param string $description The content description text. - * @param string $language The language code. - * @param integer $encoding The text encoding. - */ - public function setDescription($description, $language = false, - $encoding = false) - { - $this->_description = $description; - if ($language !== false) - $this->setLanguage($language); - if ($encoding !== false) - $this->setEncoding($encoding); - } - - /** - * Returns the syllable events with their timestamps. - * - * @return Array - */ - public function getEvents() { return $this->_events; } - - /** - * Sets the syllable events with their timestamps using given encoding. - * The text language and encoding must be that of the description text. - * - * @param Array $text The test string. - * @param string $language The language code. - * @param integer $encoding The text encoding. - */ - public function setEvents($events, $language = false, $encoding = false) - { - $this->_events = $events; - if ($language !== false) - $this->setLanguage($language); - if ($encoding !== false) - $this->setEncoding($encoding); - ksort($this->_events); - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = Transform::toUInt8($this->_encoding) . $this->_language . - Transform::toUInt8($this->_format) . Transform::toUInt8($this->_type); - switch ($this->_encoding) { - case self::UTF16LE: - $data .= Transform::toString16 - ($this->_description, Transform::LITTLE_ENDIAN_ORDER, 1); - break; - case self::UTF16: - case self::UTF16BE: - $data .= Transform::toString16($this->_description, false, 1); - break; - default: - $data .= $this->_description . "\0"; - } - foreach ($this->_events as $timestamp => $syllable) { - switch ($this->_encoding) { - case self::UTF16LE: - $data .= Transform::toString16 - ($syllable, Transform::LITTLE_ENDIAN_ORDER, 1); - break; - case self::UTF16: - case self::UTF16BE: - $data .= Transform::toString16($syllable, false, 1); - break; - default: - $data .= $syllable . "\0"; - } - $data .= Transform::toUInt32BE($timestamp); - } - return $data; - } -} diff --git a/src/ID3/Frame/SYTC.php b/src/ID3/Frame/SYTC.php deleted file mode 100644 index 1654593..0000000 --- a/src/ID3/Frame/SYTC.php +++ /dev/null @@ -1,161 +0,0 @@ -Synchronised tempo codes frame might be used. - * - * The tempo data consists of one or more tempo codes. Each tempo code consists - * of one tempo part and one time part. The tempo is in BPM described with one - * or two bytes. If the first byte has the value $FF, one more byte follows, - * which is added to the first giving a range from 2 - 510 BPM, since $00 and - * $01 is reserved. $00 is used to describe a beat-free time period, which is - * not the same as a music-free time period. $01 is used to indicate one single - * beat-stroke followed by a beat-free period. - * - * The tempo descriptor is followed by a time stamp. Every time the tempo in the - * music changes, a tempo descriptor may indicate this for the player. All tempo - * descriptors must be sorted in chronological order. The first beat-stroke in - * a time-period is at the same time as the beat description occurs. There may - * only be one SYTC frame in each tag. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_SYTC extends ID3_Frame - implements ID3_Timing -{ - /** Describes a beat-free time period. */ - const BEAT_FREE = 0x00; - - /** Indicate one single beat-stroke followed by a beat-free period. */ - const SINGLE_BEAT = 0x01; - - /** @var integer */ - private $_format = ID3_Timing::MPEG_FRAMES; - - /** @var Array */ - private $_events = array(); - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - $offset = 0; - $this->_format = Transform::fromUInt8($this->_data[$offset++]); - while ($offset < strlen($this->_data)) { - $tempo = Transform::fromUInt8($this->_data[$offset++]); - if ($tempo == 0xff) - $tempo += Transform::fromUInt8($this->_data[$offset++]); - $this->_events - [Transform::fromUInt32BE(substr($this->_data, $offset, 4))] = $tempo; - $offset += 4; - } - ksort($this->_events); - } - - /** - * Returns the timing format. - * - * @return integer - */ - public function getFormat() { return $this->_format; } - - /** - * Sets the timing format. - * - * @see ID3_Timing - * @param integer $format The timing format. - */ - public function setFormat($format) { $this->_format = $format; } - - /** - * Returns the time-bpm tempo events. - * - * @return Array - */ - public function getEvents() { return $this->_events; } - - /** - * Sets the time-bpm tempo events. - * - * @param Array $events The time-bpm tempo events. - */ - public function setEvents($events) - { - $this->_events = $events; - ksort($this->_events); - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = Transform::toUInt8($this->_format); - foreach ($this->_events as $timestamp => $tempo) { - if ($tempo >= 0xff) - $data .= Transform::toUInt8(0xff) . Transform::toUInt8($tempo - 0xff); - else - $data .= Transform::toUInt8($tempo); - $data .= Transform::toUInt32BE($timestamp); - } - return $data; - } -} diff --git a/src/ID3/Frame/TALB.php b/src/ID3/Frame/TALB.php deleted file mode 100644 index 8a7492b..0000000 --- a/src/ID3/Frame/TALB.php +++ /dev/null @@ -1,53 +0,0 @@ -Album/Movie/Show title frame is intended for the title of the - * recording (or source of sound) from which the audio in the file is taken. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TALB extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TBPM.php b/src/ID3/Frame/TBPM.php deleted file mode 100644 index 442b680..0000000 --- a/src/ID3/Frame/TBPM.php +++ /dev/null @@ -1,53 +0,0 @@ -BPM frame contains the number of beats per minute in the main part - * of the audio. The BPM is an integer and represented as a numerical string. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TBPM extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TCOM.php b/src/ID3/Frame/TCOM.php deleted file mode 100644 index c7f73ad..0000000 --- a/src/ID3/Frame/TCOM.php +++ /dev/null @@ -1,52 +0,0 @@ -Composer frame is intended for the name of the composer. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TCOM extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TCON.php b/src/ID3/Frame/TCON.php deleted file mode 100644 index 28826e3..0000000 --- a/src/ID3/Frame/TCON.php +++ /dev/null @@ -1,62 +0,0 @@ -Content type, which ID3v1 was stored as a one byte numeric value - * only, is now a string. You may use one or several of the ID3v1 types as - * numerical strings, or, since the category list would be impossible to - * maintain with accurate and up to date categories, define your own. - * - * You may also use any of the following keywords: - * - *
- *  RX  Remix
- *  CR  Cover
- * 
- * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TCON extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TCOP.php b/src/ID3/Frame/TCOP.php deleted file mode 100644 index a389935..0000000 --- a/src/ID3/Frame/TCOP.php +++ /dev/null @@ -1,59 +0,0 @@ -Copyright message frame, in which the string must begin with a - * year and a space character (making five characters), is intended for the - * copyright holder of the original sound, not the audio file itself. The - * absence of this frame means only that the copyright information is - * unavailable or has been removed, and must not be interpreted to mean that the - * audio is public domain. Every time this field is displayed the field must be - * preceded with "Copyright " (C) " ", where (C) is one character showing a C in - * a circle. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TCOP extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TDAT.php b/src/ID3/Frame/TDAT.php deleted file mode 100644 index 3f6be07..0000000 --- a/src/ID3/Frame/TDAT.php +++ /dev/null @@ -1,55 +0,0 @@ -Date frame is a numeric string in the DDMM format containing the - * date for the recording. This field is always four characters long. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @deprecated ID3v2.3.0 - */ -final class ID3_Frame_TDAT extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TDEN.php b/src/ID3/Frame/TDEN.php deleted file mode 100644 index 4b21494..0000000 --- a/src/ID3/Frame/TDEN.php +++ /dev/null @@ -1,56 +0,0 @@ -Encoding time frame contains a timestamp describing when the audio - * was encoded. Timestamp format is described in the - * {@link http://www.id3.org/id3v2.4.0-structure ID3v2 structure document}. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_TDEN extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TDLY.php b/src/ID3/Frame/TDLY.php deleted file mode 100644 index df52531..0000000 --- a/src/ID3/Frame/TDLY.php +++ /dev/null @@ -1,54 +0,0 @@ -Playlist delay defines the numbers of milliseconds of silence that - * should be inserted before this audio. The value zero indicates that this is a - * part of a multifile audio track that should be played continuously. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TDLY extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TDOR.php b/src/ID3/Frame/TDOR.php deleted file mode 100644 index 7e5a3e1..0000000 --- a/src/ID3/Frame/TDOR.php +++ /dev/null @@ -1,57 +0,0 @@ -Original release time frame contains a timestamp describing when - * the original recording of the audio was released. Timestamp format is - * described in the {@link http://www.id3.org/id3v2.4.0-structure ID3v2 - * structure document}. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_TDOR extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TDRC.php b/src/ID3/Frame/TDRC.php deleted file mode 100644 index 5d761e3..0000000 --- a/src/ID3/Frame/TDRC.php +++ /dev/null @@ -1,56 +0,0 @@ -Recording time frame contains a timestamp describing when the - * audio was recorded. Timestamp format is described in the - * {@link http://www.id3.org/id3v2.4.0-structure ID3v2 structure document}. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_TDRC extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TDRL.php b/src/ID3/Frame/TDRL.php deleted file mode 100644 index 454490f..0000000 --- a/src/ID3/Frame/TDRL.php +++ /dev/null @@ -1,56 +0,0 @@ -Release time frame contains a timestamp describing when the audio - * was first released. Timestamp format is described in the - * {@link http://www.id3.org/id3v2.4.0-structure ID3v2 structure document}. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_TDRL extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TDTG.php b/src/ID3/Frame/TDTG.php deleted file mode 100644 index 17525fb..0000000 --- a/src/ID3/Frame/TDTG.php +++ /dev/null @@ -1,56 +0,0 @@ -Tagging time frame contains a timestamp describing then the audio - * was tagged. Timestamp format is described in the - * {@link http://www.id3.org/id3v2.4.0-structure ID3v2 structure document}. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_TDTG extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TENC.php b/src/ID3/Frame/TENC.php deleted file mode 100644 index d3cbf27..0000000 --- a/src/ID3/Frame/TENC.php +++ /dev/null @@ -1,54 +0,0 @@ -Encoded by frame contains the name of the person or organisation - * that encoded the audio file. This field may contain a copyright message, if - * the audio file also is copyrighted by the encoder. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TENC extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TEXT.php b/src/ID3/Frame/TEXT.php deleted file mode 100644 index bf632ab..0000000 --- a/src/ID3/Frame/TEXT.php +++ /dev/null @@ -1,53 +0,0 @@ -Lyricist/Text writer frame is intended for the writer of the text - * or lyrics in the recording. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TEXT extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TFLT.php b/src/ID3/Frame/TFLT.php deleted file mode 100644 index f1e9a01..0000000 --- a/src/ID3/Frame/TFLT.php +++ /dev/null @@ -1,69 +0,0 @@ -File type frame indicates which type of audio this tag defines. - * The following types and refinements are defined: - * - *
- * MIME   MIME type follows
- *  MPG    MPEG Audio
- *    /1     MPEG 1/2 layer I
- *    /2     MPEG 1/2 layer II
- *    /3     MPEG 1/2 layer III
- *    /2.5   MPEG 2.5
- *    /AAC   Advanced audio compression
- *  VQF    Transform-domain Weighted Interleave Vector Quantisation
- *  PCM    Pulse Code Modulated audio
- * 
- * - * but other types may be used, but not for these types though. This is used in - * a similar way to the predefined types in the {@link ID3_Frame_TMED} - * frame. If this frame is not present audio type is assumed to be MPG. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TFLT extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TIME.php b/src/ID3/Frame/TIME.php deleted file mode 100644 index 713226c..0000000 --- a/src/ID3/Frame/TIME.php +++ /dev/null @@ -1,55 +0,0 @@ -Time frame is a numeric string in the HHMM format containing the - * time for the recording. This field is always four characters long. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @deprecated ID3v2.3.0 - */ -final class ID3_Frame_TIME extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TIPL.php b/src/ID3/Frame/TIPL.php deleted file mode 100644 index dfcadde..0000000 --- a/src/ID3/Frame/TIPL.php +++ /dev/null @@ -1,55 +0,0 @@ -Involved people list is very similar to the musician credits list, - * but maps between functions, like producer, and names. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_TIPL extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TIT1.php b/src/ID3/Frame/TIT1.php deleted file mode 100644 index 2f29e77..0000000 --- a/src/ID3/Frame/TIT1.php +++ /dev/null @@ -1,54 +0,0 @@ -Content group description frame is used if the sound belongs to a - * larger category of sounds/music. For example, classical music is often sorted - * in different musical sections (e.g. "Piano Concerto", "Weather - Hurricane"). - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TIT1 extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TIT2.php b/src/ID3/Frame/TIT2.php deleted file mode 100644 index 384de2d..0000000 --- a/src/ID3/Frame/TIT2.php +++ /dev/null @@ -1,53 +0,0 @@ -Title/Songname/Content description frame is the actual name of the - * piece (e.g. "Adagio", "Hurricane Donna"). - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TIT2 extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TIT3.php b/src/ID3/Frame/TIT3.php deleted file mode 100644 index c593da2..0000000 --- a/src/ID3/Frame/TIT3.php +++ /dev/null @@ -1,54 +0,0 @@ -Subtitle/Description refinement frame is used for information - * directly related to the contents title (e.g. "Op. 16" or "Performed live at - * Wembley"). - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TIT3 extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TKEY.php b/src/ID3/Frame/TKEY.php deleted file mode 100644 index dd8d6c4..0000000 --- a/src/ID3/Frame/TKEY.php +++ /dev/null @@ -1,56 +0,0 @@ -Initial key frame contains the musical key in which the sound - * starts. It is represented as a string with a maximum length of three - * characters. The ground keys are represented with "A", "B", "C", "D", "E", "F" - * and "G" and halfkeys represented with "b" and "#". Minor is represented as - * "m", e.g. "Dbm" $00. Off key is represented with an "o" only. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TKEY extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TLAN.php b/src/ID3/Frame/TLAN.php deleted file mode 100644 index 14fd104..0000000 --- a/src/ID3/Frame/TLAN.php +++ /dev/null @@ -1,57 +0,0 @@ -Language frame should contain the languages of the text or lyrics - * spoken or sung in the audio. The language is represented with three - * characters according to {@link http://www.loc.gov/standards/iso639-2/ - * ISO-639-2}. If more than one language is used in the text their language - * codes should follow according to the amount of their usage, e.g. - * "eng" $00 "sve" $00. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TLAN extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TLEN.php b/src/ID3/Frame/TLEN.php deleted file mode 100644 index faf81c1..0000000 --- a/src/ID3/Frame/TLEN.php +++ /dev/null @@ -1,53 +0,0 @@ -Length frame contains the length of the audio file in - * milliseconds, represented as a numeric string. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TLEN extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TMCL.php b/src/ID3/Frame/TMCL.php deleted file mode 100644 index ca75f48..0000000 --- a/src/ID3/Frame/TMCL.php +++ /dev/null @@ -1,56 +0,0 @@ -Musician credits list is intended as a mapping between instruments - * and the musician that played it. Every odd field is an instrument and every - * even is an artist or a comma delimited list of artists. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_TMCL extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TMOO.php b/src/ID3/Frame/TMOO.php deleted file mode 100644 index 72059e6..0000000 --- a/src/ID3/Frame/TMOO.php +++ /dev/null @@ -1,55 +0,0 @@ -Mood frame is intended to reflect the mood of the audio with a few - * keywords, e.g. "Romantic" or "Sad". - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_TMOO extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TOAL.php b/src/ID3/Frame/TOAL.php deleted file mode 100644 index 144e09f..0000000 --- a/src/ID3/Frame/TOAL.php +++ /dev/null @@ -1,54 +0,0 @@ -Original album/movie/show title frame is intended for the title of - * the original recording (or source of sound), if for example the music in the - * file should be a cover of a previously released song. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TOAL extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TOFN.php b/src/ID3/Frame/TOFN.php deleted file mode 100644 index 572a59d..0000000 --- a/src/ID3/Frame/TOFN.php +++ /dev/null @@ -1,54 +0,0 @@ -Original filename frame contains the preferred filename for the - * file, since some media doesn't allow the desired length of the filename. The - * filename is case sensitive and includes its suffix. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TOFN extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TOLY.php b/src/ID3/Frame/TOLY.php deleted file mode 100644 index a4d0eff..0000000 --- a/src/ID3/Frame/TOLY.php +++ /dev/null @@ -1,54 +0,0 @@ -Original lyricist/text writer frame is intended for the text - * writer of the original recording, if for example the music in the file should - * be a cover of a previously released song. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TOLY extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TOPE.php b/src/ID3/Frame/TOPE.php deleted file mode 100644 index b3d4fe6..0000000 --- a/src/ID3/Frame/TOPE.php +++ /dev/null @@ -1,54 +0,0 @@ -Original artist/performer frame is intended for the performer of - * the original recording, if for example the music in the file should be a - * cover of a previously released song. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TOPE extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TORY.php b/src/ID3/Frame/TORY.php deleted file mode 100644 index d273bd6..0000000 --- a/src/ID3/Frame/TORY.php +++ /dev/null @@ -1,57 +0,0 @@ -Original release year frame is intended for the year when the - * original recording, if for example the music in the file should be a cover of - * a previously released song, was released. The field is formatted as in the - * {@link ID3_Frame_TYER} frame. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @deprecated ID3v2.3.0 - */ -final class ID3_Frame_TORY extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TOWN.php b/src/ID3/Frame/TOWN.php deleted file mode 100644 index 072f4b9..0000000 --- a/src/ID3/Frame/TOWN.php +++ /dev/null @@ -1,53 +0,0 @@ -File owner/licensee frame contains the name of the owner or - * licensee of the file and it's contents. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TOWN extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TPE1.php b/src/ID3/Frame/TPE1.php deleted file mode 100644 index bd82147..0000000 --- a/src/ID3/Frame/TPE1.php +++ /dev/null @@ -1,53 +0,0 @@ -Lead artist/Lead performer/Soloist/Performing group is used for - * the main artist. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TPE1 extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TPE2.php b/src/ID3/Frame/TPE2.php deleted file mode 100644 index 0104db9..0000000 --- a/src/ID3/Frame/TPE2.php +++ /dev/null @@ -1,53 +0,0 @@ -Band/Orchestra/Accompaniment frame is used for additional - * information about the performers in the recording. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TPE2 extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TPE3.php b/src/ID3/Frame/TPE3.php deleted file mode 100644 index a1d172c..0000000 --- a/src/ID3/Frame/TPE3.php +++ /dev/null @@ -1,52 +0,0 @@ -Conductor frame is used for the name of the conductor. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TPE3 extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TPE4.php b/src/ID3/Frame/TPE4.php deleted file mode 100644 index 6977164..0000000 --- a/src/ID3/Frame/TPE4.php +++ /dev/null @@ -1,54 +0,0 @@ -Interpreted, remixed, or otherwise modified by frame contains more - * information about the people behind a remix and similar interpretations of - * another existing piece. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TPE4 extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TPOS.php b/src/ID3/Frame/TPOS.php deleted file mode 100644 index 5fd1458..0000000 --- a/src/ID3/Frame/TPOS.php +++ /dev/null @@ -1,56 +0,0 @@ -Part of a set frame is a numeric string that describes which part - * of a set the audio came from. This frame is used if the source described in - * the {@link ID3_Frame_TALB} frame is divided into several mediums, e.g. - * a double CD. The value may be extended with a "/" character and a numeric - * string containing the total number of parts in the set. E.g. "1/2". - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TPOS extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TPRO.php b/src/ID3/Frame/TPRO.php deleted file mode 100644 index f4073f1..0000000 --- a/src/ID3/Frame/TPRO.php +++ /dev/null @@ -1,61 +0,0 @@ -Produced notice frame, in which the string must begin with a year - * and a space character (making five characters), is intended for the - * production copyright holder of the original sound, not the audio file itself. - * The absence of this frame means only that the production copyright - * information is unavailable or has been removed, and must not be interpreted - * to mean that the audio is public domain. Every time this field is displayed - * the field must be preceded with "Produced " (P) " ", where (P) is one - * character showing a P in a circle. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_TPRO extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TPUB.php b/src/ID3/Frame/TPUB.php deleted file mode 100644 index b54efdb..0000000 --- a/src/ID3/Frame/TPUB.php +++ /dev/null @@ -1,53 +0,0 @@ -Publisher frame simply contains the name of the label or - * publisher. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TPUB extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TRCK.php b/src/ID3/Frame/TRCK.php deleted file mode 100644 index bffc7c6..0000000 --- a/src/ID3/Frame/TRCK.php +++ /dev/null @@ -1,55 +0,0 @@ -Track number/Position in set frame is a numeric string containing - * the order number of the audio-file on its original recording. This may be - * extended with a "/" character and a numeric string containing the total - * number of tracks/elements on the original recording. E.g. "4/9". - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TRCK extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TRDA.php b/src/ID3/Frame/TRDA.php deleted file mode 100644 index 1911ed6..0000000 --- a/src/ID3/Frame/TRDA.php +++ /dev/null @@ -1,57 +0,0 @@ -Recording dates frame is intended to be used as complement to - * the {@link ID3_Frame_TYER}, {@link ID3_Frame_TDAT} and {@link ID3_Frame_TIME} - * frames. E.g. "4th-7th June, 12th June" in combination with the - * {@link ID3_Frame_TYER} frame. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @deprecated ID3v2.3.0 - */ -final class ID3_Frame_TRDA extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TRSN.php b/src/ID3/Frame/TRSN.php deleted file mode 100644 index e12c048..0000000 --- a/src/ID3/Frame/TRSN.php +++ /dev/null @@ -1,53 +0,0 @@ -Internet radio station name frame contains the name of the - * internet radio station from which the audio is streamed. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TRSN extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TRSO.php b/src/ID3/Frame/TRSO.php deleted file mode 100644 index 7d5a164..0000000 --- a/src/ID3/Frame/TRSO.php +++ /dev/null @@ -1,53 +0,0 @@ -Internet radio station owner frame contains the name of the owner - * of the internet radio station from which the audio is streamed. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TRSO extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TSIZ.php b/src/ID3/Frame/TSIZ.php deleted file mode 100644 index d1551cd..0000000 --- a/src/ID3/Frame/TSIZ.php +++ /dev/null @@ -1,55 +0,0 @@ -Size frame contains the size of the audiofile in bytes, excluding - * the ID3v2 tag, represented as a numeric string. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @deprecated ID3v2.3.0 - */ -final class ID3_Frame_TSIZ extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TSOA.php b/src/ID3/Frame/TSOA.php deleted file mode 100644 index 5e6942a..0000000 --- a/src/ID3/Frame/TSOA.php +++ /dev/null @@ -1,55 +0,0 @@ -Album sort order frame defines a string which should be used - * instead of the {@link ID3_Frame_TALB} album name frame for sorting purposes. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_TSOA extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TSOP.php b/src/ID3/Frame/TSOP.php deleted file mode 100644 index 04f3523..0000000 --- a/src/ID3/Frame/TSOP.php +++ /dev/null @@ -1,55 +0,0 @@ -Performer sort order frame defines a string which should be used - * instead of the {@link ID3_Frame_TPE2} performer frame for sorting purposes. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_TSOP extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TSOT.php b/src/ID3/Frame/TSOT.php deleted file mode 100644 index 0fb1e82..0000000 --- a/src/ID3/Frame/TSOT.php +++ /dev/null @@ -1,55 +0,0 @@ -Title sort order frame defines a string which should be used - * instead of the {@link ID3_Frame_TIT2} title frame for sorting purposes. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_TSOT extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TSRC.php b/src/ID3/Frame/TSRC.php deleted file mode 100644 index 93f604a..0000000 --- a/src/ID3/Frame/TSRC.php +++ /dev/null @@ -1,53 +0,0 @@ -ISRC frame should contain the International Standard Recording - * Code (12 characters). - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_ISRC extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TSSE.php b/src/ID3/Frame/TSSE.php deleted file mode 100644 index 9c1122b..0000000 --- a/src/ID3/Frame/TSSE.php +++ /dev/null @@ -1,54 +0,0 @@ -Software/Hardware and settings used for encoding frame includes - * the used audio encoder and its settings when the file was encoded. Hardware - * refers to hardware encoders, not the computer on which a program was run. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TSSE extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TSST.php b/src/ID3/Frame/TSST.php deleted file mode 100644 index c997ace..0000000 --- a/src/ID3/Frame/TSST.php +++ /dev/null @@ -1,55 +0,0 @@ -Set subtitle frame is intended for the subtitle of the part of a - * set this track belongs to. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @since ID3v2.4.0 - */ -final class ID3_Frame_TSST extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/TXXX.php b/src/ID3/Frame/TXXX.php deleted file mode 100644 index 95ede88..0000000 --- a/src/ID3/Frame/TXXX.php +++ /dev/null @@ -1,159 +0,0 @@ - - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_TXXX extends ID3_Frame_AbstractText -{ - /** @var string */ - private $_description; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - ID3_Frame::__construct($reader, $options); - - $this->_encoding = $this->getOption("encoding", ID3_Encoding::UTF8); - - if ($reader === null) - return; - - $encoding = Transform::fromUInt8($this->_data[0]); - $this->_data = substr($this->_data, 1); - - switch ($encoding) { - case self::UTF16: - list($this->_description, $this->_text) = - $this->_explodeString16($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16"); - $this->_text = $this->_convertString - (array(Transform::fromString16($this->_text)), "utf-16"); - break; - case self::UTF16BE: - list($this->_description, $this->_text) = - $this->_explodeString16($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16be"); - $this->_text = $this->_convertString - (array(Transform::fromString16($this->_text)), "utf-16be"); - break; - case self::UTF8: - list($this->_description, $this->_text) = $this->_convertString - ($this->_explodeString8($this->_data, 2), "utf-8"); - $this->_text = array($this->_text); - break; - default: - list($this->_description, $this->_text) = $this->_convertString - ($this->_explodeString8($this->_data, 2), "iso-8859-1"); - $this->_text = array($this->_text); - } - } - - /** - * Returns the description text. - * - * @return string - */ - public function getDescription() { return $this->_description; } - - /** - * Sets the description text using given encoding. - * - * @param string $description The content description text. - * @param integer $encoding The text encoding. - */ - public function setDescription($description, $encoding = false) - { - $this->_description = $description; - if ($encoding !== false) - $this->_encoding = $encoding; - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = Transform::toUInt8($this->_encoding); - switch ($this->_encoding) { - case self::UTF16LE: - $data .= Transform::toString16 - ($this->_description, Transform::LITTLE_ENDIAN_ORDER, 1) . - Transform::toString16 - ($this->_text[0], Transform::LITTLE_ENDIAN_ORDER, 1); - break; - case self::UTF16: - case self::UTF16BE: - $data .= Transform::toString16($this->_description, false, 1) . - Transform::toString16($this->_text[0], false, 1); - break; - default: - $data .= $this->_description . "\0" . $this->_text[0]; - } - return $data; - } -} - diff --git a/src/ID3/Frame/TYER.php b/src/ID3/Frame/TYER.php deleted file mode 100644 index 350c33d..0000000 --- a/src/ID3/Frame/TYER.php +++ /dev/null @@ -1,55 +0,0 @@ -Year frame is a numeric string with a year of the recording. This - * frames is always four characters long (until the year 10000). - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - * @deprecated ID3v2.3.0 - */ -final class ID3_Frame_TYER extends ID3_Frame_AbstractText {} diff --git a/src/ID3/Frame/USER.php b/src/ID3/Frame/USER.php deleted file mode 100644 index ef365df..0000000 --- a/src/ID3/Frame/USER.php +++ /dev/null @@ -1,205 +0,0 @@ -Terms of use frame contains a brief description of the terms of - * use and ownership of the file. More detailed information concerning the legal - * terms might be available through the {@link ID3_Frame_WCOP} frame. Newlines - * are allowed in the text. There may be more than one Terms of use frames in a - * tag, but only one with the same language. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_USER extends ID3_Frame - implements ID3_Encoding, ID3_Language -{ - /** @var integer */ - private $_encoding; - - /** @var string */ - private $_language = "und"; - - /** @var string */ - private $_text; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - $this->_encoding = $this->getOption("encoding", ID3_Encoding::UTF8); - - if ($reader === null) - return; - - $encoding = Transform::fromUInt8($this->_data[0]); - $this->_language = substr($this->_data, 1, 3); - if ($this->_language == "XXX") - $this->_language = "und"; - $this->_data = substr($this->_data, 4); - - switch ($encoding) { - case self::UTF16: - $this->_text = $this->_convertString - (Transform::fromString16($this->_data), "utf-16"); - break; - case self::UTF16BE: - $this->_text = $this->_convertString - (Transform::fromString16($this->_data), "utf-16be"); - break; - case self::UTF8: - $this->_text = $this->_convertString - (Transform::fromString8($this->_data), "utf-8"); - break; - default: - $this->_text = $this->_convertString - (Transform::fromString8($this->_data), "iso-8859-1"); - } - } - - /** - * Returns the text encoding. - * - * All the strings read from a file are automatically converted to the - * character encoding specified with the encoding option. See - * {@link ID3v2} for details. This method returns the original text encoding - * used to write the frame. - * - * @return integer - */ - public function getEncoding() { return $this->_encoding; } - - /** - * Sets the text encoding. - * - * All the string written to the frame are done so using given character - * encoding. No conversions of existing data take place upon the call to this - * method thus all texts must be given in given character encoding. - * - * The default character encoding used to write the frame is UTF-8. - * - * @see ID3_Encoding - * @param integer $encoding The text encoding. - */ - public function setEncoding($encoding) { $this->_encoding = $encoding; } - - /** - * Returns the language code as specified in the - * {@link http://www.loc.gov/standards/iso639-2/ ISO-639-2} standard. - * - * @return string - */ - public function getLanguage() { return $this->_language; } - - /** - * Sets the text language code as specified in the - * {@link http://www.loc.gov/standards/iso639-2/ ISO-639-2} standard. - * - * @see ID3_Language - * @param string $language The language code. - */ - public function setLanguage($language) - { - if ($language == "XXX") - $language = "und"; - $this->_language = substr($language, 0, 3); - } - - /** - * Returns the text. - * - * @return string - */ - public function getText() { return $this->_text; } - - /** - * Sets the text using given language and encoding. - * - * @param string $text The text. - * @param string $language The language code. - * @param integer $encoding The text encoding. - */ - public function setText($text, $language = false, $encoding = false) - { - $this->_text = $text; - if ($language !== false) - $this->setLanguage($language); - if ($encoding !== false) - $this->setEncoding($encoding); - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = Transform::toUInt8($this->_encoding) . $this->_language; - switch ($this->_encoding) { - case self::UTF16LE: - $data .= Transform::toString16 - ($this->_text, Transform::MACHINE_ENDIAN_ORDER); - break; - case self::UTF16: - case self::UTF16BE: - $data .= Transform::toString16($this->_text); - break; - default: - $data .= $this->_text; - } - return $data; - } -} diff --git a/src/ID3/Frame/USLT.php b/src/ID3/Frame/USLT.php deleted file mode 100644 index 33e2257..0000000 --- a/src/ID3/Frame/USLT.php +++ /dev/null @@ -1,251 +0,0 @@ -Unsynchronised lyrics/text transcription frame contains the lyrics - * of the song or a text transcription of other vocal activities. There may be - * more than one unsynchronised lyrics/text transcription frame in each tag, but - * only one with the same language and content descriptor. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_USLT extends ID3_Frame - implements ID3_Encoding, ID3_Language -{ - /** @var integer */ - private $_encoding; - - /** @var string */ - private $_language = "und"; - - /** @var string */ - private $_description; - - /** @var string */ - private $_text; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - $this->_encoding = $this->getOption("encoding", ID3_Encoding::UTF8); - - if ($reader === null) - return; - - $encoding = Transform::fromUInt8($this->_data[0]); - $this->_language = substr($this->_data, 1, 3); - if ($this->_language == "XXX") - $this->_language = "und"; - $this->_data = substr($this->_data, 4); - - switch ($encoding) { - case self::UTF16: - list ($this->_description, $this->_text) = - $this->_explodeString16($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16"); - $this->_text = $this->_convertString - (Transform::fromString16($this->_text), "utf-16"); - break; - case self::UTF16BE: - list ($this->_description, $this->_text) = - $this->_explodeString16($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16be"); - $this->_text = $this->_convertString - (Transform::fromString16($this->_text), "utf-16be"); - break; - case self::UTF8: - list ($this->_description, $this->_text) = - $this->_explodeString8($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString8($this->_description), "utf-8"); - $this->_text = $this->_convertString - (Transform::fromString8($this->_text), "utf-8"); - break; - default: - list ($this->_description, $this->_text) = - $this->_explodeString8($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString8($this->_description), "iso-8859-1"); - $this->_text = $this->_convertString - (Transform::fromString8($this->_text), "iso-8859-1"); - } - } - - /** - * Returns the text encoding. - * - * All the strings read from a file are automatically converted to the - * character encoding specified with the encoding option. See - * {@link ID3v2} for details. This method returns the original text encoding - * used to write the frame. - * - * @return integer - */ - public function getEncoding() { return $this->_encoding; } - - /** - * Sets the text encoding. - * - * All the string written to the frame are done so using given character - * encoding. No conversions of existing data take place upon the call to this - * method thus all texts must be given in given character encoding. - * - * The default character encoding used to write the frame is UTF-8. - * - * @see ID3_Encoding - * @param integer $encoding The text encoding. - */ - public function setEncoding($encoding) { $this->_encoding = $encoding; } - - /** - * Returns the language code as specified in the - * {@link http://www.loc.gov/standards/iso639-2/ ISO-639-2} standard. - * - * @return string - */ - public function getLanguage() { return $this->_language; } - - /** - * Sets the text language code as specified in the - * {@link http://www.loc.gov/standards/iso639-2/ ISO-639-2} standard. - * - * @see ID3_Language - * @param string $language The language code. - */ - public function setLanguage($language) - { - if ($language == "XXX") - $language = "und"; - $this->_language = substr($language, 0, 3); - } - - /** - * Returns the short content description. - * - * @return string - */ - public function getDescription() { return $this->_description; } - - /** - * Sets the content description text using given encoding. The description - * language and encoding must be that of the actual text. - * - * @param string $description The content description text. - * @param string $language The language code. - * @param integer $encoding The text encoding. - */ - public function setDescription($description, $language = false, - $encoding = false) - { - $this->_description = $description; - if ($language !== false) - $this->setLanguage($language); - if ($encoding !== false) - $this->setEncoding($encoding); - } - - /** - * Returns the lyrics/text. - * - * @return string - */ - public function getText() { return $this->_text; } - - /** - * Sets the text using given encoding. The text language and encoding must be - * that of the description text. - * - * @param mixed $text The test string. - * @param string $language The language code. - * @param integer $encoding The text encoding. - */ - public function setText($text, $language = false, $encoding = false) - { - $this->_text = $text; - if ($language !== false) - $this->setLanguage($language); - if ($encoding !== false) - $this->setEncoding($encoding); - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = Transform::toUInt8($this->_encoding) . $this->_language; - switch ($this->_encoding) { - case self::UTF16LE: - $data .= Transform::toString16 - ($this->_description, Transform::LITTLE_ENDIAN_ORDER) . "\0\0" . - Transform::toString16($this->_text, Transform::LITTLE_ENDIAN_ORDER); - break; - case self::UTF16: - case self::UTF16BE: - $data .= Transform::toString16($this->_description) . "\0\0" . - Transform::toString16($this->_text); - break; - default: - $data .= $this->_description . "\0" . $this->_text; - } - return $data; - } -} diff --git a/src/ID3/Frame/Unknown.php b/src/ID3/Frame/Unknown.php deleted file mode 100644 index d3c6b27..0000000 --- a/src/ID3/Frame/Unknown.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright Copyright (c) 2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_Unknown extends ID3_Frame -{ - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() { return $this->_data; } -} diff --git a/src/ID3/Frame/WCOM.php b/src/ID3/Frame/WCOM.php deleted file mode 100644 index d976f29..0000000 --- a/src/ID3/Frame/WCOM.php +++ /dev/null @@ -1,54 +0,0 @@ -Commercial information frame is a URL pointing at a webpage with - * information such as where the album can be bought. There may be more than one - * WCOM frame in a tag, but not with the same content. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_WCOM extends ID3_Frame_AbstractLink {} diff --git a/src/ID3/Frame/WCOP.php b/src/ID3/Frame/WCOP.php deleted file mode 100644 index 0115a32..0000000 --- a/src/ID3/Frame/WCOP.php +++ /dev/null @@ -1,53 +0,0 @@ -Copyright/Legal information frame is a URL pointing at a webpage - * where the terms of use and ownership of the file is described. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_WCOP extends ID3_Frame_AbstractLink {} diff --git a/src/ID3/Frame/WOAF.php b/src/ID3/Frame/WOAF.php deleted file mode 100644 index 50df02a..0000000 --- a/src/ID3/Frame/WOAF.php +++ /dev/null @@ -1,53 +0,0 @@ -Official audio file webpage frame is a URL pointing at a file - * specific webpage. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_WOAF extends ID3_Frame_AbstractLink {} diff --git a/src/ID3/Frame/WOAR.php b/src/ID3/Frame/WOAR.php deleted file mode 100644 index ec32302..0000000 --- a/src/ID3/Frame/WOAR.php +++ /dev/null @@ -1,54 +0,0 @@ -Official artist/performer webpage frame is a URL pointing at the - * artists official webpage. There may be more than one WOAR frame in a tag if - * the audio contains more than one performer, but not with the same content. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_WOAR extends ID3_Frame_AbstractLink {} diff --git a/src/ID3/Frame/WOAS.php b/src/ID3/Frame/WOAS.php deleted file mode 100644 index 7961bea..0000000 --- a/src/ID3/Frame/WOAS.php +++ /dev/null @@ -1,53 +0,0 @@ -Official audio source webpage frame is a URL pointing at the - * official webpage for the source of the audio file, e.g. a movie. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_WOAS extends ID3_Frame_AbstractLink {} diff --git a/src/ID3/Frame/WORS.php b/src/ID3/Frame/WORS.php deleted file mode 100644 index 1ea09a8..0000000 --- a/src/ID3/Frame/WORS.php +++ /dev/null @@ -1,53 +0,0 @@ -Official Internet radio station homepage contains a URL pointing - * at the homepage of the internet radio station. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_WORS extends ID3_Frame_AbstractLink {} diff --git a/src/ID3/Frame/WPAY.php b/src/ID3/Frame/WPAY.php deleted file mode 100644 index 1c724da..0000000 --- a/src/ID3/Frame/WPAY.php +++ /dev/null @@ -1,53 +0,0 @@ -Payment frame is a URL pointing at a webpage that will handle the - * process of paying for this file. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_WPAY extends ID3_Frame_AbstractLink {} diff --git a/src/ID3/Frame/WPUB.php b/src/ID3/Frame/WPUB.php deleted file mode 100644 index d5461b6..0000000 --- a/src/ID3/Frame/WPUB.php +++ /dev/null @@ -1,53 +0,0 @@ -Publishers official webpage frame is a URL pointing at the - * official webpage for the publisher. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_WPUB extends ID3_Frame_AbstractLink {} diff --git a/src/ID3/Frame/WXXX.php b/src/ID3/Frame/WXXX.php deleted file mode 100644 index e758079..0000000 --- a/src/ID3/Frame/WXXX.php +++ /dev/null @@ -1,181 +0,0 @@ - - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Frame_WXXX extends ID3_Frame_AbstractLink - implements ID3_Encoding -{ - /** @var integer */ - private $_encoding; - - /** @var string */ - private $_description; - - /** - * Constructs the class with given parameters and parses object related data. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - ID3_Frame::__construct($reader, $options); - - $this->_encoding = $this->getOption("encoding", ID3_Encoding::UTF8); - - if ($reader === null) - return; - - $encoding = Transform::fromUInt8($this->_data[0]); - $this->_data = substr($this->_data, 1); - - switch ($encoding) { - case self::UTF16: - list($this->_description, $this->_link) = - $this->_explodeString16($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16"); - break; - case self::UTF16BE: - list($this->_description, $this->_link) = - $this->_explodeString16($this->_data, 2); - $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16be"); - break; - case self::UTF8: - list($this->_description, $this->_link) = - $this->_explodeString8($this->_data, 2); - $this->_description = $this->_convertString($this->_description, "utf-8"); - break; - default: - list($this->_description, $this->_link) = - $this->_explodeString8($this->_data, 2); - $this->_description = $this->_convertString - ($this->_description, "iso-8859-1"); - } - $this->_link = implode($this->_explodeString8($this->_link, 1), ""); - } - - /** - * Returns the text encoding. - * - * All the strings read from a file are automatically converted to the - * character encoding specified with the encoding option. See - * {@link ID3v2} for details. This method returns the original text encoding - * used to write the frame. - * - * @return integer The encoding. - */ - public function getEncoding() { return $this->_encoding; } - - /** - * Sets the text encoding. - * - * All the string written to the frame are done so using given character - * encoding. No conversions of existing data take place upon the call to this - * method thus all texts must be given in given character encoding. - * - * The default character encoding used to write the frame is UTF-8. - * - * @see ID3_Encoding - * @param integer $encoding The text encoding. - */ - public function setEncoding($encoding) { $this->_encoding = $encoding; } - - /** - * Returns the link description. - * - * @return string - */ - public function getDescription() { return $this->_description; } - - /** - * Sets the content description text using given encoding. - * - * @param string $description The content description text. - * @param integer $encoding The text encoding. - */ - public function setDescription($description, $encoding = false) - { - $this->_description = $description; - if ($encoding !== false) - $this->_encoding = $encoding; - } - - /** - * Returns the frame raw data without the header. - * - * @return string - */ - protected function _getData() - { - $data = Transform::toUInt8($this->_encoding); - switch ($this->_encoding) { - case self::UTF16LE: - $data .= Transform::toString16 - ($this->_description, Tranform::LITTLE_ENDIAN_ORDER, 1); - break; - case self::UTF16: - case self::UTF16BE: - $data .= Transform::toString16($this->_description, false, 1); - break; - default: - $data .= Transform::toString8($this->_description, 1); - } - return $data . $this->_link; - } -} diff --git a/src/ID3/Header.php b/src/ID3/Header.php deleted file mode 100644 index cd8c5e6..0000000 --- a/src/ID3/Header.php +++ /dev/null @@ -1,174 +0,0 @@ - - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3_Header extends ID3_Object -{ - /** A flag to denote whether or not unsynchronisation is applied on all - frames */ - const UNSYNCHRONISATION = 128; - - /** A flag to denote whether or not the header is followed by an extended - header */ - const EXTENDEDHEADER = 64; - - /** A flag used as an experimental indicator. This flag shall always be set - when the tag is in an experimental stage. */ - const EXPERIMENTAL = 32; - - /** - * A flag to denote whether a footer is present at the very end of the tag. - * - * @since ID3v2.4.0 - */ - const FOOTER = 16; - - /** @var integer */ - private $_version = 4.0; - - /** @var integer */ - private $_flags = 0; - - /** @var integer */ - private $_size; - - /** - * Constructs the class with given parameters and reads object related data - * from the ID3v2 tag. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - parent::__construct($reader, $options); - - if ($reader === null) - return; - - $this->_version = $options["version"] = - $this->_reader->readInt8() + $this->_reader->readInt8() / 10; - $this->_flags = $this->_reader->readInt8(); - $this->_size = $this->_decodeSynchsafe32($this->_reader->readUInt32BE()); - } - - /** - * Returns the tag version number. The version number is in the form of - * major.revision. - * - * @return integer - */ - public function getVersion() { return $this->_version; } - - /** - * Sets the tag version number. Supported version numbers are 3.0 and 4.0 - * for ID3v2.3.0 and ID3v2.4.0 standards, respectively. - * - * @param integer $version The tag version number in the form of - * major.revision. - */ - public function setVersion($version) - { - $this->setOption("version", $this->_version = $version); - } - - /** - * Checks whether or not the flag is set. Returns true if the flag - * is set, false otherwise. - * - * @param integer $flag The flag to query. - * @return boolean - */ - public function hasFlag($flag) { return ($this->_flags & $flag) == $flag; } - - /** - * Returns the flags byte. - * - * @return integer - */ - public function getFlags() { return $this->_flags; } - - /** - * Sets the flags byte. - * - * @param string $flags The flags byte. - */ - public function setFlags($flags) { $this->_flags = $flags; } - - /** - * Returns the tag size, excluding the header and the footer. - * - * @return integer - */ - public function getSize() { return $this->_size; } - - /** - * Sets the tag size, excluding the header and the footer. Called - * automatically upon tag generation to adjust the tag size. - * - * @param integer $size The size of the tag, in bytes. - */ - public function setSize($size) { $this->_size = $size; } - - /** - * Returns the header/footer data without the identifier. - * - * @return string - */ - public function __toString() - { - return Transform::toInt8(floor($this->_version)) . - Transform::toInt8(($this->_version - floor($this->_version)) * 10) . - Transform::toInt8($this->_flags) . - Transform::toUInt32BE($this->_encodeSynchsafe32($this->_size)); - } -} diff --git a/src/ID3/Language.php b/src/ID3/Language.php deleted file mode 100644 index e4f6336..0000000 --- a/src/ID3/Language.php +++ /dev/null @@ -1,69 +0,0 @@ -Language interface implies that the ID3v2 frame supports - * its content to be given in multiple languages. - * - * The three byte language code is used to describe the language of the frame's - * content, according to {@link http://www.loc.gov/standards/iso639-2/ - * ISO-639-2}. The language should be represented in lower case. If the language - * is not known the string "xxx" should be used. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -interface ID3_Language -{ - /** - * Returns the text language code. - * - * @return string - */ - public function getLanguage(); - - /** - * Sets the text language code. - * - * @param string $language The text language code. - */ - public function setLanguage($language); -} diff --git a/src/ID3/Object.php b/src/ID3/Object.php deleted file mode 100644 index 58e7b30..0000000 --- a/src/ID3/Object.php +++ /dev/null @@ -1,303 +0,0 @@ - - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -abstract class ID3_Object -{ - /** - * The reader object. - * - * @var Reader - */ - protected $_reader; - - /** - * The options array. - * - * @var Array - */ - private $_options; - - /** - * Constructs the class with given parameters. - * - * @param Reader $reader The reader object. - * @param Array $options The options array. - */ - public function __construct($reader = null, &$options = array()) - { - $this->_reader = $reader; - $this->_options = &$options; - } - - /** - * Returns the options array. - * - * @return Array - */ - public final function getOptions() { return $this->_options; } - - /** - * Returns the given option value, or the default value if the option is not - * defined. - * - * @param string $option The name of the option. - * @param mixed $defaultValue The default value to be returned. - */ - public final function getOption($option, $defaultValue = false) - { - if (isset($this->_options[$option])) - return $this->_options[$option]; - return $defaultValue; - } - - /** - * Sets the options array. See {@link ID3v2} class for available options. - * - * @param Array $options The options array. - */ - public final function setOptions(&$options) { $this->_options = &$options; } - - /** - * Sets the given option the given value. - * - * @param string $option The name of the option. - * @param mixed $value The value to set for the option. - */ - public final function setOption($option, $value) - { - $this->_options[$option] = $value; - } - - /** - * Magic function so that $obj->value will work. - * - * @param string $name The field name. - * @return mixed - */ - public function __get($name) - { - if (method_exists($this, "get" . ucfirst($name))) - return call_user_func(array($this, "get" . ucfirst($name))); - else { - require_once("ID3/Exception.php"); - throw new ID3_Exception("Unknown field: " . $name); - } - } - - /** - * Magic function so that assignments with $obj->value will work. - * - * @param string $name The field name. - * @param string $value The field value. - * @return mixed - */ - public function __set($name, $value) - { - if (method_exists($this, "set" . ucfirst($name))) - call_user_func - (array($this, "set" . ucfirst($name)), $value); - else { - require_once("ID3/Exception.php"); - throw new ID3_Exception("Unknown field: " . $name); - } - } - - /** - * Encodes the given 32-bit integer to 28-bit synchsafe integer, where the - * most significant bit of each byte is zero, making seven bits out of eight - * available. - * - * @param integer $val The integer to encode. - * @return integer - */ - protected final function _encodeSynchsafe32($val) - { - return ($val & 0x7f) | ($val & 0x3f80) << 1 | - ($val & 0x1fc000) << 2 | ($val & 0xfe00000) << 3; - } - - /** - * Decodes the given 28-bit synchsafe integer to regular 32-bit integer. - * - * @param integer $val The integer to decode - * @return integer - */ - protected final function _decodeSynchsafe32($val) - { - return ($val & 0x7f) | ($val & 0x7f00) >> 1 | - ($val & 0x7f0000) >> 2 | ($val & 0x7f000000) >> 3; - } - - /** - * Applies the unsynchronisation scheme to the given data string. - * - * Whenever a false synchronisation is found within the data, one zeroed byte - * is inserted after the first false synchronisation byte. This has the side - * effect that all 0xff00 combinations have to be altered, so they will not - * be affected by the decoding process. Therefore all the 0xff00 combinations - * have to be replaced with the 0xff0000 combination during the - * unsynchronisation. - * - * @param string $data The input data. - * @return string - */ - protected final function _encodeUnsynchronisation(&$data) - { - $result = ""; - for ($i = 0, $j = 0; $i < strlen($data) - 1; $i++) - if (ord($data[$i]) == 0xff && - ((($tmp = ord($data[$i + 1])) & 0xe0) == 0xe0 || $tmp == 0x0)) { - $result .= substr($data, $j, $i + 1 - $j) . "\0"; - $j = $i + 1; - } - return $result . substr($data, $j); - } - - /** - * Reverses the unsynchronisation scheme from the given data string. - * - * @see _encodeUnsynchronisation - * @param string $data The input data. - * @return string - */ - protected final function _decodeUnsynchronisation(&$data) - { - $result = ""; - for ($i = 0, $j = 0; $i < strlen($data) - 1; $i++) - if (ord($data[$i]) == 0xff && ord($data[$i + 1]) == 0x0) { - $result .= substr($data, $j, $i + 1 - $j); - $j = $i + 2; - } - return $result . substr($data, $j); - } - - /** - * Splits UTF-16 formatted binary data up according to null terminators - * residing in the string, up to a given limit. - * - * @param string $value The input string. - * @return Array - */ - protected final function _explodeString16($value, $limit = null) - { - $i = 0; - $array = array(); - while (count($array) < $limit - 1 || $limit === null) { - $start = $i; - do { - $i = strpos($value, "\x00\x00", $i); - if ($i === false) { - $array[] = substr($value, $start); - return $array; - } - } while ($i & 0x1 != 0 && $i++); // make sure its aligned - $array[] = substr($value, $start, $i - $start); - $i += 2; - } - $array[] = substr($value, $i); - return $array; - } - - /** - * Splits UTF-8 or ISO-8859-1 formatted binary data according to null - * terminators residing in the string, up to a given limit. - * - * @param string $value The input string. - * @return Array - */ - protected final function _explodeString8($value, $limit = null) - { - return preg_split("/\\x00/", $value, $limit); - } - - /** - * Converts string to requested character encoding and returns it. See the - * documentation of iconv for accepted values for encoding. - * - * @param string|Array $string - * @param string $encoding - */ - protected final function _convertString($string, $encoding) - { - $target = $this->getOption("encoding", ID3_Encoding::UTF8); - switch ($target) { - case ID3_Encoding::UTF16: - $target = "utf-16"; - break; - case ID3_Encoding::UTF16LE: - $target = "utf-16le"; - break; - case ID3_Encoding::UTF16BE: - $target = "utf-16be"; - break; - case ID3_Encoding::UTF8: - $target = "utf-8"; - break; - default: - $target = "iso-8859-1"; - } - - if (strtolower($target) == strtolower($encoding)) - return $string; - - if (is_array($string)) - foreach ($string as $key => $value) - $string[$key] = iconv($encoding, $target, $value); - else - $string = iconv($encoding, $target, $string); - return $string; - } - - /** - * Returns the object data. - * - * @return string - */ - abstract public function __toString(); -} diff --git a/src/ID3/Timing.php b/src/ID3/Timing.php deleted file mode 100644 index 7eafee2..0000000 --- a/src/ID3/Timing.php +++ /dev/null @@ -1,73 +0,0 @@ -Timing interface implies that the ID3v2 frame contains - * one or more 32-bit timestamps. - * - * The timestamps are absolute times, meaning that every stamp contains the time - * from the beginning of the file. - * - * @package php-reader - * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -interface ID3_Timing -{ - /** The timestamp is an absolute time, using MPEG frames as unit. */ - const MPEG_FRAMES = 1; - - /** The timestamp is an absolute time, using milliseconds as unit. */ - const MILLISECONDS = 2; - - /** - * Returns the timing format. - * - * @return integer - */ - public function getFormat(); - - /** - * Sets the timing format. - * - * @param integer $format The timing format. - */ - public function setFormat($format); -} diff --git a/src/ID3v2.php b/src/ID3v2.php deleted file mode 100644 index 0905c38..0000000 --- a/src/ID3v2.php +++ /dev/null @@ -1,555 +0,0 @@ - - * @author Ryan Butterfield - * @copyright Copyright (c) 2008-2009 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ - */ -final class ID3v2 -{ - /** @var Reader */ - private $_reader; - - /** @var ID3_Header */ - private $_header; - - /** @var ID3_ExtendedHeader */ - private $_extendedHeader; - - /** @var ID3_Header */ - private $_footer; - - /** @var Array */ - private $_frames = array(); - - /** @var string */ - private $_filename = false; - - /** @var Array */ - private $_options; - - /** - * Constructs the ID3v2 class with given file and options. The options array - * may also be given as the only parameter. - * - * The following options are currently recognized: - * o encoding -- Indicates the encoding that all the texts are presented - * with. By default this is set to ID3_Encoding::UTF8. See the - * documentation of the {@link ID3_Encoding} interface for accepted - * values. Conversions are carried out using iconv. - * o version -- The ID3v2 tag version to use in write operation. This option - * is automatically set when a tag is read from a file and defaults to - * version 4.0 for tag write. - * o readonly -- Indicates that the tag is read from a temporary file or - * another source it cannot be written back to. The tag can, however, - * still be written to another file. - * - * @todo Only limited subset of flags are processed. - * @todo Utilize the SEEK frame and search for a footer to find the tag - * @todo Utilize the LINK frame to fetch frames from other sources - * @param string|Reader $filename The path to the file, file descriptor of an - * opened file, or {@link Reader} instance. - * @param Array $options The options array. - */ - public function __construct($filename = false, $options = array()) - { - if (is_array($filename)) { - $options = $filename; - $filename = false; - } - - $this->_options = &$options; - if ($filename === false || - (is_string($filename) && file_exists($filename) === false) || - (is_resource($filename) && - in_array(get_resource_type($filename), array("file", "stream")))) { - $this->_header = new ID3_Header(null, $options); - } else { - if (is_string($filename) && !isset($options["readonly"])) - $this->_filename = $filename; - if ($filename instanceof Reader) - $this->_reader = &$filename; - else - $this->_reader = new Reader($filename); - - $startOffset = $this->_reader->getOffset(); - - if ($this->_reader->readString8(3) != "ID3") { - require_once("ID3/Exception.php"); - throw new ID3_Exception("File does not contain ID3v2 tag"); - } - - $this->_header = new ID3_Header($this->_reader, $options); - if ($this->_header->getVersion() < 3 || - $this->_header->getVersion() > 4) { - require_once("ID3/Exception.php"); - throw new ID3_Exception - ("File does not contain ID3v2 tag of supported version"); - } - if ($this->_header->getVersion() < 4 && - $this->_header->hasFlag(ID3_Header::UNSYNCHRONISATION)) { - require_once("ID3/Exception.php"); - throw new ID3_Exception - ("Unsynchronisation not supported for this version of ID3v2 tag"); - } - unset($this->_options["unsyncronisation"]); - if ($this->_header->hasFlag(ID3_Header::UNSYNCHRONISATION)) - $this->_options["unsyncronisation"] = true; - if ($this->_header->hasFlag(ID3_Header::EXTENDEDHEADER)) { - require_once("ID3/ExtendedHeader.php"); - $this->_extendedHeader = - new ID3_ExtendedHeader($this->_reader, $options); - } - if ($this->_header->hasFlag(ID3_Header::FOOTER)) - $this->_footer = &$this->_header; // skip footer, and rather copy header - - while (true) { - $offset = $this->_reader->getOffset(); - - // Jump off the loop if we reached the end of the tag - if ($offset - $startOffset - 10 >= $this->_header->getSize() - - ($this->hasFooter() ? 10 : 0) - /* Min bytes for a header */ 10) - break; - - // Jump off the loop if we reached padding - if (Transform::fromUInt8($identifier = $this->_reader->read(1)) == 0) - break; - - $identifier .= $this->_reader->read(3); - - // Jump off the loop if we reached invalid entities. This fix is just to - // make things work. Utility called MP3ext does not seem to know what it - // is doing as it uses padding to write its version information there. - if ($identifier == "MP3e") - break; - - $this->_reader->setOffset($offset); - if (@fopen($filename = "ID3/Frame/" . - strtoupper($identifier) . ".php", "r", true) !== false) - require_once($filename); - if (class_exists($classname = "ID3_Frame_" . $identifier)) - $frame = new $classname($this->_reader, $options); - else { - require_once("ID3/Frame/Unknown.php"); - $frame = new ID3_Frame_Unknown($this->_reader, $options); - } - - if (!isset($this->_frames[$frame->getIdentifier()])) - $this->_frames[$frame->getIdentifier()] = array(); - $this->_frames[$frame->getIdentifier()][] = $frame; - } - } - } - - /** - * Returns the header object. - * - * @return ID3_Header - */ - public function getHeader() { return $this->_header; } - - /** - * Checks whether there is an extended header present in the tag. Returns - * true if the header is present, false otherwise. - * - * @return boolean - */ - public function hasExtendedHeader() - { - if ($this->_header) - return $this->_header->hasFlag(ID3_Header::EXTENDEDHEADER); - } - - /** - * Returns the extended header object if present, or false - * otherwise. - * - * @return ID3_ExtendedHeader|false - */ - public function getExtendedHeader() - { - if ($this->hasExtendedHeader()) - return $this->_extendedHeader; - return false; - } - - /** - * Sets the extended header object. - * - * @param ID3_ExtendedHeader $extendedHeader The header object - */ - public function setExtendedHeader($extendedHeader) - { - if (is_subclass_of($extendedHeader, "ID3_ExtendedHeader")) { - $this->_header->flags = - $this->_header->flags | ID3_Header::EXTENDEDHEADER; - $this->_extendedHeader->setOptions($this->_options); - $this->_extendedHeader = $extendedHeader; - } else { - require_once("ID3/Exception.php"); - throw new ID3_Exception("Invalid argument"); - } - } - - /** - * Checks whether there is a frame given as an argument defined in the tag. - * Returns true if one ore more frames are present, - * false otherwise. - * - * @param string $identifier The frame name. - * @return boolean - */ - public function hasFrame($identifier) - { - return isset($this->_frames[$identifier]); - } - - /** - * Returns all the frames the tag contains as an associate array. The frame - * identifiers work as keys having an array of frames as associated value. - * - * @return Array - */ - public function getFrames() { return $this->_frames; } - - /** - * Returns an array of frames matching the given identifier or an empty array - * if no frames matched the identifier. - * - * The identifier may contain wildcard characters "*" and "?". The asterisk - * matches against zero or more characters, and the question mark matches any - * single character. - * - * Please note that one may also use the shorthand $obj->identifier to access - * the first frame with the identifier given. Wildcards cannot be used with - * the shorthand method. - * - * @param string $identifier The frame name. - * @return Array - */ - public function getFramesByIdentifier($identifier) - { - $matches = array(); - $searchPattern = "/^" . - str_replace(array("*", "?"), array(".*", "."), $identifier) . "$/i"; - foreach ($this->_frames as $identifier => $frames) - if (preg_match($searchPattern, $identifier)) - foreach ($frames as $frame) - $matches[] = $frame; - return $matches; - } - - /** - * Removes any frames matching the given object identifier. - * - * The identifier may contain wildcard characters "*" and "?". The asterisk - * matches against zero or more characters, and the question mark matches any - * single character. - * - * One may also use the shorthand unset($obj->identifier) to achieve the same - * result. Wildcards cannot be used with the shorthand method. - * - * @param string $identifier The frame name. - */ - public final function removeFramesByIdentifier($identifier) - { - $searchPattern = "/^" . - str_replace(array("*", "?"), array(".*", "."), $identifier) . "$/i"; - foreach ($this->_frames as $identifier => $frames) - if (preg_match($searchPattern, $identifier)) - unset($this->_frames[$identifier]); - } - - /** - * Adds a new frame to the tag and returns it. - * - * @param ID3_Frame $frame The frame to add. - * @return ID3_Frame - */ - public function addFrame($frame) - { - $frame->setOptions($this->_options); - if (!$this->hasFrame($frame->getIdentifier())) - $this->_frames[$frame->getIdentifier()] = array(); - return $this->_frames[$frame->getIdentifier()][] = $frame; - } - - /** - * Remove the given frame from the tag. - * - * @param ID3_Frame $frame The frame to remove. - */ - public function removeFrame($frame) - { - if (!$this->hasFrame($frame->getIdentifier())) - foreach ($this->_frames[$frame->getIdentifier()] as $key => $value) - if ($frame === $value) - unset($this->_frames[$frame->getIdentifier()][$key]); - } - - /** - * Checks whether there is a footer present in the tag. Returns - * true if the footer is present, false otherwise. - * - * @return boolean - */ - public function hasFooter() - { - return $this->_header->hasFlag(ID3_Header::FOOTER); - } - - /** - * Returns the footer object if present, or false otherwise. - * - * @return ID3_Header|false - */ - public function getFooter() - { - if ($this->hasFooter()) - return $this->_footer; - return false; - } - - /** - * Sets whether the tag should have a footer defined. - * - * @param boolean $useFooter Whether the tag should have a footer - */ - public function setFooter($useFooter) - { - if ($useFooter) { - $this->_header->setFlags - ($this->_header->getFlags() | ID3_Header::FOOTER); - $this->_footer = &$this->_header; - } else { - /* Count footer bytes towards the tag size, so it gets removed or - overridden upon re-write */ - if ($this->hasFooter()) - $this->_header->setSize($this->_header->getSize() + 10); - - $this->_header->setFlags - ($this->_header->getFlags() & ~ID3_Header::FOOTER); - $this->_footer = null; - } - } - - /** - * Writes the possibly altered ID3v2 tag back to the file where it was read. - * If the class was constructed without a file name, one can be provided here - * as an argument. Regardless, the write operation will override previous - * tag information, if found. - * - * If write is called without setting any frames to the tag, the tag is - * removed from the file. - * - * @param string $filename The optional path to the file. - */ - public function write($filename = false) - { - if ($filename === false && ($filename = $this->_filename) === false) { - require_once("ID3/Exception.php"); - throw new ID3_Exception("No file given to write the tag to"); - } - else if ($filename !== false && $this->_filename !== false && - realpath($filename) != realpath($this->_filename) && - !copy($this->_filename, $filename)) { - require_once("ID3/Exception.php"); - throw new ID3_Exception("Unable to copy source to destination: " . - realpath($this->_filename) . "->" . realpath($filename)); - } - - if (($fd = fopen - ($filename, file_exists($filename) ? "r+b" : "wb")) === false) { - require_once("ID3/Exception.php"); - throw new ID3_Exception("Unable to open file for writing: " . $filename); - } - - $oldTagSize = $this->_header->getSize(); - $tag = $this->__toString(); - $tagSize = empty($this->_frames) ? 0 : strlen($tag); - - if ($this->_reader === null || - $tagSize - 10 > $oldTagSize || $tagSize == 0) { - fseek($fd, 0, SEEK_END); - $oldFileSize = ftell($fd); - ftruncate($fd, $newFileSize = $tagSize - $oldTagSize + $oldFileSize); - for ($i = 1, $cur = $oldFileSize; $cur > 0; $cur -= 1024, $i++) { - fseek($fd, -(($i * 1024) + ($newFileSize - $oldFileSize)), SEEK_END); - $buffer = fread($fd, 1024); - fseek($fd, -($i * 1024), SEEK_END); - fwrite($fd, $buffer, 1024); - } - } - fseek($fd, 0); - fwrite($fd, $tag, $tagSize); - fclose($fd); - - $this->_filename = $filename; - } - - /** - * Magic function so that $obj->value will work. The method will attempt to - * return the first frame that matches the identifier. - * - * If there is no frame or field with given name, the method will attempt to - * create a frame with given identifier. - * - * If none of these work, an exception is thrown. - * - * @param string $name The frame or field name. - * @return mixed - */ - public function __get($name) { - if (isset($this->_frames[strtoupper($name)])) - return $this->_frames[strtoupper($name)][0]; - if (method_exists($this, "get" . ucfirst($name))) - return call_user_func(array($this, "get" . ucfirst($name))); - if (@fopen($filename = - "ID3/Frame/" . strtoupper($name) . ".php", "r", true) !== false) - require_once($filename); - if (class_exists($classname = "ID3_Frame_" . strtoupper($name))) - return $this->addFrame(new $classname()); - require_once("ID3/Exception.php"); - throw new ID3_Exception("Unknown frame/field: " . $name); - } - - /** - * Magic function so that isset($obj->value) will work. This method checks - * whether the frame matching the identifier exists. - * - * @param string $name The frame identifier. - * @return boolean - */ - public function __isset($name) - { - return isset($this->_frames[strtoupper($name)]); - } - - /** - * Magic function so that unset($obj->value) will work. This method removes - * all the frames matching the identifier. - * - * @param string $name The frame identifier. - */ - public function __unset($name) { unset($this->_frames[strtoupper($name)]); } - - /** - * Returns the tag raw data. - * - * @return string - */ - public function __toString() - { - unset($this->_options["unsyncronisation"]); - - $data = ""; - foreach ($this->_frames as $frames) - foreach ($frames as $frame) - $data .= $frame->__toString(); - - $datalen = strlen($data); - $padlen = 0; - - if (isset($this->_options["unsyncronisation"]) && - $this->_options["unsyncronisation"] === true) - $this->_header->setFlags - ($this->_header->getFlags() | ID3_Header::UNSYNCHRONISATION); - - /* The tag padding is calculated as follows. If the tag can be written in - the space of the previous tag, the remaining space is used for padding. - If there is no previous tag or the new tag is bigger than the space taken - by the previous tag, the padding is a constant 4096 bytes. */ - if ($this->hasFooter() === false) { - if ($this->_reader !== null && $datalen < $this->_header->getSize()) - $padlen = $this->_header->getSize() - $datalen; - else - $padlen = 4096; - } - - /* ID3v2.4.0 CRC calculated w/ padding */ - if (!isset($this->_options["version"]) || $this->_options["version"] >= 4) - $data = str_pad($data, $datalen + $padlen, "\0"); - - if ($this->hasExtendedHeader()) { - $this->_extendedHeader->setPadding($padlen); - if ($this->_extendedHeader->hasFlag(ID3_ExtendedHeader::CRC32)) { - $crc = crc32($data); - if ($crc & 0x80000000) - $crc = -(($crc ^ 0xffffffff) + 1); - $this->_extendedHeader->setCrc($crc); - } - $data = $this->getExtendedHeader()->__toString() . $data; - } - - /* ID3v2.3.0 CRC calculated w/o padding */ - if (isset($this->_options["version"]) && $this->_options["version"] < 4) - $data = str_pad($data, $datalen + $padlen, "\0"); - - $this->_header->setSize(strlen($data)); - - return "ID3" . $this->_header->__toString() . $data . - ($this->hasFooter() ? "3DI" . $this->getFooter()->__toString() : ""); - } -} diff --git a/src/Zend/Io/FileReader.php b/src/Zend/Io/FileReader.php index d4c470c..8ef48fb 100644 --- a/src/Zend/Io/FileReader.php +++ b/src/Zend/Io/FileReader.php @@ -50,7 +50,8 @@ class Zend_Io_FileReader extends Zend_Io_Reader if (!file_exists($filename) || !is_readable($filename) || ($fd = fopen($filename, $mode)) === false) { require_once('Zend/Io/Exception.php'); - throw new Zend_Io_Exception('Unable to open file for reading: ' . $filename); + throw new Zend_Io_Exception + ('Unable to open file for reading: ' . $filename); } parent::__construct($fd); } diff --git a/src/Zend/Io/FileWriter.php b/src/Zend/Io/FileWriter.php index f1d27bc..591e3f9 100644 --- a/src/Zend/Io/FileWriter.php +++ b/src/Zend/Io/FileWriter.php @@ -50,7 +50,8 @@ class Zend_Io_FileWriter extends Zend_Io_Writer $mode = file_exists($filename) ? 'r+b' : 'wb'; if (($fd = fopen($filename, $mode)) === false) { require_once('Zend/Io/Exception.php'); - throw new Zend_Io_Exception('Unable to open file for writing: ' . $filename); + throw new Zend_Io_Exception + ('Unable to open file for writing: ' . $filename); } parent::__construct($fd); } diff --git a/src/Zend/Io/Reader.php b/src/Zend/Io/Reader.php index d058de8..bd7622d 100644 --- a/src/Zend/Io/Reader.php +++ b/src/Zend/Io/Reader.php @@ -69,7 +69,8 @@ class Zend_Io_Reader if (!is_resource($fd) || !in_array(get_resource_type($fd), array('stream'))) { require_once('Zend/Io/Exception.php'); - throw new Zend_Io_Exception('Invalid resource type (only resources of type stream are supported)'); + throw new Zend_Io_Exception + ('Invalid resource type (only resources of type stream are supported)'); } $this->_fd = $fd; @@ -497,7 +498,8 @@ class Zend_Io_Reader * @throws Zend_Io_Exception if length attribute is negative or * if an I/O error occurs */ - public final function readString16($length, &$order = null, $trimOrder = false) + public final function readString16 + ($length, &$order = null, $trimOrder = false) { $value = $this->read($length); diff --git a/src/Zend/Io/StringReader.php b/src/Zend/Io/StringReader.php index 3d40af7..46d338c 100644 --- a/src/Zend/Io/StringReader.php +++ b/src/Zend/Io/StringReader.php @@ -40,23 +40,42 @@ class Zend_Io_StringReader extends Zend_Io_Reader * Constructs the Zend_Io_StringReader class with given source string. * * @param string $data The string to use as the source. + * @param integer $length If the length argument is given, + * reading will stop after length bytes have been read or + * the end of string is reached, whichever comes first. * @throws Zend_Io_Exception if an I/O error occurs */ - public function __construct($data) + public function __construct($data, $length = null) { if (($this->_fd = fopen('php://memory', 'w+b')) === false) { require_once('Zend/Io/Exception.php'); throw new Zend_Io_Exception('Unable to open php://memory stream'); } if ($data !== null && is_string($data)) { - if (($this->_size = fwrite($this->_fd, $data, $tagSize)) === false) { + if ($length === null) { + $length = strlen($data); + } + if (($this->_size = fwrite($this->_fd, $data, $length)) === false) { require_once('Zend/Io/Exception.php'); - throw new Zend_Io_Exception('Unable to write data to php://memory stream'); + throw new Zend_Io_Exception + ('Unable to write data to php://memory stream'); } fseek($this->_fd, 0); } } + /** + * Returns the string representation of this class. + */ + public function toString() + { + $offset = $this->getOffset(); + $this->setOffset(0); + $data = $this->read($this->getSize()); + $this->setOffset($offset); + return $data; + } + /** * Closes the file descriptor. */ diff --git a/src/Zend/Io/StringWriter.php b/src/Zend/Io/StringWriter.php index b35caa6..6ce98b7 100644 --- a/src/Zend/Io/StringWriter.php +++ b/src/Zend/Io/StringWriter.php @@ -39,24 +39,43 @@ class Zend_Io_StringWriter extends Zend_Io_Writer /** * Constructs the Zend_Io_StringWriter class with given source string. * - * @param string $data The string to use as the source. + * @param string $data The string to use as the source. + * @param integer $length If the length argument is given, + * reading will stop after length bytes have been read or + * the end of string is reached, whichever comes first. * @throws Zend_Io_Exception if an I/O error occurs */ - public function __construct($data = null) + public function __construct($data = null, $length = null) { if (($this->_fd = fopen('php://memory', 'w+b')) === false) { require_once('Zend/Io/Exception.php'); throw new Zend_Io_Exception('Unable to open php://memory stream'); } if ($data !== null && is_string($data)) { - if (($this->_size = fwrite($this->_fd, $data, $tagSize)) === false) { + if ($length === null) { + $length = strlen($data); + } + if (($this->_size = fwrite($this->_fd, $data, $length)) === false) { require_once('Zend/Io/Exception.php'); - throw new Zend_Io_Exception('Unable to write data to php://memory stream'); + throw new Zend_Io_Exception + ('Unable to write data to php://memory stream'); } fseek($this->_fd, 0); } } + /** + * Returns the string representation of this class. + */ + public function toString() + { + $offset = $this->getOffset(); + $this->setOffset(0); + $data = fread($this->getFileDescriptor(), $this->getSize()); + $this->setOffset($offset); + return $data; + } + /** * Closes the file descriptor. */ diff --git a/src/Zend/Io/Writer.php b/src/Zend/Io/Writer.php index 63e6288..e8bddc4 100644 --- a/src/Zend/Io/Writer.php +++ b/src/Zend/Io/Writer.php @@ -67,9 +67,10 @@ class Zend_Io_Writer public function __construct($fd) { if (!is_resource($fd) || - !in_array(get_resource_type($fd), array('stream'))) { + !in_array(get_resource_type($fd), array('stream'))) { require_once('Zend/Io/Exception.php'); - throw new Zend_Io_Exception('Invalid resource type (only resources of type stream are supported)'); + throw new Zend_Io_Exception + ('Invalid resource type (only resources of type stream are supported)'); } $this->_fd = $fd; @@ -174,7 +175,11 @@ class Zend_Io_Writer require_once('Zend/Io/Exception.php'); throw new Zend_Io_Exception('Cannot operate on a closed stream'); } - fwrite($this->_fd, $value, $length === null ? strlen($value) : $length); + if ($length === null) { + $length = strlen($value); + } + fwrite($this->_fd, $value, $length); + $this->_size += $length; return $this; } @@ -197,7 +202,7 @@ class Zend_Io_Writer * @return Zend_Io_Writer * @throws Zend_Io_Exception if the stream is closed */ - public final function writeUInt8() + public final function writeUInt8($value) { return $this->write(pack('C*', $value)); } @@ -223,7 +228,7 @@ class Zend_Io_Writer */ public final function writeInt16LE($value) { - if ($this->_isBigEndian()) { + if ($this->_isLittleEndian()) { return $this->write(strrev($this->_toInt16($value))); } else { return $this->write($this->_toInt16($value)); @@ -240,7 +245,7 @@ class Zend_Io_Writer */ public final function writeInt16BE($value) { - if ($this->_isLittleEndian()) { + if ($this->_isBigEndian()) { return $this->write(strrev($this->_toInt16($value))); } else { return $this->write($this->_toInt16($value)); @@ -294,7 +299,7 @@ class Zend_Io_Writer */ public final function writeInt32LE($value) { - if ($this->_isBigEndian()) { + if ($this->_isLittleEndian()) { return $this->write(strrev($this->_toInt32($value))); } else { return $this->write($this->_toInt32($value)); @@ -311,7 +316,7 @@ class Zend_Io_Writer */ public final function writeInt32BE($value) { - if ($this->_isLittleEndian()) { + if ($this->_isBigEndian()) { return $this->write(strrev($this->_toInt32($value))); } else { return $this->write($this->_toInt32($value)); @@ -354,7 +359,8 @@ class Zend_Io_Writer */ public final function writeInt64LE($value) { - return $this->write(pack('V*', $value & 0xffffffff, $value / (0xffffffff+1))); + return $this->write + (pack('V*', $value & 0xffffffff, $value / (0xffffffff+1))); } /** @@ -367,7 +373,8 @@ class Zend_Io_Writer */ public final function writeInt64BE($value) { - return $this->write(pack('N*', $value / (0xffffffff+1), $value & 0xffffffff)); + return $this->write + (pack('N*', $value / (0xffffffff+1), $value & 0xffffffff)); } /** @@ -391,7 +398,7 @@ class Zend_Io_Writer */ public final function writeFloatLE($value) { - if ($this->_isBigEndian()) { + if ($this->_isLittleEndian()) { return $this->write(strrev($this->_toFloat($value))); } else { return $this->write($this->_toFloat($value)); @@ -408,7 +415,7 @@ class Zend_Io_Writer */ public final function writeFloatBE($value) { - if ($this->_isLittleEndian()) { + if ($this->_isBigEndian()) { return $this->write(strrev($this->_toFloat($value))); } else { return $this->write($this->_toFloat($value)); diff --git a/src/Zend/Media/Exception.php b/src/Zend/Media/Exception.php index 040ad18..611621d 100644 --- a/src/Zend/Media/Exception.php +++ b/src/Zend/Media/Exception.php @@ -14,7 +14,7 @@ * * @category Zend * @package Zend_Media - * @subpackage Id3 + * @subpackage ID3 * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ @@ -29,7 +29,7 @@ require_once 'Zend/Exception.php'; * * @category Zend * @package Zend_Media - * @subpackage Id3 + * @subpackage ID3 * @author Sven Vollbehr * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License diff --git a/src/Zend/Media/Id3/DateFrame.php b/src/Zend/Media/Id3/DateFrame.php new file mode 100644 index 0000000..965eeee --- /dev/null +++ b/src/Zend/Media/Id3/DateFrame.php @@ -0,0 +1,111 @@ + + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +abstract class Zend_Media_Id3_DateFrame + extends Zend_Media_Id3_TextFrame +{ + private $_format; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + * @param string $format Rule for formatting output. If null the default + * ISO 8601 date format is used. + */ + public function __construct + ($reader = null, &$options = array(), $format = null) + { + Zend_Media_Id3_Frame::__construct($reader, $options); + + $this->setEncoding(Zend_Media_Id3_Encoding::ISO88591); + + $this->_format = $format; + + if ($this->_reader === null) { + return; + } + + $this->_reader->skip(1); + $this->setText($this->_reader->readString8($this->_reader->getSize())); + } + + /** + * Returns the date. + * + * @return Zend_Date + */ + public function getDate() + { + require_once 'Zend/Date.php'; + $date = new Zend_Date(0); + $date->setTimezone('UTC'); + $date->set + ($this->getText(), + $this->_format ? $this->_format : Zend_Date::ISO_8601); + return $date; + } + + /** + * Sets the date. If called with null value the current time is entered. + * + * @param Zend_Date $date The date. + */ + public function setDate($date = null) + { + require_once 'Zend/Date.php'; + if ($date === null) { + $date = Zend_Date::now(); + } + $date->setTimezone('UTC'); + $this->setText($date->toString(Zend_Date::ISO_8601)); + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $this->setEncoding(Zend_Media_Id3_Encoding::ISO88591); + parent::_writeFrame($writer); + } +} diff --git a/src/Zend/Media/Id3/Encoding.php b/src/Zend/Media/Id3/Encoding.php new file mode 100644 index 0000000..45de538 --- /dev/null +++ b/src/Zend/Media/Id3/Encoding.php @@ -0,0 +1,82 @@ +Encoding interface implies that the implementing ID3v2 frame + * supports content encoding. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +interface Zend_Media_Id3_Encoding +{ + /** The ISO-8859-1 encoding. */ + const ISO88591 = 0; + + /** The UTF-16 Unicode encoding with BOM. */ + const UTF16 = 1; + + /** The UTF-16LE Unicode encoding without BOM. */ + const UTF16LE = 4; + + /** The UTF-16BE Unicode encoding without BOM. */ + const UTF16BE = 2; + + /** The UTF-8 Unicode encoding. */ + const UTF8 = 3; + + /** + * Returns the text encoding. + * + * All the strings read from a file are automatically converted to the + * character encoding specified with the encoding option. See + * {@link Zend_Media_Id3v2} for details. This method returns that character + * encoding, or any value set after read, translated into a string form + * regarless if it was set using a {@link Zend_Media_Id3_Encoding} constant + * or a string. + * + * @return integer + */ + public function getEncoding(); + + /** + * Sets the text encoding. + * + * All the string written to the frame are done so using given character + * encoding. No conversions of existing data take place upon the call to + * this method thus all texts must be given in given character encoding. + * + * The character encoding parameter takes either a + * {@link Zend_Media_Id3_Encoding} constant or a character set name string + * in the form accepted by iconv. The default character encoding used to + * write the frame is 'utf-8'. + * + * @see Zend_Media_Id3_Encoding + * @param integer $encoding The text encoding. + */ + public function setEncoding($encoding); +} diff --git a/src/Zend/Media/Id3/Exception.php b/src/Zend/Media/Id3/Exception.php index a6be32f..3bd2c82 100644 --- a/src/Zend/Media/Id3/Exception.php +++ b/src/Zend/Media/Id3/Exception.php @@ -14,7 +14,7 @@ * * @category Zend * @package Zend_Media - * @subpackage Id3 + * @subpackage ID3 * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ @@ -30,7 +30,7 @@ require_once 'Zend/Media/Exception.php'; * * @category Zend * @package Zend_Media - * @subpackage Id3 + * @subpackage ID3 * @author Sven Vollbehr * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License diff --git a/src/Zend/Media/Id3/ExtendedHeader.php b/src/Zend/Media/Id3/ExtendedHeader.php new file mode 100644 index 0000000..6282f6e --- /dev/null +++ b/src/Zend/Media/Id3/ExtendedHeader.php @@ -0,0 +1,348 @@ + + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_ExtendedHeader extends Zend_Media_Id3_Object +{ + /** + * A flag to denote that the present tag is an update of a tag found earlier + * in the present file or stream. If frames defined as unique are found in + * the present tag, they are to override any corresponding ones found in the + * earlier tag. This flag has no corresponding data. + * + * @since ID3v2.4.0 + */ + const UPDATE = 64; + + /** + * @since ID3v2.4.0 A flag to denote that a CRC-32 data is included in the + * extended header. The CRC is calculated on all the data between the header + * and footer as indicated by the header's tag length field, minus the + * extended header. Note that this includes the padding (if there is any), + * but excludes the footer. The CRC-32 is stored as an 35 bit synchsafe + * integer, leaving the upper four bits always zeroed. + * + * @since ID3v2.3.0 The CRC is calculated before unsynchronisation on the + * data between the extended header and the padding, i.e. the frames and + * only the frames. + */ + const CRC32 = 32; + + /** + * A flag to denote whether or not the tag has restrictions applied on it. + * + * @since ID3v2.4.0 + */ + const RESTRICTED = 16; + + /** @var integer */ + private $_size; + + /** @var integer */ + private $_flags = 0; + + /** @var integer */ + private $_padding; + + /** @var integer */ + private $_crc; + + /** @var integer */ + private $_restrictions = 0; + + /** + * Constructs the class with given parameters and reads object related data + * from the ID3v2 tag. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($reader === null) + return; + + $offset = $this->_reader->getOffset(); + $this->_size = $this->_reader->readUInt32BE(); + + /* ID3v2.3.0 ExtendedHeader */ + if ($this->getOption('version', 4) < 4) { + if ($this->_reader->readUInt16BE() == 0x8000) { + $this->_flags = self::CRC32; + } + $this->_padding = $this->_reader->readUInt32BE(); + if ($this->hasFlag(self::CRC32)) { + $this->_crc = $this->_reader->readUInt32BE(); + } + } + + /* ID3v2.4.0 ExtendedHeader */ + else { + $this->_size = $this->_decodeSynchsafe32($this->_size); + $this->_reader->skip(1); + $this->_flags = $this->_reader->readInt8(); + if ($this->hasFlag(self::UPDATE)) { + $this->_reader->skip(1); + } + if ($this->hasFlag(self::CRC32)) { + $this->_reader->skip(1); + $this->_crc = + $this->_reader->readInt8() * (0xfffffff + 1) + + _decodeSynchsafe32($this->_reader->readUInt32BE()); + } + if ($this->hasFlag(self::RESTRICTED)) { + $this->_reader->skip(1); + $this->_restrictions = $this->_reader->readInt8(); + } + } + } + + /** + * Returns the extended header size in bytes. + * + * @return integer + */ + public function getSize() + { + return $this->_size; + } + + /** + * Checks whether or not the flag is set. Returns true if the + * flag is set, false otherwise. + * + * @param integer $flag The flag to query. + * @return boolean + */ + public function hasFlag($flag) + { + return ($this->_flags & $flag) == $flag; + } + + /** + * Returns the flags byte. + * + * @return integer + */ + public function getFlags($flags) + { + return $this->_flags; + } + + /** + * Sets the flags byte. + * + * @param integer $flags The flags byte. + */ + public function setFlags($flags) + { + $this->_flags = $flags; + } + + /** + * Returns the CRC-32 data. + * + * @return integer + */ + public function getCrc() + { + if ($this->hasFlag(self::CRC32)) { + return $this->_crc; + } + return false; + } + + /** + * Sets whether the CRC-32 should be generated upon tag write. + * + * @param boolean $useCrc Whether CRC-32 should be generated. + */ + public function useCrc($useCrc) + { + if ($useCrc) { + $this->setFlags($this->getFlags() | self::CRC32); + } else { + $this->setFlags($this->getFlags() & ~self::CRC32); + } + } + + /** + * Sets the CRC-32. The CRC-32 value is calculated of all the frames in the + * tag and includes padding. + * + * @param integer $crc The 32-bit CRC value. + */ + public function setCrc($crc) + { + if (is_bool($crc)) { + $this->useCrc($crc); + } else { + $this->_crc = $crc; + } + } + + /** + * Returns the restrictions. For some applications it might be desired to + * restrict a tag in more ways than imposed by the ID3v2 specification. Note + * that the presence of these restrictions does not affect how the tag is + * decoded, merely how it was restricted before encoding. If this flag is + * set the tag is restricted as follows: + * + *
+     * Restrictions %ppqrrstt
+     *
+     * p - Tag size restrictions
+     *
+     *   00   No more than 128 frames and 1 MB total tag size.
+     *   01   No more than 64 frames and 128 KB total tag size.
+     *   10   No more than 32 frames and 40 KB total tag size.
+     *   11   No more than 32 frames and 4 KB total tag size.
+     *
+     * q - Text encoding restrictions
+     *
+     *   0    No restrictions
+     *   1    Strings are only encoded with ISO-8859-1 or UTF-8.
+     *
+     * r - Text fields size restrictions
+     *
+     *   00   No restrictions
+     *   01   No string is longer than 1024 characters.
+     *   10   No string is longer than 128 characters.
+     *   11   No string is longer than 30 characters.
+     *
+     *   Note that nothing is said about how many bytes is used to represent
+     *   those characters, since it is encoding dependent. If a text frame
+     *   consists of more than one string, the sum of the strungs is restricted
+     *   as stated.
+     *
+     * s - Image encoding restrictions
+     *
+     *   0   No restrictions
+     *   1   Images are encoded only with PNG [PNG] or JPEG [JFIF].
+     *
+     * t - Image size restrictions
+     *
+     *   00  No restrictions
+     *   01  All images are 256x256 pixels or smaller.
+     *   10  All images are 64x64 pixels or smaller.
+     *   11  All images are exactly 64x64 pixels, unless required otherwise.
+     * 
+ * + * @return integer + */ + public function getRestrictions() + { + return $this->_restrictions; + } + + /** + * Sets the restrictions byte. See {@link #getRestrictions} for more. + * + * @param integer $restrictions The restrictions byte. + */ + public function setRestrictions($restrictions) + { + $this->_restrictions = $restrictions; + } + + /** + * Returns the total padding size, or simply the total tag size excluding + * the frames and the headers. + * + * @return integer + * @deprecated ID3v2.3.0 + */ + public function getPadding() + { + return $this->_padding; + } + + /** + * Sets the total padding size, or simply the total tag size excluding the + * frames and the headers. + * + * @param integer $padding The padding size. + * @deprecated ID3v2.3.0 + */ + public function setPadding($padding) + { + return $this->_padding = $padding; + } + + /** + * Writes the header data. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + public function write($writer) + { + /* ID3v2.3.0 ExtendedHeader */ + if ($this->getOption('version', 4) < 4) { + $writer->writeUInt32BE($this->_size) + ->writeUInt16BE($this->hasFlag(self::CRC32) ? 0x8000 : 0) + ->writeUInt32BE($this->_padding); + if ($this->hasFlag(self::CRC32)) { + $writer->writeUInt32BE($this->_crc); + } + } + + /* ID3v2.4.0 ExtendedHeader */ + else { + $writer->writeUInt32BE($this->_encodeSynchsafe32($this->_size)) + ->writeInt8(1) + ->writeInt8($this->_flags); + if ($this->hasFlag(self::UPDATE)) { + $writer->write("\0"); + } + if ($this->hasFlag(self::CRC32)) { + $writer->writeInt8(5) + ->writeInt8 + ($this->_crc & 0xf0000000 >> 28 & 0xf /*eq >>> 28*/) + ->writeUInt32BE($this->_encodeSynchsafe32($this->_crc)); + } + if ($this->hasFlag(self::RESTRICTED)) { + $writer->writeInt8(1) + ->writeInt8($this->_restrictions); + } + } + } +} diff --git a/src/Zend/Media/Id3/Frame.php b/src/Zend/Media/Id3/Frame.php new file mode 100644 index 0000000..72c65ff --- /dev/null +++ b/src/Zend/Media/Id3/Frame.php @@ -0,0 +1,315 @@ + + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +abstract class Zend_Media_Id3_Frame extends Zend_Media_Id3_Object +{ + /** + * This flag tells the tag parser what to do with this frame if it + * unknown and the tag is altered in any way. This applies to all kinds of + * alterations, including adding more padding and reordering the frames. + */ + const DISCARD_ON_TAGCHANGE = 16384; + + /** + * This flag tells the tag parser what to do with this frame if it is + * unknown and the file, excluding the tag, is altered. This does not apply + * when the audio is completely replaced with other audio data. + */ + const DISCARD_ON_FILECHANGE = 8192; + + /** + * This flag, if set, tells the software that the contents of this frame are + * intended to be read only. Changing the contents might break something, + * e.g. a signature. + */ + const READ_ONLY = 4096; + + /** + * This flag indicates whether or not this frame belongs in a group with + * other frames. If set, a group identifier byte is added to the frame. + * Every frame with the same group identifier belongs to the same group. + */ + const GROUPING_IDENTITY = 32; + + /** + * This flag indicates whether or not the frame is compressed. A Data + * Length Indicator byte is included in the frame. + * + * @see DATA_LENGTH_INDICATOR + */ + const COMPRESSION = 8; + + /** + * This flag indicates whether or not the frame is encrypted. If set, one + * byte indicating with which method it was encrypted will be added to the + * frame. See description of the {@link Zend_Media_Id3_Frame_Encr ENCR} + * frame for more information about encryption method registration. + * Encryption should be done after compression. Whether or not setting this + * flag requires the presence of a Data Length Indicator depends on + * the specific algorithm used. + * + * @see DATA_LENGTH_INDICATOR + */ + const ENCRYPTION = 4; + + /** + * This flag indicates whether or not unsynchronisation was applied to this + * frame. + * + * @since ID3v2.4.0 + */ + const UNSYNCHRONISATION = 2; + + /** + * This flag indicates that a data length indicator has been added to the + * frame. + * + * @since ID3v2.4.0 + */ + const DATA_LENGTH_INDICATOR = 1; + + /** @var integer */ + private $_identifier; + + /** @var integer */ + private $_size = 0; + + /** @var integer */ + private $_flags = 0; + + /** + * Constructs the class with given parameters and reads object related data + * from the ID3v2 tag. + * + * Replaces the reader instance with a string reader object instance that + * can be used to further process the data in the frame sub class. + * + * @todo Only limited subset of flags are processed. + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($reader === null) { + $this->_identifier = strtoupper(substr(get_class($this), -4)); + } else { + $this->_identifier = $this->_reader->readString8(4, " "); + + /* ID3v2.3.0 size and flags; convert flags to 2.4.0 format */ + if ($this->getOption('version', 4) < 4) { + $this->_size = $this->_reader->readUInt32BE(); + $flags = $this->_reader->readUInt16BE(); + if (($flags & 0x8000) == 0x8000) + $this->_flags |= self::DISCARD_ON_TAGCHANGE; + if (($flags & 0x4000) == 0x4000) + $this->_flags |= self::DISCARD_ON_FILECHANGE; + if (($flags & 0x2000) == 0x2000) + $this->_flags |= self::READ_ONLY; + if (($flags & 0x80) == 0x80) + $this->_flags |= self::COMPRESSION; + if (($flags & 0x40) == 0x40) + $this->_flags |= self::ENCRYPTION; + if (($flags & 0x20) == 0x20) + $this->_flags |= self::GROUPING_IDENTITY; + } + + /* ID3v2.4.0 size and flags */ + else { + $this->_size = + $this->_decodeSynchsafe32($this->_reader->readUInt32BE()); + $this->_flags = $this->_reader->readUInt16BE(); + } + + $dataLength = $this->_size; + if ($this->hasFlag(self::DATA_LENGTH_INDICATOR)) { + $dataLength = + $this->_decodeSynchsafe32($this->_reader->readUInt32BE()); + $this->_size -= 4; + } + + $data = $this->_reader->read($this->_size); + $this->_size = $dataLength; + + if ($this->hasFlag(self::UNSYNCHRONISATION) || + $this->getOption('unsynchronisation', false) === true) { + $data = $this->_decodeUnsynchronisation($data); + } + + $this->_reader = new Zend_Io_StringReader($data); + } + } + + /** + * Returns the frame identifier string. + * + * @return string + */ + public final function getIdentifier() + { + return $this->_identifier; + } + + /** + * Sets the frame identifier. + * + * @param string $identifier The identifier. + */ + public final function setIdentifier($identifier) + { + $this->_identifier = $identifier; + } + + /** + * Returns the size of the data in the final frame, after encryption, + * compression and unsynchronisation. The size is excluding the frame + * header. + * + * @return integer + */ + public final function getSize() + { + return $this->_size; + } + + /** + * Checks whether or not the flag is set. Returns true if the + * flag is set, false otherwise. + * + * @param integer $flag The flag to query. + * @return boolean + */ + public final function hasFlag($flag) + { + return ($this->_flags & $flag) == $flag; + } + + /** + * Returns the frame flags byte. + * + * @return integer + */ + public final function getFlags($flags) + { + return $this->_flags; + } + + /** + * Sets the frame flags byte. + * + * @param string $flags The flags byte. + */ + public final function setFlags($flags) + { + $this->_flags = $flags; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + abstract protected function _writeFrame($writer); + + /** + * Writes the frame data with the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + public function write($writer) + { + /* ID3v2.3.0 Flags; convert from 2.4.0 format */ + if ($this->getOption('version', 4) < 4) { + $flags = 0; + if ($this->hasFlag(self::DISCARD_ON_TAGCHANGE)) { + $flags = $flags | 0x8000; + } + if ($this->hasFlag(self::DISCARD_ON_FILECHANGE)) { + $flags = $flags | 0x4000; + } + if ($this->hasFlag(self::READ_ONLY)) { + $flags = $flags | 0x2000; + } + if ($this->hasFlag(self::COMPRESSION)) { + $flags = $flags | 0x80; + } + if ($this->hasFlag(self::ENCRYPTION)) { + $flags = $flags | 0x40; + } + if ($this->hasFlag(self::GROUPING_IDENTITY)) { + $flags = $flags | 0x20; + } + } + + /* ID3v2.4.0 Flags */ + else { + $flags = $this->_flags; + } + + $this->_writeFrame($buffer = new Zend_Io_StringWriter()); + $data = $buffer->toString(); + $size = $this->_size = strlen($data); + + if ($this->getOption('version', 4) >= 4) { + $data = $this->_encodeUnsynchronisation($data); + if (($dataLength = strlen($data)) != $size) { + $size = 4 + $dataLength; + $flags |= self::DATA_LENGTH_INDICATOR | self::UNSYNCHRONISATION; + $this->setOption('unsynchronisation', true); + } else { + $flags &= ~(self::DATA_LENGTH_INDICATOR | + self::UNSYNCHRONISATION); + } + } + + $writer->writeString8(substr($this->_identifier, 0, 4), 4, " ") + ->writeUInt32BE($this->_encodeSynchsafe32($size)) + ->writeUInt16BE($flags); + + if (($flags & self::DATA_LENGTH_INDICATOR) == + self::DATA_LENGTH_INDICATOR) { + $writer->writeUInt32BE($this->_encodeSynchsafe32($this->_size)); + } + $writer->write($data); + } +} diff --git a/src/Zend/Media/Id3/Frame/Aenc.php b/src/Zend/Media/Id3/Frame/Aenc.php new file mode 100644 index 0000000..a8f9906 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Aenc.php @@ -0,0 +1,178 @@ +Audio encryption indicates if the actual audio stream is + * encrypted, and by whom. + * + * The identifier is a URL containing an email address, or a link to a location + * where an email address can be found, that belongs to the organisation + * responsible for this specific encrypted audio file. Questions regarding the + * encrypted audio should be sent to the email address specified. There may be + * more than one AENC frame in a tag, but only one with the same owner + * identifier. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Aenc extends Zend_Media_Id3_Frame +{ + /** @var string */ + private $_owner; + + /** @var integer */ + private $_previewStart; + + /** @var integer */ + private $_previewLength; + + /** @var string */ + private $_encryptionInfo; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + list($this->_owner) = $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_reader->setOffset(strlen($this->_owner) + 1); + $this->_previewStart = $this->_reader->readUInt16BE(); + $this->_previewLength = $this->_reader->readUInt16BE(); + $this->_encryptionInfo = + $this->_reader->read($this->_reader->getSize()); + } + + /** + * Returns the owner identifier string. + * + * @return string + */ + public function getOwner() + { + return $this->_owner; + } + + /** + * Sets the owner identifier string. + * + * @param string $owner The owner identifier string. + */ + public function setOwner($owner) + { + $this->_owner = $owner; + } + + /** + * Returns the pointer to an unencrypted part of the audio in frames. + * + * @return integer + */ + public function getPreviewStart() + { + return $this->_previewStart; + } + + /** + * Sets the pointer to an unencrypted part of the audio in frames. + * + * @param integer $previewStart The pointer to an unencrypted part. + */ + public function setPreviewStart($previewStart) + { + $this->_previewStart = $previewStart; + } + + /** + * Returns the length of the preview in frames. + * + * @return integer + */ + public function getPreviewLength() + { + return $this->_previewLength; + } + + /** + * Sets the length of the preview in frames. + * + * @param integer $previewLength The length of the preview. + */ + public function setPreviewLength($previewLength) + { + $this->_previewLength = $previewLength; + } + + /** + * Returns the encryption info. + * + * @return string + */ + public function getEncryptionInfo() + { + return $this->_encryptionInfo; + } + + /** + * Sets the encryption info binary string. + * + * @param string $encryptionInfo The data string. + */ + public function setEncryptionInfo($encryptionInfo) + { + $this->_encryptionInfo = $encryptionInfo; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeString8($this->_owner, 1) + ->writeUInt16BE($this->_previewStart) + ->writeUInt16BE($this->_previewLength) + ->write($this->_encryptionInfo); + } +} diff --git a/src/Zend/Media/Id3/Frame/Apic.php b/src/Zend/Media/Id3/Frame/Apic.php new file mode 100644 index 0000000..20adb46 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Apic.php @@ -0,0 +1,290 @@ +Attached picture frame contains a picture directly related to the + * audio file. Image format is the MIME type and subtype for the image. + * + * There may be several pictures attached to one file, each in their individual + * APIC frame, but only one with the same content descriptor. There may only + * be one picture with the same picture type. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Apic extends Zend_Media_Id3_Frame + implements Zend_Media_Id3_Encoding +{ + /** + * The list of image types. + * + * @var Array + */ + public static $types = array + ('Other', '32x32 pixels file icon (PNG only)', 'Other file icon', + 'Cover (front)', 'Cover (back)', 'Leaflet page', + 'Media (e.g. label side of CD)', 'Lead artist/lead performer/soloist', + 'Artist/performer', 'Conductor', 'Band/Orchestra', 'Composer', + 'Lyricist/text writer', 'Recording Location', 'During recording', + 'During performance', 'Movie/video screen capture', + 'A bright coloured fish', 'Illustration', 'Band/artist logotype', + 'Publisher/Studio logotype'); + + /** @var integer */ + private $_encoding; + + /** @var string */ + private $_mimeType = 'image/unknown'; + + /** @var integer */ + private $_imageType = 0; + + /** @var string */ + private $_description; + + /** @var string */ + private $_imageData; + + /** @var integer */ + private $_imageSize = 0; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @todo There is the possibility to put only a link to the image file by + * using the MIME type '-->' and having a complete URL instead of picture + * data. Support for such needs design considerations. + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + $this->setEncoding + ($this->getOption('encoding', Zend_Media_Id3_Encoding::UTF8)); + + if ($this->_reader === null) { + return; + } + + $encoding = $this->_reader->readUInt8(); + list($this->_mimeType) = $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_reader->setOffset(1 + strlen($this->_mimeType) + 1); + $this->_imageType = $this->_reader->readUInt8(); + + switch ($encoding) { + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + list ($this->_description, $this->_imageData) = + $this->_explodeString16 + ($this->_reader->read($this->_reader->getSize()), 2); + break; + case self::UTF8: + // break intentionally omitted + default: + list ($this->_description, $this->_imageData) = + $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + break; + } + $this->_description = + $this->_convertString($this->_description, $encoding); + $this->_imageSize = strlen($this->_imageData); + } + + /** + * Returns the text encoding. + * + * All the strings read from a file are automatically converted to the + * character encoding specified with the encoding option. See + * {@link Zend_Media_Id3v2} for details. This method returns that character + * encoding, or any value set after read, translated into a string form + * regarless if it was set using a {@link Zend_Media_Id3_Encoding} constant + * or a string. + * + * @return integer + */ + public function getEncoding() + { + return $this->_translateIntToEncoding($this->_encoding); + } + + /** + * Sets the text encoding. + * + * All the string written to the frame are done so using given character + * encoding. No conversions of existing data take place upon the call to + * this method thus all texts must be given in given character encoding. + * + * The character encoding parameter takes either a + * {@link Zend_Media_Id3_Encoding} constant or a character set name string + * in the form accepted by iconv. The default character encoding used to + * write the frame is 'utf-8'. + * + * @see Zend_Media_Id3_Encoding + * @param integer $encoding The text encoding. + */ + public function setEncoding($encoding) + { + $this->_encoding = $this->_translateEncodingToInt($encoding); + } + + /** + * Returns the MIME type. The MIME type is always ISO-8859-1 encoded. + * + * @return string + */ + public function getMimeType() + { + return $this->_mimeType; + } + + /** + * Sets the MIME type. The MIME type is always ISO-8859-1 encoded. + * + * @param string $mimeType The MIME type. + */ + public function setMimeType($mimeType) + { + $this->_mimeType = $mimeType; + } + + /** + * Returns the image type. + * + * @return integer + */ + public function getImageType() + { + return $this->_imageType; + } + + /** + * Sets the image type code. + * + * @param integer $imageType The image type code. + */ + public function setImageType($imageType) + { + $this->_imageType = $imageType; + } + + /** + * Returns the file description. + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Sets the content description text using given encoding. + * + * @param string $description The content description text. + * @param integer $encoding The text encoding. + */ + public function setDescription($description, $encoding = null) + { + $this->_description = $description; + if ($encoding !== null) { + $this->setEncoding($encoding); + } + } + + /** + * Returns the embedded image data. + * + * @return string + */ + public function getImageData() + { + return $this->_imageData; + } + + /** + * Sets the embedded image data. Also updates the image size field to + * correspond the new data. + * + * @param string $imageData The image data. + */ + public function setImageData($imageData) + { + $this->_imageData = $imageData; + $this->_imageSize = strlen($imageData); + } + + /** + * Returns the size of the embedded image data. + * + * @return integer + */ + public function getImageSize() + { + return $this->_imageSize; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt8($this->_encoding) + ->writeString8($this->_mimeType, 1) + ->writeUInt8($this->_imageType); + switch ($this->_encoding) { + case self::UTF16LE: + $writer->writeString16 + ($this->_description, + Zend_Io_Writer::LITTLE_ENDIAN_ORDER, 1); + break; + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + $writer->writeString16($this->_description, null, 1); + break; + default: + $writer->writeString8($this->_description, 1); + break; + } + $writer->writeString8($this->_imageData); + } +} diff --git a/src/Zend/Media/Id3/Frame/Aspi.php b/src/Zend/Media/Id3/Frame/Aspi.php new file mode 100644 index 0000000..c729de2 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Aspi.php @@ -0,0 +1,160 @@ +Audio seek point index or + * ASPI frame makes seeking easier by providing a list a seek points within the + * audio file. The seek points are a fractional offset within the audio data, + * providing a starting point from which to find an appropriate point to start + * decoding. The presence of an ASPI frame requires the existence of a + * {@link Zend_Media_Id3_Frame_Tlen TLEN} frame, indicating the duration of the + * file in milliseconds. There may only be one audio seek point index frame in + * a tag. + * + * @todo Data parsing and write support + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Aspi extends Zend_Media_Id3_Frame +{ + /** @var integer */ + private $_dataStart; + + /** @var integer */ + private $_dataLength; + + /** @var integer */ + private $_size; + + /** @var Array */ + private $_fractions = array(); + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + require_once 'Zend/Media/Id3/Exception.php'; + throw new Zend_Media_Id3_Exception('Write not supported yet'); + } + + $this->_dataStart = $this->_reader->readInt32BE(); + $this->_dataLength = $this->_reader->readInt32BE(); + $this->_size = $this->_reader->readInt16BE(); + + $bitsPerPoint = $this->_reader->readInt8($this->_data[10]); + /*for ($i = 0, $offset = 11; $i < $this->_size; $i++) { + if ($bitsPerPoint == 16) { + $this->_fractions[$i] = substr($this->_data, $offset, 2); + $offset += 2; + } else { + $this->_fractions[$i] = substr($this->_data, $offset, 1); + $offset ++; + } + }*/ + } + + /** + * Returns the byte offset from the beginning of the file. + * + * @return integer + */ + public function getDataStart() + { + return $this->_dataStart; + } + + /** + * Sets the byte offset from the beginning of the file. + * + * @param integer $dataStart The offset. + */ + public function setDataStart($dataStart) + { + $this->_dataStart = $dataStart; + } + + /** + * Returns the byte length of the audio data being indexed. + * + * @return integer + */ + public function getDataLength() + { + return $this->_dataLength; + } + + /** + * Sets the byte length of the audio data being indexed. + * + * @param integer $dataLength The length. + */ + public function setDataLength($dataLength) + { + $this->_dataLength = $dataLength; + } + + /** + * Returns the number of index points in the frame. + * + * @return integer + */ + public function getSize() + { + return count($this->_fractions); + } + + /** + * Returns the numerator of the fraction representing a relative position in + * the data or false if index not defined. The denominator is 2 + * to the power of b. + * + * @param integer $index The fraction numerator. + * @return integer + */ + public function getFractionAt($index) + { + if (isset($this->_fractions[$index])) { + return $this->_fractions[$index]; + } + return false; + } +} diff --git a/src/Zend/Media/Id3/Frame/Comm.php b/src/Zend/Media/Id3/Frame/Comm.php new file mode 100644 index 0000000..eaa5a5a --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Comm.php @@ -0,0 +1,155 @@ +Comments frame is intended for any kind of full text information + * that does not fit in any other frame. It consists of a frame header followed + * by encoding, language and content descriptors and is ended with the actual + * comment as a text string. Newline characters are allowed in the comment text + * string. There may be more than one comment frame in each tag, but only one + * with the same language and content descriptor. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Comm extends Zend_Media_Id3_LanguageTextFrame +{ + /** @var string */ + private $_description; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + Zend_Media_Id3_Frame::__construct($reader, $options); + + $this->setEncoding + ($this->getOption('encoding', Zend_Media_Id3_Encoding::UTF8)); + + if ($this->_reader === null) { + return; + } + + $encoding = $this->_reader->readUInt8(); + $this->_language = strtolower($this->_reader->read(3)); + if ($this->_language == 'xxx') { + $this->_language = 'und'; + } + + switch ($encoding) { + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + list($this->_description, $this->_text) = + $this->_explodeString16 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_description = + $this->_convertString($this->_description, $encoding); + $this->_text = + $this->_convertString($this->_text, $encoding); + break; + case self::UTF8: + // break intentionally omitted + default: + list($this->_description, $this->_text) = $this->_convertString + ($this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2), + $encoding); + break; + } + } + + /** + * Returns the short content description. + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Sets the content description text using given encoding. The description + * language and encoding must be that of the actual text. + * + * @param string $description The content description text. + * @param string $language The language code. + * @param integer $encoding The text encoding. + */ + public function setDescription + ($description, $language = null, $encoding = null) + { + $this->_description = $description; + if ($language !== null) { + $this->setLanguage($language); + } + if ($encoding !== null) { + $this->setEncoding($encoding); + } + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt8($this->_encoding) + ->write($this->_language); + switch ($this->_encoding) { + case self::UTF16LE: + $writer->writeString16 + ($this->_description, + Zend_Io_Writer::LITTLE_ENDIAN_ORDER, 1) + ->writeString16 + ($this->_text,Zend_Io_Writer::LITTLE_ENDIAN_ORDER); + break; + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + $writer->writeString16($this->_description, null, 1) + ->writeString16($this->_text); + break; + default: + $writer->writeString8($this->_description, 1) + ->writeString8($this->_text); + break; + } + } +} diff --git a/src/Zend/Media/Id3/Frame/Comr.php b/src/Zend/Media/Id3/Frame/Comr.php new file mode 100644 index 0000000..ce238b7 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Comr.php @@ -0,0 +1,490 @@ +Commercial frame enables several competing offers in the same tag + * by bundling all needed information. That makes this frame rather complex but + * it's an easier solution than if one tries to achieve the same result with + * several frames. + * + * There may be more than one commercial frame in a tag, but no two may be + * identical. + * + * @todo The use of Zend_Currency requires design considerations. + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Comr extends Zend_Media_Id3_Frame + implements Zend_Media_Id3_Encoding +{ + /** + * The delivery types. + * + * @var Array + */ + public static $types = array + ('Other', 'Standard CD album with other songs', + 'Compressed audio on CD', 'File over the Internet', + 'Stream over the Internet', 'As note sheets', + 'As note sheets in a book with other sheets', 'Music on other media', + 'Non-musical merchandise'); + + /** @var integer */ + private $_encoding; + + /** @var string */ + private $_currency = 'EUR'; + + /** @var string */ + private $_price; + + /** @var string */ + private $_date; + + /** @var string */ + private $_contact; + + /** @var integer */ + private $_delivery = 0; + + /** @var string */ + private $_seller; + + /** @var string */ + private $_description; + + /** @var string */ + private $_mimeType = false; + + /** @var string */ + private $_imageData; + + /** @var integer */ + private $_imageSize = 0; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + $this->setEncoding + ($this->getOption('encoding', Zend_Media_Id3_Encoding::UTF8)); + + if ($this->_reader === null) { + return; + } + + $encoding = $this->_reader->readUInt8(); + $this->_currency = strtoupper($this->_reader->read(3)); + $offset = $this->_reader->getOffset(); + list ($this->_price) = + $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_reader->setOffset($offset + strlen($this->_price) + 1); + $this->_date = $this->_reader->read(8); + $offset = $this->_reader->getOffset(); + list($this->_contact) = + $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_reader->setOffset($offset + strlen($this->_contact) + 1); + $this->_delivery = $this->_reader->readUInt8(); + $offset = $this->_reader->getOffset(); + switch ($encoding) { + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + list ($this->_seller, $this->_description) = + $this->_explodeString16 + ($this->_reader->read($this->_reader->getSize()), 3); + $this->_reader->setOffset + ($offset + strlen($this->_seller) + + strlen($this->_description) + 4); + break; + case self::UTF8: + // break intentionally omitted + default: + list ($this->_seller, $this->_description) = + $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 3); + $this->_reader->setOffset + ($offset + strlen($this->_seller) + + strlen($this->_description) + 2); + break; + } + $this->_seller = $this->_convertString($this->_seller, $encoding); + $this->_description = $this->_convertString($this->_description, $encoding); + + if (!$this->_reader->available()) + return; + + list($this->_mimeType, $this->_imageData) = + $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_imageSize = strlen($this->_imageData); + } + + /** + * Returns the text encoding. + * + * All the strings read from a file are automatically converted to the + * character encoding specified with the encoding option. See + * {@link Zend_Media_Id3v2} for details. This method returns that character + * encoding, or any value set after read, translated into a string form + * regarless if it was set using a {@link Zend_Media_Id3_Encoding} constant + * or a string. + * + * @return integer + */ + public function getEncoding() + { + return $this->_translateIntToEncoding($this->_encoding); + } + + /** + * Sets the text encoding. + * + * All the string written to the frame are done so using given character + * encoding. No conversions of existing data take place upon the call to + * this method thus all texts must be given in given character encoding. + * + * The character encoding parameter takes either a + * {@link Zend_Media_Id3_Encoding} constant or a character set name string + * in the form accepted by iconv. The default character encoding used to + * write the frame is 'utf-8'. + * + * @see Zend_Media_Id3_Encoding + * @param integer $encoding The text encoding. + */ + public function setEncoding($encoding) + { + $this->_encoding = $this->_translateEncodingToInt($encoding); + } + + /** + * Returns the currency code, encoded according to + * {@link http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/currency_codes/currency_codes_list-1.htm + * ISO 4217} alphabetic currency code. + * + * @return string + */ + public function getCurrency() + { + return $this->_currency; + } + + /** + * Sets the currency used in transaction, encoded according to + * {@link http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/currency_codes/currency_codes_list-1.htm + * ISO 4217} alphabetic currency code. + * + * @param string $currency The currency code. + */ + public function setCurrency($currency) + { + $this->_currency = strtoupper($currency); + } + + /** + * Returns the first price. + * + * @return double + */ + public function getPrice() + { + $array = explode('/', $this->_price); + return doubleval($array[0]); + } + + /** + * Returns the price array. + * + * @return Array + */ + public function getPrices() + { + $array = explode('/', $this->_price); + foreach ($array as $key => $value) { + $array[$key] = doubleval($value); + } + return $array; + } + + /** + * Sets the default price. Multiple prices can be given in the form of an + * array but there may only be one currency of each type. + * + * @param double $price The price. + */ + public function setPrice($price) + { + $this->setPrices($price); + } + + /** + * Sets the default price. Multiple prices can be given in the form of an + * array but there may only be one currency of each type. + * + * @param double|Array $prices The prices. + */ + public function setPrices($prices) + { + if (!is_array($prices)) { + $prices = array($prices); + } + $this->_price = implode('/', $prices); + } + + /** + * Returns the date describing for how long the price is valid. + * + * @internal The ID3v2 standard does not declare the time zone to be used + * in the date. Date must thus be expressed as GMT/UTC. + * @return Zend_Date + */ + public function getDate() + { + require_once 'Zend/Date.php'; + $date = new Zend_Date(0); + $date->setTimezone('UTC'); + $date->set($this->_date, 'yyyyMMdd'); + return $date; + } + + /** + * Sets the date describing for how long the price is valid for. + * + * @internal The ID3v2 standard does not declare the time zone to be used + * in the date. Date must thus be expressed as GMT/UTC. + * @param Zend_Date $date The date. + */ + public function setDate($date) + { + require_once 'Zend/Date.php'; + if ($date === null) { + $date = Zend_Date::now(); + } + $date->setTimezone('UTC'); + $this->_date = $date->toString('yyyyMMdd'); + } + + /** + * Returns the contact URL, with which the user can contact the seller. + * + * @return string + */ + public function getContact() + { + return $this->_contact; + } + + /** + * Sets the contact URL, with which the user can contact the seller. + * + * @param string $contact The contact URL. + */ + public function setContact($contact) + { + $this->_contact = $contact; + } + + /** + * Returns the delivery type with whitch the audio was delivered when + * bought. + * + * @return integer + */ + public function getDelivery() + { + return $this->_delivery; + } + + /** + * Sets the delivery type with whitch the audio was delivered when bought. + * + * @param integer $delivery The delivery type code. + */ + public function setDelivery($delivery) + { + $this->_delivery = $delivery; + } + + /** + * Returns the name of the seller. + * + * @return string + */ + public function getSeller() + { + return $this->_seller; + } + + /** + * Sets the name of the seller using given encoding. The seller text + * encoding must be that of the description text. + * + * @param string $seller The name of the seller. + * @param integer $encoding The text encoding. + */ + public function setSeller($seller, $encoding = null) + { + $this->_seller = $seller; + if ($encoding !== null) { + $this->setEncoding($encoding); + } + } + + /** + * Returns the short description of the product. + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Sets the content description text using given encoding. The description + * encoding must be that of the seller text. + * + * @param string $description The content description text. + * @param integer $encoding The text encoding. + */ + public function setDescription($description, $encoding = null) + { + $this->_description = $description; + if ($encoding !== null) { + $this->setEncoding($encoding); + } + } + + /** + * Returns the MIME type of the seller's company logo, if attached, or + * false otherwise. Currently only 'image/png' and 'image/jpeg' + * are allowed. + * + * @return string + */ + public function getMimeType() + { + return $this->_mimeType; + } + + /** + * Sets the MIME type. Currently only 'image/png' and 'image/jpeg' are + * allowed. The MIME type is always ISO-8859-1 encoded. + * + * @param string $mimeType The MIME type. + */ + public function setMimeType($mimeType) + { + $this->_mimeType = $mimeType; + } + + /** + * Returns the embedded image binary data. + * + * @return string + */ + public function getImageData() + { + return $this->_imageData; + } + + /** + * Sets the embedded image data. Also updates the image size to correspond + * the new data. + * + * @param string $imageData The image data. + */ + public function setImageData($imageData) + { + $this->_imageData = $imageData; + $this->_imageSize = strlen($imageData); + } + + /** + * Returns the size of the embedded image data. + * + * @return integer + */ + public function getImageSize() + { + return $this->_imageSize; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt8($this->_encoding) + ->write($this->_currency) + ->writeString8($this->_price, 1) + ->write($this->_date) + ->writeString8($this->_contact, 1) + ->writeUInt8($this->_delivery); + switch ($this->_encoding) { + case self::UTF16LE: + $writer->writeString16 + ($this->_seller, Zend_Io_Writer::LITTLE_ENDIAN_ORDER, 1) + ->writeString16 + ($this->_description, + Zend_Io_Writer::LITTLE_ENDIAN_ORDER, 1); + break; + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + $writer->writeString16($this->_seller, null, 1) + ->writeString16($this->_description, null, 1); + break; + default: + $writer->writeString8($this->_seller, 1) + ->writeString8($this->_description, 1); + break; + } + if ($this->_mimeType) { + $writer->writeString8($this->_mimeType, 1) + ->write($this->_imageData); + } + } +} diff --git a/src/Zend/Media/Id3/Frame/Encr.php b/src/Zend/Media/Id3/Frame/Encr.php new file mode 100644 index 0000000..d211584 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Encr.php @@ -0,0 +1,165 @@ +Encryption method + * registration frame. + * + * The owner identifier a URL containing an email address, or a link to a + * location where an email address can be found, that belongs to the + * organisation responsible for this specific encryption method. Questions + * regarding the encryption method should be sent to the indicated email + * address. + * + * The method symbol contains a value that is associated with this method + * throughout the whole tag, in the range 0x80-0xF0. All other values are + * reserved. The method symbol may optionally be followed by encryption + * specific data. + * + * There may be several ENCR frames in a tag but only one containing the same + * symbol and only one containing the same owner identifier. The method must be + * used somewhere in the tag. See {@link Zend_Media_Id3_Frame#ENCRYPTION} for + * more information. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Encr extends Zend_Media_Id3_Frame +{ + /** @var string */ + private $_owner; + + /** @var integer */ + private $_method; + + /** @var string */ + private $_encryptionData; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + list($this->_owner, ) = + $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_reader->setOffset(strlen($this->_owner) + 1); + $this->_method = $this->_reader->readInt8(); + $this->_encryptionData = + $this->_reader->read($this->_reader->getSize()); + } + + /** + * Returns the owner identifier string. + * + * @return string + */ + public function getOwner() + { + return $this->_owner; + } + + /** + * Sets the owner identifier string. + * + + * @param string $owner The owner identifier string. + */ + public function setOwner($owner) + { + $this->_owner = $owner; + } + + /** + * Returns the method symbol. + * + * @return integer + */ + public function getMethod() + { + return $this->_method; + } + + /** + * Sets the method symbol. + * + * @param integer $method The method symbol byte. + */ + public function setMethod($method) + { + $this->_method = $method; + } + + /** + * Returns the encryption data. + * + * @return string + */ + public function getEncryptionData() + { + return $this->_encryptionData; + } + + /** + * Sets the encryption data. + * + * @param string $encryptionData The encryption data string. + */ + public function setEncryptionData($encryptionData) + { + $this->_encryptionData = $encryptionData; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeString8($this->_owner, 1) + ->writeInt8($this->_method) + ->write($this->_encryptionData); + } +} diff --git a/src/Zend/Media/Id3/Frame/Equ2.php b/src/Zend/Media/Id3/Frame/Equ2.php new file mode 100644 index 0000000..7760645 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Equ2.php @@ -0,0 +1,195 @@ +Equalisation (2) is another subjective, alignment frame. It allows + * the user to predefine an equalisation curve within the audio file. There may + * be more than one EQU2 frame in each tag, but only one with the same + * identification string. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Equ2 extends Zend_Media_Id3_Frame +{ + /** + * Interpolation type that defines that no interpolation is made. A jump + * from one adjustment level to another occurs in the middle between two + * adjustment points. + */ + const BAND = 0; + + /** + * Interpolation type that defines that interpolation between adjustment + * points is linear. + */ + const LINEAR = 1; + + /** @var integer */ + private $_interpolation; + + /** @var string */ + private $_device; + + /** @var Array */ + private $_adjustments = array(); + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + $this->_interpolation = $this->_reader->readInt8(); + list ($this->_device) = $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_reader->setOffset(1 + strlen($this->_device) + 1); + while ($this->_reader->available()) { + $this->_adjustments + [(int)($this->_reader->readUInt16BE() / 2)] = + $this->_reader->readInt16BE() / 512.0; + } + ksort($this->_adjustments); + } + + /** + * Returns the interpolation method. The interpolation method describes + * which method is preferred when an interpolation between the adjustment + * point that follows. + * + * @return integer + */ + public function getInterpolation() + { + return $this->_interpolation; + } + + /** + * Sets the interpolation method. The interpolation method describes which + * method is preferred when an interpolation between the adjustment point + * that follows. + * + * @param integer $interpolation The interpolation method code. + */ + public function setInterpolation($interpolation) + { + $this->_interpolation = $interpolation; + } + + /** + * Returns the device where the adjustments should apply. + * + * @return string + */ + public function getDevice() + { + return $this->_device; + } + + /** + * Sets the device where the adjustments should apply. + * + * @param string $device The device. + */ + public function setDevice($device) + { + $this->_device = $device; + } + + /** + * Returns the array containing adjustments having frequencies as keys and + * their corresponding adjustments as values. + * + * Adjustment points are ordered by frequency. + * + * @return Array + */ + public function getAdjustments() + { + return $this->_adjustments; + } + + /** + * Adds a volume adjustment setting for given frequency. The frequency can + * have a value from 0 to 32767 Hz, and the adjustment +/- 64 dB with a + * precision of 0.001953125 dB. + * + * @param integer $frequency The frequency, in hertz. + * @param integer $adjustment The adjustment, in dB. + */ + public function addAdjustment($frequency, $adjustment) + { + $this->_adjustments[$frequency] = $adjustment; + ksort($this->_adjustments); + } + + /** + * Sets the adjustments array. The array must have frequencies as keys and + * their corresponding adjustments as values. The frequency can have a value + * from 0 to 32767 Hz, and the adjustment +/- 64 dB with a precision of + * 0.001953125 dB. One frequency should only be described once in the frame. + * + * @param Array $adjustments The adjustments array. + */ + public function setAdjustments($adjustments) + { + $this->_adjustments = $adjustments; + ksort($this->_adjustments); + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeInt8($this->_interpolation) + ->writeString8($this->_device, 1); + foreach ($this->_adjustments as $frequency => $adjustment) { + $writer->writeUInt16BE($frequency * 2) + ->writeInt16BE($adjustment * 512); + } + } +} diff --git a/src/Zend/Media/Id3/Frame/Equa.php b/src/Zend/Media/Id3/Frame/Equa.php new file mode 100644 index 0000000..1cc2377 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Equa.php @@ -0,0 +1,133 @@ +Equalisation frame is another subjective, alignment frame. It + * allows the user to predefine an equalisation curve within the audio file. + * There may only be one EQUA frame in each tag. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @deprecated ID3v2.3.0 + */ +final class Zend_Media_Id3_Frame_Equa extends Zend_Media_Id3_Frame +{ + /** @var Array */ + private $_adjustments; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + $adjustmentBits = $this->_reader->readInt8(); + if ($adjustmentBits <= 8 || $adjustmentBits > 16) { + require_once 'Zend/Media/Id3/Exception.php'; + throw new Zend_Media_Id3_Exception + ('Unsupported adjustment bit size of: ' . $adjustmentBits); + } + + while ($this->_reader->available()) { + $frequency = $this->_reader->readUInt16BE(); + $this->_adjustments[($frequency & 0x7fff)] = + ($frequency & 0x8000) == 0x8000 ? + $this->_reader->readUInt16BE() : + -$this->_reader->readUInt16BE(); + } + ksort($this->_adjustments); + } + + /** + * Returns the array containing adjustments having frequencies as keys and + * their corresponding adjustments as values. + * + * @return Array + */ + public function getAdjustments() + { + return $this->_adjustments; + } + + /** + * Adds a volume adjustment setting for given frequency. The frequency can + * have a value from 0 to 32767 Hz. + * + * @param integer $frequency The frequency, in hertz. + * @param integer $adjustment The adjustment, in dB. + */ + public function addAdjustment($frequency, $adjustment) + { + $this->_adjustments[$frequency] = $adjustment; + ksort($this->_adjustments); + } + + /** + * Sets the adjustments array. The array must have frequencies as keys and + * their corresponding adjustments as values. The frequency can have a value + * from 0 to 32767 Hz. One frequency should only be described once in the + * frame. + * + * @param Array $adjustments The adjustments array. + */ + public function setAdjustments($adjustments) + { + $this->_adjustments = $adjustments; + ksort($this->_adjustments); + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeInt8(16); + foreach ($this->_adjustments as $frequency => $adjustment) { + $writer->writeUInt16BE + ($adjustment > 0 ? $frequency | 0x8000 : $frequency & ~0x8000) + ->writeUInt16BE(abs($adjustment)); + } + } +} diff --git a/src/Zend/Media/Id3/Frame/Etco.php b/src/Zend/Media/Id3/Frame/Etco.php new file mode 100644 index 0000000..417d76d --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Etco.php @@ -0,0 +1,168 @@ +Event timing codes allows synchronisation with key events in the + * audio. + * + * The events are an array of timestamp and type pairs. The time stamp is set to + * zero if directly at the beginning of the sound or after the previous event. + * All events are sorted in chronological order. + * + * The events 0xe0-ef are for user events. You might want to synchronise your + * music to something, like setting off an explosion on-stage, activating a + * screensaver etc. + * + * There may only be one ETCO frame in each tag. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Etco extends Zend_Media_Id3_Frame + implements Zend_Media_Id3_Timing +{ + /** + * The list of event types. + * + * @var Array + */ + public static $types = array + ('Padding', 'End of initial silence', 'Intro start', 'Main part start', + 'Outro start', 'Outro end', 'Verse start','Refrain start', + 'Interlude start', 'Theme start', 'Variation start', 'Key change', + 'Time change', 'Momentary unwanted noise', 'Sustained noise', + 'Sustained noise end', 'Intro end', 'Main part end', 'Verse end', + 'Refrain end', 'Theme end', 'Profanity', 'Profanity end', + + 0xe0 => 'User event', 'User event', 'User event', 'User event', + 'User event', 'User event', 'User event', 'User event', 'User event', + 'User event', 'User event', 'User event', 'User event', 'User event', + + 0xfd => 'Audio end (start of silence)', 'Audio file ends', + 'One more byte of events follows'); + + /** @var integer */ + private $_format = Zend_Media_Id3_Timing::MPEG_FRAMES; + + /** @var Array */ + private $_events = array(); + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + $this->_format = $this->_reader->readUInt8(); + while ($this->_reader->available()) { + $data = $this->_reader->readUInt8(); + $this->_events[$this->_reader->readUInt32BE()] = $data; + if ($data == 0xff) { + break; + } + } + ksort($this->_events); + } + + /** + * Returns the timing format. + * + * @return integer + */ + public function getFormat() + { + return $this->_format; + } + + /** + * Sets the timing format. + * + * @see Zend_Media_Id3_Timing + * @param integer $format The timing format. + */ + public function setFormat($format) + { + $this->_format = $format; + } + + /** + * Returns the events as an associated array having the timestamps as keys + * and the event types as values. + * + * @return Array + */ + public function getEvents() + { + return $this->_events; + } + + /** + * Sets the events using given format. The value must be an associated array + * having the timestamps as keys and the event types as values. + * + * @param Array $events The events array. + * @param integer $format The timing format. + */ + public function setEvents($events, $format = null) + { + $this->_events = $events; + if ($format !== null) { + $this->setFormat($format); + } + ksort($this->_events); + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt8($this->_format); + foreach ($this->_events as $timestamp => $type) { + $writer->writeUInt8($type) + ->writeUInt32BE($timestamp); + } + } +} diff --git a/src/Zend/Media/Id3/Frame/Geob.php b/src/Zend/Media/Id3/Frame/Geob.php new file mode 100644 index 0000000..4b14ced --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Geob.php @@ -0,0 +1,264 @@ +General encapsulated object frame any type of file can be + * encapsulated. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Geob extends Zend_Media_Id3_Frame + implements Zend_Media_Id3_Encoding +{ + /** @var integer */ + private $_encoding; + + /** @var string */ + private $_mimeType; + + /** @var string */ + private $_filename; + + /** @var string */ + private $_description; + + /** @var string */ + private $_data; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + $this->setEncoding + ($this->getOption('encoding', Zend_Media_Id3_Encoding::UTF8)); + + if ($this->_reader === null) { + return; + } + + $encoding = $this->_reader->readUInt8(); + list($this->_mimeType) = $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_reader->setOffset(1 + strlen($this->_mimeType) + 1); + + switch ($encoding) { + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + list ($this->_filename, $this->_description, + $this->_data) = + $this->_explodeString16 + ($this->_reader->read($this->_reader->getSize()), 3); + break; + case self::UTF8: + // break intentionally omitted + default: + list ($this->_filename, $this->_description, + $this->_data) = + $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 3); + break; + } + $this->_filename = + $this->_convertString($this->_filename, $encoding); + $this->_description = + $this->_convertString($this->_description, $encoding); + } + + /** + * Returns the text encoding. + * + * All the strings read from a file are automatically converted to the + * character encoding specified with the encoding option. See + * {@link Zend_Media_Id3v2} for details. This method returns that character + * encoding, or any value set after read, translated into a string form + * regarless if it was set using a {@link Zend_Media_Id3_Encoding} constant + * or a string. + * + * @return integer + */ + public function getEncoding() + { + return $this->_translateIntToEncoding($this->_encoding); + } + + /** + * Sets the text encoding. + * + * All the string written to the frame are done so using given character + * encoding. No conversions of existing data take place upon the call to + * this method thus all texts must be given in given character encoding. + * + * The character encoding parameter takes either a + * {@link Zend_Media_Id3_Encoding} constant or a character set name string + * in the form accepted by iconv. The default character encoding used to + * write the frame is 'utf-8'. + * + * @see Zend_Media_Id3_Encoding + * @param integer $encoding The text encoding. + */ + public function setEncoding($encoding) + { + $this->_encoding = $this->_translateEncodingToInt($encoding); + } + + /** + * Returns the MIME type. The MIME type is always encoded with ISO-8859-1. + * + * @return string + */ + public function getMimeType() + { + return $this->_mimeType; + } + + /** + * Sets the MIME type. The MIME type is always ISO-8859-1 encoded. + * + * @param string $mimeType The MIME type. + */ + public function setMimeType($mimeType) + { + $this->_mimeType = $mimeType; + } + + /** + * Returns the file name. + * + * @return string + */ + public function getFilename() + { + return $this->_filename; + } + + /** + * Sets the file name using given encoding. The file name encoding must be + * that of the description text. + * + * @param string $description The file description text. + * @param integer $encoding The text encoding. + */ + public function setFilename($filename, $encoding = null) + { + $this->_filename = $filename; + if ($encoding !== null) { + $this->_encoding = $encoding; + } + } + + /** + * Returns the file description. + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Sets the file description text using given encoding. The description + * encoding must be that of the file name. + * + * @param string $description The file description text. + * @param integer $encoding The text encoding. + */ + public function setDescription($description, $encoding = null) + { + $this->_description = $description; + if ($encoding !== null) { + $this->setEncoding($encoding); + } + } + + /** + * Returns the embedded object binary data. + * + * @return string + */ + public function getData() + { + return $this->_data; + } + + /** + * Sets the embedded object binary data. + * + * @param string $data The object data. + */ + public function setData($data) + { + $this->_data = $data; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt8($this->_encoding) + ->writeString8($this->_mimeType, 1); + switch ($this->_encoding) { + case self::UTF16LE: + $writer->writeString16 + ($this->_filename, Zend_Io_Writer::LITTLE_ENDIAN_ORDER, 1) + ->writeString16 + ($this->_description, + Zend_Io_Writer::LITTLE_ENDIAN_ORDER, 1); + break; + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + $writer->writeString16($this->_filename, null, 1) + ->writeString16($this->_description, null, 1); + break; + default: + $writer->writeString8($this->_filename, 1) + ->writeString8($this->_description, 1); + break; + } + $writer->write($this->_data); + } +} diff --git a/src/Zend/Media/Id3/Frame/Grid.php b/src/Zend/Media/Id3/Frame/Grid.php new file mode 100644 index 0000000..e5c72d9 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Grid.php @@ -0,0 +1,160 @@ +Group identification registration frame enables grouping of + * otherwise unrelated frames. This can be used when some frames are to be + * signed. To identify which frames belongs to a set of frames a group + * identifier must be registered in the tag with this frame. + * + * The owner identifier is a URL containing an email address, or a link to a + * location where an email address can be found, that belongs to the + * organisation responsible for this grouping. Questions regarding the grouping + * should be sent to the indicated email address. + * + * The group symbol contains a value that associates the frame with this group + * throughout the whole tag, in the range 0x80-0xf0. All other values are + * reserved. The group symbol may optionally be followed by some group specific + * data, e.g. a digital signature. There may be several GRID frames in a tag + * but only one containing the same symbol and only one containing the same + * owner identifier. The group symbol must be used somewhere in the tag. See + * {@link Zend_Media_Id3_Frame#GROUPING_IDENTITY} for more information. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Grid extends Zend_Media_Id3_Frame +{ + /** @var string */ + private $_owner; + + /** @var integer */ + private $_group; + + /** @var string */ + private $_data; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + list($this->_owner) = $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_reader->setOffset(strlen($this->_owner) + 1); + $this->_group = $this->_reader->readUInt8(); + $this->_data = $this->_reader->read($this->_reader->getSize()); + } + + /** + * Returns the owner identifier string. + * + * @return string + */ + public function getOwner() + { + return $this->_owner; + } + + /** + * Sets the owner identifier string. + * + * @param string $owner The owner identifier string. + */ + public function setOwner($owner) + { + $this->_owner = $owner; + } + + /** + * Returns the group symbol. + * + * @return integer + */ + public function getGroup() + { + return $this->_group; + } + + /** + * Sets the group symbol. + * + * @param integer $group The group symbol. + */ + public function setGroup($group) + { + $this->_group = $group; + } + + /** + * Returns the group dependent data. + * + * @return string + */ + public function getData() + { + return $this->_data; + } + + /** + * Sets the group dependent data. + * + * @param string $data The data. + */ + public function setData($data) + { + $this->_data = $data; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeString8($this->_owner, 1) + ->writeUInt8($this->_group) + ->write($this->_data); + } +} diff --git a/src/Zend/Media/Id3/Frame/Ipls.php b/src/Zend/Media/Id3/Frame/Ipls.php new file mode 100644 index 0000000..a96e3a6 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Ipls.php @@ -0,0 +1,200 @@ +Involved people list is a frame containing the names of those + * involved, and how they were involved. There may only be one IPLS frame in + * each tag. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @deprecated ID3v2.3.0 + */ +final class Zend_Media_Id3_Frame_Ipls extends Zend_Media_Id3_Frame + implements Zend_Media_Id3_Encoding +{ + /** @var integer */ + private $_encoding; + + /** @var Array */ + private $_people = array(); + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + $this->setEncoding + ($this->getOption('encoding', Zend_Media_Id3_Encoding::UTF8)); + + if ($this->_reader === null) { + return; + } + + $data = array(); + $encoding = $this->_reader->readUInt8(); + switch ($encoding) { + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + $data = $this->_explodeString16 + ($this->_reader->read($this->_reader->getSize())); + foreach ($data as &$str) + $str = $this->_convertString($str, $encoding); + break; + case self::UTF8: + // break intentionally omitted + default: + $data = $this->_convertString + ($this->_explodeString8 + ($this->_reader->read($this->_reader->getSize())), + $encoding); + break; + } + + for ($i = 0; $i < count($data) - 1; $i += 2) { + $this->_people[] = array($data[$i] => @$data[$i + 1]); + } + } + + /** + * Returns the text encoding. + * + * All the strings read from a file are automatically converted to the + * character encoding specified with the encoding option. See + * {@link Zend_Media_Id3v2} for details. This method returns that character + * encoding, or any value set after read, translated into a string form + * regarless if it was set using a {@link Zend_Media_Id3_Encoding} constant + * or a string. + * + * @return integer + */ + public function getEncoding() + { + return $this->_translateIntToEncoding($this->_encoding); + } + + /** + * Sets the text encoding. + * + * All the string written to the frame are done so using given character + * encoding. No conversions of existing data take place upon the call to + * this method thus all texts must be given in given character encoding. + * + * The character encoding parameter takes either a + * {@link Zend_Media_Id3_Encoding} constant or a character set name string + * in the form accepted by iconv. The default character encoding used to + * write the frame is 'utf-8'. + * + * @see Zend_Media_Id3_Encoding + * @param integer $encoding The text encoding. + */ + public function setEncoding($encoding) + { + $this->_encoding = $this->_translateEncodingToInt($encoding); + } + + /** + * Returns the involved people list as an array. For each person, the array + * contains an entry, which too is an associate array with involvement as + * its key and involvee as its value. + * + * @return Array + */ + public function getPeople() + { + return $this->_people; + } + + /** + * Adds a person with his involvement. + * + * @return string + */ + public function addPerson($involvement, $person) + { + $this->_people[] = array($involvement => $person); + } + + /** + * Sets the involved people list array. For each person, the array must + * contain an associate array with involvement as its key and involvee as + * its value. + * + * @param Array $people The involved people list. + */ + public function setPeople($people) + { + $this->_people = $people; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt8($this->_encoding); + foreach ($this->_people as $entry) { + foreach ($entry as $key => $val) { + switch ($this->_encoding) { + case self::UTF16LE: + $writer->writeString16 + ($key, Zend_Io_Writer::LITTLE_ENDIAN_ORDER, 1) + ->writeString16 + ($val, Zend_Io_Writer::LITTLE_ENDIAN_ORDER, 1); + break; + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + $writer->writeString16($key, null, 1) + ->writeString16($val, null, 1); + break; + default: + $writer->writeString8($key, 1) + ->writeString8($val, 1); + break; + } + } + } + } +} diff --git a/src/Zend/Media/Id3/Frame/Link.php b/src/Zend/Media/Id3/Frame/Link.php new file mode 100644 index 0000000..6623efc --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Link.php @@ -0,0 +1,188 @@ +Linked information frame is used to keep information duplication + * as low as possible by linking information from another ID3v2 tag that might + * reside in another audio file or alone in a binary file. It is recommended + * that this method is only used when the files are stored on a CD-ROM or other + * circumstances when the risk of file separation is low. + * + * Data should be retrieved from the first tag found in the file to which this + * link points. There may be more than one LINK frame in a tag, but only one + * with the same contents. + * + * A linked frame is to be considered as part of the tag and has the same + * restrictions as if it was a physical part of the tag (i.e. only one + * {@link Zend_Media_Id3_Frame_Rvrb RVRB} frame allowed, whether it's linked or + * not). + * + * Frames that may be linked and need no additional data are + * {@link Zend_Media_Id3_Frame_Aspi ASPI}, + * {@link Zend_Media_Id3_Frame_Etco ETCO}, + * {@link Zend_Media_Id3_Frame_Equ2 EQU2}, + * {@link Zend_Media_Id3_Frame_Mcdi MCDI}, + * {@link Zend_Media_Id3_Frame_Mllt MLLT}, + * {@link Zend_Media_Id3_Frame_Owne OWNE}, + * {@link Zend_Media_Id3_Frame_Rva2 RVA2}, + * {@link Zend_Media_Id3_Frame_Rvrb RVRB}, + * {@link Zend_Media_Id3_Frame_Sytc SYTC}, the text information frames (ie + * frames descendats of {@link Zend_Media_Id3_TextFrame}) and the URL + * link frames (ie frames descendants of + * {@link Zend_Media_Id3_LinkFrame}). + * + * The {@link Zend_Media_Id3_Frame_Aenc AENC}, + * {@link Zend_Media_Id3_Frame_Apic APIC}, + * {@link Zend_Media_Id3_Frame_Geob GEOB} + * and {@link Zend_Media_Id3_Frame_Txxx TXXX} frames may be linked with the + * content descriptor as additional ID data. + * + * The {@link Zend_Media_Id3_Frame_User USER} frame may be linked with the + * language field as additional ID data. + * + * The {@link Zend_Media_Id3_Frame_Priv PRIV} frame may be linked with the owner + * identifier as additional ID data. + * + * The {@link Zend_Media_Id3_Frame_Comm COMM}, + * {@link Zend_Media_Id3_Frame_Sylt SYLT} and + * {@link Zend_Media_Id3_Frame_Uslt USLT} frames may be linked with three bytes + * of language descriptor directly followed by a content descriptor as + * additional ID data. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Link extends Zend_Media_Id3_Frame +{ + /** @var string */ + private $_target; + + /** @var string */ + private $_url; + + /** @var string */ + private $_qualifier; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + $this->_target = $this->_reader->read(4); + list($this->_url, $this->_qualifier) = + $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + } + + /** + * Returns the target tag identifier. + * + * @return string + */ + public function getTarget() + { + return $this->_target; + } + + /** + * Sets the target tag identifier. + * + * @param string $target The target tag identifier. + */ + public function setTarget($target) + { + $this->_target = $target; + } + + /** + * Returns the target tag URL. + * + * @return string + */ + public function getUrl() + { + return $this->_url; + } + + /** + * Sets the target tag URL. + * + * @param string $url The target URL. + */ + public function setUrl($url) + { + $this->_url = $url; + } + + /** + * Returns the additional data to identify further the tag. + * + * @return string + */ + public function getQualifier() + { + return $this->_qualifier; + } + + /** + * Sets the additional data to be used in tag identification. + * + * @param string $identifier The qualifier. + */ + public function setQualifier($qualifier) + { + $this->_qualifier = $qualifier; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeString8(substr($this->_target, 0, 4), 4) + ->writeString8($this->_url, 1) + ->writeString8($this->_qualifier); + } +} diff --git a/src/Zend/Media/Id3/Frame/Mcdi.php b/src/Zend/Media/Id3/Frame/Mcdi.php new file mode 100644 index 0000000..06fca94 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Mcdi.php @@ -0,0 +1,102 @@ + + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Mcdi extends Zend_Media_Id3_Frame +{ + /** @var string */ + private $_data; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + $this->_data = $this->_reader->read($this->_reader->getSize()); + } + + /** + * Returns the CD TOC binary dump. + * + * @return string + */ + public function getData() + { + return $this->_data; + } + + /** + * Sets the CD TOC binary dump. + * + * @param string $data The CD TOC binary dump string. + */ + public function setData($data) + { + $this->_data = $data; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->write($this->_data); + } +} diff --git a/src/Zend/Media/Id3/Frame/Mllt.php b/src/Zend/Media/Id3/Frame/Mllt.php new file mode 100644 index 0000000..b72d76a --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Mllt.php @@ -0,0 +1,187 @@ +MPEG location lookup table frame includes references that the + * software can use to calculate positions in the file. + * + * The MPEG frames between reference describes how much the frame counter should + * be increased for every reference. If this value is two then the first + * reference points out the second frame, the 2nd reference the 4th frame, the + * 3rd reference the 6th frame etc. In a similar way the bytes between reference + * and milliseconds between reference points out bytes and milliseconds + * respectively. + * + * Each reference consists of two parts; a certain number of bits that describes + * the difference between what is said in bytes between reference and the + * reality and a certain number of bits that describes the difference between + * what is said in milliseconds between reference and the reality. + * + * There may only be one MLLT frame in each tag. + * + * @todo Data parsing and write support + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Mllt extends Zend_Media_Id3_Frame +{ + /** @var integer */ + private $_frames; + + /** @var integer */ + private $_bytes; + + /** @var integer */ + private $_milliseconds; + + /** @var Array */ + private $_deviation = array(); + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + require_once 'Zend/Media/Id3/Exception.php'; + throw new Zend_Media_Id3_Exception('Write not supported yet'); + } + + $this->_frames = Transform::fromInt16BE(substr($this->_data, 0, 2)); + $this->_bytes = Transform::fromInt32BE(substr($this->_data, 2, 3)); + $this->_milliseconds = Transform::fromInt32BE(substr($this->_data, 5, 3)); + + $byteDevBits = Transform::fromInt8($this->_data[8]); + $millisDevBits = Transform::fromInt8($this->_data[9]); + + // $data = substr($this->_data, 10); + } + + /** + * Returns the number of MPEG frames between reference. + * + + * @return integer + */ + public function getFrames() + { + return $this->_frames; + } + + /** + * Sets the number of MPEG frames between reference. + * + + * @param integer $frames The number of MPEG frames. + */ + public function setFrames($frames) + { + $this->_frames = $frames; + } + + /** + * Returns the number of bytes between reference. + * + + * @return integer + */ + public function getBytes() + { + return $this->_bytes; + } + + /** + * Sets the number of bytes between reference. + * + + * @param integer $bytes The number of bytes. + */ + public function setBytes($bytes) + { + $this->_bytes = $bytes; + } + + /** + * Returns the number of milliseconds between references. + * + + * @return integer + */ + public function getMilliseconds() + { + return $this->_milliseconds; + } + + /** + * Sets the number of milliseconds between references. + * + + * @param integer $milliseconds The number of milliseconds. + */ + public function setMilliseconds($milliseconds) + { + return $this->_milliseconds; + } + + /** + * Returns the deviations as an array. Each value is an array containing two + * values, ie the deviation in bytes, and the deviation in milliseconds, + * respectively. + * + + * @return Array + */ + public function getDeviation() + { + return $this->_deviation; + } + + /** + * Sets the deviations array. The array must consist of arrays, each of + * which having two values, the deviation in bytes, and the deviation in + * milliseconds, respectively. + * + + * @param Array $deviation The deviations array. + */ + public function setDeviation($deviation) + { + $this->_deviation = $deviation; + } +} diff --git a/src/Zend/Media/Id3/Frame/Owne.php b/src/Zend/Media/Id3/Frame/Owne.php new file mode 100644 index 0000000..4aac05f --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Owne.php @@ -0,0 +1,258 @@ +Ownership frame might be used as a reminder of a made transaction + * or, if signed, as proof. Note that the {@link Zend_Media_Id3_Frame_User USER} + * and {@link Zend_Media_Id3_Frame_Town TOWN} frames are good to use in + * conjunction with this one. + * + * There may only be one OWNE frame in a tag. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Owne extends Zend_Media_Id3_Frame + implements Zend_Media_Id3_Encoding +{ + /** @var integer */ + private $_encoding; + + /** @var string */ + private $_currency = 'EUR'; + + /** @var string */ + private $_price; + + /** @var string */ + private $_date; + + /** @var string */ + private $_seller; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + $this->setEncoding + ($this->getOption('encoding', Zend_Media_Id3_Encoding::UTF8)); + + if ($this->_reader === null) { + return; + } + + $encoding = $this->_reader->readUInt8(); + $this->_currency = strtoupper($this->_reader->read(3)); + $offset = $this->_reader->getOffset(); + list ($this->_price) = + $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_reader->setOffset($offset + strlen($this->_price) + 1); + $this->_date = $this->_reader->read(8); + $this->_seller = $this->_convertString + ($this->_reader->read($this->_reader->getSize()), $encoding); + } + + /** + * Returns the text encoding. + * + * All the strings read from a file are automatically converted to the + * character encoding specified with the encoding option. See + * {@link Zend_Media_Id3v2} for details. This method returns that character + * encoding, or any value set after read, translated into a string form + * regarless if it was set using a {@link Zend_Media_Id3_Encoding} constant + * or a string. + * + * @return integer + */ + public function getEncoding() + { + return $this->_translateIntToEncoding($this->_encoding); + } + + /** + * Sets the text encoding. + * + * All the string written to the frame are done so using given character + * encoding. No conversions of existing data take place upon the call to + * this method thus all texts must be given in given character encoding. + * + * The character encoding parameter takes either a + * {@link Zend_Media_Id3_Encoding} constant or a character set name string + * in the form accepted by iconv. The default character encoding used to + * write the frame is 'utf-8'. + * + * @see Zend_Media_Id3_Encoding + * @param integer $encoding The text encoding. + */ + public function setEncoding($encoding) + { + $this->_encoding = $this->_translateEncodingToInt($encoding); + } + + /** + * Returns the currency code, encoded according to + * {@link http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/currency_codes/currency_codes_list-1.htm + * ISO 4217} alphabetic currency code. + * + * @return string + */ + public function getCurrency() + { + return $this->_currency; + } + + /** + * Sets the currency used in transaction, encoded according to + * {@link http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/currency_codes/currency_codes_list-1.htm + * ISO 4217} alphabetic currency code. + * + * @param string $currency The currency code. + */ + public function setCurrency($currency) + { + $this->_currency = strtoupper($currency); + } + + /** + * Returns the price. + * + * @return double + */ + public function getPrice() + { + return doubleval($this->_price); + } + + /** + * Sets the price. + * + * @param integer $price The price. + */ + public function setPrice($price) + { + $this->_price = number_format($price, 2, '.', ''); + } + + /** + * Returns the date describing for how long the price is valid. + * + * @internal The ID3v2 standard does not declare the time zone to be used + * in the date. Date must thus be expressed as GMT/UTC. + * @return Zend_Date + */ + public function getDate() + { + require_once 'Zend/Date.php'; + $date = new Zend_Date(0); + $date->setTimezone('UTC'); + $date->set($this->_date, 'yyyyMMdd'); + return $date; + } + + /** + * Sets the date describing for how long the price is valid for. + * + * @internal The ID3v2 standard does not declare the time zone to be used + * in the date. Date must thus be expressed as GMT/UTC. + * @param Zend_Date $date The date. + */ + public function setDate($date) + { + require_once 'Zend/Date.php'; + if ($date === null) { + $date = Zend_Date::now(); + } + $date->setTimezone('UTC'); + $this->_date = $date->toString('yyyyMMdd'); + } + + /** + * Returns the name of the seller. + * + * @return string + */ + public function getSeller() + { + return $this->_seller; + } + + /** + * Sets the name of the seller using given encoding. + * + * @param string $seller The name of the seller. + * @param integer $encoding The text encoding. + */ + public function setSeller($seller, $encoding = null) + { + $this->_seller = $seller; + if ($encoding !== null) { + $this->setEncoding($encoding); + } + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt8($this->_encoding) + ->write($this->_currency) + ->writeString8($this->_price, 1) + ->write($this->_date); + switch ($this->_encoding) { + case self::UTF16LE: + $writer->writeString16 + ($this->_seller, Zend_Io_Writer::LITTLE_ENDIAN_ORDER); + break; + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + $writer->writeString16($this->_seller); + break; + default: + $writer->writeString8($this->_seller); + break; + } + } +} diff --git a/src/Zend/Media/Id3/Frame/Pcnt.php b/src/Zend/Media/Id3/Frame/Pcnt.php new file mode 100644 index 0000000..1dfcf80 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Pcnt.php @@ -0,0 +1,110 @@ +Play counter is simply a counter of the number of times a file has + * been played. The value is increased by one every time the file begins to + * play. There may only be one PCNT frame in each tag. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Pcnt extends Zend_Media_Id3_Frame +{ + /** @var integer */ + private $_counter = 0; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + if ($this->_reader->getSize() > 4) { + $this->_counter = $this->_reader->readInt64BE(); // UInt64 + } else { + $this->_counter = $this->_reader->readUInt32BE(); + } + } + + /** + * Returns the counter. + * + * @return integer + */ + public function getCounter() + { + return $this->_counter; + } + + /** + * Adds counter by one. + */ + public function addCounter() + { + $this->_counter++; + } + + /** + * Sets the counter value. + * + * @param integer $counter The counter value. + */ + public function setCounter($counter) + { + $this->_counter = $counter; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + if ($this->_counter > 4294967295) { + $writer->writeInt64BE($this->_counter); // UInt64 + } else { + $writer->writeUInt32BE($this->_counter); + } + } +} diff --git a/src/Zend/Media/Id3/Frame/Popm.php b/src/Zend/Media/Id3/Frame/Popm.php new file mode 100644 index 0000000..785f25f --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Popm.php @@ -0,0 +1,176 @@ +Popularimeter frame is to specify how good an audio + * file is. Many interesting applications could be found to this frame such as a + * playlist that features better audio files more often than others or it could + * be used to profile a person's taste and find other good files by comparing + * people's profiles. The frame contains the email address to the user, one + * rating byte and a four byte play counter, intended to be increased with one + * for every time the file is played. + * + * The rating is 1-255 where 1 is worst and 255 is best. 0 is unknown. If no + * personal counter is wanted it may be omitted. When the counter reaches all + * one's, one byte is inserted in front of the counter thus making the counter + * eight bits bigger in the same away as the play counter + * {@link Zend_Media_Id3_Frame_Pcnt PCNT}. There may be more than one POPM frame + * in each tag, but only one with the same email address. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Popm extends Zend_Media_Id3_Frame +{ + /** @var string */ + private $_owner; + + /** @var integer */ + private $_rating = 0; + + /** @var integer */ + private $_counter = 0; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + list ($this->_owner) = + $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_reader->setOffset(strlen($this->_owner) + 1); + $this->_rating = $this->_reader->readUInt8(); + + if ($this->_reader->getSize() - strlen($this->_owner) - 2 > 4) { + $this->_counter = + $this->_reader->readInt64BE(); // UInt64 + } else if ($this->_reader->available() > 0) { + $this->_counter = $this->_reader->readUInt32BE(); + } + } + + /** + * Returns the owner identifier string. + * + * @return string + */ + public function getOwner() + { + return $this->_owner; + } + + /** + * Sets the owner identifier string. + * + * @param string $owner The owner identifier string. + */ + public function setOwner($owner) + { + return $this->_owner = $owner; + } + + /** + * Returns the user rating. + * + * @return integer + */ + public function getRating() + { + return $this->_rating; + } + + /** + * Sets the user rating. + * + * @param integer $rating The user rating. + */ + public function setRating($rating) + { + $this->_rating = $rating; + } + + /** + * Returns the counter. + * + * @return integer + */ + public function getCounter() + { + return $this->_counter; + } + + /** + * Adds counter by one. + */ + public function addCounter() + { + $this->_counter++; + } + + /** + * Sets the counter value. + * + * @param integer $counter The counter value. + */ + public function setCounter($counter) + { + $this->_counter = $counter; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeString8($this->_owner, 1) + ->writeInt8($this->_rating); + if ($this->_counter > 0xffffffff) { + $writer->writeInt64BE($this->_counter); + } else if ($this->_counter > 0) { + $writer->writeUInt32BE($this->_counter); + } + } +} diff --git a/src/Zend/Media/Id3/Frame/Poss.php b/src/Zend/Media/Id3/Frame/Poss.php new file mode 100644 index 0000000..f9b6c2d --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Poss.php @@ -0,0 +1,129 @@ +Position synchronisation frame delivers information to the + * listener of how far into the audio stream he picked up; in effect, it states + * the time offset from the first frame in the stream. There may only be one + * POSS frame in each tag. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Poss extends Zend_Media_Id3_Frame + implements Zend_Media_Id3_Timing +{ + /** @var integer */ + private $_format = Zend_Media_Id3_Timing::MPEG_FRAMES; + + /** @var integer */ + private $_position; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + $this->_format = $this->_reader->readUInt8(); + $this->_position = $this->_reader->readUInt32BE(); + } + + /** + * Returns the timing format. + * + * @return integer + */ + public function getFormat() + { + return $this->_format; + } + + /** + * Sets the timing format. + * + * @see Zend_Media_Id3_Timing + * @param integer $format The timing format. + */ + public function setFormat($format) + { + $this->_format = $format; + } + + /** + * Returns the position where in the audio the listener starts to receive, + * i.e. the beginning of the next frame. + * + * @return integer + */ + public function getPosition() + { + return $this->_position; + } + + /** + * Sets the position where in the audio the listener starts to receive, + * i.e. the beginning of the next frame, using given format. + * + * @param integer $position The position. + * @param integer $format The timing format. + */ + public function setPosition($position, $format = null) + { + $this->_position = $position; + if ($format !== null) { + $this->setFormat($format); + } + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt8($this->_format) + ->writeUInt32BE($this->_position); + } +} diff --git a/src/Zend/Media/Id3/Frame/Priv.php b/src/Zend/Media/Id3/Frame/Priv.php new file mode 100644 index 0000000..42103de --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Priv.php @@ -0,0 +1,125 @@ +Private frame is used to contain information from a software + * producer that its program uses and does not fit into the other frames. The + * frame consists of an owner identifier string and the binary data. The owner + * identifier is URL containing an email address, or a link to a location where + * an email address can be found, that belongs to the organisation responsible + * for the frame. Questions regarding the frame should be sent to the indicated + * email address. The tag may contain more than one PRIV frame but only with + * different contents. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Priv extends Zend_Media_Id3_Frame +{ + /** @var string */ + private $_owner; + + /** @var string */ + private $_data; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + list($this->_owner, $this->_data) = + $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + } + + /** + * Returns the owner identifier string. + * + * @return string + */ + public function getOwner() + { + return $this->_owner; + } + + /** + * Sets the owner identifier string. + * + * @param string $owner The owner identifier string. + */ + public function setOwner($owner) + { + $this->_owner = $owner; + } + + /** + * Returns the private binary data associated with the frame. + * + * @return string + */ + public function getData() + { + return $this->_data; + } + + /** + * Sets the private binary data associated with the frame. + * + * @param string $data The private binary data string. + */ + public function setData($data) + { + $this->_data = $data; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeString8($this->_owner, 1) + ->write($this->_data); + } +} diff --git a/src/Zend/Media/Id3/Frame/Rbuf.php b/src/Zend/Media/Id3/Frame/Rbuf.php new file mode 100644 index 0000000..dd2bb3b --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Rbuf.php @@ -0,0 +1,190 @@ +Recommended buffer size frame. If the embedded info + * flag is set then this indicates that an ID3 tag with the maximum size + * described in buffer size may occur in the audio stream. In such case the tag + * should reside between two MPEG frames, if the audio is MPEG encoded. If the + * position of the next tag is known, offset to next tag may be used. The offset + * is calculated from the end of tag in which this frame resides to the first + * byte of the header in the next. This field may be omitted. Embedded tags are + * generally not recommended since this could render unpredictable behaviour + * from present software/hardware. + * + * For applications like streaming audio it might be an idea to embed tags into + * the audio stream though. If the clients connects to individual connections + * like HTTP and there is a possibility to begin every transmission with a tag, + * then this tag should include a recommended buffer size frame. If the client + * is connected to a arbitrary point in the stream, such as radio or multicast, + * then the recommended buffer size frame should be included in every tag. + * + * The buffer size should be kept to a minimum. There may only be one RBUF + * frame in each tag. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Rbuf extends Zend_Media_Id3_Frame +{ + /** + * A flag to denote that an ID3 tag with the maximum size described in + * buffer size may occur in the audio stream. + */ + const EMBEDDED = 0x1; + + /** @var integer */ + private $_bufferSize; + + /** @var integer */ + private $_infoFlags; + + /** @var integer */ + private $_offset = 0; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + // Who designs frames with 3 byte integers?? + $this->_reader = new Zend_Io_StringReader + ("\0" . $this->_reader->read($this->_reader->getSize())); + + $this->_bufferSize = $this->_reader->readUInt32BE(); + $this->_infoFlags = $this->_reader->readInt8(); + if ($this->_reader->available()) { + $this->_offset = $this->_reader->readInt32BE(); + } + } + + /** + * Returns the buffer size. + * + * @return integer + */ + public function getBufferSize() + { + return $this->_bufferSize; + } + + /** + * Sets the buffer size. + * + * @param integer $size The buffer size. + */ + public function setBufferSize($bufferSize) + { + $this->_bufferSize = $bufferSize; + } + + /** + * Checks whether or not the flag is set. Returns true if the + * flag is set, false otherwise. + * + * @param integer $flag The flag to query. + * @return boolean + */ + public function hasInfoFlag($flag) + { + return ($this->_infoFlags & $flag) == $flag; + } + + /** + * Returns the flags byte. + * + * @return integer + */ + public function getInfoFlags() + { + return $this->_infoFlags; + } + + /** + * Sets the flags byte. + * + * @param string $flags The flags byte. + */ + public function setInfoFlags($infoFlags) + { + $this->_infoFlags = $infoFlags; + } + + /** + * Returns the offset to next tag. + * + * @return integer + */ + public function getOffset() + { + return $this->_offset; + } + + /** + * Sets the offset to next tag. + * + * @param integer $offset The offset. + */ + public function setOffset($offset) + { + $this->_offset = $offset; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $tmp = new Zend_Io_StringWriter(); + $tmp->writeUInt32BE($this->_bufferSize); + + $writer->write(substr($tmp->toString(), 1, 3)) + ->writeInt8($this->_infoFlags) + ->writeInt32BE($this->_offset); + } +} diff --git a/src/Zend/Media/Id3/Frame/Rva2.php b/src/Zend/Media/Id3/Frame/Rva2.php new file mode 100644 index 0000000..18dd408 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Rva2.php @@ -0,0 +1,213 @@ +Relative volume adjustment (2) frame is a more subjective frame + * than the previous ones. It allows the user to say how much he wants to + * increase/decrease the volume on each channel when the file is played. The + * purpose is to be able to align all files to a reference volume, so that you + * don't have to change the volume constantly. This frame may also be used to + * balance adjust the audio. + * + * The volume adjustment is encoded in a way giving the scale of +/- 64 dB with + * a precision of 0.001953125 dB. + * + * There may be more than one RVA2 frame in each tag, but only one with the same + * identification string. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Rva2 extends Zend_Media_Id3_Frame +{ + /** + * The channel type key. + * + * @see $types + * @var string + */ + const channelType = 'channelType'; + + /** + * The volume adjustment key. Adjustments are +/- 64 dB with a precision of + * 0.001953125 dB. + * + * @var string + */ + const volumeAdjustment = 'volumeAdjustment'; + + /** + * The peak volume key. + * + * @var string + */ + const peakVolume = 'peakVolume'; + + /** + * The list of channel types. + * + * @var Array + */ + public static $types = array + ('Other', 'Master volume', 'Front right', 'Front left', 'Back right', + 'Back left', 'Front centre', 'Back centre', 'Subwoofer'); + + /** @var string */ + private $_device; + + /** @var Array */ + private $_adjustments; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + list ($this->_device) = + $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_reader->setOffset(strlen($this->_device) + 1); + + for ($i = $j = 0; $i < 9; $i++) { + $this->_adjustments[$i] = array + (self::channelType => $this->_reader->readInt8(), + self::volumeAdjustment => + $this->_reader->readInt16BE() / 512.0); + $bitsInPeak = $this->_reader->readInt8(); + $bytesInPeak = $bitsInPeak > 0 ? ceil($bitsInPeak / 8) : 0; + switch ($bytesInPeak) { + case 8: + $this->_adjustments[$i][self::peakVolume] = + $this->_reader->readInt64BE(); + break; + case 4: + $this->_adjustments[$i][self::peakVolume] = + $this->_reader->readUInt32BE(); + break; + case 2: + $this->_adjustments[$i][self::peakVolume] = + $this->_reader->readUInt16BE(); + break; + case 1: + $this->_adjustments[$i][self::peakVolume] = + $this->_reader->readUInt8(); + break; + default: + break; + } + } + } + + /** + * Returns the device where the adjustments should apply. + * + * @return string + */ + public function getDevice() + { + return $this->_device; + } + + /** + * Sets the device where the adjustments should apply. + * + * @param string $device The device. + */ + public function setDevice($device) + { + $this->_device = $device; + } + + /** + * Returns the array containing volume adjustments for each channel. Volume + * adjustments are arrays themselves containing the following keys: + * channelType, volumeAdjustment, peakVolume. + * + * @return Array + */ + public function getAdjustments() + { + return $this->_adjustments; + } + + /** + * Sets the array of volume adjustments for each channel. Each volume + * adjustment is an array too containing the following keys: channelType, + * volumeAdjustment, peakVolume. + * + * @param Array $adjustments The volume adjustments array. + */ + public function setAdjustments($adjustments) + { + $this->_adjustments = $adjustments; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeString8($this->_device, 1); + foreach ($this->_adjustments as $channel) { + $writer->writeInt8($channel[self::channelType]) + ->writeInt16BE($channel[self::volumeAdjustment] * 512); + if (abs($channel[self::peakVolume]) <= 0xff) { + $writer->writeInt8(8) + ->writeUInt8($channel[self::peakVolume]); + } else if (abs($channel[self::peakVolume]) <= 0xffff) { + $writer->writeInt8(16) + ->writeUInt16BE($channel[self::peakVolume]); + } else if (abs($channel[self::peakVolume]) <= 0xffffffff) { + $writer->writeInt8(32) + ->writeUInt32BE($channel[self::peakVolume]); + } else { + $writer->writeInt8(64) + ->writeInt64BE($channel[self::peakVolume]); // UInt64 + } + } + } +} diff --git a/src/Zend/Media/Id3/Frame/Rvad.php b/src/Zend/Media/Id3/Frame/Rvad.php new file mode 100644 index 0000000..5932677 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Rvad.php @@ -0,0 +1,238 @@ +Relative volume adjustment frame is a more subjective function + * than the previous ones. It allows the user to say how much he wants to + * increase/decrease the volume on each channel while the file is played. The + * purpose is to be able to align all files to a reference volume, so that you + * don't have to change the volume constantly. This frame may also be used to + * balance adjust the audio. + * + * There may only be one RVAD frame in each tag. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @deprecated ID3v2.3.0 + */ +final class Zend_Media_Id3_Frame_Rvad extends Zend_Media_Id3_Frame +{ + /* The required keys. */ + + /** @var string */ + const right = 'right'; + + /** @var string */ + const left = 'left'; + + /** @var string */ + const peakRight = 'peakRight'; + + /** @var string */ + const peakLeft = 'peakLeft'; + + /* The optional keys. */ + + /** @var string */ + const rightBack = 'rightBack'; + + /** @var string */ + const leftBack = 'leftBack'; + + /** @var string */ + const peakRightBack = 'peakRightBack'; + + /** @var string */ + const peakLeftBack = 'peakLeftBack'; + + /** @var string */ + const center = 'center'; + + /** @var string */ + const peakCenter = 'peakCenter'; + + /** @var string */ + const bass = 'bass'; + + /** @var string */ + const peakBass = 'peakBass'; + + /** @var Array */ + private $_adjustments; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + $flags = $this->_reader->readInt8(); + $descriptionBits = $this->_reader->readInt8(); + if ($descriptionBits <= 8 || $descriptionBits > 16) { + require_once 'Zend/Media/Id3/Exception.php'; + throw new Zend_Media_Id3_Exception + ('Unsupported description bit size of: ' . $descriptionBits); + } + + $this->_adjustments[self::right] = + ($flags & 0x1) == 0x1 ? + $this->_reader->readUInt16BE() : -$this->_reader->readUInt16BE(); + $this->_adjustments[self::left] = + ($flags & 0x2) == 0x2 ? + $this->_reader->readUInt16BE() : -$this->_reader->readUInt16BE(); + $this->_adjustments[self::peakRight] = $this->_reader->readUInt16BE(); + $this->_adjustments[self::peakLeft] = $this->_reader->readUInt16BE(); + + if (!$this->_reader->available()) { + return; + } + + $this->_adjustments[self::rightBack] = + ($flags & 0x4) == 0x4 ? + $this->_reader->readUInt16BE() : -$this->_reader->readUInt16BE(); + $this->_adjustments[self::leftBack] = + ($flags & 0x8) == 0x8 ? + $this->_reader->readUInt16BE() : -$this->_reader->readUInt16BE(); + $this->_adjustments[self::peakRightBack] = + $this->_reader->readUInt16BE(); + $this->_adjustments[self::peakLeftBack] = + $this->_reader->readUInt16BE(); + + if (!$this->_reader->available()) { + return; + } + + $this->_adjustments[self::center] = + ($flags & 0x10) == 0x10 ? + $this->_reader->readUInt16BE() : -$this->_reader->readUInt16BE(); + $this->_adjustments[self::peakCenter] = $this->_reader->readUInt16BE(); + + if (!$this->_reader->available()) { + return; + } + + $this->_adjustments[self::bass] = + ($flags & 0x20) == 0x20 ? + $this->_reader->readUInt16BE() : -$this->_reader->readUInt16BE(); + $this->_adjustments[self::peakBass] = $this->_reader->readUInt16BE(); + } + + /** + * Returns the array containing the volume adjustments. The array must + * contain the following keys: right, left, peakRight, peakLeft. It may + * optionally contain the following keys: rightBack, leftBack, + * peakRightBack, peakLeftBack, center, peakCenter, bass, and peakBass. + * + * @return Array + */ + public function getAdjustments() + { + return $this->_adjustments; + } + + /** + * Sets the array of volume adjustments. The array must contain the + * following keys: right, left, peakRight, peakLeft. It may optionally + * contain the following keys: rightBack, leftBack, peakRightBack, + * peakLeftBack, center, peakCenter, bass, and peakBass. + * + * @param Array $adjustments The volume adjustments array. + */ + public function setAdjustments($adjustments) + { + $this->_adjustments = $adjustments; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeInt8($flags = 0); + if ($this->_adjustments[self::right] > 0) + $flags = $flags | 0x1; + if ($this->_adjustments[self::left] > 0) + $flags = $flags | 0x2; + $writer->writeInt8(16) + ->writeUInt16BE(abs($this->_adjustments[self::right])) + ->writeUInt16BE(abs($this->_adjustments[self::left])) + ->writeUInt16BE(abs($this->_adjustments[self::peakRight])) + ->writeUInt16BE(abs($this->_adjustments[self::peakLeft])); + + if (isset($this->_adjustments[self::rightBack]) && + isset($this->_adjustments[self::leftBack]) && + isset($this->_adjustments[self::peakRightBack]) && + isset($this->_adjustments[self::peakLeftBack])) { + if ($this->_adjustments[self::rightBack] > 0) + $flags = $flags | 0x4; + if ($this->_adjustments[self::leftBack] > 0) + $flags = $flags | 0x8; + $writer->writeUInt16BE(abs($this->_adjustments[self::rightBack])) + ->writeUInt16BE(abs($this->_adjustments[self::leftBack])) + ->writeUInt16BE + (abs($this->_adjustments[self::peakRightBack])) + ->writeUInt16BE + (abs($this->_adjustments[self::peakLeftBack])); + } + + if (isset($this->_adjustments[self::center]) && + isset($this->_adjustments[self::peakCenter])) { + if ($this->_adjustments[self::center] > 0) + $flags = $flags | 0x10; + $writer->writeUInt16BE(abs($this->_adjustments[self::center])) + ->writeUInt16BE(abs($this->_adjustments[self::peakCenter])); + } + + if (isset($this->_adjustments[self::bass]) && + isset($this->_adjustments[self::peakBass])) { + if ($this->_adjustments[self::bass] > 0) + $flags = $flags | 0x20; + $writer->writeUInt16BE(abs($this->_adjustments[self::bass])) + ->writeUInt16BE(abs($this->_adjustments[self::peakBass])); + } + $writer->setOffset(0); + $writer->writeInt8($flags); + } +} diff --git a/src/Zend/Media/Id3/Frame/Rvrb.php b/src/Zend/Media/Id3/Frame/Rvrb.php new file mode 100644 index 0000000..98432ac --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Rvrb.php @@ -0,0 +1,331 @@ +Reverb is yet another subjective frame, with which you can adjust + * echoes of different kinds. Reverb left/right is the delay between every + * bounce in milliseconds. Reverb bounces left/right is the number of bounces + * that should be made. $FF equals an infinite number of bounces. Feedback is + * the amount of volume that should be returned to the next echo bounce. $00 is + * 0%, $FF is 100%. If this value were $7F, there would be 50% volume reduction + * on the first bounce, 50% of that on the second and so on. Left to left means + * the sound from the left bounce to be played in the left speaker, while left + * to right means sound from the left bounce to be played in the right speaker. + * + * Premix left to right is the amount of left sound to be mixed in the right + * before any reverb is applied, where $00 id 0% and $FF is 100%. Premix right + * to left does the same thing, but right to left. Setting both premix to $FF + * would result in a mono output (if the reverb is applied symmetric). There + * may only be one RVRB frame in each tag. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Rvrb extends Zend_Media_Id3_Frame +{ + /** @var integer */ + private $_reverbLeft; + + /** @var integer */ + private $_reverbRight; + + /** @var integer */ + private $_reverbBouncesLeft; + + /** @var integer */ + private $_reverbBouncesRight; + + /** @var integer */ + private $_reverbFeedbackLtoL; + + /** @var integer */ + private $_reverbFeedbackLtoR; + + /** @var integer */ + private $_reverbFeedbackRtoR; + + /** @var integer */ + private $_reverbFeedbackRtoL; + + /** @var integer */ + private $_premixLtoR; + + /** @var integer */ + private $_premixRtoL; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + $this->_reverbLeft = $this->_reader->readUInt16BE(); + $this->_reverbRight = $this->_reader->readUInt16BE(); + $this->_reverbBouncesLeft = $this->_reader->readUInt8(); + $this->_reverbBouncesRight = $this->_reader->readUInt8(); + $this->_reverbFeedbackLtoL = $this->_reader->readUInt8(); + $this->_reverbFeedbackLtoR = $this->_reader->readUInt8(); + $this->_reverbFeedbackRtoR = $this->_reader->readUInt8(); + $this->_reverbFeedbackRtoL = $this->_reader->readUInt8(); + $this->_premixLtoR = $this->_reader->readUInt8(); + $this->_premixRtoL = $this->_reader->readUInt8(); + } + + /** + * Returns the left reverb. + * + * @return integer + */ + public function getReverbLeft() + { + return $this->_reverbLeft; + } + + /** + * Sets the left reverb. + * + * @param integer $reverbLeft The left reverb. + */ + public function setReverbLeft($reverbLeft) + { + return $this->_reverbLeft = $reverbLeft; + } + + /** + * Returns the right reverb. + * + * @return integer + */ + public function getReverbRight() + { + return $this->_reverbRight; + } + + /** + * Sets the right reverb. + * + * @param integer $reverbRight The right reverb. + */ + public function setReverbRight($reverbRight) + { + return $this->_reverbRight = $reverbRight; + } + + /** + * Returns the left reverb bounces. + * + * @return integer + */ + public function getReverbBouncesLeft() + { + return $this->_reverbBouncesLeft; + } + + /** + * Sets the left reverb bounces. + * + * @param integer $reverbBouncesLeft The left reverb bounces. + */ + public function setReverbBouncesLeft($reverbBouncesLeft) + { + $this->_reverbBouncesLeft = $reverbBouncesLeft; + } + + /** + * Returns the right reverb bounces. + * + * @return integer + */ + public function getReverbBouncesRight() + { + return $this->_reverbBouncesRight; + } + + /** + * Sets the right reverb bounces. + * + * @param integer $reverbBouncesRight The right reverb bounces. + */ + public function setReverbBouncesRight($reverbBouncesRight) + { + $this->_reverbBouncesRight = $reverbBouncesRight; + } + + /** + * Returns the left-to-left reverb feedback. + * + * @return integer + */ + public function getReverbFeedbackLtoL() + { + return $this->_reverbFeedbackLtoL; + } + + /** + * Sets the left-to-left reverb feedback. + * + * @param integer $reverbFeedbackLtoL The left-to-left reverb feedback. + */ + public function setReverbFeedbackLtoL($reverbFeedbackLtoL) + { + $this->_reverbFeedbackLtoL = $reverbFeedbackLtoL; + } + + /** + * Returns the left-to-right reverb feedback. + * + * @return integer + */ + public function getReverbFeedbackLtoR() + { + return $this->_reverbFeedbackLtoR; + } + + /** + * Sets the left-to-right reverb feedback. + * + * @param integer $reverbFeedbackLtoR The left-to-right reverb feedback. + */ + public function setReverbFeedbackLtoR($reverbFeedbackLtoR) + { + $this->_reverbFeedbackLtoR = $reverbFeedbackLtoR; + } + + /** + * Returns the right-to-right reverb feedback. + * + * @return integer + */ + public function getReverbFeedbackRtoR() + { + return $this->_reverbFeedbackRtoR; + } + + /** + * Sets the right-to-right reverb feedback. + * + * @param integer $reverbFeedbackRtoR The right-to-right reverb feedback. + */ + public function setReverbFeedbackRtoR($reverbFeedbackRtoR) + { + $this->_reverbFeedbackRtoR = $reverbFeedbackRtoR; + } + + /** + * Returns the right-to-left reverb feedback. + * + * @return integer + */ + public function getReverbFeedbackRtoL() + { + return $this->_reverbFeedbackRtoL; + } + + /** + * Sets the right-to-left reverb feedback. + * + * @param integer $reverbFeedbackRtoL The right-to-left reverb feedback. + */ + public function setReverbFeedbackRtoL($reverbFeedbackRtoL) + { + $this->_reverbFeedbackRtoL = $reverbFeedbackRtoL; + } + + /** + * Returns the left-to-right premix. + * + * @return integer + */ + public function getPremixLtoR() + { + return $this->_premixLtoR; + } + + /** + * Sets the left-to-right premix. + * + * @param integer $premixLtoR The left-to-right premix. + */ + public function setPremixLtoR($premixLtoR) + { + $this->_premixLtoR = $premixLtoR; + } + + /** + * Returns the right-to-left premix. + * + * @return integer + */ + public function getPremixRtoL() + { + return $this->_premixRtoL; + } + + /** + * Sets the right-to-left premix. + * + * @param integer $premixRtoL The right-to-left premix. + */ + public function setPremixRtoL($premixRtoL) + { + $this->_premixRtoL = $premixRtoL; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt16BE($this->_reverbLeft) + ->writeUInt16BE($this->_reverbRight) + ->writeUInt8($this->_reverbBouncesLeft) + ->writeUInt8($this->_reverbBouncesRight) + ->writeUInt8($this->_reverbFeedbackLtoL) + ->writeUInt8($this->_reverbFeedbackLtoR) + ->writeUInt8($this->_reverbFeedbackRtoR) + ->writeUInt8($this->_reverbFeedbackRtoL) + ->writeUInt8($this->_premixLtoR) + ->writeUInt8($this->_premixRtoL); + } +} diff --git a/src/Zend/Media/Id3/Frame/Seek.php b/src/Zend/Media/Id3/Frame/Seek.php new file mode 100644 index 0000000..791bf72 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Seek.php @@ -0,0 +1,95 @@ +Seek frame indicates where other tags in a file/stream can be + * found. The minimum offset to next tag is calculated from the end of this tag + * to the beginning of the next. There may only be one seek frame in a tag. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Seek extends Zend_Media_Id3_Frame +{ + /** @var integer */ + private $_minOffset; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + $this->_minOffset = $this->_reader->readInt32BE(); + } + + /** + * Returns the minimum offset to next tag in bytes. + * + * @return integer + */ + public function getMinimumOffset() + { + return $this->_minOffset; + } + + /** + * Sets the minimum offset to next tag in bytes. + * + * @param integer $minOffset The minimum offset. + */ + public function setMinimumOffset($minOffset) + { + $this->_minOffset = $minOffset; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeInt32BE($this->_minOffset); + } +} diff --git a/src/Zend/Media/Id3/Frame/Sign.php b/src/Zend/Media/Id3/Frame/Sign.php new file mode 100644 index 0000000..69f7262 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Sign.php @@ -0,0 +1,123 @@ +Group identification registration, to be signed. Although signatures + * can reside inside the registration frame, it might be desired to store the + * signature elsewhere, e.g. in watermarks. There may be more than one signature + * frame in a tag, but no two may be identical. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Sign extends Zend_Media_Id3_Frame +{ + /** @var integer */ + private $_group; + + /** @var string */ + private $_signature; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + $this->_group = $this->_reader->readUInt8(); + $this->_signature = $this->_reader->read($this->_reader->getSize()); + } + + /** + * Returns the group symbol byte. + * + * @return integer + */ + public function getGroup() + { + return $this->_group; + } + + /** + * Sets the group symbol byte. + * + * @param integer $group The group symbol byte. + */ + public function setGroup($group) + { + $this->_group = $group; + } + + /** + * Returns the signature binary data. + * + * @return string + */ + public function getSignature() + { + return $this->_signature; + } + + /** + * Sets the signature binary data. + * + * @param string $signature The signature binary data string. + */ + public function setSignature($signature) + { + $this->_signature = $signature; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt8($this->_group) + ->write($this->_signature); + } +} diff --git a/src/Zend/Media/Id3/Frame/Sylt.php b/src/Zend/Media/Id3/Frame/Sylt.php new file mode 100644 index 0000000..81c4c17 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Sylt.php @@ -0,0 +1,371 @@ +Synchronised lyrics/text frame is another way of incorporating the + * words, said or sung lyrics, in the audio file as text, this time, however, + * in sync with the audio. It might also be used to describing events e.g. + * occurring on a stage or on the screen in sync with the audio. + * + * There may be more than one SYLT frame in each tag, but only one with the + * same language and content descriptor. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_SYLT extends Zend_Media_Id3_Frame + implements Zend_Media_Id3_Encoding, Zend_Media_Id3_Language, + Zend_Media_Id3_Timing +{ + /** + * The list of content types. + * + * @var Array + */ + public static $types = array + ('Other', 'Lyrics', 'Text transcription', 'Movement/Part name', + 'Events', 'Chord', 'Trivia', 'URLs to webpages', 'URLs to images'); + + /** @var integer */ + private $_encoding; + + /** @var string */ + private $_language = 'und'; + + /** @var integer */ + private $_format = Zend_Media_Id3_Timing::MPEG_FRAMES; + + /** @var integer */ + private $_type = 0; + + /** @var string */ + private $_description; + + /** @var Array */ + private $_events = array(); + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + $this->setEncoding + ($this->getOption('encoding', Zend_Media_Id3_Encoding::UTF8)); + + if ($this->_reader === null) { + return; + } + + $encoding = $this->_reader->readUInt8(); + $this->_language = strtolower($this->_reader->read(3)); + if ($this->_language == 'xxx') { + $this->_language = 'und'; + } + $this->_format = $this->_reader->readUInt8(); + $this->_type = $this->_reader->readUInt8(); + + $offset = $this->_reader->getOffset(); + switch ($encoding) { + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + list($this->_description) = + $this->_explodeString16 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_reader->setOffset + ($offset + strlen($this->_description) + 2); + break; + case self::UTF8: + // break intentionally omitted + default: + list($this->_description) = + $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_reader->setOffset + ($offset + strlen($this->_description) + 1); + break; + } + $this->_description = + $this->_convertString($this->_description, $encoding); + + while ($this->_reader->available()) { + $offset = $this->_reader->getOffset(); + switch ($encoding) { + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + list($syllable) = + $this->_explodeString16 + ($this->_reader->read + ($this->_reader->getSize()), 2); + $this->_reader->setOffset + ($offset + strlen($syllable) + 2); + break; + case self::UTF8: + // break intentionally omitted + default: + list($syllable) = + $this->_explodeString8 + ($this->_reader->read + ($this->_reader->getSize()), 2); + $this->_reader->setOffset + ($offset + strlen($syllable) + 1); + break; + } + $this->_events + [$this->_reader->readUInt32BE()] = + $this->_convertString($syllable, $encoding); + } + ksort($this->_events); + } + + /** + * Returns the text encoding. + * + * All the strings read from a file are automatically converted to the + * character encoding specified with the encoding option. See + * {@link Zend_Media_Id3v2} for details. This method returns that character + * encoding, or any value set after read, translated into a string form + * regarless if it was set using a {@link Zend_Media_Id3_Encoding} constant + * or a string. + * + * @return integer + */ + public function getEncoding() + { + return $this->_translateIntToEncoding($this->_encoding); + } + + /** + * Sets the text encoding. + * + * All the string written to the frame are done so using given character + * encoding. No conversions of existing data take place upon the call to + * this method thus all texts must be given in given character encoding. + * + * The character encoding parameter takes either a + * {@link Zend_Media_Id3_Encoding} constant or a character set name string + * in the form accepted by iconv. The default character encoding used to + * write the frame is 'utf-8'. + * + * @see Zend_Media_Id3_Encoding + * @param integer $encoding The text encoding. + */ + public function setEncoding($encoding) + { + $this->_encoding = $this->_translateEncodingToInt($encoding); + } + + /** + * Returns the language code as specified in the + * {@link http://www.loc.gov/standards/iso639-2/ ISO-639-2} standard. + * + * @return string + */ + public function getLanguage() + { + return $this->_language; + } + + /** + * Sets the text language code as specified in the + * {@link http://www.loc.gov/standards/iso639-2/ ISO-639-2} standard. + * + * @see Zend_Media_Id3_Language + * @param string $language The language code. + */ + public function setLanguage($language) + { + $language = strtolower($language); + if ($language == 'xxx') { + $language = 'und'; + } + $this->_language = substr($language, 0, 3); + } + + /** + * Returns the timing format. + * + * @return integer + */ + public function getFormat() + { + return $this->_format; + } + + /** + * Sets the timing format. + * + * @see Zend_Media_Id3_Timing + * @param integer $format The timing format. + */ + public function setFormat($format) + { + $this->_format = $format; + } + + /** + * Returns the content type code. + * + * @return integer + */ + public function getType() + { + return $this->_type; + } + + /** + * Sets the content type code. + * + * @param integer $type The content type code. + */ + public function setType($type) + { + $this->_type = $type; + } + + /** + * Returns the content description. + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Sets the content description text using given encoding. The description + * language and encoding must be that of the actual text. + * + * @param string $description The content description text. + * @param string $language The language code. + * @param integer $encoding The text encoding. + */ + public function setDescription + ($description, $language = null, $encoding = null) + { + $this->_description = $description; + if ($language !== null) { + $this->setLanguage($language); + } + if ($encoding !== null) { + $this->setEncoding($encoding); + } + } + + /** + * Returns the syllable events with their timestamps. + * + * @return Array + */ + public function getEvents() + { + return $this->_events; + } + + /** + * Sets the syllable events with their timestamps using given encoding. + * + * The text language and encoding must be that of the description text. + * + * @param Array $text The test string. + * @param string $language The language code. + * @param integer $encoding The text encoding. + */ + public function setEvents($events, $language = null, $encoding = null) + { + $this->_events = $events; + if ($language !== null) { + $this->setLanguage($language); + } + if ($encoding !== null) { + $this->setEncoding($encoding); + } + ksort($this->_events); + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt8($this->_encoding) + ->write($this->_language) + ->writeUInt8($this->_format) + ->writeUInt8($this->_type); + switch ($this->_encoding) { + case self::UTF16LE: + $writer->writeString16 + ($this->_description, + Zend_Io_Writer::LITTLE_ENDIAN_ORDER, 1); + break; + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + $writer->writeString16($this->_description, null, 1); + break; + default: + $writer->writeString8($this->_description, 1); + break; + } + foreach ($this->_events as $timestamp => $syllable) { + switch ($this->_encoding) { + case self::UTF16LE: + $writer->writeString16 + ($syllable, Zend_Io_Writer::LITTLE_ENDIAN_ORDER, 1); + break; + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + $writer->writeString16($syllable, null, 1); + break; + default: + $writer->writeString8($syllable, 1); + break; + } + $writer->writeUInt32BE($timestamp); + } + } +} diff --git a/src/Zend/Media/Id3/Frame/Sytc.php b/src/Zend/Media/Id3/Frame/Sytc.php new file mode 100644 index 0000000..36b889a --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Sytc.php @@ -0,0 +1,157 @@ +Synchronised tempo codes frame might be used. + * + * The tempo data consists of one or more tempo codes. Each tempo code consists + * of one tempo part and one time part. The tempo is in BPM described with one + * or two bytes. If the first byte has the value $FF, one more byte follows, + * which is added to the first giving a range from 2 - 510 BPM, since $00 and + * $01 is reserved. $00 is used to describe a beat-free time period, which is + * not the same as a music-free time period. $01 is used to indicate one single + * beat-stroke followed by a beat-free period. + * + * The tempo descriptor is followed by a time stamp. Every time the tempo in the + * music changes, a tempo descriptor may indicate this for the player. All tempo + * descriptors must be sorted in chronological order. The first beat-stroke in + * a time-period is at the same time as the beat description occurs. There may + * only be one SYTC frame in each tag. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Sytc extends Zend_Media_Id3_Frame + implements Zend_Media_Id3_Timing +{ + /** Describes a beat-free time period. */ + const BEAT_FREE = 0x00; + + /** Indicate one single beat-stroke followed by a beat-free period. */ + const SINGLE_BEAT = 0x01; + + /** @var integer */ + private $_format = Zend_Media_Id3_Timing::MPEG_FRAMES; + + /** @var Array */ + private $_events = array(); + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader === null) { + return; + } + + $offset = 0; + $this->_format = $this->_reader->readUInt8(); + while ($this->_reader->available()) { + $tempo = $this->_reader->readUInt8(); + if ($tempo == 0xff) + $tempo += $this->_reader->readUInt8(); + $this->_events[$this->_reader->readUInt32BE()] = $tempo; + } + ksort($this->_events); + } + + /** + * Returns the timing format. + * + * @return integer + */ + public function getFormat() + { + return $this->_format; + } + + /** + * Sets the timing format. + * + * @see Zend_Media_Id3_Timing + * @param integer $format The timing format. + */ + public function setFormat($format) + { + $this->_format = $format; + } + + /** + * Returns the time-bpm tempo events. + * + * @return Array + */ + public function getEvents() + { + return $this->_events; + } + + /** + * Sets the time-bpm tempo events. + * + * @param Array $events The time-bpm tempo events. + */ + public function setEvents($events) + { + $this->_events = $events; + ksort($this->_events); + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt8($this->_format); + foreach ($this->_events as $timestamp => $tempo) { + if ($tempo >= 0xff) { + $writer->writeUInt8(0xff) + ->writeUInt8($tempo - 0xff); + } else { + $writer->writeUInt8($tempo); + } + $writer->writeUInt32BE($timestamp); + } + } +} diff --git a/src/Zend/Media/Id3/Frame/Talb.php b/src/Zend/Media/Id3/Frame/Talb.php new file mode 100644 index 0000000..cd055e9 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Talb.php @@ -0,0 +1,40 @@ +Album/Movie/Show title frame is intended for the title of the + * recording (or source of sound) from which the audio in the file is taken. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Talb extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tbpm.php b/src/Zend/Media/Id3/Frame/Tbpm.php new file mode 100644 index 0000000..41f43a9 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tbpm.php @@ -0,0 +1,40 @@ +BPM frame contains the number of beats per minute in the main part + * of the audio. The BPM is an integer and represented as a numerical string. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tbpm extends Zend_Media_Id3_NumberFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tcom.php b/src/Zend/Media/Id3/Frame/Tcom.php new file mode 100644 index 0000000..75a45c5 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tcom.php @@ -0,0 +1,39 @@ +Composer frame is intended for the name of the composer. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tcom extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tcon.php b/src/Zend/Media/Id3/Frame/Tcon.php new file mode 100644 index 0000000..030dd61 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tcon.php @@ -0,0 +1,49 @@ +Content type, which ID3v1 was stored as a one byte numeric value + * only, is now a string. You may use one or several of the ID3v1 types as + * numerical strings, or, since the category list would be impossible to + * maintain with accurate and up to date categories, define your own. + * + * You may also use any of the following keywords: + * + *
+ *  RX  Remix
+ *  CR  Cover
+ * 
+ * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tcon extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tcop.php b/src/Zend/Media/Id3/Frame/Tcop.php new file mode 100644 index 0000000..9678164 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tcop.php @@ -0,0 +1,46 @@ +Copyright message frame, in which the string must begin with a + * year and a space character (making five characters), is intended for the + * copyright holder of the original sound, not the audio file itself. The + * absence of this frame means only that the copyright information is + * unavailable or has been removed, and must not be interpreted to mean that the + * audio is public domain. Every time this field is displayed the field must be + * preceded with 'Copyright ' (C) ' ', where (C) is one character showing a C in + * a circle. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tcop extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tdat.php b/src/Zend/Media/Id3/Frame/Tdat.php new file mode 100644 index 0000000..9b5b571 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tdat.php @@ -0,0 +1,42 @@ +Date frame is a numeric string in the DDMM format containing the + * date for the recording. This field is always four characters long. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @deprecated ID3v2.3.0 + */ +final class Zend_Media_Id3_Frame_Tdat extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tden.php b/src/Zend/Media/Id3/Frame/Tden.php new file mode 100644 index 0000000..d1cc911 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tden.php @@ -0,0 +1,42 @@ +Encoding time frame contains a timestamp describing when the audio + * was encoded. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Tden extends Zend_Media_Id3_DateFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tdly.php b/src/Zend/Media/Id3/Frame/Tdly.php new file mode 100644 index 0000000..489afe4 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tdly.php @@ -0,0 +1,41 @@ +Playlist delay defines the numbers of milliseconds of silence that + * should be inserted before this audio. The value zero indicates that this is a + * part of a multifile audio track that should be played continuously. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tdly extends Zend_Media_Id3_NumberFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tdor.php b/src/Zend/Media/Id3/Frame/Tdor.php new file mode 100644 index 0000000..22eac5f --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tdor.php @@ -0,0 +1,42 @@ +Original release time frame contains a timestamp describing when + * the original recording of the audio was released. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Tdor extends Zend_Media_Id3_DateFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tdrc.php b/src/Zend/Media/Id3/Frame/Tdrc.php new file mode 100644 index 0000000..d2d28b3 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tdrc.php @@ -0,0 +1,43 @@ +Recording time frame contains a timestamp describing when the + * audio was recorded. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Tdrc extends Zend_Media_Id3_DateFrame +{ +} diff --git a/src/Zend/Media/Id3/Frame/Tdrl.php b/src/Zend/Media/Id3/Frame/Tdrl.php new file mode 100644 index 0000000..3bfe57b --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tdrl.php @@ -0,0 +1,42 @@ +Release time frame contains a timestamp describing when the audio + * was first released. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Tdrl extends Zend_Media_Id3_DateFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tdtg.php b/src/Zend/Media/Id3/Frame/Tdtg.php new file mode 100644 index 0000000..9b5dbe0 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tdtg.php @@ -0,0 +1,42 @@ +Tagging time frame contains a timestamp describing then the audio + * was tagged. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Tdtg extends Zend_Media_Id3_DateFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tenc.php b/src/Zend/Media/Id3/Frame/Tenc.php new file mode 100644 index 0000000..c0c483b --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tenc.php @@ -0,0 +1,41 @@ +Encoded by frame contains the name of the person or organisation + * that encoded the audio file. This field may contain a copyright message, if + * the audio file also is copyrighted by the encoder. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tenc extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Text.php b/src/Zend/Media/Id3/Frame/Text.php new file mode 100644 index 0000000..11c169e --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Text.php @@ -0,0 +1,40 @@ +Lyricist/Text writer frame is intended for the writer of the text + * or lyrics in the recording. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Text extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tflt.php b/src/Zend/Media/Id3/Frame/Tflt.php new file mode 100644 index 0000000..44b50eb --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tflt.php @@ -0,0 +1,57 @@ +File type frame indicates which type of audio this tag defines. + * The following types and refinements are defined: + * + *
+ * MIME   MIME type follows
+ *  MPG    MPEG Audio
+ *    /1     MPEG 1/2 layer I
+ *    /2     MPEG 1/2 layer II
+ *    /3     MPEG 1/2 layer III
+ *    /2.5   MPEG 2.5
+ *    /AAC   Advanced audio compression
+ *  VQF    Transform-domain Weighted Interleave Vector Quantisation
+ *  PCM    Pulse Code Modulated audio
+ * 
+ * + * but other types may be used, but not for these types though. This is used in + * a similar way to the predefined types in the + * {@link Zend_Media_Id3_Frame_Tmed TMED} frame. If this frame is not present + * audio type is assumed to be MPG. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tflt extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Time.php b/src/Zend/Media/Id3/Frame/Time.php new file mode 100644 index 0000000..5eba339 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Time.php @@ -0,0 +1,105 @@ +Time frame contains the time for the recording in the HHMM format. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @deprecated ID3v2.3.0 + */ +final class Zend_Media_Id3_Frame_Time extends Zend_Media_Id3_DateFrame +{ + private $_hours; + private $_minutes; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options, 'HHmm'); + $this->_hours = substr($this->getText(), 0, 2); + $this->_minutes = substr($this->getText(), 2, 2); + } + + /** + * Returns the hour. + * + * @return integer + */ + public function getHour() + { + return intval($this->_hours); + } + + /** + * Sets the hour. + * + * @param integer $hours The hours. + */ + public function setHour($hours) + { + $this->setText + (($this->_hours = str_pad(strval($hours), 2, "0", STR_PAD_LEFT)) . + ($this->_minutes ? $this->_minutes : '00'), + Zend_Media_Id3_Encoding::ISO88591); + } + + /** + * Returns the minutes. + * + * @return integer + */ + public function getMinute() + { + return intval($this->_minutes); + } + + /** + * Sets the minutes. + * + * @param integer $minutes The minutes. + */ + public function setMinute($minutes) + { + $this->setText + (($this->_hours ? $this->_hours : '00') . + ($this->_minutes = + str_pad(strval($minutes), 2, "0", STR_PAD_LEFT)), + Zend_Media_Id3_Encoding::ISO88591); + } +} diff --git a/src/Zend/Media/Id3/Frame/Tipl.php b/src/Zend/Media/Id3/Frame/Tipl.php new file mode 100644 index 0000000..f105700 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tipl.php @@ -0,0 +1,43 @@ +Involved people list is very similar to the musician credits list, + * but maps between functions, like producer, and names. + * + * @todo Implement better support + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Tipl extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tit1.php b/src/Zend/Media/Id3/Frame/Tit1.php new file mode 100644 index 0000000..94b2618 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tit1.php @@ -0,0 +1,41 @@ +Content group description frame is used if the sound belongs to a + * larger category of sounds/music. For example, classical music is often sorted + * in different musical sections (e.g. 'Piano Concerto', 'Weather - Hurricane'). + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tit1 extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tit2.php b/src/Zend/Media/Id3/Frame/Tit2.php new file mode 100644 index 0000000..37300aa --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tit2.php @@ -0,0 +1,40 @@ +Title/Songname/Content description frame is the actual name of the + * piece (e.g. 'Adagio', 'Hurricane Donna'). + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tit2 extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tit3.php b/src/Zend/Media/Id3/Frame/Tit3.php new file mode 100644 index 0000000..cc780f4 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tit3.php @@ -0,0 +1,41 @@ +Subtitle/Description refinement frame is used for information + * directly related to the contents title (e.g. 'Op. 16' or 'Performed live at + * Wembley'). + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tit3 extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tkey.php b/src/Zend/Media/Id3/Frame/Tkey.php new file mode 100644 index 0000000..a1e24a4 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tkey.php @@ -0,0 +1,43 @@ +Initial key frame contains the musical key in which the sound + * starts. It is represented as a string with a maximum length of three + * characters. The ground keys are represented with 'A', 'B', 'C', 'D', 'E', 'F' + * and 'G' and halfkeys represented with 'b' and '#'. Minor is represented as + * 'm', e.g. 'Dbm'. Off key is represented with an 'o' only. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tkey extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tlan.php b/src/Zend/Media/Id3/Frame/Tlan.php new file mode 100644 index 0000000..371b67c --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tlan.php @@ -0,0 +1,43 @@ +Language frame should contain the languages of the text or lyrics + * spoken or sung in the audio. The language is represented with three + * characters according to {@link http://www.loc.gov/standards/iso639-2/ + * ISO-639-2}. If more than one language is used in the text their language + * codes should follow according to the amount of their usage. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tlan extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tlen.php b/src/Zend/Media/Id3/Frame/Tlen.php new file mode 100644 index 0000000..d165fd0 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tlen.php @@ -0,0 +1,40 @@ +Length frame contains the length of the audio file in + * milliseconds. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tlen extends Zend_Media_Id3_NumberFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tmcl.php b/src/Zend/Media/Id3/Frame/Tmcl.php new file mode 100644 index 0000000..d1e81ed --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tmcl.php @@ -0,0 +1,44 @@ +Musician credits list is intended as a mapping between instruments + * and the musician that played it. Every odd field is an instrument and every + * even is an artist or a comma delimited list of artists. + * + * @todo Implement better support + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Tmcl extends Zend_Media_Id3_TextFrame +{} diff --git a/src/ID3/Frame/TMED.php b/src/Zend/Media/Id3/Frame/Tmed.php similarity index 50% rename from src/ID3/Frame/TMED.php rename to src/Zend/Media/Id3/Frame/Tmed.php index d4db37f..5cc4e68 100644 --- a/src/ID3/Frame/TMED.php +++ b/src/Zend/Media/Id3/Frame/Tmed.php @@ -1,48 +1,33 @@ Media type frame describes from which media the sound originated. * This may be a text string or a reference to the predefined media types found - * in the list below. Example: "VID/PAL/VHS" $00. + * in the list below. Example: 'VID/PAL/VHS'. * *
  *  DIG    Other digital media
@@ -127,11 +112,13 @@ require_once("ID3/Frame/AbstractText.php");
  *    /IV   Type IV cassette (metal)
  * 
* - * @package php-reader + * @category Zend + * @package Zend_Media * @subpackage ID3 - * @author Sven Vollbehr - * @copyright Copyright (c) 2008 The PHP Reader Project Workgroup - * @license http://code.google.com/p/php-reader/wiki/License New BSD License - * @version $Rev$ + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ -final class ID3_Frame_TMED extends ID3_Frame_AbstractText {} +final class Zend_Media_Id3_Frame_Tmed extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tmoo.php b/src/Zend/Media/Id3/Frame/Tmoo.php new file mode 100644 index 0000000..3ab4a5c --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tmoo.php @@ -0,0 +1,42 @@ +Mood frame is intended to reflect the mood of the audio with a few + * keywords, e.g. 'Romantic' or 'Sad'. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Tmoo extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Toal.php b/src/Zend/Media/Id3/Frame/Toal.php new file mode 100644 index 0000000..f556895 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Toal.php @@ -0,0 +1,41 @@ +Original album/movie/show title frame is intended for the title of + * the original recording (or source of sound), if for example the music in the + * file should be a cover of a previously released song. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Toal extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tofn.php b/src/Zend/Media/Id3/Frame/Tofn.php new file mode 100644 index 0000000..5c3c86b --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tofn.php @@ -0,0 +1,41 @@ +Original filename frame contains the preferred filename for the + * file, since some media doesn't allow the desired length of the filename. The + * filename is case sensitive and includes its suffix. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tofn extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Toly.php b/src/Zend/Media/Id3/Frame/Toly.php new file mode 100644 index 0000000..9be2636 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Toly.php @@ -0,0 +1,41 @@ +Original lyricist/text writer frame is intended for the text + * writer of the original recording, if for example the music in the file should + * be a cover of a previously released song. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Toly extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tope.php b/src/Zend/Media/Id3/Frame/Tope.php new file mode 100644 index 0000000..6ebef09 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tope.php @@ -0,0 +1,41 @@ +Original artist/performer frame is intended for the performer of + * the original recording, if for example the music in the file should be a + * cover of a previously released song. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tope extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tory.php b/src/Zend/Media/Id3/Frame/Tory.php new file mode 100644 index 0000000..cc553ca --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tory.php @@ -0,0 +1,76 @@ +Original release year frame is intended for the year when the + * original recording, if for example the music in the file should be a cover of + * a previously released song, was released. The field is formatted as in the + * {@link Zend_Media_Id3_Frame_Tyer TYER} frame. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @deprecated ID3v2.3.0 + */ +final class Zend_Media_Id3_Frame_Tory extends Zend_Media_Id3_DateFrame +{ + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options, 'Y'); + } + + /** + * Returns the year. + * + * @return integer + */ + public function getYear() + { + return intval($this->getText()); + } + + /** + * Sets the year. + * + * @param integer $year The year given in four digits. + */ + public function setYear($year) + { + $this->setText(strval($year)); + } +} diff --git a/src/Zend/Media/Id3/Frame/Town.php b/src/Zend/Media/Id3/Frame/Town.php new file mode 100644 index 0000000..4daa9e6 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Town.php @@ -0,0 +1,40 @@ +File owner/licensee frame contains the name of the owner or + * licensee of the file and it's contents. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Town extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tpe1.php b/src/Zend/Media/Id3/Frame/Tpe1.php new file mode 100644 index 0000000..b284cb5 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tpe1.php @@ -0,0 +1,40 @@ +Lead artist/Lead performer/Soloist/Performing group is used for + * the main artist. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tpe1 extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tpe2.php b/src/Zend/Media/Id3/Frame/Tpe2.php new file mode 100644 index 0000000..f31fc7a --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tpe2.php @@ -0,0 +1,40 @@ +Band/Orchestra/Accompaniment frame is used for additional + * information about the performers in the recording. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tpe2 extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tpe3.php b/src/Zend/Media/Id3/Frame/Tpe3.php new file mode 100644 index 0000000..0e70445 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tpe3.php @@ -0,0 +1,39 @@ +Conductor frame is used for the name of the conductor. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tpe3 extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tpe4.php b/src/Zend/Media/Id3/Frame/Tpe4.php new file mode 100644 index 0000000..0f338b6 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tpe4.php @@ -0,0 +1,41 @@ +Interpreted, remixed, or otherwise modified by frame contains more + * information about the people behind a remix and similar interpretations of + * another existing piece. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tpe4 extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tpos.php b/src/Zend/Media/Id3/Frame/Tpos.php new file mode 100644 index 0000000..50a9ebc --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tpos.php @@ -0,0 +1,114 @@ +Number of a set frame is a numeric string that describes which part + * of a set the audio came from. This frame is used if the source described in + * the {@link Zend_Media_Id3_Frame_Talb TALB} frame is divided into several + * mediums, e.g. a double CD. The value may be extended with a '/' character and + * a numeric string containing the total number of parts in the set. E.g. '1/2'. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tpos extends Zend_Media_Id3_TextFrame +{ + private $_number; + private $_total; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + Zend_Media_Id3_Frame::__construct($reader, $options); + + $this->setEncoding(Zend_Media_Id3_Encoding::ISO88591); + + if ($this->_reader === null) { + return; + } + + $this->_reader->skip(1); + $this->setText($this->_reader->readString8($this->_reader->getSize())); + @list ($this->_number, $this->_total) = explode("/", $this->getText()); + } + + /** + * Returns the number. + * + * @return integer + */ + public function getNumber() + { + return intval($this->_number); + } + + /** + * Sets the number. + * + * @param integer $number The number. + */ + public function setNumber($part) + { + $this->setText + ($this->_number = strval($part) . + ($this->_total ? '/' . $this->_total : ''), + Zend_Media_Id3_Encoding::ISO88591); + } + + /** + * Returns the total number. + * + * @return integer + */ + public function getTotal() + { + return intval($this->_total); + } + + /** + * Sets the total number. + * + * @param integer $total The total number. + */ + public function setTotal($total) + { + $this->setText + (($this->_number ? $this->_number : '?') . "/" . + ($this->_total = strval($total)), + Zend_Media_Id3_Encoding::ISO88591); + } +} diff --git a/src/Zend/Media/Id3/Frame/Tpro.php b/src/Zend/Media/Id3/Frame/Tpro.php new file mode 100644 index 0000000..0b0d69f --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tpro.php @@ -0,0 +1,48 @@ +Produced notice frame, in which the string must begin with a year + * and a space character (making five characters), is intended for the + * production copyright holder of the original sound, not the audio file itself. + * The absence of this frame means only that the production copyright + * information is unavailable or has been removed, and must not be interpreted + * to mean that the audio is public domain. Every time this field is displayed + * the field must be preceded with 'Produced ' (P) ' ', where (P) is one + * character showing a P in a circle. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Tpro extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tpub.php b/src/Zend/Media/Id3/Frame/Tpub.php new file mode 100644 index 0000000..d826c1c --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tpub.php @@ -0,0 +1,40 @@ +Publisher frame simply contains the name of the label or + * publisher. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tpub extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Trck.php b/src/Zend/Media/Id3/Frame/Trck.php new file mode 100644 index 0000000..0d1ff8b --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Trck.php @@ -0,0 +1,113 @@ +Track number/Position in set frame is a numeric string containing + * the order number of the audio-file on its original recording. This may be + * extended with a '/' character and a numeric string containing the total + * number of tracks/elements on the original recording. E.g. '4/9'. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Trck extends Zend_Media_Id3_TextFrame +{ + private $_number; + private $_total; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + Zend_Media_Id3_Frame::__construct($reader, $options); + + $this->setEncoding(Zend_Media_Id3_Encoding::ISO88591); + + if ($this->_reader === null) { + return; + } + + $this->_reader->skip(1); + $this->setText($this->_reader->readString8($this->_reader->getSize())); + @list ($this->_number, $this->_total) = explode("/", $this->getText()); + } + + /** + * Returns the number. + * + * @return integer + */ + public function getNumber() + { + return intval($this->_number); + } + + /** + * Sets the number. + * + * @param integer $number The number. + */ + public function setNumber($part) + { + $this->setText + ($this->_number = strval($part) . + ($this->_total ? '/' . $this->_total : ''), + Zend_Media_Id3_Encoding::ISO88591); + } + + /** + * Returns the total number. + * + * @return integer + */ + public function getTotal() + { + return intval($this->_total); + } + + /** + * Sets the total number. + * + * @param integer $total The total number. + */ + public function setTotal($total) + { + $this->setText + (($this->_number ? $this->_number : '?') . "/" . + ($this->_total = strval($total)), + Zend_Media_Id3_Encoding::ISO88591); + } +} diff --git a/src/Zend/Media/Id3/Frame/Trda.php b/src/Zend/Media/Id3/Frame/Trda.php new file mode 100644 index 0000000..12dd24d --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Trda.php @@ -0,0 +1,45 @@ +Recording dates frame is intended to be used as complement to + * the {@link Zend_Media_Id3_Frame_Tyer TYER}, + * {@link Zend_Media_Id3_Frame_Tdat TDAT} and + * {@link Zend_Media_Id3_Frame_Time TIME} frames. E.g. '4th-7th June, 12th June' + * in combination with the {@link Zend_Media_Id3_Frame_Tyer TYER} frame. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @deprecated ID3v2.3.0 + */ +final class Zend_Media_Id3_Frame_Trda extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Trsn.php b/src/Zend/Media/Id3/Frame/Trsn.php new file mode 100644 index 0000000..d757f95 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Trsn.php @@ -0,0 +1,40 @@ +Internet radio station name frame contains the name of the + * internet radio station from which the audio is streamed. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_TRSN extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Trso.php b/src/Zend/Media/Id3/Frame/Trso.php new file mode 100644 index 0000000..f627fb3 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Trso.php @@ -0,0 +1,40 @@ +Internet radio station owner frame contains the name of the owner + * of the internet radio station from which the audio is streamed. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_TRSO extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tsiz.php b/src/Zend/Media/Id3/Frame/Tsiz.php new file mode 100644 index 0000000..097cccd --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tsiz.php @@ -0,0 +1,42 @@ +Size frame contains the size of the audiofile in bytes, excluding + * the ID3v2 tag. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @deprecated ID3v2.3.0 + */ +final class Zend_Media_Id3_Frame_Tsiz extends Zend_Media_Id3_NumberFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tsoa.php b/src/Zend/Media/Id3/Frame/Tsoa.php new file mode 100644 index 0000000..7b81bf0 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tsoa.php @@ -0,0 +1,43 @@ +Album sort order frame defines a string which should be used + * instead of the {@link Zend_Media_Id3_Frame_Talb TALB} album name frame for + * sorting purposes. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Tsoa extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tsop.php b/src/Zend/Media/Id3/Frame/Tsop.php new file mode 100644 index 0000000..d0df497 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tsop.php @@ -0,0 +1,43 @@ +Performer sort order frame defines a string which should be used + * instead of the {@link Zend_Media_Id3_Frame_Tpe2 TPE2} performer frame for + * sorting purposes. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Tsop extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tsot.php b/src/Zend/Media/Id3/Frame/Tsot.php new file mode 100644 index 0000000..c1ceb2e --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tsot.php @@ -0,0 +1,43 @@ +Title sort order frame defines a string which should be used + * instead of the {@link Zend_Media_Id3_Frame_Tit2 TIT2} title frame for sorting + * purposes. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Tsot extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tsrc.php b/src/Zend/Media/Id3/Frame/Tsrc.php new file mode 100644 index 0000000..0747d9d --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tsrc.php @@ -0,0 +1,206 @@ +TSRC frame should contain the International Standard Recording + * Code or ISRC (12 characters). + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tsrc extends Zend_Media_Id3_TextFrame +{ + /** @var string */ + private $_country; + + /** @var string */ + private $_registrant; + + /** @var string */ + private $_year; + + /** @var string */ + private $_uniqueNumber; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + Zend_Media_Id3_Frame::__construct($reader, $options); + + $this->setEncoding(Zend_Media_Id3_Encoding::ISO88591); + + if ($this->_reader === null) { + return; + } + + $this->_reader->skip(1); + $this->setText($this->_reader->readString8($this->_reader->getSize())); + $this->_country = substr($this->getText(), 0, 2); + $this->_registrant = substr($this->getText(), 2, 3); + $this->_year = substr($this->getText(), 5, 2); + $this->_uniqueNumber = substr($this->getText(), 7, 5); + } + + /** + * Returns the appropriate for the registrant the two-character ISO 3166-1 + * alpha-2 country code. + * + * @return string + */ + public function getCountry() + { + return $this->_country; + } + + /** + * Sets the country. + * + * @param string $country The two-character ISO 3166-1 alpha-2 country code. + */ + public function setCountry($country) + { + $this->_country = $country; + } + + /** + * Returns the three character alphanumeric registrant code, uniquely + * identifying the organisation which registered the ISRC code. + * + * @return string + */ + public function getRegistrant() + { + return $this->_registrant; + } + + /** + * Sets the registrant. + * + * @param string $registrant The three character alphanumeric registrant + * code. + */ + public function setRegistrant($registrant) + { + $this->_registrant = $registrant; + } + + /** + * Returns the year of registration. + * + * @return integer + */ + public function getYear() + { + $year = intval($this->_year); + if ($year > 50) { + return 1900 + $year; + } else { + return 2000 + $year; + } + } + + /** + * Sets the year. + * + * @param integer $year The year of registration. + */ + public function setYear($year) + { + $this->_year = substr(strval($year), 2, 2); + } + + /** + * Returns the unique number identifying the particular sound recording. + * + * @return integer + */ + public function getUniqueNumber() + { + return intval($this->_uniqueNumber); + } + + /** + * Sets the unique number. + * + * @param integer $uniqueNumber The unique number identifying the + * particular sound recording. + */ + public function setUniqueNumber($uniqueNumber) + { + $this->_uniqueNumber = + str_pad(strval($uniqueNumber), 5, "0", STR_PAD_LEFT); + } + + /** + * Returns the whole ISRC code in the form + * "country-registrant-year-unique number". + * + * @return string + */ + public function getIsrc() + { + return $this->_country . "-" . $this->_registrant . "-" . + $this->_year . "-" . $this->_uniqueNumber; + } + + /** + * Sets the ISRC code in the form "country-registrant-year-unique number". + * + * @param string $isrc The ISRC code. + */ + public function setIsrc($isrc) + { + list($this->_country, + $this->_registrant, + $this->_year, + $this->_uniqueNumber) = preg_split('/-/', $isrc); + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $this->setText + ($this->_country . $this->_registrant . $this->_year . + $this->_uniqueNumber, Zend_Media_Id3_Encoding::ISO88591); + parent::_writeFrame($writer); + } +} diff --git a/src/Zend/Media/Id3/Frame/Tsse.php b/src/Zend/Media/Id3/Frame/Tsse.php new file mode 100644 index 0000000..736fa3e --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tsse.php @@ -0,0 +1,41 @@ +Software/Hardware and settings used for encoding frame includes + * the used audio encoder and its settings when the file was encoded. Hardware + * refers to hardware encoders, not the computer on which a program was run. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Tsse extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Tsst.php b/src/Zend/Media/Id3/Frame/Tsst.php new file mode 100644 index 0000000..210dfc7 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tsst.php @@ -0,0 +1,42 @@ +Set subtitle frame is intended for the subtitle of the part of a + * set this track belongs to. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @since ID3v2.4.0 + */ +final class Zend_Media_Id3_Frame_Tsst extends Zend_Media_Id3_TextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Txxx.php b/src/Zend/Media/Id3/Frame/Txxx.php new file mode 100644 index 0000000..4850bd9 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Txxx.php @@ -0,0 +1,144 @@ + + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Txxx extends Zend_Media_Id3_TextFrame +{ + /** @var string */ + private $_description; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + Zend_Media_Id3_Frame::__construct($reader, $options); + + $this->setEncoding + ($this->getOption('encoding', Zend_Media_Id3_Encoding::UTF8)); + + if ($this->_reader === null) { + return; + } + + $encoding = $this->_reader->readUInt8(); + switch ($encoding) { + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + list($this->_description, $this->_text) = + $this->_explodeString16 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_description = + $this->_convertString($this->_description, $encoding); + $this->_text = + $this->_convertString(array($this->_text), $encoding); + break; + case self::UTF8: + // break intentionally omitted + default: + list($this->_description, $this->_text) = $this->_convertString + ($this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2), + $encoding); + $this->_text = array($this->_text); + break; + } + } + + /** + * Returns the description text. + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Sets the description text using given encoding. + * + * @param string $description The content description text. + * @param integer $encoding The text encoding. + */ + public function setDescription($description, $encoding = null) + { + $this->_description = $description; + if ($encoding !== null) { + $this->setEncoding($encoding); + } + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt8($this->_encoding); + switch ($this->_encoding) { + case self::UTF16LE: + $writer->writeString16 + ($this->_description, + Zend_Io_Writer::LITTLE_ENDIAN_ORDER, null, 1) + ->writeString16 + ($this->_text[0], + Zend_Io_Writer::LITTLE_ENDIAN_ORDER); + break; + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + $writer->writeString16($this->_description, null, 1) + ->writeString16($this->_text[0], null); + break; + default: + $writer->writeString8($this->_description, 1) + ->writeString8($this->_text[0]); + break; + } + } +} diff --git a/src/Zend/Media/Id3/Frame/Tyer.php b/src/Zend/Media/Id3/Frame/Tyer.php new file mode 100644 index 0000000..d015430 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Tyer.php @@ -0,0 +1,73 @@ +Year frame is a numeric string with a year of the recording. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + * @deprecated ID3v2.3.0 + */ +final class Zend_Media_Id3_Frame_Tyer extends Zend_Media_Id3_DateFrame +{ + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options, 'Y'); + } + + /** + * Returns the year. + * + * @return integer + */ + public function getYear() + { + return intval($this->getText()); + } + + /** + * Sets the year. + * + * @param integer $year The year given in four digits. + */ + public function setYear($year) + { + $this->setText(strval($year)); + } +} diff --git a/src/Zend/Media/Id3/Frame/Unknown.php b/src/Zend/Media/Id3/Frame/Unknown.php new file mode 100644 index 0000000..0701447 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Unknown.php @@ -0,0 +1,48 @@ + + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Unknown extends Zend_Media_Id3_Frame +{ + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + {} +} diff --git a/src/Zend/Media/Id3/Frame/User.php b/src/Zend/Media/Id3/Frame/User.php new file mode 100644 index 0000000..6d611db --- /dev/null +++ b/src/Zend/Media/Id3/Frame/User.php @@ -0,0 +1,43 @@ +Terms of use frame contains a brief description of the terms of + * use and ownership of the file. More detailed information concerning the legal + * terms might be available through the {@link Zend_Media_Id3_Frame_Wcop WCOP} + * frame. Newlines are allowed in the text. There may be more than one Terms of + * use frames in a tag, but only one with the same language. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_User extends Zend_Media_Id3_LanguageTextFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Uslt.php b/src/Zend/Media/Id3/Frame/Uslt.php new file mode 100644 index 0000000..fa5cb73 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Uslt.php @@ -0,0 +1,154 @@ +Unsynchronised lyrics/text transcription frame contains the lyrics + * of the song or a text transcription of other vocal activities. There may be + * more than one unsynchronised lyrics/text transcription frame in each tag, but + * only one with the same language and content descriptor. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Uslt extends Zend_Media_Id3_LanguageTextFrame +{ + /** @var string */ + private $_description; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + Zend_Media_Id3_Frame::__construct($reader, $options); + + $this->setEncoding + ($this->getOption('encoding', Zend_Media_Id3_Encoding::UTF8)); + + if ($this->_reader === null) { + return; + } + + $encoding = $this->_reader->readUInt8(); + $this->_language = strtolower($this->_reader->read(3)); + if ($this->_language == 'xxx') { + $this->_language = 'und'; + } + + switch ($encoding) { + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + list($this->_description, $this->_text) = + $this->_explodeString16 + ($this->_reader->read($this->_reader->getSize()), 2); + $this->_description = + $this->_convertString($this->_description, $encoding); + $this->_text = + $this->_convertString($this->_text, $encoding); + break; + case self::UTF8: + // break intentionally omitted + default: + list($this->_description, $this->_text) = $this->_convertString + ($this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2), + $encoding); + break; + } + } + + /** + * Returns the short content description. + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Sets the content description text using given encoding. The description + * language and encoding must be that of the actual text. + * + * @param string $description The content description text. + * @param string $language The language code. + * @param integer $encoding The text encoding. + */ + public function setDescription + ($description, $language = null, $encoding = null) + { + $this->_description = $description; + if ($language !== null) { + $this->setLanguage($language); + } + if ($encoding !== null) { + $this->setEncoding($encoding); + } + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt8($this->_encoding) + ->write($this->_language); + switch ($this->_encoding) { + case self::UTF16LE: + $writer->writeString16 + ($this->_description, + Zend_Io_Writer::LITTLE_ENDIAN_ORDER, 1) + ->writeString16 + ($this->_text,Zend_Io_Writer::LITTLE_ENDIAN_ORDER); + break; + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + $writer->writeString16($this->_description, null, 1) + ->writeString16($this->_text); + break; + default: + $writer->writeString8($this->_description, 1) + ->writeString8($this->_text); + break; + } + } +} diff --git a/src/Zend/Media/Id3/Frame/Wcom.php b/src/Zend/Media/Id3/Frame/Wcom.php new file mode 100644 index 0000000..0474dcb --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Wcom.php @@ -0,0 +1,41 @@ +Commercial information frame is a URL pointing at a webpage with + * information such as where the album can be bought. There may be more than one + * WCOM frame in a tag, but not with the same content. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Wcom extends Zend_Media_Id3_LinkFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Wcop.php b/src/Zend/Media/Id3/Frame/Wcop.php new file mode 100644 index 0000000..1335a90 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Wcop.php @@ -0,0 +1,40 @@ +Copyright/Legal information frame is a URL pointing at a webpage + * where the terms of use and ownership of the file is described. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Wcop extends Zend_Media_Id3_LinkFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Woaf.php b/src/Zend/Media/Id3/Frame/Woaf.php new file mode 100644 index 0000000..68245b4 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Woaf.php @@ -0,0 +1,40 @@ +Official audio file webpage frame is a URL pointing at a file + * specific webpage. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Woaf extends Zend_Media_Id3_LinkFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Woar.php b/src/Zend/Media/Id3/Frame/Woar.php new file mode 100644 index 0000000..9e7cee0 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Woar.php @@ -0,0 +1,41 @@ +Official artist/performer webpage frame is a URL pointing at the + * artists official webpage. There may be more than one WOAR frame in a tag if + * the audio contains more than one performer, but not with the same content. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Woar extends Zend_Media_Id3_LinkFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Woas.php b/src/Zend/Media/Id3/Frame/Woas.php new file mode 100644 index 0000000..67043cb --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Woas.php @@ -0,0 +1,40 @@ +Official audio source webpage frame is a URL pointing at the + * official webpage for the source of the audio file, e.g. a movie. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Woas extends Zend_Media_Id3_LinkFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Wors.php b/src/Zend/Media/Id3/Frame/Wors.php new file mode 100644 index 0000000..6bb16da --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Wors.php @@ -0,0 +1,40 @@ +Official Internet radio station homepage contains a URL pointing + * at the homepage of the internet radio station. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Wors extends Zend_Media_Id3_LinkFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Wpay.php b/src/Zend/Media/Id3/Frame/Wpay.php new file mode 100644 index 0000000..38838fa --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Wpay.php @@ -0,0 +1,40 @@ +Payment frame is a URL pointing at a webpage that will handle the + * process of paying for this file. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Wpay extends Zend_Media_Id3_LinkFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Wpub.php b/src/Zend/Media/Id3/Frame/Wpub.php new file mode 100644 index 0000000..7b41a21 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Wpub.php @@ -0,0 +1,40 @@ +Publishers official webpage frame is a URL pointing at the + * official webpage for the publisher. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Wpub extends Zend_Media_Id3_LinkFrame +{} diff --git a/src/Zend/Media/Id3/Frame/Wxxx.php b/src/Zend/Media/Id3/Frame/Wxxx.php new file mode 100644 index 0000000..2ec8566 --- /dev/null +++ b/src/Zend/Media/Id3/Frame/Wxxx.php @@ -0,0 +1,180 @@ + + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Frame_Wxxx extends Zend_Media_Id3_LinkFrame + implements Zend_Media_Id3_Encoding +{ + /** @var integer */ + private $_encoding; + + /** @var string */ + private $_description; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + Zend_Media_Id3_Frame::__construct($reader, $options); + + $this->setEncoding + ($this->getOption('encoding', Zend_Media_Id3_Encoding::UTF8)); + + if ($this->_reader === null) { + return; + } + + $encoding = $this->_reader->readUInt8(); + switch ($encoding) { + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + list($this->_description, $this->_link) = + $this->_explodeString16 + ($this->_reader->read($this->_reader->getSize()), 2); + break; + case self::UTF8: + // break intentionally omitted + default: + list($this->_description, $this->_link) = + $this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 2); + break; + } + $this->_description = + $this->_convertString($this->_description, $encoding); + $this->_link = implode($this->_explodeString8($this->_link, 1), ''); + } + + /** + * Returns the text encoding. + * + * All the strings read from a file are automatically converted to the + * character encoding specified with the encoding option. See + * {@link Zend_Media_Id3v2} for details. This method returns that character + * encoding, or any value set after read, translated into a string form + * regarless if it was set using a {@link Zend_Media_Id3_Encoding} constant + * or a string. + * + * @return integer + */ + public function getEncoding() + { + return $this->_translateIntToEncoding($this->_encoding); + } + + /** + * Sets the text encoding. + * + * All the string written to the frame are done so using given character + * encoding. No conversions of existing data take place upon the call to + * this method thus all texts must be given in given character encoding. + * + * The character encoding parameter takes either a + * {@link Zend_Media_Id3_Encoding} constant or a character set name string + * in the form accepted by iconv. The default character encoding used to + * write the frame is 'utf-8'. + * + * @see Zend_Media_Id3_Encoding + * @param integer $encoding The text encoding. + */ + public function setEncoding($encoding) + { + $this->_encoding = $this->_translateEncodingToInt($encoding); + } + + /** + * Returns the link description. + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Sets the content description text using given encoding. + * + * @param string $description The content description text. + * @param integer $encoding The text encoding. + */ + public function setDescription($description, $encoding = null) + { + $this->_description = $description; + if ($encoding !== null) { + $this->setEncoding($encoding); + } + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt8($this->_encoding); + switch ($this->_encoding) { + case self::UTF16LE: + $writer->writeString16 + ($this->_description, + Zend_Io_Writer::LITTLE_ENDIAN_ORDER, 1); + break; + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + $writer->writeString16($this->_description, null, 1); + break; + default: + $writer->writeString8($this->_description, 1); + break; + } + $writer->write($this->_link); + } +} diff --git a/src/Zend/Media/Id3/Header.php b/src/Zend/Media/Id3/Header.php new file mode 100644 index 0000000..804232d --- /dev/null +++ b/src/Zend/Media/Id3/Header.php @@ -0,0 +1,179 @@ + + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +final class Zend_Media_Id3_Header extends Zend_Media_Id3_Object +{ + /** A flag to denote whether or not unsynchronisation is applied on all + frames */ + const UNSYNCHRONISATION = 128; + + /** A flag to denote whether or not the header is followed by an extended + header */ + const EXTENDED_HEADER = 64; + + /** A flag used as an experimental indicator. This flag shall always be set + when the tag is in an experimental stage. */ + const EXPERIMENTAL = 32; + + /** + * A flag to denote whether a footer is present at the very end of the tag. + * + * @since ID3v2.4.0 + */ + const FOOTER = 16; + + /** @var integer */ + private $_version = 4.0; + + /** @var integer */ + private $_flags = 0; + + /** @var integer */ + private $_size; + + /** + * Constructs the class with given parameters and reads object related data + * from the ID3v2 tag. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($reader === null) + return; + + $this->_version = $options['version'] = + $this->_reader->readInt8() + $this->_reader->readInt8() / 10; + $this->_flags = $this->_reader->readInt8(); + $this->_size = + $this->_decodeSynchsafe32($this->_reader->readUInt32BE()); + } + + /** + * Returns the tag version number. The version number is in the form of + * major.revision. + * + * @return integer + */ + public function getVersion() + { + return $this->_version; + } + + /** + * Sets the tag version number. Supported version numbers are 3.0 and 4.0 + * for ID3v2.3.0 and ID3v2.4.0 standards, respectively. + * + * @param integer $version The tag version number in the form of + * major.revision. + */ + public function setVersion($version) + { + $this->setOption('version', $this->_version = $version); + } + + /** + * Checks whether or not the flag is set. Returns true if the + * flag is set, false otherwise. + * + * @param integer $flag The flag to query. + * @return boolean + */ + public function hasFlag($flag) + { + return ($this->_flags & $flag) == $flag; + } + + /** + * Returns the flags byte. + * + * @return integer + */ + public function getFlags() + { + return $this->_flags; + } + + /** + * Sets the flags byte. + * + * @param string $flags The flags byte. + */ + public function setFlags($flags) + { + $this->_flags = $flags; + } + + /** + * Returns the tag size, excluding the header and the footer. + * + * @return integer + */ + public function getSize() + { + return $this->_size; + } + + /** + * Sets the tag size, excluding the header and the footer. Called + * automatically upon tag generation to adjust the tag size. + * + * @param integer $size The size of the tag, in bytes. + */ + public function setSize($size) + { + $this->_size = $size; + } + + /** + * Writes the header/footer data without the identifier. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + public function write($writer) + { + $writer->writeInt8(floor($this->_version)) + ->writeInt8(($this->_version - floor($this->_version)) * 10) + ->writeInt8($this->_flags) + ->writeUInt32BE($this->_encodeSynchsafe32($this->_size)); + } +} diff --git a/src/Zend/Media/Id3/Language.php b/src/Zend/Media/Id3/Language.php new file mode 100644 index 0000000..200a78f --- /dev/null +++ b/src/Zend/Media/Id3/Language.php @@ -0,0 +1,56 @@ +Zend_Media_Id3_Language interface implies that the + * implementing ID3v2 frame supports its content to be given in multiple + * languages. + * + * The three byte language code is used to describe the language of the frame's + * content, according to {@link http://www.loc.gov/standards/iso639-2/ + * ISO-639-2}. The language should be represented in lower case. If the language + * is not known the string 'und' should be used. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +interface Zend_Media_Id3_Language +{ + /** + * Returns the text language code. + * + * @return string + */ + public function getLanguage(); + + /** + * Sets the text language code. + * + * @param string $language The text language code. + */ + public function setLanguage($language); +} diff --git a/src/Zend/Media/Id3/LanguageTextFrame.php b/src/Zend/Media/Id3/LanguageTextFrame.php new file mode 100644 index 0000000..e4aaa8d --- /dev/null +++ b/src/Zend/Media/Id3/LanguageTextFrame.php @@ -0,0 +1,222 @@ + + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +abstract class Zend_Media_Id3_LanguageTextFrame extends Zend_Media_Id3_Frame + implements Zend_Media_Id3_Encoding, Zend_Media_Id3_Language +{ + /** + * The text encoding. + * + * @var integer + */ + protected $_encoding; + + /** + * The ISO-639-2 language code. + * + * @var string + */ + protected $_language = 'und'; + + /** + * The text. + * + * @var string + */ + protected $_text; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + $this->setEncoding + ($this->getOption('encoding', Zend_Media_Id3_Encoding::UTF8)); + + if ($this->_reader === null) { + return; + } + + $encoding = $this->_reader->readUInt8(); + $this->_language = strtolower($this->_reader->read(3)); + if ($this->_language == 'xxx') { + $this->_language = 'und'; + } + + switch ($encoding) { + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + $this->_text = $this->_convertString + ($this->_reader->readString16($this->_reader->getSize()), + $encoding); + break; + case self::UTF8: + // break intentionally omitted + default: + $this->_text = $this->_convertString + ($this->_reader->readString8($this->_reader->getSize()), + $encoding); + break; + } + } + + /** + * Returns the text encoding. + * + * All the strings read from a file are automatically converted to the + * character encoding specified with the encoding option. See + * {@link Zend_Media_Id3v2} for details. This method returns that character + * encoding, or any value set after read, translated into a string form + * regarless if it was set using a {@link Zend_Media_Id3_Encoding} constant + * or a string. + * + * @return integer + */ + public function getEncoding() + { + return $this->_translateIntToEncoding($this->_encoding); + } + + /** + * Sets the text encoding. + * + * All the string written to the frame are done so using given character + * encoding. No conversions of existing data take place upon the call to + * this method thus all texts must be given in given character encoding. + * + * The character encoding parameter takes either a + * {@link Zend_Media_Id3_Encoding} constant or a character set name string + * in the form accepted by iconv. The default character encoding used to + * write the frame is 'utf-8'. + * + * @see Zend_Media_Id3_Encoding + * @param integer $encoding The text encoding. + */ + public function setEncoding($encoding) + { + $this->_encoding = $this->_translateEncodingToInt($encoding); + } + + /** + * Returns the language code as specified in the + * {@link http://www.loc.gov/standards/iso639-2/ ISO-639-2} standard. + * + * @return string + */ + public function getLanguage() + { + return $this->_language; + } + + /** + * Sets the text language code as specified in the + * {@link http://www.loc.gov/standards/iso639-2/ ISO-639-2} standard. + * + * @see Zend_Media_Id3_Language + * @param string $language The language code. + */ + public function setLanguage($language) + { + $language = strtolower($language); + if ($language == 'xxx') { + $language = 'und'; + } + $this->_language = substr($language, 0, 3); + } + + /** + * Returns the text. + * + * @return string + */ + public function getText() + { + return $this->_text; + } + + /** + * Sets the text using given language and encoding. + * + * @param string $text The text. + * @param string $language The language code. + * @param integer $encoding The text encoding. + */ + public function setText($text, $language = null, $encoding = null) + { + $this->_text = $text; + if ($language !== null) { + $this->setLanguage($language); + } + if ($encoding !== null) { + $this->setEncoding($encoding); + } + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt8($this->_encoding) + ->write($this->_language); + switch ($this->_encoding) { + case self::UTF16LE: + $writer->writeString16 + ($this->_text, Zend_Io_Writer::LITTLE_ENDIAN_ORDER); + break; + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + // break intentionally omitted + default: + $writer->write($this->_text); + break; + } + } +} diff --git a/src/Zend/Media/Id3/LinkFrame.php b/src/Zend/Media/Id3/LinkFrame.php new file mode 100644 index 0000000..9e2f160 --- /dev/null +++ b/src/Zend/Media/Id3/LinkFrame.php @@ -0,0 +1,92 @@ + + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +abstract class Zend_Media_Id3_LinkFrame extends Zend_Media_Id3_Frame +{ + /** @var string */ + protected $_link; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + if ($this->_reader !== null) { + $this->_link = implode + ($this->_explodeString8 + ($this->_reader->read($this->_reader->getSize()), 1), ''); + } + } + + /** + * Returns the link associated with the frame. + * + * @return string + */ + public function getLink() + { + return $this->_link; + } + + /** + * Sets the link. The link encoding is always ISO-8859-1. + * + * @param string $link The link. + */ + public function setLink($link) + { + $this->_link = $link; + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->write($this->_link); + } +} diff --git a/src/Zend/Media/Id3/NumberFrame.php b/src/Zend/Media/Id3/NumberFrame.php new file mode 100644 index 0000000..33c875c --- /dev/null +++ b/src/Zend/Media/Id3/NumberFrame.php @@ -0,0 +1,93 @@ + + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +abstract class Zend_Media_Id3_NumberFrame + extends Zend_Media_Id3_TextFrame +{ + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + Zend_Media_Id3_Frame::__construct($reader, $options); + + $this->setEncoding(Zend_Media_Id3_Encoding::ISO88591); + + if ($this->_reader === null) { + return; + } + + $this->_reader->skip(1); + $this->setText($this->_reader->readString8($this->_reader->getSize())); + } + + /** + * Returns the integer value of the text. + * + * @return integer + */ + public function getValue() + { + return doubleval($this->getText()); + } + + /** + * Sets the integer value of the text. + * + * @param integer $value The integer value of the text. + */ + public function setValue($value) + { + $this->setText(strval($value), Zend_Media_Id3_Encoding::ISO88591); + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $this->setEncoding(Zend_Media_Id3_Encoding::ISO88591); + parent::_writeFrame($writer); + } +} diff --git a/src/Zend/Media/Id3/Object.php b/src/Zend/Media/Id3/Object.php new file mode 100644 index 0000000..d1f11e7 --- /dev/null +++ b/src/Zend/Media/Id3/Object.php @@ -0,0 +1,366 @@ + + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +abstract class Zend_Media_Id3_Object +{ + /** + * The reader object. + * + * @var Zend_Io_Reader + */ + protected $_reader; + + /** + * The options array. + * + * @var Array + */ + private $_options; + + /** + * Constructs the class with given parameters. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + $this->_reader = $reader; + $this->_options = &$options; + } + + /** + * Returns the options array. + * + * @return Array + */ + public final function getOptions() + { + return $this->_options; + } + + /** + * Returns the given option value, or the default value if the option is not + * defined. + * + * @param string $option The name of the option. + * @param mixed $defaultValue The default value to be returned. + */ + public final function getOption($option, $defaultValue = null) + { + if (isset($this->_options[$option])) { + return $this->_options[$option]; + } + return $defaultValue; + } + + /** + * Sets the options array. See {@link Zend_Media_Id3v2} class for available + * options. + * + * @param Array $options The options array. + */ + public final function setOptions(&$options) + { + $this->_options = &$options; + } + + /** + * Sets the given option the given value. + * + * @param string $option The name of the option. + * @param mixed $value The value to set for the option. + */ + public final function setOption($option, $value) + { + $this->_options[$option] = $value; + } + + /** + * Magic function so that $obj->value will work. + * + * @param string $name The field name. + * @return mixed + */ + public function __get($name) + { + if (method_exists($this, 'get' . ucfirst($name))) { + return call_user_func(array($this, 'get' . ucfirst($name))); + } else { + require_once 'Zend/Media/Id3/Exception.php'; + throw new Zend_Media_Id3_Exception('Unknown field: ' . $name); + } + } + + /** + * Magic function so that assignments with $obj->value will work. + * + * @param string $name The field name. + * @param string $value The field value. + * @return mixed + */ + public function __set($name, $value) + { + if (method_exists($this, 'set' . ucfirst($name))) { + call_user_func(array($this, 'set' . ucfirst($name)), $value); + } else { + require_once 'Zend/Media/Id3/Exception.php'; + throw new Zend_Media_Id3_Exception('Unknown field: ' . $name); + } + } + + /** + * Encodes the given 32-bit integer to 28-bit synchsafe integer, where the + * most significant bit of each byte is zero, making seven bits out of eight + * available. + * + * @param integer $val The integer to encode. + * @return integer + */ + protected final function _encodeSynchsafe32($val) + { + return ($val & 0x7f) | ($val & 0x3f80) << 1 | + ($val & 0x1fc000) << 2 | ($val & 0xfe00000) << 3; + } + + /** + * Decodes the given 28-bit synchsafe integer to regular 32-bit integer. + * + + * @param integer $val The integer to decode + * @return integer + */ + protected final function _decodeSynchsafe32($val) + { + return ($val & 0x7f) | ($val & 0x7f00) >> 1 | + ($val & 0x7f0000) >> 2 | ($val & 0x7f000000) >> 3; + } + + /** + * Applies the unsynchronisation scheme to the given data string. + * + * Whenever a false synchronisation is found within the data, one zeroed + * byte is inserted after the first false synchronisation byte. This has the + * side effect that all 0xff00 combinations have to be altered, so they will + * not be affected by the decoding process. Therefore all the 0xff00 + * combinations have to be replaced with the 0xff0000 combination during the + * unsynchronisation. + * + * @param string $data The input data. + * @return string + */ + protected final function _encodeUnsynchronisation(&$data) + { + $result = ''; + for ($i = 0, $j = 0; $i < strlen($data) - 1; $i++) { + if (ord($data[$i]) == 0xff && + ((($tmp = ord($data[$i + 1])) & 0xe0) == 0xe0 || $tmp == 0x0)) { + $result .= substr($data, $j, $i + 1 - $j) . "\0"; + $j = $i + 1; + } + } + return $result . substr($data, $j); + } + + /** + * Reverses the unsynchronisation scheme from the given data string. + * + * @see _encodeUnsynchronisation + * @param string $data The input data. + * @return string + */ + protected final function _decodeUnsynchronisation(&$data) + { + $result = ''; + for ($i = 0, $j = 0; $i < strlen($data) - 1; $i++) { + if (ord($data[$i]) == 0xff && ord($data[$i + 1]) == 0x0) { + $result .= substr($data, $j, $i + 1 - $j); + $j = $i + 2; + } + } + return $result . substr($data, $j); + } + + /** + * Splits UTF-16 formatted binary data up according to null terminators + * residing in the string, up to a given limit. + * + * @param string $value The input string. + * @return Array + */ + protected final function _explodeString16($value, $limit = null) + { + $i = 0; + $array = array(); + while (count($array) < $limit - 1 || $limit === null) { + $start = $i; + do { + $i = strpos($value, "\x00\x00", $i); + if ($i === false) { + $array[] = substr($value, $start); + return $array; + } + } while ($i & 0x1 != 0 && $i++); // make sure its aligned + $array[] = substr($value, $start, $i - $start); + $i += 2; + } + $array[] = substr($value, $i); + return $array; + } + + /** + * Splits UTF-8 or ISO-8859-1 formatted binary data according to null + * terminators residing in the string, up to a given limit. + * + * @param string $value The input string. + * @return Array + */ + protected final function _explodeString8($value, $limit = null) + { + return preg_split("/\\x00/", $value, $limit); + } + + /** + * Converts string from the given character encoding to the target encoding + * specified by the options as the encoding to display all the texts with, + * and returns the converted string. + * + * Character encoding sets can be {@link Zend_Media_Id3_Encoding} + * constants or already in the string form accepted by iconv. + * + * @param string|Array $string + * @param string|integer $source The source encoding. + * @param string|integer $target The target encoding. Defaults to the + * encoding value set in options. + */ + protected final function _convertString($string, $source, $target = null) + { + if ($target === null) { + $target = $this->getOption('encoding', 'utf-8'); + } + + $source = $this->_translateIntToEncoding($source); + $target = $this->_translateIntToEncoding($target); + + if ($source == $target) { + return $string; + } + + if (is_array($string)) { + foreach ($string as $key => $value) { + $string[$key] = iconv($source, $target, $value); + } + } else { + $string = iconv($source, $target, $string); + } + return $string; + } + + /** + * Returns given encoding in the form accepted by iconv. + * + * Character encoding set can be a {@link Zend_Media_Id3_Encoding} + * constant or already in the string form accepted by iconv. + * + * @param string|integer $encoding The encoding. + * @return string + */ + protected final function _translateIntToEncoding($encoding) + { + if (is_string($encoding)) { + return strtolower($encoding); + } + if (is_integer($encoding)) { + switch ($encoding) { + case Zend_Media_Id3_Encoding::UTF16: + return 'utf-16'; + case Zend_Media_Id3_Encoding::UTF16LE: + return 'utf-16le'; + case Zend_Media_Id3_Encoding::UTF16BE: + return 'utf-16be'; + case Zend_Media_Id3_Encoding::ISO88591: + return 'iso-8859-1'; + default: + return 'utf-8'; + } + } + return 'utf-8'; + } + + /** + * Returns given encoding in the form possible to write to the tag frame. + * + * Character encoding set can be in the string form accepted by iconv or + * already a {@link Zend_Media_Id3_Encoding} constant. + * + * @param string|integer $encoding The encoding. + * @return integer + */ + protected final function _translateEncodingToInt($encoding) + { + if (is_integer($encoding)) { + if ($encoding >= 0 && $encoding <= 4) { + return $encoding; + } + } + if (is_string($encoding)) { + switch ($encoding) { + case 'utf-16': + return Zend_Media_Id3_Encoding::UTF16; + case 'utf-16le': + return Zend_Media_Id3_Encoding::UTF16; + case 'utf-16be': + return Zend_Media_Id3_Encoding::UTF16BE; + case 'iso-8859-1': + return Zend_Media_Id3_Encoding::ISO88591; + default: + return Zend_Media_Id3_Encoding::UTF8; + } + } + return Zend_Media_Id3_Encoding::UTF8; + } + + /** + * Writes the object data. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + abstract public function write($writer); +} diff --git a/src/Zend/Media/Id3/TextFrame.php b/src/Zend/Media/Id3/TextFrame.php new file mode 100644 index 0000000..524e692 --- /dev/null +++ b/src/Zend/Media/Id3/TextFrame.php @@ -0,0 +1,195 @@ + + * @author Ryan Butterfield + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +abstract class Zend_Media_Id3_TextFrame extends Zend_Media_Id3_Frame + implements Zend_Media_Id3_Encoding +{ + /** + * The text encoding. + * + * @var integer + */ + protected $_encoding; + + /** + * The text array. + * + * @var string + */ + protected $_text; + + /** + * Constructs the class with given parameters and parses object related + * data. + * + * @param Zend_Io_Reader $reader The reader object. + * @param Array $options The options array. + */ + public function __construct($reader = null, &$options = array()) + { + parent::__construct($reader, $options); + + $this->setEncoding + ($this->getOption('encoding', Zend_Media_Id3_Encoding::UTF8)); + + if ($this->_reader === null) { + return; + } + + $encoding = $this->_reader->readUInt8(); + switch ($encoding) { + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + $this->_text = $this->_convertString + ($this->_explodeString16 + ($this->_reader->readString16($this->_reader->getSize())), + $encoding); + break; + case self::UTF8: + // break intentionally omitted + default: + $this->_text = $this->_convertString + ($this->_explodeString8 + ($this->_reader->readString8($this->_reader->getSize())), + $encoding); + break; + } + } + + /** + * Returns the text encoding. + * + * All the strings read from a file are automatically converted to the + * character encoding specified with the encoding option. See + * {@link Zend_Media_Id3v2} for details. This method returns that character + * encoding, or any value set after read, translated into a string form + * regarless if it was set using a {@link Zend_Media_Id3_Encoding} constant + * or a string. + * + * @return integer + */ + public function getEncoding() + { + return $this->_translateIntToEncoding($this->_encoding); + } + + /** + * Sets the text encoding. + * + * All the string written to the frame are done so using given character + * encoding. No conversions of existing data take place upon the call to + * this method thus all texts must be given in given character encoding. + * + * The character encoding parameter takes either a + * {@link Zend_Media_Id3_Encoding} constant or a character set name string + * in the form accepted by iconv. The default character encoding used to + * write the frame is 'utf-8'. + * + * @see Zend_Media_Id3_Encoding + * @param integer $encoding The text encoding. + */ + public function setEncoding($encoding) + { + $this->_encoding = $this->_translateEncodingToInt($encoding); + } + + /** + * Returns the first text chunk the frame contains. + * + * @return string + */ + public function getText() + { + return $this->_text[0]; + } + + /** + * Returns an array of texts the frame contains. + * + * @return Array + */ + public function getTexts() + { + return $this->_text; + } + + /** + * Sets the text using given encoding. + * + * @param mixed $text The text string or an array of strings. + * @param integer $encoding The text encoding. + */ + public function setText($text, $encoding = null) + { + $this->_text = is_array($text) ? $text : array($text); + if ($encoding !== null) { + $this->setEncoding($encoding); + } + } + + /** + * Writes the frame raw data without the header. + * + * @param Zend_Io_Writer $writer The writer object. + * @return void + */ + protected function _writeFrame($writer) + { + $writer->writeUInt8($this->_encoding); + switch ($this->_encoding) { + case self::UTF16LE: + $count = count($this->_text); + for ($i = 0; $i < $count; $i++) { + $writer->writeString16 + ($text, Zend_Io_Writer::LITTLE_ENDIAN_ORDER, + $i == $count ? null : 1); + } + break; + case self::UTF16: + // break intentionally omitted + case self::UTF16BE: + $writer->write(implode("\0\0", $this->_text)); + break; + default: + $writer->write(implode("\0", $this->_text)); + break; + } + } +} diff --git a/src/Zend/Media/Id3/Timing.php b/src/Zend/Media/Id3/Timing.php new file mode 100644 index 0000000..a1a7f09 --- /dev/null +++ b/src/Zend/Media/Id3/Timing.php @@ -0,0 +1,60 @@ +Zend_Media_Id3_Timing interface implies that the implementing + * ID3v2 frame contains one or more 32-bit timestamps. + * + * The timestamps are absolute times, meaning that every stamp contains the time + * from the beginning of the file. + * + * @category Zend + * @package Zend_Media + * @subpackage ID3 + * @author Sven Vollbehr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +interface Zend_Media_Id3_Timing +{ + /** The timestamp is an absolute time, using MPEG frames as unit. */ + const MPEG_FRAMES = 1; + + /** The timestamp is an absolute time, using milliseconds as unit. */ + const MILLISECONDS = 2; + + /** + * Returns the timing format. + * + * @return integer + */ + public function getFormat(); + + /** + * Sets the timing format. + * + + * @param integer $format The timing format. + */ + public function setFormat($format); +} diff --git a/src/Zend/Media/Id3v1.php b/src/Zend/Media/Id3v1.php index 505d283..977218c 100644 --- a/src/Zend/Media/Id3v1.php +++ b/src/Zend/Media/Id3v1.php @@ -14,7 +14,7 @@ * * @category Zend * @package Zend_Media - * @subpackage Id3 + * @subpackage ID3 * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ @@ -30,7 +30,7 @@ require_once 'Zend/Io/FileReader.php'; * * @category Zend * @package Zend_Media - * @subpackage Id3 + * @subpackage ID3 * @author Sven Vollbehr * @author Ryan Butterfield * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)