QuickTime.pm 282 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578
  1. #------------------------------------------------------------------------------
  2. # File: QuickTime.pm
  3. #
  4. # Description: Read QuickTime, MP4 and M4A meta information
  5. #
  6. # Revisions: 10/04/2005 - P. Harvey Created
  7. # 12/19/2005 - P. Harvey Added MP4 support
  8. # 09/22/2006 - P. Harvey Added M4A support
  9. # 07/27/2010 - P. Harvey Updated to 2010-05-03 QuickTime spec
  10. #
  11. # References:
  12. #
  13. # 1) http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html
  14. # 2) http://search.cpan.org/dist/MP4-Info-1.04/
  15. # 3) http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt
  16. # 4) http://wiki.multimedia.cx/index.php?title=Apple_QuickTime
  17. # 5) ISO 14496-12 (http://read.pudn.com/downloads64/ebook/226547/ISO_base_media_file_format.pdf)
  18. # 6) ISO 14496-16 (http://www.iec-normen.de/previewpdf/info_isoiec14496-16%7Bed2.0%7Den.pdf)
  19. # 7) http://atomicparsley.sourceforge.net/mpeg-4files.html
  20. # 8) http://wiki.multimedia.cx/index.php?title=QuickTime_container
  21. # 9) http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart3.pdf (Oct 2008)
  22. # 10) http://code.google.com/p/mp4v2/wiki/iTunesMetadata
  23. # 11) http://www.canieti.com.mx/assets/files/1011/IEC_100_1384_DC.pdf
  24. # 12) QuickTime file format specification 2010-05-03
  25. # 13) http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf
  26. # 14) http://standards.iso.org/ittf/PubliclyAvailableStandards/c051533_ISO_IEC_14496-12_2008.zip
  27. # 15) http://getid3.sourceforge.net/source/module.audio-video.quicktime.phps
  28. # 16) http://qtra.apple.com/atoms.html
  29. # 17) http://www.etsi.org/deliver/etsi_ts/126200_126299/126244/10.01.00_60/ts_126244v100100p.pdf
  30. # 18) https://github.com/appsec-labs/iNalyzer/blob/master/scinfo.m
  31. # 19) http://nah6.com/~itsme/cvs-xdadevtools/iphone/tools/decodesinf.pl
  32. # 20) https://developer.apple.com/legacy/library/documentation/quicktime/reference/QT7-1_Update_Reference/QT7-1_Update_Reference.pdf
  33. # 21) Francois Bonzon private communication
  34. # 22) https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/Metadata/Metadata.html
  35. #------------------------------------------------------------------------------
  36. package Image::ExifTool::QuickTime;
  37. use strict;
  38. use vars qw($VERSION $AUTOLOAD);
  39. use Image::ExifTool qw(:DataAccess :Utils);
  40. use Image::ExifTool::Exif;
  41. $VERSION = '1.94';
  42. sub FixWrongFormat($);
  43. sub ProcessMOV($$;$);
  44. sub ProcessKeys($$$);
  45. sub ProcessMetaData($$$);
  46. sub ProcessEncodingParams($$$);
  47. sub ProcessHybrid($$$);
  48. sub ProcessRights($$$);
  49. sub ConvertISO6709($);
  50. sub ConvertChapterList($);
  51. sub PrintChapter($);
  52. sub PrintGPSCoordinates($);
  53. sub UnpackLang($);
  54. sub WriteQuickTime($$$);
  55. sub WriteMOV($$);
  56. # MIME types for all entries in the ftypLookup with file extensions
  57. # (defaults to 'video/mp4' if not found in this lookup)
  58. my %mimeLookup = (
  59. '3G2' => 'video/3gpp2',
  60. '3GP' => 'video/3gpp',
  61. AAX => 'audio/vnd.audible.aax',
  62. DVB => 'video/vnd.dvb.file',
  63. F4A => 'audio/mp4',
  64. F4B => 'audio/mp4',
  65. JP2 => 'image/jp2',
  66. JPM => 'image/jpm',
  67. JPX => 'image/jpx',
  68. M4A => 'audio/mp4',
  69. M4B => 'audio/mp4',
  70. M4P => 'audio/mp4',
  71. M4V => 'video/x-m4v',
  72. MOV => 'video/quicktime',
  73. MQV => 'video/quicktime',
  74. );
  75. # look up file type from ftyp atom type, with MIME type in comment if known
  76. # (ref http://www.ftyps.com/)
  77. my %ftypLookup = (
  78. '3g2a' => '3GPP2 Media (.3G2) compliant with 3GPP2 C.S0050-0 V1.0', # video/3gpp2
  79. '3g2b' => '3GPP2 Media (.3G2) compliant with 3GPP2 C.S0050-A V1.0.0', # video/3gpp2
  80. '3g2c' => '3GPP2 Media (.3G2) compliant with 3GPP2 C.S0050-B v1.0', # video/3gpp2
  81. '3ge6' => '3GPP (.3GP) Release 6 MBMS Extended Presentations', # video/3gpp
  82. '3ge7' => '3GPP (.3GP) Release 7 MBMS Extended Presentations', # video/3gpp
  83. '3gg6' => '3GPP Release 6 General Profile', # video/3gpp
  84. '3gp1' => '3GPP Media (.3GP) Release 1 (probably non-existent)', # video/3gpp
  85. '3gp2' => '3GPP Media (.3GP) Release 2 (probably non-existent)', # video/3gpp
  86. '3gp3' => '3GPP Media (.3GP) Release 3 (probably non-existent)', # video/3gpp
  87. '3gp4' => '3GPP Media (.3GP) Release 4', # video/3gpp
  88. '3gp5' => '3GPP Media (.3GP) Release 5', # video/3gpp
  89. '3gp6' => '3GPP Media (.3GP) Release 6 Basic Profile', # video/3gpp
  90. '3gp6' => '3GPP Media (.3GP) Release 6 Progressive Download', # video/3gpp
  91. '3gp6' => '3GPP Media (.3GP) Release 6 Streaming Servers', # video/3gpp
  92. '3gs7' => '3GPP Media (.3GP) Release 7 Streaming Servers', # video/3gpp
  93. 'aax ' => 'Audible Enhanced Audiobook (.AAX)', #PH
  94. 'avc1' => 'MP4 Base w/ AVC ext [ISO 14496-12:2005]', # video/mp4
  95. 'CAEP' => 'Canon Digital Camera',
  96. 'caqv' => 'Casio Digital Camera',
  97. 'CDes' => 'Convergent Design',
  98. 'da0a' => 'DMB MAF w/ MPEG Layer II aud, MOT slides, DLS, JPG/PNG/MNG images',
  99. 'da0b' => 'DMB MAF, extending DA0A, with 3GPP timed text, DID, TVA, REL, IPMP',
  100. 'da1a' => 'DMB MAF audio with ER-BSAC audio, JPG/PNG/MNG images',
  101. 'da1b' => 'DMB MAF, extending da1a, with 3GPP timed text, DID, TVA, REL, IPMP',
  102. 'da2a' => 'DMB MAF aud w/ HE-AAC v2 aud, MOT slides, DLS, JPG/PNG/MNG images',
  103. 'da2b' => 'DMB MAF, extending da2a, with 3GPP timed text, DID, TVA, REL, IPMP',
  104. 'da3a' => 'DMB MAF aud with HE-AAC aud, JPG/PNG/MNG images',
  105. 'da3b' => 'DMB MAF, extending da3a w/ BIFS, 3GPP timed text, DID, TVA, REL, IPMP',
  106. 'dmb1' => 'DMB MAF supporting all the components defined in the specification',
  107. 'dmpf' => 'Digital Media Project', # various
  108. 'drc1' => 'Dirac (wavelet compression), encapsulated in ISO base media (MP4)',
  109. 'dv1a' => 'DMB MAF vid w/ AVC vid, ER-BSAC aud, BIFS, JPG/PNG/MNG images, TS',
  110. 'dv1b' => 'DMB MAF, extending dv1a, with 3GPP timed text, DID, TVA, REL, IPMP',
  111. 'dv2a' => 'DMB MAF vid w/ AVC vid, HE-AAC v2 aud, BIFS, JPG/PNG/MNG images, TS',
  112. 'dv2b' => 'DMB MAF, extending dv2a, with 3GPP timed text, DID, TVA, REL, IPMP',
  113. 'dv3a' => 'DMB MAF vid w/ AVC vid, HE-AAC aud, BIFS, JPG/PNG/MNG images, TS',
  114. 'dv3b' => 'DMB MAF, extending dv3a, with 3GPP timed text, DID, TVA, REL, IPMP',
  115. 'dvr1' => 'DVB (.DVB) over RTP', # video/vnd.dvb.file
  116. 'dvt1' => 'DVB (.DVB) over MPEG-2 Transport Stream', # video/vnd.dvb.file
  117. 'F4A ' => 'Audio for Adobe Flash Player 9+ (.F4A)', # audio/mp4
  118. 'F4B ' => 'Audio Book for Adobe Flash Player 9+ (.F4B)', # audio/mp4
  119. 'F4P ' => 'Protected Video for Adobe Flash Player 9+ (.F4P)', # video/mp4
  120. 'F4V ' => 'Video for Adobe Flash Player 9+ (.F4V)', # video/mp4
  121. 'isc2' => 'ISMACryp 2.0 Encrypted File', # ?/enc-isoff-generic
  122. 'iso2' => 'MP4 Base Media v2 [ISO 14496-12:2005]', # video/mp4
  123. 'isom' => 'MP4 Base Media v1 [IS0 14496-12:2003]', # video/mp4
  124. 'JP2 ' => 'JPEG 2000 Image (.JP2) [ISO 15444-1 ?]', # image/jp2
  125. 'JP20' => 'Unknown, from GPAC samples (prob non-existent)',
  126. 'jpm ' => 'JPEG 2000 Compound Image (.JPM) [ISO 15444-6]', # image/jpm
  127. 'jpx ' => 'JPEG 2000 with extensions (.JPX) [ISO 15444-2]', # image/jpx
  128. 'KDDI' => '3GPP2 EZmovie for KDDI 3G cellphones', # video/3gpp2
  129. #LCAG => (found in CompatibleBrands of Leica MOV videos)
  130. 'M4A ' => 'Apple iTunes AAC-LC (.M4A) Audio', # audio/x-m4a
  131. 'M4B ' => 'Apple iTunes AAC-LC (.M4B) Audio Book', # audio/mp4
  132. 'M4P ' => 'Apple iTunes AAC-LC (.M4P) AES Protected Audio', # audio/mp4
  133. 'M4V ' => 'Apple iTunes Video (.M4V) Video', # video/x-m4v
  134. 'M4VH' => 'Apple TV (.M4V)', # video/x-m4v
  135. 'M4VP' => 'Apple iPhone (.M4V)', # video/x-m4v
  136. 'mj2s' => 'Motion JPEG 2000 [ISO 15444-3] Simple Profile', # video/mj2
  137. 'mjp2' => 'Motion JPEG 2000 [ISO 15444-3] General Profile', # video/mj2
  138. 'mmp4' => 'MPEG-4/3GPP Mobile Profile (.MP4/3GP) (for NTT)', # video/mp4
  139. 'mp21' => 'MPEG-21 [ISO/IEC 21000-9]', # various
  140. 'mp41' => 'MP4 v1 [ISO 14496-1:ch13]', # video/mp4
  141. 'mp42' => 'MP4 v2 [ISO 14496-14]', # video/mp4
  142. 'mp71' => 'MP4 w/ MPEG-7 Metadata [per ISO 14496-12]', # various
  143. 'MPPI' => 'Photo Player, MAF [ISO/IEC 23000-3]', # various
  144. 'mqt ' => 'Sony / Mobile QuickTime (.MQV) US Patent 7,477,830 (Sony Corp)', # video/quicktime
  145. 'MSNV' => 'MPEG-4 (.MP4) for SonyPSP', # audio/mp4
  146. 'NDAS' => 'MP4 v2 [ISO 14496-14] Nero Digital AAC Audio', # audio/mp4
  147. 'NDSC' => 'MPEG-4 (.MP4) Nero Cinema Profile', # video/mp4
  148. 'NDSH' => 'MPEG-4 (.MP4) Nero HDTV Profile', # video/mp4
  149. 'NDSM' => 'MPEG-4 (.MP4) Nero Mobile Profile', # video/mp4
  150. 'NDSP' => 'MPEG-4 (.MP4) Nero Portable Profile', # video/mp4
  151. 'NDSS' => 'MPEG-4 (.MP4) Nero Standard Profile', # video/mp4
  152. 'NDXC' => 'H.264/MPEG-4 AVC (.MP4) Nero Cinema Profile', # video/mp4
  153. 'NDXH' => 'H.264/MPEG-4 AVC (.MP4) Nero HDTV Profile', # video/mp4
  154. 'NDXM' => 'H.264/MPEG-4 AVC (.MP4) Nero Mobile Profile', # video/mp4
  155. 'NDXP' => 'H.264/MPEG-4 AVC (.MP4) Nero Portable Profile', # video/mp4
  156. 'NDXS' => 'H.264/MPEG-4 AVC (.MP4) Nero Standard Profile', # video/mp4
  157. 'odcf' => 'OMA DCF DRM Format 2.0 (OMA-TS-DRM-DCF-V2_0-20060303-A)', # various
  158. 'opf2' => 'OMA PDCF DRM Format 2.1 (OMA-TS-DRM-DCF-V2_1-20070724-C)',
  159. 'opx2' => 'OMA PDCF DRM + XBS extensions (OMA-TS-DRM_XBS-V1_0-20070529-C)',
  160. 'pana' => 'Panasonic Digital Camera',
  161. 'qt ' => 'Apple QuickTime (.MOV/QT)', # video/quicktime
  162. 'ROSS' => 'Ross Video',
  163. 'sdv ' => 'SD Memory Card Video', # various?
  164. 'ssc1' => 'Samsung stereoscopic, single stream',
  165. 'ssc2' => 'Samsung stereoscopic, dual stream',
  166. 'XAVC' => 'Sony XAVC', #PH
  167. );
  168. # information for time/date-based tags (time zero is Jan 1, 1904)
  169. my %timeInfo = (
  170. Notes => 'converted from UTC to local time if the QuickTimeUTC option is set',
  171. # It is not uncommon for brain-dead software to use the wrong time zero,
  172. # so assume a time zero of Jan 1, 1970 if the date is before this
  173. RawConv => q{
  174. my $offset = (66 * 365 + 17) * 24 * 3600;
  175. return $val - $offset if $val >= $offset or $$self{OPTIONS}{QuickTimeUTC};
  176. $self->WarnOnce('Patched incorrect time zero for QuickTime date/time tag',1) if $val;
  177. return $val;
  178. },
  179. Shift => 'Time',
  180. Writable => 1,
  181. Permanent => 1,
  182. DelValue => 0,
  183. # Note: This value will be in UTC if generated by a system that is aware of the time zone
  184. ValueConv => 'ConvertUnixTime($val, $self->Options("QuickTimeUTC"))',
  185. ValueConvInv => 'GetUnixTime($val, $self->Options("QuickTimeUTC")) + (66 * 365 + 17) * 24 * 3600',
  186. PrintConv => '$self->ConvertDateTime($val)',
  187. PrintConvInv => '$self->InverseDateTime($val)',
  188. # (can't put Groups here because they aren't constant!)
  189. );
  190. # information for duration tags
  191. my %durationInfo = (
  192. ValueConv => '$$self{TimeScale} ? $val / $$self{TimeScale} : $val',
  193. PrintConv => '$$self{TimeScale} ? ConvertDuration($val) : $val',
  194. );
  195. # parsing for most of the 3gp udta language text boxes
  196. my %langText = (
  197. RawConv => sub {
  198. my ($val, $self) = @_;
  199. return '<err>' unless length $val >= 6;
  200. my $lang = UnpackLang(Get16u(\$val, 4));
  201. $lang = $lang ? "($lang) " : '';
  202. $val = substr($val, 6); # isolate string
  203. $val = $self->Decode($val, 'UCS2') if $val =~ /^\xfe\xff/;
  204. return $lang . $val;
  205. },
  206. );
  207. # 4-character Vendor ID codes (ref PH)
  208. my %vendorID = (
  209. appl => 'Apple',
  210. fe20 => 'Olympus (fe20)', # (FE200)
  211. FFMP => 'FFmpeg',
  212. 'GIC '=> 'General Imaging Co.',
  213. kdak => 'Kodak',
  214. KMPI => 'Konica-Minolta',
  215. leic => 'Leica',
  216. mino => 'Minolta',
  217. niko => 'Nikon',
  218. NIKO => 'Nikon',
  219. olym => 'Olympus',
  220. pana => 'Panasonic',
  221. pent => 'Pentax',
  222. pr01 => 'Olympus (pr01)', # (FE100,FE110,FE115)
  223. sany => 'Sanyo',
  224. 'SMI '=> 'Sorenson Media Inc.',
  225. ZORA => 'Zoran Corporation',
  226. 'AR.D'=> 'Parrot AR.Drone',
  227. ' KD '=> 'Kodak', # (FZ201)
  228. );
  229. # QuickTime data atom encodings for string types (ref 12)
  230. my %stringEncoding = (
  231. 1 => 'UTF8',
  232. 2 => 'UTF16',
  233. 3 => 'ShiftJIS',
  234. 4 => 'UTF8',
  235. 5 => 'UTF16',
  236. );
  237. my %graphicsMode = (
  238. # (ref http://homepage.mac.com/vanhoek/MovieGuts%20docs/64.html)
  239. 0x00 => 'srcCopy',
  240. 0x01 => 'srcOr',
  241. 0x02 => 'srcXor',
  242. 0x03 => 'srcBic',
  243. 0x04 => 'notSrcCopy',
  244. 0x05 => 'notSrcOr',
  245. 0x06 => 'notSrcXor',
  246. 0x07 => 'notSrcBic',
  247. 0x08 => 'patCopy',
  248. 0x09 => 'patOr',
  249. 0x0a => 'patXor',
  250. 0x0b => 'patBic',
  251. 0x0c => 'notPatCopy',
  252. 0x0d => 'notPatOr',
  253. 0x0e => 'notPatXor',
  254. 0x0f => 'notPatBic',
  255. 0x20 => 'blend',
  256. 0x21 => 'addPin',
  257. 0x22 => 'addOver',
  258. 0x23 => 'subPin',
  259. 0x24 => 'transparent',
  260. 0x25 => 'addMax',
  261. 0x26 => 'subOver',
  262. 0x27 => 'addMin',
  263. 0x31 => 'grayishTextOr',
  264. 0x32 => 'hilite',
  265. 0x40 => 'ditherCopy',
  266. # the following ref ISO/IEC 15444-3
  267. 0x100 => 'Alpha',
  268. 0x101 => 'White Alpha',
  269. 0x102 => 'Pre-multiplied Black Alpha',
  270. 0x110 => 'Component Alpha',
  271. );
  272. # QuickTime atoms
  273. %Image::ExifTool::QuickTime::Main = (
  274. PROCESS_PROC => \&ProcessMOV,
  275. WRITE_PROC => \&WriteQuickTime,
  276. GROUPS => { 2 => 'Video' },
  277. NOTES => q{
  278. The QuickTime format is used for many different types of audio, video and
  279. image files (most commonly, MOV and MP4 videos). Exiftool extracts standard
  280. meta information a variety of audio, video and image parameters, as well as
  281. proprietary information written by many camera models. Tags with a question
  282. mark after their name are not extracted unless the Unknown option is set.
  283. ExifTool has the ability to write/create XMP, and edit some date/time tags
  284. in QuickTime-format files.
  285. According to the specification, many QuickTime date/time tags should be
  286. stored as UTC. Unfortunately, digital cameras often store local time values
  287. instead (presumably because they don't know the time zone). For this
  288. reason, by default ExifTool does not assume a time zone for these values.
  289. However, if the QuickTimeUTC API option is set, then ExifTool will assume
  290. these values are properly stored as UTC, and will convert them to local time
  291. when extracting.
  292. See
  293. L<http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html>
  294. for the official specification.
  295. },
  296. meta => { # 'meta' is found here in my Sony ILCE-7S MP4 sample - PH
  297. Name => 'Meta',
  298. SubDirectory => {
  299. TagTable => 'Image::ExifTool::QuickTime::Meta',
  300. Start => 4, # skip 4-byte version number header
  301. },
  302. },
  303. free => [
  304. {
  305. Name => 'KodakFree',
  306. # (found in Kodak M5370 MP4 videos)
  307. Condition => '$$valPt =~ /^\0\0\0.Seri/s',
  308. SubDirectory => { TagTable => 'Image::ExifTool::Kodak::Free' },
  309. },{
  310. Unknown => 1,
  311. Binary => 1,
  312. },
  313. # (also Samsung WB750 uncompressed thumbnail data starting with "SDIC\0")
  314. ],
  315. # fre1 - 4 bytes: "june" (Kodak PixPro SP360)
  316. frea => {
  317. Name => 'Kodak_frea',
  318. SubDirectory => { TagTable => 'Image::ExifTool::Kodak::frea' },
  319. },
  320. skip => [
  321. {
  322. Name => 'CanonSkip',
  323. Condition => '$$valPt =~ /^\0.{3}(CNDB|CNCV|CNMN|CNFV|CNTH|CNDM)/s',
  324. SubDirectory => { TagTable => 'Image::ExifTool::Canon::Skip' },
  325. },
  326. { Name => 'Skip', Unknown => 1, Binary => 1 },
  327. ],
  328. wide => { Unknown => 1, Binary => 1 },
  329. ftyp => { #MP4
  330. Name => 'FileType',
  331. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::FileType' },
  332. },
  333. pnot => {
  334. Name => 'Preview',
  335. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Preview' },
  336. },
  337. PICT => {
  338. Name => 'PreviewPICT',
  339. Groups => { 2 => 'Preview' },
  340. Binary => 1,
  341. },
  342. pict => { #8
  343. Name => 'PreviewPICT',
  344. Groups => { 2 => 'Preview' },
  345. Binary => 1,
  346. },
  347. moov => {
  348. Name => 'Movie',
  349. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Movie' },
  350. },
  351. mdat => { Name => 'MovieData', Unknown => 1, Binary => 1 },
  352. 'mdat-size' => {
  353. Name => 'MovieDataSize',
  354. Notes => q{
  355. not a real tag ID, this tag represents the size of the 'mdat' data in bytes
  356. and is used in the AvgBitrate calculation
  357. },
  358. },
  359. 'mdat-offset' => 'MovieDataOffset',
  360. junk => { Unknown => 1, Binary => 1 }, #8
  361. uuid => [
  362. { #9 (MP4 files)
  363. Name => 'XMP',
  364. # *** this is where ExifTool writes XMP in MP4 videos (as per XMP spec) ***
  365. Condition => '$$valPt=~/^\xbe\x7a\xcf\xcb\x97\xa9\x42\xe8\x9c\x71\x99\x94\x91\xe3\xaf\xac/',
  366. SubDirectory => {
  367. TagTable => 'Image::ExifTool::XMP::Main',
  368. Start => 16,
  369. },
  370. },
  371. { #11 (MP4 files)
  372. Name => 'UUID-PROF',
  373. Condition => '$$valPt=~/^PROF!\xd2\x4f\xce\xbb\x88\x69\x5c\xfa\xc9\xc7\x40/',
  374. SubDirectory => {
  375. TagTable => 'Image::ExifTool::QuickTime::Profile',
  376. Start => 24, # uid(16) + version(1) + flags(3) + count(4)
  377. },
  378. },
  379. { #PH (Flip MP4 files)
  380. Name => 'UUID-Flip',
  381. Condition => '$$valPt=~/^\x4a\xb0\x3b\x0f\x61\x8d\x40\x75\x82\xb2\xd9\xfa\xce\xd3\x5f\xf5/',
  382. SubDirectory => {
  383. TagTable => 'Image::ExifTool::QuickTime::Flip',
  384. Start => 16,
  385. },
  386. },
  387. # "\x98\x7f\xa3\xdf\x2a\x85\x43\xc0\x8f\x8f\xd9\x7c\x47\x1e\x8e\xea" - unknown data in Flip videos
  388. { #8
  389. Name => 'UUID-Unknown',
  390. Unknown => 1,
  391. Binary => 1,
  392. },
  393. ],
  394. _htc => {
  395. Name => 'HTCInfo',
  396. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HTCInfo' },
  397. },
  398. udta => {
  399. Name => 'UserData',
  400. SubDirectory => { TagTable => 'Image::ExifTool::FLIR::UserData' },
  401. },
  402. thum => { #PH
  403. Name => 'ThumbnailImage',
  404. Groups => { 2 => 'Preview' },
  405. Binary => 1,
  406. },
  407. ardt => { #PH
  408. Name => 'ARDroneFile',
  409. ValueConv => 'length($val) > 4 ? substr($val,4) : $val', # remove length
  410. },
  411. prrt => { #PH
  412. Name => 'ARDroneTelemetry',
  413. Notes => q{
  414. telemetry information for each video frame: status1, status2, time, pitch,
  415. roll, yaw, speed, altitude
  416. },
  417. ValueConv => q{
  418. my $size = length $val;
  419. return \$val if $size < 12 or not $$self{OPTIONS}{Binary};
  420. my $len = Get16u(\$val, 2);
  421. my $str = '';
  422. SetByteOrder('II');
  423. my $pos = 12;
  424. while ($pos + $len <= $size) {
  425. my $s1 = Get16u(\$val, $pos);
  426. # s2: 7=take-off?, 3=moving, 4=hovering, 9=landing?, 2=landed
  427. my $s2 = Get16u(\$val, $pos + 2);
  428. $str .= "$s1 $s2";
  429. my $num = int(($len-4)/4);
  430. my ($i, $v);
  431. for ($i=0; $i<$num; ++$i) {
  432. my $pt = $pos + 4 + $i * 4;
  433. if ($i > 0 && $i < 4) {
  434. $v = GetFloat(\$val, $pt); # pitch/roll/yaw
  435. } else {
  436. $v = Get32u(\$val, $pt);
  437. # convert time to sec, and speed(NC)/altitude to metres
  438. $v /= 1000 if $i <= 5;
  439. }
  440. $str .= " $v";
  441. }
  442. $str .= "\n";
  443. $pos += $len;
  444. }
  445. SetByteOrder('MM');
  446. return \$str;
  447. },
  448. },
  449. # meta - proprietary XML information written by some Flip cameras - PH
  450. );
  451. # MPEG-4 'ftyp' atom
  452. # (ref http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html)
  453. %Image::ExifTool::QuickTime::FileType = (
  454. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  455. GROUPS => { 2 => 'Video' },
  456. FORMAT => 'int32u',
  457. 0 => {
  458. Name => 'MajorBrand',
  459. Format => 'undef[4]',
  460. PrintConv => \%ftypLookup,
  461. },
  462. 1 => {
  463. Name => 'MinorVersion',
  464. Format => 'undef[4]',
  465. ValueConv => 'sprintf("%x.%x.%x", unpack("nCC", $val))',
  466. },
  467. 2 => {
  468. Name => 'CompatibleBrands',
  469. Format => 'undef[$size-8]',
  470. # ignore any entry with a null, and return others as a list
  471. ValueConv => 'my @a=($val=~/.{4}/sg); @a=grep(!/\0/,@a); \@a',
  472. },
  473. );
  474. # proprietary HTC atom (HTC One MP4 video)
  475. %Image::ExifTool::QuickTime::HTCInfo = (
  476. PROCESS_PROC => \&ProcessMOV,
  477. GROUPS => { 2 => 'Video' },
  478. NOTES => 'Tags written by some HTC camera phones.',
  479. slmt => {
  480. Name => 'Unknown_slmt',
  481. Unknown => 1,
  482. Format => 'int32u', # (observed values: 4)
  483. },
  484. );
  485. # atoms used in QTIF files
  486. %Image::ExifTool::QuickTime::ImageFile = (
  487. PROCESS_PROC => \&ProcessMOV,
  488. GROUPS => { 2 => 'Image' },
  489. NOTES => 'Tags used in QTIF QuickTime Image Files.',
  490. idsc => {
  491. Name => 'ImageDescription',
  492. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ImageDesc' },
  493. },
  494. idat => {
  495. Name => 'ImageData',
  496. Binary => 1,
  497. },
  498. iicc => {
  499. Name => 'ICC_Profile',
  500. SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' },
  501. },
  502. );
  503. # image description data block
  504. %Image::ExifTool::QuickTime::ImageDesc = (
  505. PROCESS_PROC => \&ProcessHybrid,
  506. VARS => { ID_LABEL => 'ID/Index' },
  507. GROUPS => { 2 => 'Image' },
  508. FORMAT => 'int16u',
  509. 2 => {
  510. Name => 'CompressorID',
  511. Format => 'string[4]',
  512. # not very useful since this isn't a complete list and name is given below
  513. # # ref http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html
  514. # PrintConv => {
  515. # cvid => 'Cinepak',
  516. # jpeg => 'JPEG',
  517. # 'smc '=> 'Graphics',
  518. # 'rle '=> 'Animation',
  519. # rpza => 'Apple Video',
  520. # kpcd => 'Kodak Photo CD',
  521. # 'png '=> 'Portable Network Graphics',
  522. # mjpa => 'Motion-JPEG (format A)',
  523. # mjpb => 'Motion-JPEG (format B)',
  524. # SVQ1 => 'Sorenson video, version 1',
  525. # SVQ3 => 'Sorenson video, version 3',
  526. # mp4v => 'MPEG-4 video',
  527. # 'dvc '=> 'NTSC DV-25 video',
  528. # dvcp => 'PAL DV-25 video',
  529. # 'gif '=> 'Compuserve Graphics Interchange Format',
  530. # h263 => 'H.263 video',
  531. # tiff => 'Tagged Image File Format',
  532. # 'raw '=> 'Uncompressed RGB',
  533. # '2vuY'=> "Uncompressed Y'CbCr, 3x8-bit 4:2:2 (2vuY)",
  534. # 'yuv2'=> "Uncompressed Y'CbCr, 3x8-bit 4:2:2 (yuv2)",
  535. # v308 => "Uncompressed Y'CbCr, 8-bit 4:4:4",
  536. # v408 => "Uncompressed Y'CbCr, 8-bit 4:4:4:4",
  537. # v216 => "Uncompressed Y'CbCr, 10, 12, 14, or 16-bit 4:2:2",
  538. # v410 => "Uncompressed Y'CbCr, 10-bit 4:4:4",
  539. # v210 => "Uncompressed Y'CbCr, 10-bit 4:2:2",
  540. # },
  541. },
  542. 10 => {
  543. Name => 'VendorID',
  544. Format => 'string[4]',
  545. RawConv => 'length $val ? $val : undef',
  546. PrintConv => \%vendorID,
  547. SeparateTable => 'VendorID',
  548. },
  549. # 14 - ("Quality" in QuickTime docs) ??
  550. 16 => 'SourceImageWidth',
  551. 17 => 'SourceImageHeight',
  552. 18 => { Name => 'XResolution', Format => 'fixed32u' },
  553. 20 => { Name => 'YResolution', Format => 'fixed32u' },
  554. # 24 => 'FrameCount', # always 1 (what good is this?)
  555. 25 => {
  556. Name => 'CompressorName',
  557. Format => 'string[32]',
  558. # (sometimes this is a Pascal string, and sometimes it is a C string)
  559. RawConv => q{
  560. $val=substr($val,1,ord($1)) if $val=~/^([\0-\x1f])/ and ord($1)<length($val);
  561. length $val ? $val : undef;
  562. },
  563. },
  564. 41 => 'BitDepth',
  565. #
  566. # Observed offsets for child atoms of various CompressorID types:
  567. #
  568. # CompressorID Offset Child atoms
  569. # ----------- ------ ----------------
  570. # avc1 86 avcC, btrt, colr, pasp, fiel, clap, svcC
  571. # mp4v 86 esds, pasp
  572. # s263 86 d263
  573. #
  574. btrt => {
  575. Name => 'BitrateInfo',
  576. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Bitrate' },
  577. },
  578. # Reference for fiel, colr, pasp, clap:
  579. # https://developer.apple.com/library/mac/technotes/tn2162/_index.html#//apple_ref/doc/uid/DTS40013070-CH1-TNTAG9
  580. fiel => {
  581. Name => 'VideoFieldOrder',
  582. ValueConv => 'join(" ", unpack("C*",$val))',
  583. PrintConv => [{
  584. 1 => 'Progressive',
  585. 2 => '2:1 Interlaced',
  586. }],
  587. },
  588. colr => {
  589. Name => 'ColorRepresentation',
  590. ValueConv => 'join(" ", substr($val,0,4), unpack("x4n*",$val))',
  591. },
  592. pasp => {
  593. Name => 'PixelAspectRatio',
  594. ValueConv => 'join(":", unpack("N*",$val))',
  595. },
  596. clap => {
  597. Name => 'CleanAperture',
  598. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::CleanAperture' },
  599. },
  600. # avcC - AVC configuration (ref http://thompsonng.blogspot.ca/2010/11/mp4-file-format-part-2.html)
  601. # hvcC - HEVC configuration
  602. # svcC - 7 bytes: 00 00 00 00 ff e0 00
  603. # esds - elementary stream descriptor
  604. # d263
  605. gama => { Name => 'Gamma', Format => 'fixed32u' },
  606. # mjqt - default quantization table for MJPEG
  607. # mjht - default Huffman table for MJPEG
  608. );
  609. # 'btrt' atom information (ref http://lists.freedesktop.org/archives/gstreamer-commits/2011-October/054459.html)
  610. %Image::ExifTool::QuickTime::Bitrate = (
  611. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  612. GROUPS => { 2 => 'Video' },
  613. FORMAT => 'int32u',
  614. PRIORITY => 0, # often filled with zeros
  615. 0 => 'BufferSize',
  616. 1 => 'MaxBitrate',
  617. 2 => 'AverageBitrate',
  618. );
  619. # 'clap' atom information (ref https://developer.apple.com/library/mac/technotes/tn2162/_index.html#//apple_ref/doc/uid/DTS40013070-CH1-TNTAG9)
  620. %Image::ExifTool::QuickTime::CleanAperture = (
  621. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  622. GROUPS => { 2 => 'Video' },
  623. FORMAT => 'rational64u',
  624. 0 => 'CleanApertureWidth',
  625. 1 => 'CleanApertureHeight',
  626. 2 => 'CleanApertureOffsetX',
  627. 3 => 'CleanApertureOffsetY',
  628. );
  629. # preview data block
  630. %Image::ExifTool::QuickTime::Preview = (
  631. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  632. WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
  633. GROUPS => { 2 => 'Image' },
  634. FORMAT => 'int16u',
  635. 0 => {
  636. Name => 'PreviewDate',
  637. Format => 'int32u',
  638. Groups => { 2 => 'Time' },
  639. %timeInfo,
  640. },
  641. 2 => 'PreviewVersion',
  642. 3 => {
  643. Name => 'PreviewAtomType',
  644. Format => 'string[4]',
  645. },
  646. 5 => 'PreviewAtomIndex',
  647. );
  648. # movie atoms
  649. %Image::ExifTool::QuickTime::Movie = (
  650. PROCESS_PROC => \&ProcessMOV,
  651. WRITE_PROC => \&WriteQuickTime,
  652. GROUPS => { 2 => 'Video' },
  653. mvhd => {
  654. Name => 'MovieHeader',
  655. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MovieHeader' },
  656. },
  657. trak => {
  658. Name => 'Track',
  659. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Track' },
  660. },
  661. udta => {
  662. Name => 'UserData',
  663. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::UserData' },
  664. },
  665. meta => { # 'meta' is found here in my EX-F1 MOV sample - PH
  666. Name => 'Meta',
  667. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Meta' },
  668. },
  669. iods => {
  670. Name => 'InitialObjectDescriptor',
  671. Flags => ['Binary','Unknown'],
  672. },
  673. uuid => [
  674. { #11 (MP4 files) (also found in QuickTime::Track)
  675. Name => 'UUID-USMT',
  676. Condition => '$$valPt=~/^USMT!\xd2\x4f\xce\xbb\x88\x69\x5c\xfa\xc9\xc7\x40/',
  677. SubDirectory => {
  678. TagTable => 'Image::ExifTool::QuickTime::UserMedia',
  679. Start => 16,
  680. },
  681. },
  682. { #PH (Canon SX280)
  683. Name => 'UUID-Canon',
  684. Condition => '$$valPt=~/^\x85\xc0\xb6\x87\x82\x0f\x11\xe0\x81\x11\xf4\xce\x46\x2b\x6a\x48/',
  685. SubDirectory => {
  686. TagTable => 'Image::ExifTool::Canon::uuid',
  687. Start => 16,
  688. },
  689. },
  690. {
  691. Name => 'UUID-Unknown',
  692. Unknown => 1,
  693. Binary => 1,
  694. },
  695. ],
  696. cmov => {
  697. Name => 'CompressedMovie',
  698. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::CMovie' },
  699. },
  700. htka => { # (written by HTC One M8 in slow-motion 1280x720 video - PH)
  701. Name => 'HTCTrack',
  702. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Track' },
  703. },
  704. # prfl - Profile (ref 12)
  705. # clip - clipping --> contains crgn (clip region) (ref 12)
  706. # mvex - movie extends --> contains mehd (movie extends header), trex (track extends) (ref 14)
  707. # ICAT - 4 bytes: "6350" (Nikon CoolPix S6900)
  708. );
  709. # movie header data block
  710. %Image::ExifTool::QuickTime::MovieHeader = (
  711. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  712. WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
  713. GROUPS => { 2 => 'Video' },
  714. FORMAT => 'int32u',
  715. DATAMEMBER => [ 0, 1, 2, 3, 4 ],
  716. 0 => {
  717. Name => 'MovieHeaderVersion',
  718. Format => 'int8u',
  719. RawConv => '$$self{MovieHeaderVersion} = $val',
  720. },
  721. 1 => {
  722. Name => 'CreateDate',
  723. Groups => { 2 => 'Time' },
  724. %timeInfo,
  725. # this is int64u if MovieHeaderVersion == 1 (ref 13)
  726. Hook => '$$self{MovieHeaderVersion} and $format = "int64u", $varSize += 4',
  727. },
  728. 2 => {
  729. Name => 'ModifyDate',
  730. Groups => { 2 => 'Time' },
  731. %timeInfo,
  732. # this is int64u if MovieHeaderVersion == 1 (ref 13)
  733. Hook => '$$self{MovieHeaderVersion} and $format = "int64u", $varSize += 4',
  734. },
  735. 3 => {
  736. Name => 'TimeScale',
  737. RawConv => '$$self{TimeScale} = $val',
  738. },
  739. 4 => {
  740. Name => 'Duration',
  741. %durationInfo,
  742. # this is int64u if MovieHeaderVersion == 1 (ref 13)
  743. Hook => '$$self{MovieHeaderVersion} and $format = "int64u", $varSize += 4',
  744. },
  745. 5 => {
  746. Name => 'PreferredRate',
  747. ValueConv => '$val / 0x10000',
  748. },
  749. 6 => {
  750. Name => 'PreferredVolume',
  751. Format => 'int16u',
  752. ValueConv => '$val / 256',
  753. PrintConv => 'sprintf("%.2f%%", $val * 100)',
  754. },
  755. 9 => {
  756. Name => 'MatrixStructure',
  757. Format => 'fixed32s[9]',
  758. # (the right column is fixed 2.30 instead of 16.16)
  759. ValueConv => q{
  760. my @a = split ' ',$val;
  761. $_ /= 0x4000 foreach @a[2,5,8];
  762. return "@a";
  763. },
  764. },
  765. 18 => { Name => 'PreviewTime', %durationInfo },
  766. 19 => { Name => 'PreviewDuration', %durationInfo },
  767. 20 => { Name => 'PosterTime', %durationInfo },
  768. 21 => { Name => 'SelectionTime', %durationInfo },
  769. 22 => { Name => 'SelectionDuration',%durationInfo },
  770. 23 => { Name => 'CurrentTime', %durationInfo },
  771. 24 => 'NextTrackID',
  772. );
  773. # track atoms
  774. %Image::ExifTool::QuickTime::Track = (
  775. PROCESS_PROC => \&ProcessMOV,
  776. WRITE_PROC => \&WriteQuickTime,
  777. GROUPS => { 1 => 'Track#', 2 => 'Video' },
  778. tkhd => {
  779. Name => 'TrackHeader',
  780. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TrackHeader' },
  781. },
  782. udta => {
  783. Name => 'UserData',
  784. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::UserData' },
  785. },
  786. mdia => { #MP4
  787. Name => 'Media',
  788. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Media' },
  789. },
  790. meta => { #PH (MOV)
  791. Name => 'Meta',
  792. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Meta' },
  793. },
  794. tref => {
  795. Name => 'TrackRef',
  796. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TrackRef' },
  797. },
  798. tapt => {
  799. Name => 'TrackAperture',
  800. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TrackAperture' },
  801. },
  802. uuid => [
  803. { #11 (MP4 files) (also found in QuickTime::Movie)
  804. Name => 'UUID-USMT',
  805. Condition => '$$valPt=~/^USMT!\xd2\x4f\xce\xbb\x88\x69\x5c\xfa\xc9\xc7\x40/',
  806. SubDirectory => {
  807. TagTable => 'Image::ExifTool::QuickTime::UserMedia',
  808. Start => 16,
  809. },
  810. },
  811. {
  812. Name => 'UUID-Unknown',
  813. Unknown => 1,
  814. Binary => 1,
  815. },
  816. ],
  817. # edts - edits --> contains elst (edit list)
  818. # clip - clipping --> contains crgn (clip region)
  819. # matt - track matt --> contains kmat (compressed matt)
  820. # load - track loading settings
  821. # imap - track input map --> contains ' in' --> contains ' ty', obid
  822. # prfl - Profile (ref 12)
  823. );
  824. # track header data block
  825. %Image::ExifTool::QuickTime::TrackHeader = (
  826. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  827. WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
  828. GROUPS => { 1 => 'Track#', 2 => 'Video' },
  829. FORMAT => 'int32u',
  830. DATAMEMBER => [ 0, 1, 2, 5 ],
  831. 0 => {
  832. Name => 'TrackHeaderVersion',
  833. Format => 'int8u',
  834. Priority => 0,
  835. RawConv => '$$self{TrackHeaderVersion} = $val',
  836. },
  837. 1 => {
  838. Name => 'TrackCreateDate',
  839. Priority => 0,
  840. Groups => { 2 => 'Time' },
  841. %timeInfo,
  842. # this is int64u if TrackHeaderVersion == 1 (ref 13)
  843. Hook => '$$self{TrackHeaderVersion} and $format = "int64u", $varSize += 4',
  844. },
  845. 2 => {
  846. Name => 'TrackModifyDate',
  847. Priority => 0,
  848. Groups => { 2 => 'Time' },
  849. %timeInfo,
  850. # this is int64u if TrackHeaderVersion == 1 (ref 13)
  851. Hook => '$$self{TrackHeaderVersion} and $format = "int64u", $varSize += 4',
  852. },
  853. 3 => {
  854. Name => 'TrackID',
  855. Priority => 0,
  856. },
  857. 5 => {
  858. Name => 'TrackDuration',
  859. Priority => 0,
  860. %durationInfo,
  861. # this is int64u if TrackHeaderVersion == 1 (ref 13)
  862. Hook => '$$self{TrackHeaderVersion} and $format = "int64u", $varSize += 4',
  863. },
  864. 8 => {
  865. Name => 'TrackLayer',
  866. Format => 'int16u',
  867. Priority => 0,
  868. },
  869. 9 => {
  870. Name => 'TrackVolume',
  871. Format => 'int16u',
  872. Priority => 0,
  873. ValueConv => '$val / 256',
  874. PrintConv => 'sprintf("%.2f%%", $val * 100)',
  875. },
  876. 10 => {
  877. Name => 'MatrixStructure',
  878. Format => 'fixed32s[9]',
  879. # (the right column is fixed 2.30 instead of 16.16)
  880. ValueConv => q{
  881. my @a = split ' ',$val;
  882. $_ /= 0x4000 foreach @a[2,5,8];
  883. return "@a";
  884. },
  885. },
  886. 19 => {
  887. Name => 'ImageWidth',
  888. Priority => 0,
  889. RawConv => \&FixWrongFormat,
  890. },
  891. 20 => {
  892. Name => 'ImageHeight',
  893. Priority => 0,
  894. RawConv => \&FixWrongFormat,
  895. },
  896. );
  897. # user data atoms
  898. %Image::ExifTool::QuickTime::UserData = (
  899. PROCESS_PROC => \&ProcessMOV,
  900. WRITE_PROC => \&WriteQuickTime,
  901. GROUPS => { 2 => 'Video' },
  902. NOTES => q{
  903. Tag ID's beginning with the copyright symbol (hex 0xa9) are multi-language
  904. text. Alternate language tags are accessed by adding a dash followed by the
  905. language/country code to the tag name. ExifTool will extract any
  906. multi-language user data tags found, even if they don't exist in this table.
  907. },
  908. "\xa9cpy" => { Name => 'Copyright', Groups => { 2 => 'Author' } },
  909. "\xa9day" => {
  910. Name => 'ContentCreateDate',
  911. Groups => { 2 => 'Time' },
  912. # handle values in the form "2010-02-12T13:27:14-0800" (written by Apple iPhone)
  913. ValueConv => q{
  914. require Image::ExifTool::XMP;
  915. $val = Image::ExifTool::XMP::ConvertXMPDate($val);
  916. $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
  917. return $val;
  918. },
  919. PrintConv => '$self->ConvertDateTime($val)',
  920. },
  921. "\xa9ART" => 'Artist', #PH (iTunes 8.0.2)
  922. "\xa9alb" => 'Album', #PH (iTunes 8.0.2)
  923. "\xa9arg" => 'Arranger', #12
  924. "\xa9ark" => 'ArrangerKeywords', #12
  925. "\xa9cmt" => 'Comment', #PH (iTunes 8.0.2)
  926. "\xa9cok" => 'ComposerKeywords', #12
  927. "\xa9com" => 'Composer', #12
  928. "\xa9dir" => 'Director', #12
  929. "\xa9ed1" => 'Edit1',
  930. "\xa9ed2" => 'Edit2',
  931. "\xa9ed3" => 'Edit3',
  932. "\xa9ed4" => 'Edit4',
  933. "\xa9ed5" => 'Edit5',
  934. "\xa9ed6" => 'Edit6',
  935. "\xa9ed7" => 'Edit7',
  936. "\xa9ed8" => 'Edit8',
  937. "\xa9ed9" => 'Edit9',
  938. "\xa9fmt" => 'Format',
  939. "\xa9gen" => 'Genre', #PH (iTunes 8.0.2)
  940. "\xa9grp" => 'Grouping', #PH (NC)
  941. "\xa9inf" => 'Information',
  942. "\xa9isr" => 'ISRCCode', #12
  943. "\xa9lab" => 'RecordLabelName', #12
  944. "\xa9lal" => 'RecordLabelURL', #12
  945. "\xa9lyr" => 'Lyrics', #PH (NC)
  946. "\xa9mak" => 'Make', #12
  947. "\xa9mal" => 'MakerURL', #12
  948. "\xa9mod" => 'Model', #PH
  949. "\xa9nam" => 'Title', #12
  950. "\xa9pdk" => 'ProducerKeywords', #12
  951. "\xa9phg" => 'RecordingCopyright', #12
  952. "\xa9prd" => 'Producer',
  953. "\xa9prf" => 'Performers',
  954. "\xa9prk" => 'PerformerKeywords', #12
  955. "\xa9prl" => 'PerformerURL',
  956. "\xa9dir" => 'Director', #12
  957. "\xa9req" => 'Requirements',
  958. "\xa9snk" => 'SubtitleKeywords', #12
  959. "\xa9snm" => 'Subtitle', #12
  960. "\xa9src" => 'SourceCredits', #12
  961. "\xa9swf" => 'SongWriter', #12
  962. "\xa9swk" => 'SongWriterKeywords', #12
  963. "\xa9swr" => 'SoftwareVersion', #12
  964. "\xa9too" => 'Encoder', #PH (NC)
  965. "\xa9trk" => 'Track', #PH (NC)
  966. "\xa9wrt" => 'Composer',
  967. "\xa9xyz" => { #PH (iPhone 3GS)
  968. Name => 'GPSCoordinates',
  969. Groups => { 2 => 'Location' },
  970. ValueConv => \&ConvertISO6709,
  971. PrintConv => \&PrintGPSCoordinates,
  972. },
  973. name => 'Name',
  974. WLOC => {
  975. Name => 'WindowLocation',
  976. Format => 'int16u',
  977. },
  978. LOOP => {
  979. Name => 'LoopStyle',
  980. Format => 'int32u',
  981. PrintConv => {
  982. 1 => 'Normal',
  983. 2 => 'Palindromic',
  984. },
  985. },
  986. SelO => {
  987. Name => 'PlaySelection',
  988. Format => 'int8u',
  989. },
  990. AllF => {
  991. Name => 'PlayAllFrames',
  992. Format => 'int8u',
  993. },
  994. meta => {
  995. Name => 'Meta',
  996. SubDirectory => {
  997. TagTable => 'Image::ExifTool::QuickTime::Meta',
  998. Start => 4, # must skip 4-byte version number header
  999. },
  1000. },
  1001. 'ptv '=> {
  1002. Name => 'PrintToVideo',
  1003. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Video' },
  1004. },
  1005. hnti => {
  1006. Name => 'HintInfo',
  1007. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HintInfo' },
  1008. },
  1009. hinf => {
  1010. Name => 'HintTrackInfo',
  1011. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HintTrackInfo' },
  1012. },
  1013. hinv => 'HintVersion', #PH (guess)
  1014. XMP_ => { #PH (Adobe CS3 Bridge)
  1015. Name => 'XMP',
  1016. # *** this is where ExifTool writes XMP in MOV videos (as per XMP spec) ***
  1017. SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
  1018. },
  1019. # the following are 3gp tags, references:
  1020. # http://atomicparsley.sourceforge.net
  1021. # http://www.3gpp.org/ftp/tsg_sa/WG4_CODEC/TSGS4_25/Docs/
  1022. cprt => { Name => 'Copyright', %langText, Groups => { 2 => 'Author' } },
  1023. auth => { Name => 'Author', %langText, Groups => { 2 => 'Author' } },
  1024. titl => { Name => 'Title', %langText },
  1025. dscp => { Name => 'Description',%langText },
  1026. perf => { Name => 'Performer', %langText },
  1027. gnre => { Name => 'Genre', %langText },
  1028. albm => { Name => 'Album', %langText },
  1029. coll => { Name => 'CollectionName', %langText }, #17
  1030. rtng => {
  1031. Name => 'Rating',
  1032. # (4-byte flags, 4-char entity, 4-char criteria, 2-byte lang, string)
  1033. RawConv => q{
  1034. return '<err>' unless length $val >= 14;
  1035. my $str = 'Entity=' . substr($val,4,4) . ' Criteria=' . substr($val,8,4);
  1036. $str =~ tr/\0-\x1f\x7f-\xff//d; # remove unprintable characters
  1037. my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 12));
  1038. $lang = $lang ? "($lang) " : '';
  1039. $val = substr($val, 14);
  1040. $val = $self->Decode($val, 'UCS2') if $val =~ /^\xfe\xff/;
  1041. return $lang . $str . ' ' . $val;
  1042. },
  1043. },
  1044. clsf => {
  1045. Name => 'Classification',
  1046. # (4-byte flags, 4-char entity, 2-byte index, 2-byte lang, string)
  1047. RawConv => q{
  1048. return '<err>' unless length $val >= 12;
  1049. my $str = 'Entity=' . substr($val,4,4) . ' Index=' . Get16u(\$val,8);
  1050. $str =~ tr/\0-\x1f\x7f-\xff//d; # remove unprintable characters
  1051. my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 10));
  1052. $lang = $lang ? "($lang) " : '';
  1053. $val = substr($val, 12);
  1054. $val = $self->Decode($val, 'UCS2') if $val =~ /^\xfe\xff/;
  1055. return $lang . $str . ' ' . $val;
  1056. },
  1057. },
  1058. kywd => {
  1059. Name => 'Keywords',
  1060. # (4 byte flags, 2-byte lang, 1-byte count, count x pascal strings)
  1061. RawConv => q{
  1062. return '<err>' unless length $val >= 7;
  1063. my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 4));
  1064. $lang = $lang ? "($lang) " : '';
  1065. my $num = Get8u(\$val, 6);
  1066. my ($i, @vals);
  1067. my $pos = 7;
  1068. for ($i=0; $i<$num; ++$i) {
  1069. last if $pos >= length $val;
  1070. my $len = Get8u(\$val, $pos++);
  1071. last if $pos + $len > length $val;
  1072. my $v = substr($val, $pos, $len);
  1073. $v = $self->Decode($v, 'UCS2') if $v =~ /^\xfe\xff/;
  1074. push @vals, $v;
  1075. $pos += $len;
  1076. }
  1077. my $sep = $self->Options('ListSep');
  1078. return $lang . join($sep, @vals);
  1079. },
  1080. },
  1081. loci => {
  1082. Name => 'LocationInformation',
  1083. Groups => { 2 => 'Location' },
  1084. # (4-byte flags, 2-byte lang, location string, 1-byte role, 4-byte fixed longitude,
  1085. # 4-byte fixed latitude, 4-byte fixed altitude, body string, notes string)
  1086. RawConv => q{
  1087. return '<err>' unless length $val >= 6;
  1088. my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 4));
  1089. $lang = $lang ? "($lang) " : '';
  1090. $val = substr($val, 6);
  1091. my $str;
  1092. if ($val =~ /^\xfe\xff/) {
  1093. $val =~ s/^(\xfe\xff(.{2})*?)\0\0//s or return '<err>';
  1094. $str = $self->Decode($1, 'UCS2');
  1095. } else {
  1096. $val =~ s/^(.*?)\0//s or return '<err>';
  1097. $str = $1;
  1098. }
  1099. $str = '(none)' unless length $str;
  1100. return '<err>' if length $val < 13;
  1101. my $role = Get8u(\$val, 0);
  1102. my $lon = GetFixed32s(\$val, 1);
  1103. my $lat = GetFixed32s(\$val, 5);
  1104. my $alt = GetFixed32s(\$val, 9);
  1105. my $roleStr = {0=>'shooting',1=>'real',2=>'fictional',3=>'reserved'}->{$role};
  1106. $str .= ' Role=' . ($roleStr || "unknown($role)");
  1107. $str .= sprintf(' Lat=%.5f Lon=%.5f Alt=%.2f', $lat, $lon, $alt);
  1108. $val = substr($val, 13);
  1109. if ($val =~ s/^(\xfe\xff(.{2})*?)\0\0//s) {
  1110. $str .= ' Body=' . $self->Decode($1, 'UCS2');
  1111. } elsif ($val =~ s/^(.*?)\0//s) {
  1112. $str .= " Body=$1";
  1113. }
  1114. if ($val =~ s/^(\xfe\xff(.{2})*?)\0\0//s) {
  1115. $str .= ' Notes=' . $self->Decode($1, 'UCS2');
  1116. } elsif ($val =~ s/^(.*?)\0//s) {
  1117. $str .= " Notes=$1";
  1118. }
  1119. return $lang . $str;
  1120. },
  1121. },
  1122. yrrc => {
  1123. Name => 'Year',
  1124. Groups => { 2 => 'Time' },
  1125. RawConv => 'length($val) >= 6 ? Get16u(\$val,4) : "<err>"',
  1126. },
  1127. urat => { #17
  1128. Name => 'UserRating',
  1129. RawConv => q{
  1130. return '<err>' unless length $val >= 8;
  1131. return Get8u(\$val, 7);
  1132. },
  1133. },
  1134. # tsel - TrackSelection (ref 17)
  1135. # Apple tags (ref 16)
  1136. angl => { Name => 'CameraAngle', Format => 'string' }, # (NC)
  1137. clfn => { Name => 'ClipFileName', Format => 'string' }, # (NC)
  1138. clid => { Name => 'ClipID', Format => 'string' }, # (NC)
  1139. cmid => { Name => 'CameraID', Format => 'string' }, # (NC)
  1140. cmnm => { # (NC)
  1141. Name => 'Model',
  1142. Description => 'Camera Model Name',
  1143. Format => 'string', # (necessary to remove the trailing NULL)
  1144. },
  1145. date => { # (NC)
  1146. Name => 'DateTimeOriginal',
  1147. Groups => { 2 => 'Time' },
  1148. ValueConv => q{
  1149. require Image::ExifTool::XMP;
  1150. $val = Image::ExifTool::XMP::ConvertXMPDate($val);
  1151. $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
  1152. return $val;
  1153. },
  1154. PrintConv => '$self->ConvertDateTime($val)',
  1155. },
  1156. manu => { # (SX280)
  1157. Name => 'Make',
  1158. # (with Canon there are 6 unknown bytes before the model: "\0\0\0\0\x15\xc7")
  1159. RawConv => '$val=~s/^\0{4}..//s; $val=~s/\0.*//; $val',
  1160. },
  1161. modl => { # (Samsung GT-S8530, Canon SX280)
  1162. Name => 'Model',
  1163. Description => 'Camera Model Name',
  1164. # (with Canon there are 6 unknown bytes before the model: "\0\0\0\0\x15\xc7")
  1165. RawConv => '$val=~s/^\0{4}..//s; $val=~s/\0.*//; $val',
  1166. },
  1167. reel => { Name => 'ReelName', Format => 'string' }, # (NC)
  1168. scen => { Name => 'Scene', Format => 'string' }, # (NC)
  1169. shot => { Name => 'ShotName', Format => 'string' }, # (NC)
  1170. slno => { Name => 'SerialNumber', Format => 'string' }, # (NC)
  1171. apmd => { Name => 'ApertureMode', Format => 'undef' }, #20
  1172. kgtt => { #http://lists.ffmpeg.org/pipermail/ffmpeg-devel-irc/2012-June/000707.html
  1173. # 'TrackType' will expand to 'Track#Type' when found inside a track
  1174. Name => 'TrackType',
  1175. # set flag to process this as international text
  1176. # even though the tag ID doesn't start with 0xa9
  1177. IText => 1,
  1178. },
  1179. chpl => { # (Nero chapter list)
  1180. Name => 'ChapterList',
  1181. ValueConv => \&ConvertChapterList,
  1182. PrintConv => \&PrintChapter,
  1183. },
  1184. # ndrm - 7 bytes (0 0 0 1 0 0 0) Nero Digital Rights Management? (PH)
  1185. # other non-Apple tags (ref 16)
  1186. # hpix - HipixRichPicture (ref 16, HIPIX)
  1187. # strk - sub-track information (ref 16, ISO)
  1188. #
  1189. # Manufacturer-specific metadata
  1190. #
  1191. TAGS => [ #PH
  1192. # these tags were initially discovered in a Pentax movie,
  1193. # but similar information is found in videos from other manufacturers
  1194. {
  1195. Name => 'FujiFilmTags',
  1196. Condition => '$$valPt =~ /^FUJIFILM DIGITAL CAMERA\0/',
  1197. SubDirectory => {
  1198. TagTable => 'Image::ExifTool::FujiFilm::MOV',
  1199. ByteOrder => 'LittleEndian',
  1200. },
  1201. },
  1202. {
  1203. Name => 'KodakTags',
  1204. Condition => '$$valPt =~ /^EASTMAN KODAK COMPANY/',
  1205. SubDirectory => {
  1206. TagTable => 'Image::ExifTool::Kodak::MOV',
  1207. ByteOrder => 'LittleEndian',
  1208. },
  1209. },
  1210. {
  1211. Name => 'KonicaMinoltaTags',
  1212. Condition => '$$valPt =~ /^KONICA MINOLTA DIGITAL CAMERA/',
  1213. SubDirectory => {
  1214. TagTable => 'Image::ExifTool::Minolta::MOV1',
  1215. ByteOrder => 'LittleEndian',
  1216. },
  1217. },
  1218. {
  1219. Name => 'MinoltaTags',
  1220. Condition => '$$valPt =~ /^MINOLTA DIGITAL CAMERA/',
  1221. SubDirectory => {
  1222. TagTable => 'Image::ExifTool::Minolta::MOV2',
  1223. ByteOrder => 'LittleEndian',
  1224. },
  1225. },
  1226. {
  1227. Name => 'NikonTags',
  1228. Condition => '$$valPt =~ /^NIKON DIGITAL CAMERA\0/',
  1229. SubDirectory => {
  1230. TagTable => 'Image::ExifTool::Nikon::MOV',
  1231. ByteOrder => 'LittleEndian',
  1232. },
  1233. },
  1234. {
  1235. Name => 'OlympusTags1',
  1236. Condition => '$$valPt =~ /^OLYMPUS DIGITAL CAMERA\0.{9}\x01\0/s',
  1237. SubDirectory => {
  1238. TagTable => 'Image::ExifTool::Olympus::MOV1',
  1239. ByteOrder => 'LittleEndian',
  1240. },
  1241. },
  1242. {
  1243. Name => 'OlympusTags2',
  1244. Condition => '$$valPt =~ /^OLYMPUS DIGITAL CAMERA(?!\0.{21}\x0a\0{3})/s',
  1245. SubDirectory => {
  1246. TagTable => 'Image::ExifTool::Olympus::MOV2',
  1247. ByteOrder => 'LittleEndian',
  1248. },
  1249. },
  1250. {
  1251. Name => 'OlympusTags3',
  1252. Condition => '$$valPt =~ /^OLYMPUS DIGITAL CAMERA\0/',
  1253. SubDirectory => {
  1254. TagTable => 'Image::ExifTool::Olympus::MP4',
  1255. ByteOrder => 'LittleEndian',
  1256. },
  1257. },
  1258. {
  1259. Name => 'OlympusTags4',
  1260. Condition => '$$valPt =~ /^.{16}OLYM\0/s',
  1261. SubDirectory => {
  1262. TagTable => 'Image::ExifTool::Olympus::MOV3',
  1263. Start => 12,
  1264. },
  1265. },
  1266. {
  1267. Name => 'PentaxTags',
  1268. Condition => '$$valPt =~ /^PENTAX DIGITAL CAMERA\0/',
  1269. SubDirectory => {
  1270. TagTable => 'Image::ExifTool::Pentax::MOV',
  1271. ByteOrder => 'LittleEndian',
  1272. },
  1273. },
  1274. {
  1275. Name => 'SamsungTags',
  1276. Condition => '$$valPt =~ /^SAMSUNG DIGITAL CAMERA\0/',
  1277. SubDirectory => {
  1278. TagTable => 'Image::ExifTool::Samsung::MP4',
  1279. ByteOrder => 'LittleEndian',
  1280. },
  1281. },
  1282. {
  1283. Name => 'SanyoMOV',
  1284. Condition => q{
  1285. $$valPt =~ /^SANYO DIGITAL CAMERA\0/ and
  1286. $self->{VALUE}->{FileType} eq "MOV"
  1287. },
  1288. SubDirectory => {
  1289. TagTable => 'Image::ExifTool::Sanyo::MOV',
  1290. ByteOrder => 'LittleEndian',
  1291. },
  1292. },
  1293. {
  1294. Name => 'SanyoMP4',
  1295. Condition => q{
  1296. $$valPt =~ /^SANYO DIGITAL CAMERA\0/ and
  1297. $self->{VALUE}->{FileType} eq "MP4"
  1298. },
  1299. SubDirectory => {
  1300. TagTable => 'Image::ExifTool::Sanyo::MP4',
  1301. ByteOrder => 'LittleEndian',
  1302. },
  1303. },
  1304. {
  1305. Name => 'UnknownTags',
  1306. Unknown => 1,
  1307. Binary => 1
  1308. },
  1309. ],
  1310. # ---- Canon ----
  1311. CNCV => { Name => 'CompressorVersion', Format => 'string' }, #PH (5D Mark II)
  1312. CNMN => {
  1313. Name => 'Model', #PH (EOS 550D)
  1314. Description => 'Camera Model Name',
  1315. Format => 'string', # (necessary to remove the trailing NULL)
  1316. },
  1317. CNFV => { Name => 'FirmwareVersion', Format => 'string' }, #PH (EOS 550D)
  1318. CNTH => { #PH (PowerShot S95)
  1319. Name => 'CanonCNTH',
  1320. SubDirectory => { TagTable => 'Image::ExifTool::Canon::CNTH' },
  1321. },
  1322. CNOP => { #PH (7DmkII)
  1323. Name => 'CanonCNOP',
  1324. SubDirectory => { TagTable => 'Image::ExifTool::Canon::CNOP' },
  1325. },
  1326. # CNDB - 2112 bytes (550D)
  1327. # CNDM - 4 bytes - 0xff,0xd8,0xff,0xd9 (S95)
  1328. # CNDG - 10232 bytes, mostly zeros (N100)
  1329. # ---- Casio ----
  1330. QVMI => { #PH
  1331. Name => 'CasioQVMI',
  1332. # Casio stores standard EXIF-format information in MOV videos (eg. EX-S880)
  1333. SubDirectory => {
  1334. TagTable => 'Image::ExifTool::Exif::Main',
  1335. ProcessProc => \&Image::ExifTool::Exif::ProcessExif, # (because ProcessMOV is default)
  1336. DirName => 'IFD0',
  1337. Multi => 0, # (no NextIFD pointer)
  1338. Start => 10,
  1339. ByteOrder => 'BigEndian',
  1340. },
  1341. },
  1342. # ---- FujiFilm ----
  1343. FFMV => { #PH (FinePix HS20EXR)
  1344. Name => 'FujiFilmFFMV',
  1345. SubDirectory => { TagTable => 'Image::ExifTool::FujiFilm::FFMV' },
  1346. },
  1347. MVTG => { #PH (FinePix HS20EXR)
  1348. Name => 'FujiFilmMVTG',
  1349. SubDirectory => {
  1350. TagTable => 'Image::ExifTool::Exif::Main',
  1351. ProcessProc => \&Image::ExifTool::Exif::ProcessExif, # (because ProcessMOV is default)
  1352. DirName => 'IFD0',
  1353. Start => 16,
  1354. Base => '$start',
  1355. ByteOrder => 'LittleEndian',
  1356. },
  1357. },
  1358. # ---- GoPro ----
  1359. GoPr => 'GoProType', #PH
  1360. # --- HTC ----
  1361. htcb => {
  1362. Name => 'HTCBinary',
  1363. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HTCBinary' },
  1364. },
  1365. # ---- Kodak ----
  1366. DcMD => {
  1367. Name => 'KodakDcMD',
  1368. SubDirectory => { TagTable => 'Image::ExifTool::Kodak::DcMD' },
  1369. },
  1370. # AMBA => Ambarella AVC atom (unknown data written by Kodak Playsport video cam)
  1371. # tmlp - 1 byte: 0 (PixPro SP360)
  1372. # pivi - 72 bytes (PixPro SP360)
  1373. # pive - 12 bytes (PixPro SP360)
  1374. # m ev - 2 bytes: 0 0 (PixPro SP360)
  1375. # m wb - 4 bytes: 0 0 0 0 (PixPro SP360)
  1376. # mclr - 4 bytes: 0 0 0 0 (PixPro SP360)
  1377. # mmtr - 4 bytes: 6 0 0 0 (PixPro SP360)
  1378. # mflr - 4 bytes: 0 0 0 0 (PixPro SP360)
  1379. # lvlm - 24 bytes (PixPro SP360)
  1380. # ufdm - 4 bytes: 0 0 0 1 (PixPro SP360)
  1381. # mtdt - 1 byte: 0 (PixPro SP360)
  1382. # gdta - 75240 bytes (PixPro SP360)
  1383. # ---- LG ----
  1384. adzc => { Name => 'Unknown_adzc', Unknown => 1, Hidden => 1, %langText }, # "false\0/","true\0/"
  1385. adze => { Name => 'Unknown_adze', Unknown => 1, Hidden => 1, %langText }, # "false\0/"
  1386. adzm => { Name => 'Unknown_adzm', Unknown => 1, Hidden => 1, %langText }, # "\x0e\x04/","\x10\x06"
  1387. # ---- Microsoft ----
  1388. Xtra => { #PH (microsoft)
  1389. Name => 'MicrosoftXtra',
  1390. SubDirectory => { TagTable => 'Image::ExifTool::Microsoft::Xtra' },
  1391. },
  1392. # ---- Minolta ----
  1393. MMA0 => { #PH (DiMage 7Hi)
  1394. Name => 'MinoltaMMA0',
  1395. SubDirectory => { TagTable => 'Image::ExifTool::Minolta::MMA' },
  1396. },
  1397. MMA1 => { #PH (Dimage A2)
  1398. Name => 'MinoltaMMA1',
  1399. SubDirectory => { TagTable => 'Image::ExifTool::Minolta::MMA' },
  1400. },
  1401. # ---- Nikon ----
  1402. NCDT => { #PH
  1403. Name => 'NikonNCDT',
  1404. SubDirectory => { TagTable => 'Image::ExifTool::Nikon::NCDT' },
  1405. },
  1406. # ---- Olympus ----
  1407. scrn => { #PH (TG-810)
  1408. Name => 'OlympusPreview',
  1409. Condition => '$$valPt =~ /^.{4}\xff\xd8\xff\xdb/s',
  1410. SubDirectory => { TagTable => 'Image::ExifTool::Olympus::scrn' },
  1411. },
  1412. # ---- Panasonic/Leica ----
  1413. PANA => { #PH
  1414. Name => 'PanasonicPANA',
  1415. SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::PANA' },
  1416. },
  1417. LEIC => { #PH
  1418. Name => 'LeicaLEIC',
  1419. SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::PANA' },
  1420. },
  1421. # ---- Pentax ----
  1422. thmb => [ # (apparently defined by 3gpp, ref 16)
  1423. { #PH (Pentax Q)
  1424. Name => 'MakerNotePentax5a',
  1425. Condition => '$$valPt =~ /^PENTAX \0II/',
  1426. SubDirectory => {
  1427. TagTable => 'Image::ExifTool::Pentax::Main',
  1428. ProcessProc => \&Image::ExifTool::Exif::ProcessExif, # (because ProcessMOV is default)
  1429. Start => 10,
  1430. Base => '$start - 10',
  1431. ByteOrder => 'LittleEndian',
  1432. },
  1433. },{ #PH (TG-810)
  1434. Name => 'OlympusThumbnail',
  1435. Condition => '$$valPt =~ /^.{4}\xff\xd8\xff\xdb/s',
  1436. SubDirectory => { TagTable => 'Image::ExifTool::Olympus::thmb' },
  1437. },{ #17 (format is in bytes 3-7)
  1438. Name => 'ThumbnailImage',
  1439. Condition => '$$valPt =~ /^.{8}\xff\xd8\xff\xdb/s',
  1440. Groups => { 2 => 'Preview' },
  1441. ValueConv => 'substr($val, 8)',
  1442. },{ #17 (format is in bytes 3-7)
  1443. Name => 'ThumbnailPNG',
  1444. Condition => '$$valPt =~ /^.{8}\x89PNG\r\n\x1a\n/s',
  1445. Groups => { 2 => 'Preview' },
  1446. ValueConv => 'substr($val, 8)',
  1447. },{
  1448. Name => 'UnknownThumbnail',
  1449. Groups => { 2 => 'Preview' },
  1450. Binary => 1,
  1451. },
  1452. ],
  1453. PENT => { #PH
  1454. Name => 'PentaxPENT',
  1455. SubDirectory => {
  1456. TagTable => 'Image::ExifTool::Pentax::PENT',
  1457. ByteOrder => 'LittleEndian',
  1458. },
  1459. },
  1460. PXTH => { #PH (Pentax K-01)
  1461. Name => 'PentaxPreview',
  1462. SubDirectory => { TagTable => 'Image::ExifTool::Pentax::PXTH' },
  1463. },
  1464. PXMN => [{ #PH (Pentax K-01)
  1465. Name => 'MakerNotePentax5b',
  1466. Condition => '$$valPt =~ /^PENTAX \0MM/',
  1467. SubDirectory => {
  1468. TagTable => 'Image::ExifTool::Pentax::Main',
  1469. ProcessProc => \&Image::ExifTool::Exif::ProcessExif, # (because ProcessMOV is default)
  1470. Start => 10,
  1471. Base => '$start - 10',
  1472. ByteOrder => 'BigEndian',
  1473. },
  1474. },{ #PH (Pentax 645Z)
  1475. Name => 'MakerNotePentax5c',
  1476. Condition => '$$valPt =~ /^PENTAX \0II/',
  1477. SubDirectory => {
  1478. TagTable => 'Image::ExifTool::Pentax::Main',
  1479. ProcessProc => \&Image::ExifTool::Exif::ProcessExif, # (because ProcessMOV is default)
  1480. Start => 10,
  1481. Base => '$start - 10',
  1482. ByteOrder => 'LittleEndian',
  1483. },
  1484. },{
  1485. Name => 'MakerNotePentaxUnknown',
  1486. Binary => 1,
  1487. }],
  1488. # ---- Ricoh ----
  1489. RTHU => { #PH (GR)
  1490. Name => 'PreviewImage',
  1491. Groups => { 2 => 'Preview' },
  1492. RawConv => '$self->ValidateImage(\$val, $tag)',
  1493. },
  1494. RMKN => { #PH (GR)
  1495. Name => 'RicohRMKN',
  1496. SubDirectory => {
  1497. TagTable => 'Image::ExifTool::Exif::Main',
  1498. ProcessProc => \&Image::ExifTool::ProcessTIFF, # (because ProcessMOV is default)
  1499. },
  1500. },
  1501. # ---- Samsung ----
  1502. vndr => 'Vendor', #PH (Samsung PL70)
  1503. SDLN => 'PlayMode', #PH (NC, Samsung ST80 "SEQ_PLAY")
  1504. INFO => {
  1505. Name => 'SamsungINFO',
  1506. SubDirectory => { TagTable => 'Image::ExifTool::Samsung::INFO' },
  1507. },
  1508. '@sec' => { #PH (Samsung WB30F)
  1509. Name => 'SamsungSec',
  1510. SubDirectory => { TagTable => 'Image::ExifTool::Samsung::sec' },
  1511. },
  1512. 'smta' => { #PH (Samsung SM-C101)
  1513. Name => 'SamsungSmta',
  1514. SubDirectory => {
  1515. TagTable => 'Image::ExifTool::Samsung::smta',
  1516. Start => 4,
  1517. },
  1518. },
  1519. cver => 'CodeVersion', #PH (guess, Samsung MV900F)
  1520. # ducp - 4 bytes all zero (Samsung ST96,WB750), 52 bytes all zero (Samsung WB30F)
  1521. # edli - 52 bytes all zero (Samsung WB30F)
  1522. # @etc - 4 bytes all zero (Samsung WB30F)
  1523. # saut - 4 bytes all zero (Samsung SM-N900T)
  1524. # smrd - string "TRUEBLUE" (Samsung SM-C101)
  1525. # ---- Unknown ----
  1526. # CDET - 128 bytes (unknown origin)
  1527. #
  1528. # other 3rd-party tags
  1529. # (ref http://code.google.com/p/mp4parser/source/browse/trunk/isoparser/src/main/resources/isoparser-default.properties?r=814)
  1530. #
  1531. ccid => 'ContentID',
  1532. icnu => 'IconURI',
  1533. infu => 'InfoURL',
  1534. cdis => 'ContentDistributorID',
  1535. albr => { Name => 'AlbumArtist', Groups => { 2 => 'Author' } },
  1536. cvru => 'CoverURI',
  1537. lrcu => 'LyricsURI',
  1538. tags => { # found in Audible .m4b audio books (ref PH)
  1539. Name => 'Audible_tags',
  1540. SubDirectory => { TagTable => 'Image::ExifTool::Audible::tags' },
  1541. },
  1542. );
  1543. # Unknown information stored in HTC One (M8) videos - PH
  1544. %Image::ExifTool::QuickTime::HTCBinary = (
  1545. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  1546. GROUPS => { 0 => 'MakerNotes', 1 => 'HTC', 2 => 'Video' },
  1547. TAG_PREFIX => 'HTCBinary',
  1548. FORMAT => 'int32u',
  1549. FIRST_ENTRY => 0,
  1550. # 0 - values: 1
  1551. # 1 - values: 0
  1552. # 2 - values: 0
  1553. # 3 - values: FileSize minus 12 (why?)
  1554. # 4 - values: 12
  1555. );
  1556. # User-specific media data atoms (ref 11)
  1557. %Image::ExifTool::QuickTime::UserMedia = (
  1558. PROCESS_PROC => \&ProcessMOV,
  1559. GROUPS => { 2 => 'Video' },
  1560. MTDT => {
  1561. Name => 'MetaData',
  1562. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MetaData' },
  1563. },
  1564. );
  1565. # User-specific media data atoms (ref 11)
  1566. %Image::ExifTool::QuickTime::MetaData = (
  1567. PROCESS_PROC => \&Image::ExifTool::QuickTime::ProcessMetaData,
  1568. GROUPS => { 2 => 'Video' },
  1569. TAG_PREFIX => 'MetaData',
  1570. 0x01 => 'Title',
  1571. 0x03 => {
  1572. Name => 'ProductionDate',
  1573. Groups => { 2 => 'Time' },
  1574. # translate from format "YYYY/mm/dd HH:MM:SS"
  1575. ValueConv => '$val=~tr{/}{:}; $val',
  1576. PrintConv => '$self->ConvertDateTime($val)',
  1577. },
  1578. 0x04 => 'Software',
  1579. 0x05 => 'Product',
  1580. 0x0a => {
  1581. Name => 'TrackProperty',
  1582. RawConv => 'my @a=unpack("Nnn",$val); "@a"',
  1583. PrintConv => [
  1584. { 0 => 'No presentation', BITMASK => { 0 => 'Main track' } },
  1585. { 0 => 'No attributes', BITMASK => { 15 => 'Read only' } },
  1586. '"Priority $val"',
  1587. ],
  1588. },
  1589. 0x0b => {
  1590. Name => 'TimeZone',
  1591. Groups => { 2 => 'Time' },
  1592. RawConv => 'Get16s(\$val,0)',
  1593. PrintConv => 'TimeZoneString($val)',
  1594. },
  1595. 0x0c => {
  1596. Name => 'ModifyDate',
  1597. Groups => { 2 => 'Time' },
  1598. # translate from format "YYYY/mm/dd HH:MM:SS"
  1599. ValueConv => '$val=~tr{/}{:}; $val',
  1600. PrintConv => '$self->ConvertDateTime($val)',
  1601. },
  1602. );
  1603. # compressed movie atoms (ref http://wiki.multimedia.cx/index.php?title=QuickTime_container#cmov)
  1604. %Image::ExifTool::QuickTime::CMovie = (
  1605. PROCESS_PROC => \&ProcessMOV,
  1606. GROUPS => { 2 => 'Video' },
  1607. dcom => 'Compression',
  1608. # cmvd - compressed movie data
  1609. );
  1610. # Profile atoms (ref 11)
  1611. %Image::ExifTool::QuickTime::Profile = (
  1612. PROCESS_PROC => \&ProcessMOV,
  1613. GROUPS => { 2 => 'Video' },
  1614. FPRF => {
  1615. Name => 'FileGlobalProfile',
  1616. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::FileProf' },
  1617. },
  1618. APRF => {
  1619. Name => 'AudioProfile',
  1620. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::AudioProf' },
  1621. },
  1622. VPRF => {
  1623. Name => 'VideoProfile',
  1624. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::VideoProf' },
  1625. },
  1626. OLYM => { #PH
  1627. Name => 'OlympusOLYM',
  1628. SubDirectory => {
  1629. TagTable => 'Image::ExifTool::Olympus::OLYM',
  1630. ByteOrder => 'BigEndian',
  1631. },
  1632. },
  1633. );
  1634. # FPRF atom information (ref 11)
  1635. %Image::ExifTool::QuickTime::FileProf = (
  1636. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  1637. GROUPS => { 2 => 'Video' },
  1638. FORMAT => 'int32u',
  1639. 0 => { Name => 'FileProfileVersion', Unknown => 1 }, # unknown = uninteresting
  1640. 1 => {
  1641. Name => 'FileFunctionFlags',
  1642. PrintConv => { BITMASK => {
  1643. 28 => 'Fragmented',
  1644. 29 => 'Additional tracks',
  1645. 30 => 'Edited', # (main AV track is edited)
  1646. }},
  1647. },
  1648. # 2 - reserved
  1649. );
  1650. # APRF atom information (ref 11)
  1651. %Image::ExifTool::QuickTime::AudioProf = (
  1652. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  1653. GROUPS => { 2 => 'Audio' },
  1654. FORMAT => 'int32u',
  1655. 0 => { Name => 'AudioProfileVersion', Unknown => 1 },
  1656. 1 => 'AudioTrackID',
  1657. 2 => {
  1658. Name => 'AudioCodec',
  1659. Format => 'undef[4]',
  1660. },
  1661. 3 => {
  1662. Name => 'AudioCodecInfo',
  1663. Unknown => 1,
  1664. PrintConv => 'sprintf("0x%.4x", $val)',
  1665. },
  1666. 4 => {
  1667. Name => 'AudioAttributes',
  1668. PrintConv => { BITMASK => {
  1669. 0 => 'Encrypted',
  1670. 1 => 'Variable bitrate',
  1671. 2 => 'Dual mono',
  1672. }},
  1673. },
  1674. 5 => {
  1675. Name => 'AudioAvgBitrate',
  1676. ValueConv => '$val * 1000',
  1677. PrintConv => 'ConvertBitrate($val)',
  1678. },
  1679. 6 => {
  1680. Name => 'AudioMaxBitrate',
  1681. ValueConv => '$val * 1000',
  1682. PrintConv => 'ConvertBitrate($val)',
  1683. },
  1684. 7 => 'AudioSampleRate',
  1685. 8 => 'AudioChannels',
  1686. );
  1687. # VPRF atom information (ref 11)
  1688. %Image::ExifTool::QuickTime::VideoProf = (
  1689. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  1690. GROUPS => { 2 => 'Video' },
  1691. FORMAT => 'int32u',
  1692. 0 => { Name => 'VideoProfileVersion', Unknown => 1 },
  1693. 1 => 'VideoTrackID',
  1694. 2 => {
  1695. Name => 'VideoCodec',
  1696. Format => 'undef[4]',
  1697. },
  1698. 3 => {
  1699. Name => 'VideoCodecInfo',
  1700. Unknown => 1,
  1701. PrintConv => 'sprintf("0x%.4x", $val)',
  1702. },
  1703. 4 => {
  1704. Name => 'VideoAttributes',
  1705. PrintConv => { BITMASK => {
  1706. 0 => 'Encrypted',
  1707. 1 => 'Variable bitrate',
  1708. 2 => 'Variable frame rate',
  1709. 3 => 'Interlaced',
  1710. }},
  1711. },
  1712. 5 => {
  1713. Name => 'VideoAvgBitrate',
  1714. ValueConv => '$val * 1000',
  1715. PrintConv => 'ConvertBitrate($val)',
  1716. },
  1717. 6 => {
  1718. Name => 'VideoMaxBitrate',
  1719. ValueConv => '$val * 1000',
  1720. PrintConv => 'ConvertBitrate($val)',
  1721. },
  1722. 7 => {
  1723. Name => 'VideoAvgFrameRate',
  1724. Format => 'fixed32u',
  1725. PrintConv => 'int($val * 1000 + 0.5) / 1000',
  1726. },
  1727. 8 => {
  1728. Name => 'VideoMaxFrameRate',
  1729. Format => 'fixed32u',
  1730. PrintConv => 'int($val * 1000 + 0.5) / 1000',
  1731. },
  1732. 9 => {
  1733. Name => 'VideoSize',
  1734. Format => 'int16u[2]',
  1735. PrintConv => '$val=~tr/ /x/; $val',
  1736. },
  1737. 10 => {
  1738. Name => 'PixelAspectRatio',
  1739. Format => 'int16u[2]',
  1740. PrintConv => '$val=~tr/ /:/; $val',
  1741. },
  1742. );
  1743. # meta atoms
  1744. %Image::ExifTool::QuickTime::Meta = (
  1745. PROCESS_PROC => \&ProcessMOV,
  1746. GROUPS => { 2 => 'Video' },
  1747. ilst => {
  1748. Name => 'ItemList',
  1749. SubDirectory => {
  1750. TagTable => 'Image::ExifTool::QuickTime::ItemList',
  1751. HasData => 1, # process atoms as containers with 'data' elements
  1752. },
  1753. },
  1754. # MP4 tags (ref 5)
  1755. hdlr => {
  1756. Name => 'Handler',
  1757. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Handler' },
  1758. },
  1759. dinf => {
  1760. Name => 'DataInformation',
  1761. Flags => ['Binary','Unknown'],
  1762. },
  1763. ipmc => {
  1764. Name => 'IPMPControl',
  1765. Flags => ['Binary','Unknown'],
  1766. },
  1767. iloc => {
  1768. Name => 'ItemLocation',
  1769. Flags => ['Binary','Unknown'],
  1770. },
  1771. ipro => {
  1772. Name => 'ItemProtection',
  1773. Flags => ['Binary','Unknown'],
  1774. },
  1775. iinf => {
  1776. Name => 'ItemInformation',
  1777. Flags => ['Binary','Unknown'],
  1778. },
  1779. 'xml ' => {
  1780. Name => 'XML',
  1781. Flags => [ 'Binary', 'Protected', 'BlockExtract' ],
  1782. SubDirectory => {
  1783. TagTable => 'Image::ExifTool::XMP::XML',
  1784. IgnoreProp => { NonRealTimeMeta => 1 }, # ignore container for Sony 'nrtm'
  1785. },
  1786. },
  1787. 'keys' => {
  1788. Name => 'Keys',
  1789. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Keys' },
  1790. },
  1791. bxml => {
  1792. Name => 'BinaryXML',
  1793. Flags => ['Binary','Unknown'],
  1794. },
  1795. pitm => {
  1796. Name => 'PrimaryItemReference',
  1797. Flags => ['Binary','Unknown'],
  1798. },
  1799. free => { #PH
  1800. Name => 'Free',
  1801. Flags => ['Binary','Unknown'],
  1802. },
  1803. );
  1804. # track reference atoms
  1805. %Image::ExifTool::QuickTime::TrackRef = (
  1806. PROCESS_PROC => \&ProcessMOV,
  1807. GROUPS => { 1 => 'Track#', 2 => 'Video' },
  1808. chap => { Name => 'ChapterListTrackID', Format => 'int32u' },
  1809. tmcd => { Name => 'TimeCode', Format => 'int32u' },
  1810. mpod => { #PH (FLIR MP4)
  1811. Name => 'ElementaryStreamTrack',
  1812. Format => 'int32u',
  1813. ValueConv => '$val =~ s/^1 //; $val', # (why 2 numbers? -- ignore the first if "1")
  1814. },
  1815. # also: sync, scpt, ssrc, iTunesInfo
  1816. );
  1817. # track aperture mode dimensions atoms
  1818. # (ref https://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap2/qtff2.html)
  1819. %Image::ExifTool::QuickTime::TrackAperture = (
  1820. PROCESS_PROC => \&ProcessMOV,
  1821. GROUPS => { 1 => 'Track#', 2 => 'Video' },
  1822. clef => {
  1823. Name => 'CleanApertureDimensions',
  1824. Format => 'fixed32u',
  1825. Count => 3,
  1826. ValueConv => '$val =~ s/^.*? //; $val', # remove flags word
  1827. PrintConv => '$val =~ tr/ /x/; $val',
  1828. },
  1829. prof => {
  1830. Name => 'ProductionApertureDimensions',
  1831. Format => 'fixed32u',
  1832. Count => 3,
  1833. ValueConv => '$val =~ s/^.*? //; $val',
  1834. PrintConv => '$val =~ tr/ /x/; $val',
  1835. },
  1836. enof => {
  1837. Name => 'EncodedPixelsDimensions',
  1838. Format => 'fixed32u',
  1839. Count => 3,
  1840. ValueConv => '$val =~ s/^.*? //; $val',
  1841. PrintConv => '$val =~ tr/ /x/; $val',
  1842. },
  1843. );
  1844. # item list atoms
  1845. # -> these atoms are unique, and contain one or more 'data' atoms
  1846. %Image::ExifTool::QuickTime::ItemList = (
  1847. PROCESS_PROC => \&ProcessMOV,
  1848. GROUPS => { 2 => 'Audio' },
  1849. NOTES => q{
  1850. As well as these tags, the 'mdta' handler uses numerical tag ID's which are
  1851. added dynamically to this table after processing the Meta Keys information.
  1852. },
  1853. # in this table, binary 1 and 2-byte "data"-type tags are interpreted as
  1854. # int8u and int16u. Multi-byte binary "data" tags are extracted as binary data
  1855. "\xa9ART" => 'Artist',
  1856. "\xa9alb" => 'Album',
  1857. "\xa9cmt" => 'Comment',
  1858. "\xa9com" => 'Composer',
  1859. "\xa9day" => {
  1860. Name => 'ContentCreateDate',
  1861. Groups => { 2 => 'Time' },
  1862. # handle values in the form "2010-02-12T13:27:14-0800"
  1863. ValueConv => q{
  1864. require Image::ExifTool::XMP;
  1865. $val = Image::ExifTool::XMP::ConvertXMPDate($val);
  1866. $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
  1867. return $val;
  1868. },
  1869. PrintConv => '$self->ConvertDateTime($val)',
  1870. },
  1871. "\xa9des" => 'Description', #4
  1872. "\xa9enc" => 'EncodedBy', #10
  1873. "\xa9gen" => 'Genre',
  1874. "\xa9grp" => 'Grouping',
  1875. "\xa9lyr" => 'Lyrics',
  1876. "\xa9nam" => 'Title',
  1877. # "\xa9st3" ? #10
  1878. "\xa9too" => 'Encoder',
  1879. "\xa9trk" => 'Track',
  1880. "\xa9wrt" => 'Composer',
  1881. '----' => {
  1882. Name => 'iTunesInfo',
  1883. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::iTunesInfo' },
  1884. },
  1885. aART => { Name => 'AlbumArtist', Groups => { 2 => 'Author' } },
  1886. covr => { Name => 'CoverArt', Groups => { 2 => 'Preview' } },
  1887. cpil => { #10
  1888. Name => 'Compilation',
  1889. PrintConv => { 0 => 'No', 1 => 'Yes' },
  1890. },
  1891. disk => {
  1892. Name => 'DiskNumber',
  1893. Format => 'undef', # (necessary to prevent decoding as string!)
  1894. ValueConv => 'length($val) >= 6 ? join(" of ",unpack("x2nn",$val)) : \$val',
  1895. },
  1896. pgap => { #10
  1897. Name => 'PlayGap',
  1898. PrintConv => {
  1899. 0 => 'Insert Gap',
  1900. 1 => 'No Gap',
  1901. },
  1902. },
  1903. tmpo => {
  1904. Name => 'BeatsPerMinute',
  1905. Format => 'int16u', # marked as boolean but really int16u in my sample
  1906. },
  1907. trkn => {
  1908. Name => 'TrackNumber',
  1909. Format => 'undef', # (necessary to prevent decoding as string!)
  1910. ValueConv => 'length($val) >= 6 ? join(" of ",unpack("x2nn",$val)) : \$val',
  1911. },
  1912. #
  1913. # Note: it is possible that the tags below are not being decoded properly
  1914. # because I don't have samples to verify many of these - PH
  1915. #
  1916. akID => { #10
  1917. Name => 'AppleStoreAccountType',
  1918. PrintConv => {
  1919. 0 => 'iTunes',
  1920. 1 => 'AOL',
  1921. },
  1922. },
  1923. albm => 'Album', #(ffmpeg source)
  1924. apID => 'AppleStoreAccount',
  1925. atID => { #10 (or TV series)
  1926. Name => 'AlbumTitleID',
  1927. Format => 'int32u',
  1928. },
  1929. auth => { Name => 'Author', Groups => { 2 => 'Author' } },
  1930. catg => 'Category', #7
  1931. cnID => { #10
  1932. Name => 'AppleStoreCatalogID',
  1933. Format => 'int32u',
  1934. },
  1935. cprt => { Name => 'Copyright', Groups => { 2 => 'Author' } },
  1936. dscp => 'Description',
  1937. desc => 'Description', #7
  1938. gnre => { #10
  1939. Name => 'Genre',
  1940. PrintConv => q{
  1941. return $val unless $val =~ /^\d+$/;
  1942. require Image::ExifTool::ID3;
  1943. Image::ExifTool::ID3::PrintGenre($val - 1); # note the "- 1"
  1944. },
  1945. },
  1946. egid => 'EpisodeGlobalUniqueID', #7
  1947. geID => { #10
  1948. Name => 'GenreID',
  1949. Format => 'int32u',
  1950. SeparateTable => 1,
  1951. PrintConv => { #21 (based on http://www.apple.com/itunes/affiliates/resources/documentation/genre-mapping.html)
  1952. 2 => 'Music|Blues',
  1953. 3 => 'Music|Comedy',
  1954. 4 => "Music|Children's Music",
  1955. 5 => 'Music|Classical',
  1956. 6 => 'Music|Country',
  1957. 7 => 'Music|Electronic',
  1958. 8 => 'Music|Holiday',
  1959. 9 => 'Music|Classical|Opera',
  1960. 10 => 'Music|Singer/Songwriter',
  1961. 11 => 'Music|Jazz',
  1962. 12 => 'Music|Latino',
  1963. 13 => 'Music|New Age',
  1964. 14 => 'Music|Pop',
  1965. 15 => 'Music|R&B/Soul',
  1966. 16 => 'Music|Soundtrack',
  1967. 17 => 'Music|Dance',
  1968. 18 => 'Music|Hip-Hop/Rap',
  1969. 19 => 'Music|World',
  1970. 20 => 'Music|Alternative',
  1971. 21 => 'Music|Rock',
  1972. 22 => 'Music|Christian & Gospel',
  1973. 23 => 'Music|Vocal',
  1974. 24 => 'Music|Reggae',
  1975. 25 => 'Music|Easy Listening',
  1976. 26 => 'Podcasts',
  1977. 27 => 'Music|J-Pop',
  1978. 28 => 'Music|Enka',
  1979. 29 => 'Music|Anime',
  1980. 30 => 'Music|Kayokyoku',
  1981. 31 => 'Music Videos',
  1982. 32 => 'TV Shows',
  1983. 33 => 'Movies',
  1984. 34 => 'Music',
  1985. 35 => 'iPod Games',
  1986. 36 => 'App Store',
  1987. 37 => 'Tones',
  1988. 38 => 'Books',
  1989. 39 => 'Mac App Store',
  1990. 40 => 'Textbooks',
  1991. 50 => 'Music|Fitness & Workout',
  1992. 51 => 'Music|Pop|K-Pop',
  1993. 52 => 'Music|Karaoke',
  1994. 53 => 'Music|Instrumental',
  1995. 74 => 'Audiobooks|News',
  1996. 75 => 'Audiobooks|Programs & Performances',
  1997. 1001 => 'Music|Alternative|College Rock',
  1998. 1002 => 'Music|Alternative|Goth Rock',
  1999. 1003 => 'Music|Alternative|Grunge',
  2000. 1004 => 'Music|Alternative|Indie Rock',
  2001. 1005 => 'Music|Alternative|New Wave',
  2002. 1006 => 'Music|Alternative|Punk',
  2003. 1007 => 'Music|Blues|Chicago Blues',
  2004. 1009 => 'Music|Blues|Classic Blues',
  2005. 1010 => 'Music|Blues|Contemporary Blues',
  2006. 1011 => 'Music|Blues|Country Blues',
  2007. 1012 => 'Music|Blues|Delta Blues',
  2008. 1013 => 'Music|Blues|Electric Blues',
  2009. 1014 => "Music|Children's Music|Lullabies",
  2010. 1015 => "Music|Children's Music|Sing-Along",
  2011. 1016 => "Music|Children's Music|Stories",
  2012. 1017 => 'Music|Classical|Avant-Garde',
  2013. 1018 => 'Music|Classical|Baroque Era',
  2014. 1019 => 'Music|Classical|Chamber Music',
  2015. 1020 => 'Music|Classical|Chant',
  2016. 1021 => 'Music|Classical|Choral',
  2017. 1022 => 'Music|Classical|Classical Crossover',
  2018. 1023 => 'Music|Classical|Early Music',
  2019. 1024 => 'Music|Classical|Impressionist',
  2020. 1025 => 'Music|Classical|Medieval Era',
  2021. 1026 => 'Music|Classical|Minimalism',
  2022. 1027 => 'Music|Classical|Modern Era',
  2023. 1028 => 'Music|Classical|Opera',
  2024. 1029 => 'Music|Classical|Orchestral',
  2025. 1030 => 'Music|Classical|Renaissance',
  2026. 1031 => 'Music|Classical|Romantic Era',
  2027. 1032 => 'Music|Classical|Wedding Music',
  2028. 1033 => 'Music|Country|Alternative Country',
  2029. 1034 => 'Music|Country|Americana',
  2030. 1035 => 'Music|Country|Bluegrass',
  2031. 1036 => 'Music|Country|Contemporary Bluegrass',
  2032. 1037 => 'Music|Country|Contemporary Country',
  2033. 1038 => 'Music|Country|Country Gospel',
  2034. 1039 => 'Music|Country|Honky Tonk',
  2035. 1040 => 'Music|Country|Outlaw Country',
  2036. 1041 => 'Music|Country|Traditional Bluegrass',
  2037. 1042 => 'Music|Country|Traditional Country',
  2038. 1043 => 'Music|Country|Urban Cowboy',
  2039. 1044 => 'Music|Dance|Breakbeat',
  2040. 1045 => 'Music|Dance|Exercise',
  2041. 1046 => 'Music|Dance|Garage',
  2042. 1047 => 'Music|Dance|Hardcore',
  2043. 1048 => 'Music|Dance|House',
  2044. 1049 => "Music|Dance|Jungle/Drum'n'bass",
  2045. 1050 => 'Music|Dance|Techno',
  2046. 1051 => 'Music|Dance|Trance',
  2047. 1052 => 'Music|Jazz|Big Band',
  2048. 1053 => 'Music|Jazz|Bop',
  2049. 1054 => 'Music|Easy Listening|Lounge',
  2050. 1055 => 'Music|Easy Listening|Swing',
  2051. 1056 => 'Music|Electronic|Ambient',
  2052. 1057 => 'Music|Electronic|Downtempo',
  2053. 1058 => 'Music|Electronic|Electronica',
  2054. 1060 => 'Music|Electronic|IDM/Experimental',
  2055. 1061 => 'Music|Electronic|Industrial',
  2056. 1062 => 'Music|Singer/Songwriter|Alternative Folk',
  2057. 1063 => 'Music|Singer/Songwriter|Contemporary Folk',
  2058. 1064 => 'Music|Singer/Songwriter|Contemporary Singer/Songwriter',
  2059. 1065 => 'Music|Singer/Songwriter|Folk-Rock',
  2060. 1066 => 'Music|Singer/Songwriter|New Acoustic',
  2061. 1067 => 'Music|Singer/Songwriter|Traditional Folk',
  2062. 1068 => 'Music|Hip-Hop/Rap|Alternative Rap',
  2063. 1069 => 'Music|Hip-Hop/Rap|Dirty South',
  2064. 1070 => 'Music|Hip-Hop/Rap|East Coast Rap',
  2065. 1071 => 'Music|Hip-Hop/Rap|Gangsta Rap',
  2066. 1072 => 'Music|Hip-Hop/Rap|Hardcore Rap',
  2067. 1073 => 'Music|Hip-Hop/Rap|Hip-Hop',
  2068. 1074 => 'Music|Hip-Hop/Rap|Latin Rap',
  2069. 1075 => 'Music|Hip-Hop/Rap|Old School Rap',
  2070. 1076 => 'Music|Hip-Hop/Rap|Rap',
  2071. 1077 => 'Music|Hip-Hop/Rap|Underground Rap',
  2072. 1078 => 'Music|Hip-Hop/Rap|West Coast Rap',
  2073. 1079 => 'Music|Holiday|Chanukah',
  2074. 1080 => 'Music|Holiday|Christmas',
  2075. 1081 => "Music|Holiday|Christmas: Children's",
  2076. 1082 => 'Music|Holiday|Christmas: Classic',
  2077. 1083 => 'Music|Holiday|Christmas: Classical',
  2078. 1084 => 'Music|Holiday|Christmas: Jazz',
  2079. 1085 => 'Music|Holiday|Christmas: Modern',
  2080. 1086 => 'Music|Holiday|Christmas: Pop',
  2081. 1087 => 'Music|Holiday|Christmas: R&B',
  2082. 1088 => 'Music|Holiday|Christmas: Religious',
  2083. 1089 => 'Music|Holiday|Christmas: Rock',
  2084. 1090 => 'Music|Holiday|Easter',
  2085. 1091 => 'Music|Holiday|Halloween',
  2086. 1092 => 'Music|Holiday|Holiday: Other',
  2087. 1093 => 'Music|Holiday|Thanksgiving',
  2088. 1094 => 'Music|Christian & Gospel|CCM',
  2089. 1095 => 'Music|Christian & Gospel|Christian Metal',
  2090. 1096 => 'Music|Christian & Gospel|Christian Pop',
  2091. 1097 => 'Music|Christian & Gospel|Christian Rap',
  2092. 1098 => 'Music|Christian & Gospel|Christian Rock',
  2093. 1099 => 'Music|Christian & Gospel|Classic Christian',
  2094. 1100 => 'Music|Christian & Gospel|Contemporary Gospel',
  2095. 1101 => 'Music|Christian & Gospel|Gospel',
  2096. 1103 => 'Music|Christian & Gospel|Praise & Worship',
  2097. 1104 => 'Music|Christian & Gospel|Southern Gospel',
  2098. 1105 => 'Music|Christian & Gospel|Traditional Gospel',
  2099. 1106 => 'Music|Jazz|Avant-Garde Jazz',
  2100. 1107 => 'Music|Jazz|Contemporary Jazz',
  2101. 1108 => 'Music|Jazz|Crossover Jazz',
  2102. 1109 => 'Music|Jazz|Dixieland',
  2103. 1110 => 'Music|Jazz|Fusion',
  2104. 1111 => 'Music|Jazz|Latin Jazz',
  2105. 1112 => 'Music|Jazz|Mainstream Jazz',
  2106. 1113 => 'Music|Jazz|Ragtime',
  2107. 1114 => 'Music|Jazz|Smooth Jazz',
  2108. 1115 => 'Music|Latino|Latin Jazz',
  2109. 1116 => 'Music|Latino|Contemporary Latin',
  2110. 1117 => 'Music|Latino|Latin Pop',
  2111. 1118 => 'Music|Latino|Raices', # (Ra&iacute;ces)
  2112. 1119 => 'Music|Latino|Latin Urban',
  2113. 1120 => 'Music|Latino|Baladas y Boleros',
  2114. 1121 => 'Music|Latino|Latin Alternative & Rock',
  2115. 1122 => 'Music|Brazilian',
  2116. 1123 => 'Music|Latino|Regional Mexicano',
  2117. 1124 => 'Music|Latino|Salsa y Tropical',
  2118. 1125 => 'Music|New Age|Environmental',
  2119. 1126 => 'Music|New Age|Healing',
  2120. 1127 => 'Music|New Age|Meditation',
  2121. 1128 => 'Music|New Age|Nature',
  2122. 1129 => 'Music|New Age|Relaxation',
  2123. 1130 => 'Music|New Age|Travel',
  2124. 1131 => 'Music|Pop|Adult Contemporary',
  2125. 1132 => 'Music|Pop|Britpop',
  2126. 1133 => 'Music|Pop|Pop/Rock',
  2127. 1134 => 'Music|Pop|Soft Rock',
  2128. 1135 => 'Music|Pop|Teen Pop',
  2129. 1136 => 'Music|R&B/Soul|Contemporary R&B',
  2130. 1137 => 'Music|R&B/Soul|Disco',
  2131. 1138 => 'Music|R&B/Soul|Doo Wop',
  2132. 1139 => 'Music|R&B/Soul|Funk',
  2133. 1140 => 'Music|R&B/Soul|Motown',
  2134. 1141 => 'Music|R&B/Soul|Neo-Soul',
  2135. 1142 => 'Music|R&B/Soul|Quiet Storm',
  2136. 1143 => 'Music|R&B/Soul|Soul',
  2137. 1144 => 'Music|Rock|Adult Alternative',
  2138. 1145 => 'Music|Rock|American Trad Rock',
  2139. 1146 => 'Music|Rock|Arena Rock',
  2140. 1147 => 'Music|Rock|Blues-Rock',
  2141. 1148 => 'Music|Rock|British Invasion',
  2142. 1149 => 'Music|Rock|Death Metal/Black Metal',
  2143. 1150 => 'Music|Rock|Glam Rock',
  2144. 1151 => 'Music|Rock|Hair Metal',
  2145. 1152 => 'Music|Rock|Hard Rock',
  2146. 1153 => 'Music|Rock|Metal',
  2147. 1154 => 'Music|Rock|Jam Bands',
  2148. 1155 => 'Music|Rock|Prog-Rock/Art Rock',
  2149. 1156 => 'Music|Rock|Psychedelic',
  2150. 1157 => 'Music|Rock|Rock & Roll',
  2151. 1158 => 'Music|Rock|Rockabilly',
  2152. 1159 => 'Music|Rock|Roots Rock',
  2153. 1160 => 'Music|Rock|Singer/Songwriter',
  2154. 1161 => 'Music|Rock|Southern Rock',
  2155. 1162 => 'Music|Rock|Surf',
  2156. 1163 => 'Music|Rock|Tex-Mex',
  2157. 1165 => 'Music|Soundtrack|Foreign Cinema',
  2158. 1166 => 'Music|Soundtrack|Musicals',
  2159. 1167 => 'Music|Comedy|Novelty',
  2160. 1168 => 'Music|Soundtrack|Original Score',
  2161. 1169 => 'Music|Soundtrack|Soundtrack',
  2162. 1171 => 'Music|Comedy|Standup Comedy',
  2163. 1172 => 'Music|Soundtrack|TV Soundtrack',
  2164. 1173 => 'Music|Vocal|Standards',
  2165. 1174 => 'Music|Vocal|Traditional Pop',
  2166. 1175 => 'Music|Jazz|Vocal Jazz',
  2167. 1176 => 'Music|Vocal|Vocal Pop',
  2168. 1177 => 'Music|World|Afro-Beat',
  2169. 1178 => 'Music|World|Afro-Pop',
  2170. 1179 => 'Music|World|Cajun',
  2171. 1180 => 'Music|World|Celtic',
  2172. 1181 => 'Music|World|Celtic Folk',
  2173. 1182 => 'Music|World|Contemporary Celtic',
  2174. 1183 => 'Music|Reggae|Modern Dancehall',
  2175. 1184 => 'Music|World|Drinking Songs',
  2176. 1185 => 'Music|Indian|Indian Pop',
  2177. 1186 => 'Music|World|Japanese Pop',
  2178. 1187 => 'Music|World|Klezmer',
  2179. 1188 => 'Music|World|Polka',
  2180. 1189 => 'Music|World|Traditional Celtic',
  2181. 1190 => 'Music|World|Worldbeat',
  2182. 1191 => 'Music|World|Zydeco',
  2183. 1192 => 'Music|Reggae|Roots Reggae',
  2184. 1193 => 'Music|Reggae|Dub',
  2185. 1194 => 'Music|Reggae|Ska',
  2186. 1195 => 'Music|World|Caribbean',
  2187. 1196 => 'Music|World|South America',
  2188. 1197 => 'Music|Arabic',
  2189. 1198 => 'Music|World|North America',
  2190. 1199 => 'Music|World|Hawaii',
  2191. 1200 => 'Music|World|Australia',
  2192. 1201 => 'Music|World|Japan',
  2193. 1202 => 'Music|World|France',
  2194. 1203 => 'Music|World|Africa',
  2195. 1204 => 'Music|World|Asia',
  2196. 1205 => 'Music|World|Europe',
  2197. 1206 => 'Music|World|South Africa',
  2198. 1207 => 'Music|Jazz|Hard Bop',
  2199. 1208 => 'Music|Jazz|Trad Jazz',
  2200. 1209 => 'Music|Jazz|Cool',
  2201. 1210 => 'Music|Blues|Acoustic Blues',
  2202. 1211 => 'Music|Classical|High Classical',
  2203. 1220 => 'Music|Brazilian|Axe', # (Ax&eacute;)
  2204. 1221 => 'Music|Brazilian|Bossa Nova',
  2205. 1222 => 'Music|Brazilian|Choro',
  2206. 1223 => 'Music|Brazilian|Forro', # (Forr&oacute;)
  2207. 1224 => 'Music|Brazilian|Frevo',
  2208. 1225 => 'Music|Brazilian|MPB',
  2209. 1226 => 'Music|Brazilian|Pagode',
  2210. 1227 => 'Music|Brazilian|Samba',
  2211. 1228 => 'Music|Brazilian|Sertanejo',
  2212. 1229 => 'Music|Brazilian|Baile Funk',
  2213. 1230 => 'Music|Alternative|Chinese Alt',
  2214. 1231 => 'Music|Alternative|Korean Indie',
  2215. 1232 => 'Music|Chinese',
  2216. 1233 => 'Music|Chinese|Chinese Classical',
  2217. 1234 => 'Music|Chinese|Chinese Flute',
  2218. 1235 => 'Music|Chinese|Chinese Opera',
  2219. 1236 => 'Music|Chinese|Chinese Orchestral',
  2220. 1237 => 'Music|Chinese|Chinese Regional Folk',
  2221. 1238 => 'Music|Chinese|Chinese Strings',
  2222. 1239 => 'Music|Chinese|Taiwanese Folk',
  2223. 1240 => 'Music|Chinese|Tibetan Native Music',
  2224. 1241 => 'Music|Hip-Hop/Rap|Chinese Hip-Hop',
  2225. 1242 => 'Music|Hip-Hop/Rap|Korean Hip-Hop',
  2226. 1243 => 'Music|Korean',
  2227. 1244 => 'Music|Korean|Korean Classical',
  2228. 1245 => 'Music|Korean|Korean Trad Song',
  2229. 1246 => 'Music|Korean|Korean Trad Instrumental',
  2230. 1247 => 'Music|Korean|Korean Trad Theater',
  2231. 1248 => 'Music|Rock|Chinese Rock',
  2232. 1249 => 'Music|Rock|Korean Rock',
  2233. 1250 => 'Music|Pop|C-Pop',
  2234. 1251 => 'Music|Pop|Cantopop/HK-Pop',
  2235. 1252 => 'Music|Pop|Korean Folk-Pop',
  2236. 1253 => 'Music|Pop|Mandopop',
  2237. 1254 => 'Music|Pop|Tai-Pop',
  2238. 1255 => 'Music|Pop|Malaysian Pop',
  2239. 1256 => 'Music|Pop|Pinoy Pop',
  2240. 1257 => 'Music|Pop|Original Pilipino Music',
  2241. 1258 => 'Music|Pop|Manilla Sound',
  2242. 1259 => 'Music|Pop|Indo Pop',
  2243. 1260 => 'Music|Pop|Thai Pop',
  2244. 1261 => 'Music|Vocal|Trot',
  2245. 1262 => 'Music|Indian',
  2246. 1263 => 'Music|Indian|Bollywood',
  2247. 1264 => 'Music|Indian|Tamil',
  2248. 1265 => 'Music|Indian|Telugu',
  2249. 1266 => 'Music|Indian|Regional Indian',
  2250. 1267 => 'Music|Indian|Devotional & Spiritual',
  2251. 1268 => 'Music|Indian|Sufi',
  2252. 1269 => 'Music|Indian|Indian Classical',
  2253. 1270 => 'Music|World|Russian Chanson',
  2254. 1271 => 'Music|World|Dini',
  2255. 1272 => 'Music|World|Halk',
  2256. 1273 => 'Music|World|Sanat',
  2257. 1274 => 'Music|World|Dangdut',
  2258. 1275 => 'Music|World|Indonesian Religious',
  2259. 1276 => 'Music|World|Calypso',
  2260. 1277 => 'Music|World|Soca',
  2261. 1278 => 'Music|Indian|Ghazals',
  2262. 1279 => 'Music|Indian|Indian Folk',
  2263. 1280 => 'Music|World|Arabesque',
  2264. 1281 => 'Music|World|Afrikaans',
  2265. 1282 => 'Music|World|Farsi',
  2266. 1283 => 'Music|World|Israeli',
  2267. 1284 => 'Music|Arabic|Khaleeji',
  2268. 1285 => 'Music|Arabic|North African',
  2269. 1286 => 'Music|Arabic|Arabic Pop',
  2270. 1287 => 'Music|Arabic|Islamic',
  2271. 1288 => 'Music|Soundtrack|Sound Effects',
  2272. 1289 => 'Music|Folk',
  2273. 1290 => 'Music|Orchestral',
  2274. 1291 => 'Music|Marching',
  2275. 1293 => 'Music|Pop|Oldies',
  2276. 1294 => 'Music|Country|Thai Country',
  2277. 1295 => 'Music|World|Flamenco',
  2278. 1296 => 'Music|World|Tango',
  2279. 1297 => 'Music|World|Fado',
  2280. 1298 => 'Music|World|Iberia',
  2281. 1299 => 'Music|World|Russian',
  2282. 1300 => 'Music|World|Turkish',
  2283. 1301 => 'Podcasts|Arts',
  2284. 1302 => 'Podcasts|Society & Culture|Personal Journals',
  2285. 1303 => 'Podcasts|Comedy',
  2286. 1304 => 'Podcasts|Education',
  2287. 1305 => 'Podcasts|Kids & Family',
  2288. 1306 => 'Podcasts|Arts|Food',
  2289. 1307 => 'Podcasts|Health',
  2290. 1309 => 'Podcasts|TV & Film',
  2291. 1310 => 'Podcasts|Music',
  2292. 1311 => 'Podcasts|News & Politics',
  2293. 1314 => 'Podcasts|Religion & Spirituality',
  2294. 1315 => 'Podcasts|Science & Medicine',
  2295. 1316 => 'Podcasts|Sports & Recreation',
  2296. 1318 => 'Podcasts|Technology',
  2297. 1320 => 'Podcasts|Society & Culture|Places & Travel',
  2298. 1321 => 'Podcasts|Business',
  2299. 1323 => 'Podcasts|Games & Hobbies',
  2300. 1324 => 'Podcasts|Society & Culture',
  2301. 1325 => 'Podcasts|Government & Organizations',
  2302. 1337 => 'Music Videos|Classical|Piano',
  2303. 1401 => 'Podcasts|Arts|Literature',
  2304. 1402 => 'Podcasts|Arts|Design',
  2305. 1404 => 'Podcasts|Games & Hobbies|Video Games',
  2306. 1405 => 'Podcasts|Arts|Performing Arts',
  2307. 1406 => 'Podcasts|Arts|Visual Arts',
  2308. 1410 => 'Podcasts|Business|Careers',
  2309. 1412 => 'Podcasts|Business|Investing',
  2310. 1413 => 'Podcasts|Business|Management & Marketing',
  2311. 1415 => 'Podcasts|Education|K-12',
  2312. 1416 => 'Podcasts|Education|Higher Education',
  2313. 1417 => 'Podcasts|Health|Fitness & Nutrition',
  2314. 1420 => 'Podcasts|Health|Self-Help',
  2315. 1421 => 'Podcasts|Health|Sexuality',
  2316. 1438 => 'Podcasts|Religion & Spirituality|Buddhism',
  2317. 1439 => 'Podcasts|Religion & Spirituality|Christianity',
  2318. 1440 => 'Podcasts|Religion & Spirituality|Islam',
  2319. 1441 => 'Podcasts|Religion & Spirituality|Judaism',
  2320. 1443 => 'Podcasts|Society & Culture|Philosophy',
  2321. 1444 => 'Podcasts|Religion & Spirituality|Spirituality',
  2322. 1446 => 'Podcasts|Technology|Gadgets',
  2323. 1448 => 'Podcasts|Technology|Tech News',
  2324. 1450 => 'Podcasts|Technology|Podcasting',
  2325. 1454 => 'Podcasts|Games & Hobbies|Automotive',
  2326. 1455 => 'Podcasts|Games & Hobbies|Aviation',
  2327. 1456 => 'Podcasts|Sports & Recreation|Outdoor',
  2328. 1459 => 'Podcasts|Arts|Fashion & Beauty',
  2329. 1460 => 'Podcasts|Games & Hobbies|Hobbies',
  2330. 1461 => 'Podcasts|Games & Hobbies|Other Games',
  2331. 1462 => 'Podcasts|Society & Culture|History',
  2332. 1463 => 'Podcasts|Religion & Spirituality|Hinduism',
  2333. 1464 => 'Podcasts|Religion & Spirituality|Other',
  2334. 1465 => 'Podcasts|Sports & Recreation|Professional',
  2335. 1466 => 'Podcasts|Sports & Recreation|College & High School',
  2336. 1467 => 'Podcasts|Sports & Recreation|Amateur',
  2337. 1468 => 'Podcasts|Education|Educational Technology',
  2338. 1469 => 'Podcasts|Education|Language Courses',
  2339. 1470 => 'Podcasts|Education|Training',
  2340. 1471 => 'Podcasts|Business|Business News',
  2341. 1472 => 'Podcasts|Business|Shopping',
  2342. 1473 => 'Podcasts|Government & Organizations|National',
  2343. 1474 => 'Podcasts|Government & Organizations|Regional',
  2344. 1475 => 'Podcasts|Government & Organizations|Local',
  2345. 1476 => 'Podcasts|Government & Organizations|Non-Profit',
  2346. 1477 => 'Podcasts|Science & Medicine|Natural Sciences',
  2347. 1478 => 'Podcasts|Science & Medicine|Medicine',
  2348. 1479 => 'Podcasts|Science & Medicine|Social Sciences',
  2349. 1480 => 'Podcasts|Technology|Software How-To',
  2350. 1481 => 'Podcasts|Health|Alternative Health',
  2351. 1602 => 'Music Videos|Blues',
  2352. 1603 => 'Music Videos|Comedy',
  2353. 1604 => "Music Videos|Children's Music",
  2354. 1605 => 'Music Videos|Classical',
  2355. 1606 => 'Music Videos|Country',
  2356. 1607 => 'Music Videos|Electronic',
  2357. 1608 => 'Music Videos|Holiday',
  2358. 1609 => 'Music Videos|Classical|Opera',
  2359. 1610 => 'Music Videos|Singer/Songwriter',
  2360. 1611 => 'Music Videos|Jazz',
  2361. 1612 => 'Music Videos|Latin',
  2362. 1613 => 'Music Videos|New Age',
  2363. 1614 => 'Music Videos|Pop',
  2364. 1615 => 'Music Videos|R&B/Soul',
  2365. 1616 => 'Music Videos|Soundtrack',
  2366. 1617 => 'Music Videos|Dance',
  2367. 1618 => 'Music Videos|Hip-Hop/Rap',
  2368. 1619 => 'Music Videos|World',
  2369. 1620 => 'Music Videos|Alternative',
  2370. 1621 => 'Music Videos|Rock',
  2371. 1622 => 'Music Videos|Christian & Gospel',
  2372. 1623 => 'Music Videos|Vocal',
  2373. 1624 => 'Music Videos|Reggae',
  2374. 1625 => 'Music Videos|Easy Listening',
  2375. 1626 => 'Music Videos|Podcasts',
  2376. 1627 => 'Music Videos|J-Pop',
  2377. 1628 => 'Music Videos|Enka',
  2378. 1629 => 'Music Videos|Anime',
  2379. 1630 => 'Music Videos|Kayokyoku',
  2380. 1631 => 'Music Videos|Disney',
  2381. 1632 => 'Music Videos|French Pop',
  2382. 1633 => 'Music Videos|German Pop',
  2383. 1634 => 'Music Videos|German Folk',
  2384. 1635 => 'Music Videos|Alternative|Chinese Alt',
  2385. 1636 => 'Music Videos|Alternative|Korean Indie',
  2386. 1637 => 'Music Videos|Chinese',
  2387. 1638 => 'Music Videos|Chinese|Chinese Classical',
  2388. 1639 => 'Music Videos|Chinese|Chinese Flute',
  2389. 1640 => 'Music Videos|Chinese|Chinese Opera',
  2390. 1641 => 'Music Videos|Chinese|Chinese Orchestral',
  2391. 1642 => 'Music Videos|Chinese|Chinese Regional Folk',
  2392. 1643 => 'Music Videos|Chinese|Chinese Strings',
  2393. 1644 => 'Music Videos|Chinese|Taiwanese Folk',
  2394. 1645 => 'Music Videos|Chinese|Tibetan Native Music',
  2395. 1646 => 'Music Videos|Hip-Hop/Rap|Chinese Hip-Hop',
  2396. 1647 => 'Music Videos|Hip-Hop/Rap|Korean Hip-Hop',
  2397. 1648 => 'Music Videos|Korean',
  2398. 1649 => 'Music Videos|Korean|Korean Classical',
  2399. 1650 => 'Music Videos|Korean|Korean Trad Song',
  2400. 1651 => 'Music Videos|Korean|Korean Trad Instrumental',
  2401. 1652 => 'Music Videos|Korean|Korean Trad Theater',
  2402. 1653 => 'Music Videos|Rock|Chinese Rock',
  2403. 1654 => 'Music Videos|Rock|Korean Rock',
  2404. 1655 => 'Music Videos|Pop|C-Pop',
  2405. 1656 => 'Music Videos|Pop|Cantopop/HK-Pop',
  2406. 1657 => 'Music Videos|Pop|Korean Folk-Pop',
  2407. 1658 => 'Music Videos|Pop|Mandopop',
  2408. 1659 => 'Music Videos|Pop|Tai-Pop',
  2409. 1660 => 'Music Videos|Pop|Malaysian Pop',
  2410. 1661 => 'Music Videos|Pop|Pinoy Pop',
  2411. 1662 => 'Music Videos|Pop|Original Pilipino Music',
  2412. 1663 => 'Music Videos|Pop|Manilla Sound',
  2413. 1664 => 'Music Videos|Pop|Indo Pop',
  2414. 1665 => 'Music Videos|Pop|Thai Pop',
  2415. 1666 => 'Music Videos|Vocal|Trot',
  2416. 1671 => 'Music Videos|Brazilian',
  2417. 1672 => 'Music Videos|Brazilian|Axe', # (Ax&eacute;)
  2418. 1673 => 'Music Videos|Brazilian|Baile Funk',
  2419. 1674 => 'Music Videos|Brazilian|Bossa Nova',
  2420. 1675 => 'Music Videos|Brazilian|Choro',
  2421. 1676 => 'Music Videos|Brazilian|Forro',
  2422. 1677 => 'Music Videos|Brazilian|Frevo',
  2423. 1678 => 'Music Videos|Brazilian|MPB',
  2424. 1679 => 'Music Videos|Brazilian|Pagode',
  2425. 1680 => 'Music Videos|Brazilian|Samba',
  2426. 1681 => 'Music Videos|Brazilian|Sertanejo',
  2427. 1682 => 'Music Videos|Classical|High Classical',
  2428. 1683 => 'Music Videos|Fitness & Workout',
  2429. 1684 => 'Music Videos|Instrumental',
  2430. 1685 => 'Music Videos|Jazz|Big Band',
  2431. 1686 => 'Music Videos|Pop|K-Pop',
  2432. 1687 => 'Music Videos|Karaoke',
  2433. 1688 => 'Music Videos|Rock|Heavy Metal',
  2434. 1689 => 'Music Videos|Spoken Word',
  2435. 1690 => 'Music Videos|Indian',
  2436. 1691 => 'Music Videos|Indian|Bollywood',
  2437. 1692 => 'Music Videos|Indian|Tamil',
  2438. 1693 => 'Music Videos|Indian|Telugu',
  2439. 1694 => 'Music Videos|Indian|Regional Indian',
  2440. 1695 => 'Music Videos|Indian|Devotional & Spiritual',
  2441. 1696 => 'Music Videos|Indian|Sufi',
  2442. 1697 => 'Music Videos|Indian|Indian Classical',
  2443. 1698 => 'Music Videos|World|Russian Chanson',
  2444. 1699 => 'Music Videos|World|Dini',
  2445. 1700 => 'Music Videos|World|Halk',
  2446. 1701 => 'Music Videos|World|Sanat',
  2447. 1702 => 'Music Videos|World|Dangdut',
  2448. 1703 => 'Music Videos|World|Indonesian Religious',
  2449. 1704 => 'Music Videos|Indian|Indian Pop',
  2450. 1705 => 'Music Videos|World|Calypso',
  2451. 1706 => 'Music Videos|World|Soca',
  2452. 1707 => 'Music Videos|Indian|Ghazals',
  2453. 1708 => 'Music Videos|Indian|Indian Folk',
  2454. 1709 => 'Music Videos|World|Arabesque',
  2455. 1710 => 'Music Videos|World|Afrikaans',
  2456. 1711 => 'Music Videos|World|Farsi',
  2457. 1712 => 'Music Videos|World|Israeli',
  2458. 1713 => 'Music Videos|Arabic',
  2459. 1714 => 'Music Videos|Arabic|Khaleeji',
  2460. 1715 => 'Music Videos|Arabic|North African',
  2461. 1716 => 'Music Videos|Arabic|Arabic Pop',
  2462. 1717 => 'Music Videos|Arabic|Islamic',
  2463. 1718 => 'Music Videos|Soundtrack|Sound Effects',
  2464. 1719 => 'Music Videos|Folk',
  2465. 1720 => 'Music Videos|Orchestral',
  2466. 1721 => 'Music Videos|Marching',
  2467. 1723 => 'Music Videos|Pop|Oldies',
  2468. 1724 => 'Music Videos|Country|Thai Country',
  2469. 1725 => 'Music Videos|World|Flamenco',
  2470. 1726 => 'Music Videos|World|Tango',
  2471. 1727 => 'Music Videos|World|Fado',
  2472. 1728 => 'Music Videos|World|Iberia',
  2473. 1729 => 'Music Videos|World|Russian',
  2474. 1730 => 'Music Videos|World|Turkish',
  2475. 1731 => 'Music Videos|Alternative|College Rock',
  2476. 1732 => 'Music Videos|Alternative|Goth Rock',
  2477. 1733 => 'Music Videos|Alternative|Grunge',
  2478. 1734 => 'Music Videos|Alternative|Indie Rock',
  2479. 1735 => 'Music Videos|Alternative|New Wave',
  2480. 1736 => 'Music Videos|Alternative|Punk',
  2481. 1737 => 'Music Videos|Blues|Acoustic Blues',
  2482. 1738 => 'Music Videos|Blues|Chicago Blues',
  2483. 1739 => 'Music Videos|Blues|Classic Blues',
  2484. 1740 => 'Music Videos|Blues|Contemporary Blues',
  2485. 1741 => 'Music Videos|Blues|Country Blues',
  2486. 1742 => 'Music Videos|Blues|Delta Blues',
  2487. 1743 => 'Music Videos|Blues|Electric Blues',
  2488. 1744 => "Music Videos|Children's Music|Lullabies",
  2489. 1745 => "Music Videos|Children's Music|Sing-Along",
  2490. 1746 => "Music Videos|Children's Music|Stories",
  2491. 1747 => 'Music Videos|Christian & Gospel|CCM',
  2492. 1748 => 'Music Videos|Christian & Gospel|Christian Metal',
  2493. 1749 => 'Music Videos|Christian & Gospel|Christian Pop',
  2494. 1750 => 'Music Videos|Christian & Gospel|Christian Rap',
  2495. 1751 => 'Music Videos|Christian & Gospel|Christian Rock',
  2496. 1752 => 'Music Videos|Christian & Gospel|Classic Christian',
  2497. 1753 => 'Music Videos|Christian & Gospel|Contemporary Gospel',
  2498. 1754 => 'Music Videos|Christian & Gospel|Gospel',
  2499. 1755 => 'Music Videos|Christian & Gospel|Praise & Worship',
  2500. 1756 => 'Music Videos|Christian & Gospel|Southern Gospel',
  2501. 1757 => 'Music Videos|Christian & Gospel|Traditional Gospel',
  2502. 1758 => 'Music Videos|Classical|Avant-Garde',
  2503. 1759 => 'Music Videos|Classical|Baroque Era',
  2504. 1760 => 'Music Videos|Classical|Chamber Music',
  2505. 1761 => 'Music Videos|Classical|Chant',
  2506. 1762 => 'Music Videos|Classical|Choral',
  2507. 1763 => 'Music Videos|Classical|Classical Crossover',
  2508. 1764 => 'Music Videos|Classical|Early Music',
  2509. 1765 => 'Music Videos|Classical|Impressionist',
  2510. 1766 => 'Music Videos|Classical|Medieval Era',
  2511. 1767 => 'Music Videos|Classical|Minimalism',
  2512. 1768 => 'Music Videos|Classical|Modern Era',
  2513. 1769 => 'Music Videos|Classical|Orchestral',
  2514. 1770 => 'Music Videos|Classical|Renaissance',
  2515. 1771 => 'Music Videos|Classical|Romantic Era',
  2516. 1772 => 'Music Videos|Classical|Wedding Music',
  2517. 1773 => 'Music Videos|Comedy|Novelty',
  2518. 1774 => 'Music Videos|Comedy|Standup Comedy',
  2519. 1775 => 'Music Videos|Country|Alternative Country',
  2520. 1776 => 'Music Videos|Country|Americana',
  2521. 1777 => 'Music Videos|Country|Bluegrass',
  2522. 1778 => 'Music Videos|Country|Contemporary Bluegrass',
  2523. 1779 => 'Music Videos|Country|Contemporary Country',
  2524. 1780 => 'Music Videos|Country|Country Gospel',
  2525. 1781 => 'Music Videos|Country|Honky Tonk',
  2526. 1782 => 'Music Videos|Country|Outlaw Country',
  2527. 1783 => 'Music Videos|Country|Traditional Bluegrass',
  2528. 1784 => 'Music Videos|Country|Traditional Country',
  2529. 1785 => 'Music Videos|Country|Urban Cowboy',
  2530. 1786 => 'Music Videos|Dance|Breakbeat',
  2531. 1787 => 'Music Videos|Dance|Exercise',
  2532. 1788 => 'Music Videos|Dance|Garage',
  2533. 1789 => 'Music Videos|Dance|Hardcore',
  2534. 1790 => 'Music Videos|Dance|House',
  2535. 1791 => "Music Videos|Dance|Jungle/Drum'n'bass",
  2536. 1792 => 'Music Videos|Dance|Techno',
  2537. 1793 => 'Music Videos|Dance|Trance',
  2538. 1794 => 'Music Videos|Easy Listening|Lounge',
  2539. 1795 => 'Music Videos|Easy Listening|Swing',
  2540. 1796 => 'Music Videos|Electronic|Ambient',
  2541. 1797 => 'Music Videos|Electronic|Downtempo',
  2542. 1798 => 'Music Videos|Electronic|Electronica',
  2543. 1799 => 'Music Videos|Electronic|IDM/Experimental',
  2544. 1800 => 'Music Videos|Electronic|Industrial',
  2545. 1801 => 'Music Videos|Hip-Hop/Rap|Alternative Rap',
  2546. 1802 => 'Music Videos|Hip-Hop/Rap|Dirty South',
  2547. 1803 => 'Music Videos|Hip-Hop/Rap|East Coast Rap',
  2548. 1804 => 'Music Videos|Hip-Hop/Rap|Gangsta Rap',
  2549. 1805 => 'Music Videos|Hip-Hop/Rap|Hardcore Rap',
  2550. 1806 => 'Music Videos|Hip-Hop/Rap|Hip-Hop',
  2551. 1807 => 'Music Videos|Hip-Hop/Rap|Latin Rap',
  2552. 1808 => 'Music Videos|Hip-Hop/Rap|Old School Rap',
  2553. 1809 => 'Music Videos|Hip-Hop/Rap|Rap',
  2554. 1810 => 'Music Videos|Hip-Hop/Rap|Underground Rap',
  2555. 1811 => 'Music Videos|Hip-Hop/Rap|West Coast Rap',
  2556. 1812 => 'Music Videos|Holiday|Chanukah',
  2557. 1813 => 'Music Videos|Holiday|Christmas',
  2558. 1814 => "Music Videos|Holiday|Christmas: Children's",
  2559. 1815 => 'Music Videos|Holiday|Christmas: Classic',
  2560. 1816 => 'Music Videos|Holiday|Christmas: Classical',
  2561. 1817 => 'Music Videos|Holiday|Christmas: Jazz',
  2562. 1818 => 'Music Videos|Holiday|Christmas: Modern',
  2563. 1819 => 'Music Videos|Holiday|Christmas: Pop',
  2564. 1820 => 'Music Videos|Holiday|Christmas: R&B',
  2565. 1821 => 'Music Videos|Holiday|Christmas: Religious',
  2566. 1822 => 'Music Videos|Holiday|Christmas: Rock',
  2567. 1823 => 'Music Videos|Holiday|Easter',
  2568. 1824 => 'Music Videos|Holiday|Halloween',
  2569. 1825 => 'Music Videos|Holiday|Thanksgiving',
  2570. 1826 => 'Music Videos|Jazz|Avant-Garde Jazz',
  2571. 1828 => 'Music Videos|Jazz|Bop',
  2572. 1829 => 'Music Videos|Jazz|Contemporary Jazz',
  2573. 1830 => 'Music Videos|Jazz|Cool',
  2574. 1831 => 'Music Videos|Jazz|Crossover Jazz',
  2575. 1832 => 'Music Videos|Jazz|Dixieland',
  2576. 1833 => 'Music Videos|Jazz|Fusion',
  2577. 1834 => 'Music Videos|Jazz|Hard Bop',
  2578. 1835 => 'Music Videos|Jazz|Latin Jazz',
  2579. 1836 => 'Music Videos|Jazz|Mainstream Jazz',
  2580. 1837 => 'Music Videos|Jazz|Ragtime',
  2581. 1838 => 'Music Videos|Jazz|Smooth Jazz',
  2582. 1839 => 'Music Videos|Jazz|Trad Jazz',
  2583. 1840 => 'Music Videos|Latin|Alternative & Rock in Spanish',
  2584. 1841 => 'Music Videos|Latin|Baladas y Boleros',
  2585. 1842 => 'Music Videos|Latin|Contemporary Latin',
  2586. 1843 => 'Music Videos|Latin|Latin Jazz',
  2587. 1844 => 'Music Videos|Latin|Latin Urban',
  2588. 1845 => 'Music Videos|Latin|Pop in Spanish',
  2589. 1846 => 'Music Videos|Latin|Raices',
  2590. 1847 => 'Music Videos|Latin|Regional Mexicano',
  2591. 1848 => 'Music Videos|Latin|Salsa y Tropical',
  2592. 1849 => 'Music Videos|New Age|Healing',
  2593. 1850 => 'Music Videos|New Age|Meditation',
  2594. 1851 => 'Music Videos|New Age|Nature',
  2595. 1852 => 'Music Videos|New Age|Relaxation',
  2596. 1853 => 'Music Videos|New Age|Travel',
  2597. 1854 => 'Music Videos|Pop|Adult Contemporary',
  2598. 1855 => 'Music Videos|Pop|Britpop',
  2599. 1856 => 'Music Videos|Pop|Pop/Rock',
  2600. 1857 => 'Music Videos|Pop|Soft Rock',
  2601. 1858 => 'Music Videos|Pop|Teen Pop',
  2602. 1859 => 'Music Videos|R&B/Soul|Contemporary R&B',
  2603. 1860 => 'Music Videos|R&B/Soul|Disco',
  2604. 1861 => 'Music Videos|R&B/Soul|Doo Wop',
  2605. 1862 => 'Music Videos|R&B/Soul|Funk',
  2606. 1863 => 'Music Videos|R&B/Soul|Motown',
  2607. 1864 => 'Music Videos|R&B/Soul|Neo-Soul',
  2608. 1865 => 'Music Videos|R&B/Soul|Soul',
  2609. 1866 => 'Music Videos|Reggae|Modern Dancehall',
  2610. 1867 => 'Music Videos|Reggae|Dub',
  2611. 1868 => 'Music Videos|Reggae|Roots Reggae',
  2612. 1869 => 'Music Videos|Reggae|Ska',
  2613. 1870 => 'Music Videos|Rock|Adult Alternative',
  2614. 1871 => 'Music Videos|Rock|American Trad Rock',
  2615. 1872 => 'Music Videos|Rock|Arena Rock',
  2616. 1873 => 'Music Videos|Rock|Blues-Rock',
  2617. 1874 => 'Music Videos|Rock|British Invasion',
  2618. 1875 => 'Music Videos|Rock|Death Metal/Black Metal',
  2619. 1876 => 'Music Videos|Rock|Glam Rock',
  2620. 1877 => 'Music Videos|Rock|Hair Metal',
  2621. 1878 => 'Music Videos|Rock|Hard Rock',
  2622. 1879 => 'Music Videos|Rock|Jam Bands',
  2623. 1880 => 'Music Videos|Rock|Prog-Rock/Art Rock',
  2624. 1881 => 'Music Videos|Rock|Psychedelic',
  2625. 1882 => 'Music Videos|Rock|Rock & Roll',
  2626. 1883 => 'Music Videos|Rock|Rockabilly',
  2627. 1884 => 'Music Videos|Rock|Roots Rock',
  2628. 1885 => 'Music Videos|Rock|Singer/Songwriter',
  2629. 1886 => 'Music Videos|Rock|Southern Rock',
  2630. 1887 => 'Music Videos|Rock|Surf',
  2631. 1888 => 'Music Videos|Rock|Tex-Mex',
  2632. 1889 => 'Music Videos|Singer/Songwriter|Alternative Folk',
  2633. 1890 => 'Music Videos|Singer/Songwriter|Contemporary Folk',
  2634. 1891 => 'Music Videos|Singer/Songwriter|Contemporary Singer/Songwriter',
  2635. 1892 => 'Music Videos|Singer/Songwriter|Folk-Rock',
  2636. 1893 => 'Music Videos|Singer/Songwriter|New Acoustic',
  2637. 1894 => 'Music Videos|Singer/Songwriter|Traditional Folk',
  2638. 1895 => 'Music Videos|Soundtrack|Foreign Cinema',
  2639. 1896 => 'Music Videos|Soundtrack|Musicals',
  2640. 1897 => 'Music Videos|Soundtrack|Original Score',
  2641. 1898 => 'Music Videos|Soundtrack|Soundtrack',
  2642. 1899 => 'Music Videos|Soundtrack|TV Soundtrack',
  2643. 1900 => 'Music Videos|Vocal|Standards',
  2644. 1901 => 'Music Videos|Vocal|Traditional Pop',
  2645. 1902 => 'Music Videos|Jazz|Vocal Jazz',
  2646. 1903 => 'Music Videos|Vocal|Vocal Pop',
  2647. 1904 => 'Music Videos|World|Africa',
  2648. 1905 => 'Music Videos|World|Afro-Beat',
  2649. 1906 => 'Music Videos|World|Afro-Pop',
  2650. 1907 => 'Music Videos|World|Asia',
  2651. 1908 => 'Music Videos|World|Australia',
  2652. 1909 => 'Music Videos|World|Cajun',
  2653. 1910 => 'Music Videos|World|Caribbean',
  2654. 1911 => 'Music Videos|World|Celtic',
  2655. 1912 => 'Music Videos|World|Celtic Folk',
  2656. 1913 => 'Music Videos|World|Contemporary Celtic',
  2657. 1914 => 'Music Videos|World|Europe',
  2658. 1915 => 'Music Videos|World|France',
  2659. 1916 => 'Music Videos|World|Hawaii',
  2660. 1917 => 'Music Videos|World|Japan',
  2661. 1918 => 'Music Videos|World|Klezmer',
  2662. 1919 => 'Music Videos|World|North America',
  2663. 1920 => 'Music Videos|World|Polka',
  2664. 1921 => 'Music Videos|World|South Africa',
  2665. 1922 => 'Music Videos|World|South America',
  2666. 1923 => 'Music Videos|World|Traditional Celtic',
  2667. 1924 => 'Music Videos|World|Worldbeat',
  2668. 1925 => 'Music Videos|World|Zydeco',
  2669. 1926 => 'Music Videos|Christian & Gospel',
  2670. 1928 => 'Music Videos|Classical|Art Song',
  2671. 1929 => 'Music Videos|Classical|Brass & Woodwinds',
  2672. 1930 => 'Music Videos|Classical|Solo Instrumental',
  2673. 1931 => 'Music Videos|Classical|Contemporary Era',
  2674. 1932 => 'Music Videos|Classical|Oratorio',
  2675. 1933 => 'Music Videos|Classical|Cantata',
  2676. 1934 => 'Music Videos|Classical|Electronic',
  2677. 1935 => 'Music Videos|Classical|Sacred',
  2678. 1936 => 'Music Videos|Classical|Guitar',
  2679. 1938 => 'Music Videos|Classical|Violin',
  2680. 1939 => 'Music Videos|Classical|Cello',
  2681. 1940 => 'Music Videos|Classical|Percussion',
  2682. 1941 => 'Music Videos|Electronic|Dubstep',
  2683. 1942 => 'Music Videos|Electronic|Bass',
  2684. 1943 => 'Music Videos|Hip-Hop/Rap|UK Hip-Hop',
  2685. 1944 => 'Music Videos|Reggae|Lovers Rock',
  2686. 1945 => 'Music Videos|Alternative|EMO',
  2687. 1946 => 'Music Videos|Alternative|Pop Punk',
  2688. 1947 => 'Music Videos|Alternative|Indie Pop',
  2689. 1948 => 'Music Videos|New Age|Yoga',
  2690. 1949 => 'Music Videos|Pop|Tribute',
  2691. 4000 => 'TV Shows|Comedy',
  2692. 4001 => 'TV Shows|Drama',
  2693. 4002 => 'TV Shows|Animation',
  2694. 4003 => 'TV Shows|Action & Adventure',
  2695. 4004 => 'TV Shows|Classic',
  2696. 4005 => 'TV Shows|Kids',
  2697. 4006 => 'TV Shows|Nonfiction',
  2698. 4007 => 'TV Shows|Reality TV',
  2699. 4008 => 'TV Shows|Sci-Fi & Fantasy',
  2700. 4009 => 'TV Shows|Sports',
  2701. 4010 => 'TV Shows|Teens',
  2702. 4011 => 'TV Shows|Latino TV',
  2703. 4401 => 'Movies|Action & Adventure',
  2704. 4402 => 'Movies|Anime',
  2705. 4403 => 'Movies|Classics',
  2706. 4404 => 'Movies|Comedy',
  2707. 4405 => 'Movies|Documentary',
  2708. 4406 => 'Movies|Drama',
  2709. 4407 => 'Movies|Foreign',
  2710. 4408 => 'Movies|Horror',
  2711. 4409 => 'Movies|Independent',
  2712. 4410 => 'Movies|Kids & Family',
  2713. 4411 => 'Movies|Musicals',
  2714. 4412 => 'Movies|Romance',
  2715. 4413 => 'Movies|Sci-Fi & Fantasy',
  2716. 4414 => 'Movies|Short Films',
  2717. 4415 => 'Movies|Special Interest',
  2718. 4416 => 'Movies|Thriller',
  2719. 4417 => 'Movies|Sports',
  2720. 4418 => 'Movies|Western',
  2721. 4419 => 'Movies|Urban',
  2722. 4420 => 'Movies|Holiday',
  2723. 4421 => 'Movies|Made for TV',
  2724. 4422 => 'Movies|Concert Films',
  2725. 4423 => 'Movies|Music Documentaries',
  2726. 4424 => 'Movies|Music Feature Films',
  2727. 4425 => 'Movies|Japanese Cinema',
  2728. 4426 => 'Movies|Jidaigeki',
  2729. 4427 => 'Movies|Tokusatsu',
  2730. 4428 => 'Movies|Korean Cinema',
  2731. 4429 => 'Movies|Russian',
  2732. 4430 => 'Movies|Turkish',
  2733. 4431 => 'Movies|Bollywood',
  2734. 4432 => 'Movies|Regional Indian',
  2735. 4433 => 'Movies|Middle Eastern',
  2736. 4434 => 'Movies|African',
  2737. 6000 => 'App Store|Business',
  2738. 6001 => 'App Store|Weather',
  2739. 6002 => 'App Store|Utilities',
  2740. 6003 => 'App Store|Travel',
  2741. 6004 => 'App Store|Sports',
  2742. 6005 => 'App Store|Social Networking',
  2743. 6006 => 'App Store|Reference',
  2744. 6007 => 'App Store|Productivity',
  2745. 6008 => 'App Store|Photo & Video',
  2746. 6009 => 'App Store|News',
  2747. 6010 => 'App Store|Navigation',
  2748. 6011 => 'App Store|Music',
  2749. 6012 => 'App Store|Lifestyle',
  2750. 6013 => 'App Store|Health & Fitness',
  2751. 6014 => 'App Store|Games',
  2752. 6015 => 'App Store|Finance',
  2753. 6016 => 'App Store|Entertainment',
  2754. 6017 => 'App Store|Education',
  2755. 6018 => 'App Store|Books',
  2756. 6020 => 'App Store|Medical',
  2757. 6021 => 'App Store|Newsstand',
  2758. 6022 => 'App Store|Catalogs',
  2759. 6023 => 'App Store|Food & Drink',
  2760. 7001 => 'App Store|Games|Action',
  2761. 7002 => 'App Store|Games|Adventure',
  2762. 7003 => 'App Store|Games|Arcade',
  2763. 7004 => 'App Store|Games|Board',
  2764. 7005 => 'App Store|Games|Card',
  2765. 7006 => 'App Store|Games|Casino',
  2766. 7007 => 'App Store|Games|Dice',
  2767. 7008 => 'App Store|Games|Educational',
  2768. 7009 => 'App Store|Games|Family',
  2769. 7011 => 'App Store|Games|Music',
  2770. 7012 => 'App Store|Games|Puzzle',
  2771. 7013 => 'App Store|Games|Racing',
  2772. 7014 => 'App Store|Games|Role Playing',
  2773. 7015 => 'App Store|Games|Simulation',
  2774. 7016 => 'App Store|Games|Sports',
  2775. 7017 => 'App Store|Games|Strategy',
  2776. 7018 => 'App Store|Games|Trivia',
  2777. 7019 => 'App Store|Games|Word',
  2778. 8001 => 'Tones|Ringtones|Alternative',
  2779. 8002 => 'Tones|Ringtones|Blues',
  2780. 8003 => "Tones|Ringtones|Children's Music",
  2781. 8004 => 'Tones|Ringtones|Classical',
  2782. 8005 => 'Tones|Ringtones|Comedy',
  2783. 8006 => 'Tones|Ringtones|Country',
  2784. 8007 => 'Tones|Ringtones|Dance',
  2785. 8008 => 'Tones|Ringtones|Electronic',
  2786. 8009 => 'Tones|Ringtones|Enka',
  2787. 8010 => 'Tones|Ringtones|French Pop',
  2788. 8011 => 'Tones|Ringtones|German Folk',
  2789. 8012 => 'Tones|Ringtones|German Pop',
  2790. 8013 => 'Tones|Ringtones|Hip-Hop/Rap',
  2791. 8014 => 'Tones|Ringtones|Holiday',
  2792. 8015 => 'Tones|Ringtones|Inspirational',
  2793. 8016 => 'Tones|Ringtones|J-Pop',
  2794. 8017 => 'Tones|Ringtones|Jazz',
  2795. 8018 => 'Tones|Ringtones|Kayokyoku',
  2796. 8019 => 'Tones|Ringtones|Latin',
  2797. 8020 => 'Tones|Ringtones|New Age',
  2798. 8021 => 'Tones|Ringtones|Classical|Opera',
  2799. 8022 => 'Tones|Ringtones|Pop',
  2800. 8023 => 'Tones|Ringtones|R&B/Soul',
  2801. 8024 => 'Tones|Ringtones|Reggae',
  2802. 8025 => 'Tones|Ringtones|Rock',
  2803. 8026 => 'Tones|Ringtones|Singer/Songwriter',
  2804. 8027 => 'Tones|Ringtones|Soundtrack',
  2805. 8028 => 'Tones|Ringtones|Spoken Word',
  2806. 8029 => 'Tones|Ringtones|Vocal',
  2807. 8030 => 'Tones|Ringtones|World',
  2808. 8050 => 'Tones|Alert Tones|Sound Effects',
  2809. 8051 => 'Tones|Alert Tones|Dialogue',
  2810. 8052 => 'Tones|Alert Tones|Music',
  2811. 8053 => 'Tones|Ringtones',
  2812. 8054 => 'Tones|Alert Tones',
  2813. 8055 => 'Tones|Ringtones|Alternative|Chinese Alt',
  2814. 8056 => 'Tones|Ringtones|Alternative|College Rock',
  2815. 8057 => 'Tones|Ringtones|Alternative|Goth Rock',
  2816. 8058 => 'Tones|Ringtones|Alternative|Grunge',
  2817. 8059 => 'Tones|Ringtones|Alternative|Indie Rock',
  2818. 8060 => 'Tones|Ringtones|Alternative|Korean Indie',
  2819. 8061 => 'Tones|Ringtones|Alternative|New Wave',
  2820. 8062 => 'Tones|Ringtones|Alternative|Punk',
  2821. 8063 => 'Tones|Ringtones|Anime',
  2822. 8064 => 'Tones|Ringtones|Arabic',
  2823. 8065 => 'Tones|Ringtones|Arabic|Arabic Pop',
  2824. 8066 => 'Tones|Ringtones|Arabic|Islamic',
  2825. 8067 => 'Tones|Ringtones|Arabic|Khaleeji',
  2826. 8068 => 'Tones|Ringtones|Arabic|North African',
  2827. 8069 => 'Tones|Ringtones|Blues|Acoustic Blues',
  2828. 8070 => 'Tones|Ringtones|Blues|Chicago Blues',
  2829. 8071 => 'Tones|Ringtones|Blues|Classic Blues',
  2830. 8072 => 'Tones|Ringtones|Blues|Contemporary Blues',
  2831. 8073 => 'Tones|Ringtones|Blues|Country Blues',
  2832. 8074 => 'Tones|Ringtones|Blues|Delta Blues',
  2833. 8075 => 'Tones|Ringtones|Blues|Electric Blues',
  2834. 8076 => 'Tones|Ringtones|Brazilian',
  2835. 8077 => 'Tones|Ringtones|Brazilian|Axe', # (Ax&eacute;)
  2836. 8078 => 'Tones|Ringtones|Brazilian|Baile Funk',
  2837. 8079 => 'Tones|Ringtones|Brazilian|Bossa Nova',
  2838. 8080 => 'Tones|Ringtones|Brazilian|Choro',
  2839. 8081 => 'Tones|Ringtones|Brazilian|Forro', # (Forr&oacute;)
  2840. 8082 => 'Tones|Ringtones|Brazilian|Frevo',
  2841. 8083 => 'Tones|Ringtones|Brazilian|MPB',
  2842. 8084 => 'Tones|Ringtones|Brazilian|Pagode',
  2843. 8085 => 'Tones|Ringtones|Brazilian|Samba',
  2844. 8086 => 'Tones|Ringtones|Brazilian|Sertanejo',
  2845. 8087 => "Tones|Ringtones|Children's Music|Lullabies",
  2846. 8088 => "Tones|Ringtones|Children's Music|Sing-Along",
  2847. 8089 => "Tones|Ringtones|Children's Music|Stories",
  2848. 8090 => 'Tones|Ringtones|Chinese',
  2849. 8091 => 'Tones|Ringtones|Chinese|Chinese Classical',
  2850. 8092 => 'Tones|Ringtones|Chinese|Chinese Flute',
  2851. 8093 => 'Tones|Ringtones|Chinese|Chinese Opera',
  2852. 8094 => 'Tones|Ringtones|Chinese|Chinese Orchestral',
  2853. 8095 => 'Tones|Ringtones|Chinese|Chinese Regional Folk',
  2854. 8096 => 'Tones|Ringtones|Chinese|Chinese Strings',
  2855. 8097 => 'Tones|Ringtones|Chinese|Taiwanese Folk',
  2856. 8098 => 'Tones|Ringtones|Chinese|Tibetan Native Music',
  2857. 8099 => 'Tones|Ringtones|Christian & Gospel',
  2858. 8100 => 'Tones|Ringtones|Christian & Gospel|CCM',
  2859. 8101 => 'Tones|Ringtones|Christian & Gospel|Christian Metal',
  2860. 8102 => 'Tones|Ringtones|Christian & Gospel|Christian Pop',
  2861. 8103 => 'Tones|Ringtones|Christian & Gospel|Christian Rap',
  2862. 8104 => 'Tones|Ringtones|Christian & Gospel|Christian Rock',
  2863. 8105 => 'Tones|Ringtones|Christian & Gospel|Classic Christian',
  2864. 8106 => 'Tones|Ringtones|Christian & Gospel|Contemporary Gospel',
  2865. 8107 => 'Tones|Ringtones|Christian & Gospel|Gospel',
  2866. 8108 => 'Tones|Ringtones|Christian & Gospel|Praise & Worship',
  2867. 8109 => 'Tones|Ringtones|Christian & Gospel|Southern Gospel',
  2868. 8110 => 'Tones|Ringtones|Christian & Gospel|Traditional Gospel',
  2869. 8111 => 'Tones|Ringtones|Classical|Avant-Garde',
  2870. 8112 => 'Tones|Ringtones|Classical|Baroque Era',
  2871. 8113 => 'Tones|Ringtones|Classical|Chamber Music',
  2872. 8114 => 'Tones|Ringtones|Classical|Chant',
  2873. 8115 => 'Tones|Ringtones|Classical|Choral',
  2874. 8116 => 'Tones|Ringtones|Classical|Classical Crossover',
  2875. 8117 => 'Tones|Ringtones|Classical|Early Music',
  2876. 8118 => 'Tones|Ringtones|Classical|High Classical',
  2877. 8119 => 'Tones|Ringtones|Classical|Impressionist',
  2878. 8120 => 'Tones|Ringtones|Classical|Medieval Era',
  2879. 8121 => 'Tones|Ringtones|Classical|Minimalism',
  2880. 8122 => 'Tones|Ringtones|Classical|Modern Era',
  2881. 8123 => 'Tones|Ringtones|Classical|Orchestral',
  2882. 8124 => 'Tones|Ringtones|Classical|Renaissance',
  2883. 8125 => 'Tones|Ringtones|Classical|Romantic Era',
  2884. 8126 => 'Tones|Ringtones|Classical|Wedding Music',
  2885. 8127 => 'Tones|Ringtones|Comedy|Novelty',
  2886. 8128 => 'Tones|Ringtones|Comedy|Standup Comedy',
  2887. 8129 => 'Tones|Ringtones|Country|Alternative Country',
  2888. 8130 => 'Tones|Ringtones|Country|Americana',
  2889. 8131 => 'Tones|Ringtones|Country|Bluegrass',
  2890. 8132 => 'Tones|Ringtones|Country|Contemporary Bluegrass',
  2891. 8133 => 'Tones|Ringtones|Country|Contemporary Country',
  2892. 8134 => 'Tones|Ringtones|Country|Country Gospel',
  2893. 8135 => 'Tones|Ringtones|Country|Honky Tonk',
  2894. 8136 => 'Tones|Ringtones|Country|Outlaw Country',
  2895. 8137 => 'Tones|Ringtones|Country|Thai Country',
  2896. 8138 => 'Tones|Ringtones|Country|Traditional Bluegrass',
  2897. 8139 => 'Tones|Ringtones|Country|Traditional Country',
  2898. 8140 => 'Tones|Ringtones|Country|Urban Cowboy',
  2899. 8141 => 'Tones|Ringtones|Dance|Breakbeat',
  2900. 8142 => 'Tones|Ringtones|Dance|Exercise',
  2901. 8143 => 'Tones|Ringtones|Dance|Garage',
  2902. 8144 => 'Tones|Ringtones|Dance|Hardcore',
  2903. 8145 => 'Tones|Ringtones|Dance|House',
  2904. 8146 => "Tones|Ringtones|Dance|Jungle/Drum'n'bass",
  2905. 8147 => 'Tones|Ringtones|Dance|Techno',
  2906. 8148 => 'Tones|Ringtones|Dance|Trance',
  2907. 8149 => 'Tones|Ringtones|Disney',
  2908. 8150 => 'Tones|Ringtones|Easy Listening',
  2909. 8151 => 'Tones|Ringtones|Easy Listening|Lounge',
  2910. 8152 => 'Tones|Ringtones|Easy Listening|Swing',
  2911. 8153 => 'Tones|Ringtones|Electronic|Ambient',
  2912. 8154 => 'Tones|Ringtones|Electronic|Downtempo',
  2913. 8155 => 'Tones|Ringtones|Electronic|Electronica',
  2914. 8156 => 'Tones|Ringtones|Electronic|IDM/Experimental',
  2915. 8157 => 'Tones|Ringtones|Electronic|Industrial',
  2916. 8158 => 'Tones|Ringtones|Fitness & Workout',
  2917. 8159 => 'Tones|Ringtones|Folk',
  2918. 8160 => 'Tones|Ringtones|Hip-Hop/Rap|Alternative Rap',
  2919. 8161 => 'Tones|Ringtones|Hip-Hop/Rap|Chinese Hip-Hop',
  2920. 8162 => 'Tones|Ringtones|Hip-Hop/Rap|Dirty South',
  2921. 8163 => 'Tones|Ringtones|Hip-Hop/Rap|East Coast Rap',
  2922. 8164 => 'Tones|Ringtones|Hip-Hop/Rap|Gangsta Rap',
  2923. 8165 => 'Tones|Ringtones|Hip-Hop/Rap|Hardcore Rap',
  2924. 8166 => 'Tones|Ringtones|Hip-Hop/Rap|Hip-Hop',
  2925. 8167 => 'Tones|Ringtones|Hip-Hop/Rap|Korean Hip-Hop',
  2926. 8168 => 'Tones|Ringtones|Hip-Hop/Rap|Latin Rap',
  2927. 8169 => 'Tones|Ringtones|Hip-Hop/Rap|Old School Rap',
  2928. 8170 => 'Tones|Ringtones|Hip-Hop/Rap|Rap',
  2929. 8171 => 'Tones|Ringtones|Hip-Hop/Rap|Underground Rap',
  2930. 8172 => 'Tones|Ringtones|Hip-Hop/Rap|West Coast Rap',
  2931. 8173 => 'Tones|Ringtones|Holiday|Chanukah',
  2932. 8174 => 'Tones|Ringtones|Holiday|Christmas',
  2933. 8175 => "Tones|Ringtones|Holiday|Christmas: Children's",
  2934. 8176 => 'Tones|Ringtones|Holiday|Christmas: Classic',
  2935. 8177 => 'Tones|Ringtones|Holiday|Christmas: Classical',
  2936. 8178 => 'Tones|Ringtones|Holiday|Christmas: Jazz',
  2937. 8179 => 'Tones|Ringtones|Holiday|Christmas: Modern',
  2938. 8180 => 'Tones|Ringtones|Holiday|Christmas: Pop',
  2939. 8181 => 'Tones|Ringtones|Holiday|Christmas: R&B',
  2940. 8182 => 'Tones|Ringtones|Holiday|Christmas: Religious',
  2941. 8183 => 'Tones|Ringtones|Holiday|Christmas: Rock',
  2942. 8184 => 'Tones|Ringtones|Holiday|Easter',
  2943. 8185 => 'Tones|Ringtones|Holiday|Halloween',
  2944. 8186 => 'Tones|Ringtones|Holiday|Thanksgiving',
  2945. 8187 => 'Tones|Ringtones|Indian',
  2946. 8188 => 'Tones|Ringtones|Indian|Bollywood',
  2947. 8189 => 'Tones|Ringtones|Indian|Devotional & Spiritual',
  2948. 8190 => 'Tones|Ringtones|Indian|Ghazals',
  2949. 8191 => 'Tones|Ringtones|Indian|Indian Classical',
  2950. 8192 => 'Tones|Ringtones|Indian|Indian Folk',
  2951. 8193 => 'Tones|Ringtones|Indian|Indian Pop',
  2952. 8194 => 'Tones|Ringtones|Indian|Regional Indian',
  2953. 8195 => 'Tones|Ringtones|Indian|Sufi',
  2954. 8196 => 'Tones|Ringtones|Indian|Tamil',
  2955. 8197 => 'Tones|Ringtones|Indian|Telugu',
  2956. 8198 => 'Tones|Ringtones|Instrumental',
  2957. 8199 => 'Tones|Ringtones|Jazz|Avant-Garde Jazz',
  2958. 8201 => 'Tones|Ringtones|Jazz|Big Band',
  2959. 8202 => 'Tones|Ringtones|Jazz|Bop',
  2960. 8203 => 'Tones|Ringtones|Jazz|Contemporary Jazz',
  2961. 8204 => 'Tones|Ringtones|Jazz|Cool',
  2962. 8205 => 'Tones|Ringtones|Jazz|Crossover Jazz',
  2963. 8206 => 'Tones|Ringtones|Jazz|Dixieland',
  2964. 8207 => 'Tones|Ringtones|Jazz|Fusion',
  2965. 8208 => 'Tones|Ringtones|Jazz|Hard Bop',
  2966. 8209 => 'Tones|Ringtones|Jazz|Latin Jazz',
  2967. 8210 => 'Tones|Ringtones|Jazz|Mainstream Jazz',
  2968. 8211 => 'Tones|Ringtones|Jazz|Ragtime',
  2969. 8212 => 'Tones|Ringtones|Jazz|Smooth Jazz',
  2970. 8213 => 'Tones|Ringtones|Jazz|Trad Jazz',
  2971. 8214 => 'Tones|Ringtones|Pop|K-Pop',
  2972. 8215 => 'Tones|Ringtones|Karaoke',
  2973. 8216 => 'Tones|Ringtones|Korean',
  2974. 8217 => 'Tones|Ringtones|Korean|Korean Classical',
  2975. 8218 => 'Tones|Ringtones|Korean|Korean Trad Instrumental',
  2976. 8219 => 'Tones|Ringtones|Korean|Korean Trad Song',
  2977. 8220 => 'Tones|Ringtones|Korean|Korean Trad Theater',
  2978. 8221 => 'Tones|Ringtones|Latin|Alternative & Rock in Spanish',
  2979. 8222 => 'Tones|Ringtones|Latin|Baladas y Boleros',
  2980. 8223 => 'Tones|Ringtones|Latin|Contemporary Latin',
  2981. 8224 => 'Tones|Ringtones|Latin|Latin Jazz',
  2982. 8225 => 'Tones|Ringtones|Latin|Latin Urban',
  2983. 8226 => 'Tones|Ringtones|Latin|Pop in Spanish',
  2984. 8227 => 'Tones|Ringtones|Latin|Raices',
  2985. 8228 => 'Tones|Ringtones|Latin|Regional Mexicano',
  2986. 8229 => 'Tones|Ringtones|Latin|Salsa y Tropical',
  2987. 8230 => 'Tones|Ringtones|Marching Bands',
  2988. 8231 => 'Tones|Ringtones|New Age|Healing',
  2989. 8232 => 'Tones|Ringtones|New Age|Meditation',
  2990. 8233 => 'Tones|Ringtones|New Age|Nature',
  2991. 8234 => 'Tones|Ringtones|New Age|Relaxation',
  2992. 8235 => 'Tones|Ringtones|New Age|Travel',
  2993. 8236 => 'Tones|Ringtones|Orchestral',
  2994. 8237 => 'Tones|Ringtones|Pop|Adult Contemporary',
  2995. 8238 => 'Tones|Ringtones|Pop|Britpop',
  2996. 8239 => 'Tones|Ringtones|Pop|C-Pop',
  2997. 8240 => 'Tones|Ringtones|Pop|Cantopop/HK-Pop',
  2998. 8241 => 'Tones|Ringtones|Pop|Indo Pop',
  2999. 8242 => 'Tones|Ringtones|Pop|Korean Folk-Pop',
  3000. 8243 => 'Tones|Ringtones|Pop|Malaysian Pop',
  3001. 8244 => 'Tones|Ringtones|Pop|Mandopop',
  3002. 8245 => 'Tones|Ringtones|Pop|Manilla Sound',
  3003. 8246 => 'Tones|Ringtones|Pop|Oldies',
  3004. 8247 => 'Tones|Ringtones|Pop|Original Pilipino Music',
  3005. 8248 => 'Tones|Ringtones|Pop|Pinoy Pop',
  3006. 8249 => 'Tones|Ringtones|Pop|Pop/Rock',
  3007. 8250 => 'Tones|Ringtones|Pop|Soft Rock',
  3008. 8251 => 'Tones|Ringtones|Pop|Tai-Pop',
  3009. 8252 => 'Tones|Ringtones|Pop|Teen Pop',
  3010. 8253 => 'Tones|Ringtones|Pop|Thai Pop',
  3011. 8254 => 'Tones|Ringtones|R&B/Soul|Contemporary R&B',
  3012. 8255 => 'Tones|Ringtones|R&B/Soul|Disco',
  3013. 8256 => 'Tones|Ringtones|R&B/Soul|Doo Wop',
  3014. 8257 => 'Tones|Ringtones|R&B/Soul|Funk',
  3015. 8258 => 'Tones|Ringtones|R&B/Soul|Motown',
  3016. 8259 => 'Tones|Ringtones|R&B/Soul|Neo-Soul',
  3017. 8260 => 'Tones|Ringtones|R&B/Soul|Soul',
  3018. 8261 => 'Tones|Ringtones|Reggae|Modern Dancehall',
  3019. 8262 => 'Tones|Ringtones|Reggae|Dub',
  3020. 8263 => 'Tones|Ringtones|Reggae|Roots Reggae',
  3021. 8264 => 'Tones|Ringtones|Reggae|Ska',
  3022. 8265 => 'Tones|Ringtones|Rock|Adult Alternative',
  3023. 8266 => 'Tones|Ringtones|Rock|American Trad Rock',
  3024. 8267 => 'Tones|Ringtones|Rock|Arena Rock',
  3025. 8268 => 'Tones|Ringtones|Rock|Blues-Rock',
  3026. 8269 => 'Tones|Ringtones|Rock|British Invasion',
  3027. 8270 => 'Tones|Ringtones|Rock|Chinese Rock',
  3028. 8271 => 'Tones|Ringtones|Rock|Death Metal/Black Metal',
  3029. 8272 => 'Tones|Ringtones|Rock|Glam Rock',
  3030. 8273 => 'Tones|Ringtones|Rock|Hair Metal',
  3031. 8274 => 'Tones|Ringtones|Rock|Hard Rock',
  3032. 8275 => 'Tones|Ringtones|Rock|Metal',
  3033. 8276 => 'Tones|Ringtones|Rock|Jam Bands',
  3034. 8277 => 'Tones|Ringtones|Rock|Korean Rock',
  3035. 8278 => 'Tones|Ringtones|Rock|Prog-Rock/Art Rock',
  3036. 8279 => 'Tones|Ringtones|Rock|Psychedelic',
  3037. 8280 => 'Tones|Ringtones|Rock|Rock & Roll',
  3038. 8281 => 'Tones|Ringtones|Rock|Rockabilly',
  3039. 8282 => 'Tones|Ringtones|Rock|Roots Rock',
  3040. 8283 => 'Tones|Ringtones|Rock|Singer/Songwriter',
  3041. 8284 => 'Tones|Ringtones|Rock|Southern Rock',
  3042. 8285 => 'Tones|Ringtones|Rock|Surf',
  3043. 8286 => 'Tones|Ringtones|Rock|Tex-Mex',
  3044. 8287 => 'Tones|Ringtones|Singer/Songwriter|Alternative Folk',
  3045. 8288 => 'Tones|Ringtones|Singer/Songwriter|Contemporary Folk',
  3046. 8289 => 'Tones|Ringtones|Singer/Songwriter|Contemporary Singer/Songwriter',
  3047. 8290 => 'Tones|Ringtones|Singer/Songwriter|Folk-Rock',
  3048. 8291 => 'Tones|Ringtones|Singer/Songwriter|New Acoustic',
  3049. 8292 => 'Tones|Ringtones|Singer/Songwriter|Traditional Folk',
  3050. 8293 => 'Tones|Ringtones|Soundtrack|Foreign Cinema',
  3051. 8294 => 'Tones|Ringtones|Soundtrack|Musicals',
  3052. 8295 => 'Tones|Ringtones|Soundtrack|Original Score',
  3053. 8296 => 'Tones|Ringtones|Soundtrack|Sound Effects',
  3054. 8297 => 'Tones|Ringtones|Soundtrack|Soundtrack',
  3055. 8298 => 'Tones|Ringtones|Soundtrack|TV Soundtrack',
  3056. 8299 => 'Tones|Ringtones|Vocal|Standards',
  3057. 8300 => 'Tones|Ringtones|Vocal|Traditional Pop',
  3058. 8301 => 'Tones|Ringtones|Vocal|Trot',
  3059. 8302 => 'Tones|Ringtones|Jazz|Vocal Jazz',
  3060. 8303 => 'Tones|Ringtones|Vocal|Vocal Pop',
  3061. 8304 => 'Tones|Ringtones|World|Africa',
  3062. 8305 => 'Tones|Ringtones|World|Afrikaans',
  3063. 8306 => 'Tones|Ringtones|World|Afro-Beat',
  3064. 8307 => 'Tones|Ringtones|World|Afro-Pop',
  3065. 8308 => 'Tones|Ringtones|World|Arabesque',
  3066. 8309 => 'Tones|Ringtones|World|Asia',
  3067. 8310 => 'Tones|Ringtones|World|Australia',
  3068. 8311 => 'Tones|Ringtones|World|Cajun',
  3069. 8312 => 'Tones|Ringtones|World|Calypso',
  3070. 8313 => 'Tones|Ringtones|World|Caribbean',
  3071. 8314 => 'Tones|Ringtones|World|Celtic',
  3072. 8315 => 'Tones|Ringtones|World|Celtic Folk',
  3073. 8316 => 'Tones|Ringtones|World|Contemporary Celtic',
  3074. 8317 => 'Tones|Ringtones|World|Dangdut',
  3075. 8318 => 'Tones|Ringtones|World|Dini',
  3076. 8319 => 'Tones|Ringtones|World|Europe',
  3077. 8320 => 'Tones|Ringtones|World|Fado',
  3078. 8321 => 'Tones|Ringtones|World|Farsi',
  3079. 8322 => 'Tones|Ringtones|World|Flamenco',
  3080. 8323 => 'Tones|Ringtones|World|France',
  3081. 8324 => 'Tones|Ringtones|World|Halk',
  3082. 8325 => 'Tones|Ringtones|World|Hawaii',
  3083. 8326 => 'Tones|Ringtones|World|Iberia',
  3084. 8327 => 'Tones|Ringtones|World|Indonesian Religious',
  3085. 8328 => 'Tones|Ringtones|World|Israeli',
  3086. 8329 => 'Tones|Ringtones|World|Japan',
  3087. 8330 => 'Tones|Ringtones|World|Klezmer',
  3088. 8331 => 'Tones|Ringtones|World|North America',
  3089. 8332 => 'Tones|Ringtones|World|Polka',
  3090. 8333 => 'Tones|Ringtones|World|Russian',
  3091. 8334 => 'Tones|Ringtones|World|Russian Chanson',
  3092. 8335 => 'Tones|Ringtones|World|Sanat',
  3093. 8336 => 'Tones|Ringtones|World|Soca',
  3094. 8337 => 'Tones|Ringtones|World|South Africa',
  3095. 8338 => 'Tones|Ringtones|World|South America',
  3096. 8339 => 'Tones|Ringtones|World|Tango',
  3097. 8340 => 'Tones|Ringtones|World|Traditional Celtic',
  3098. 8341 => 'Tones|Ringtones|World|Turkish',
  3099. 8342 => 'Tones|Ringtones|World|Worldbeat',
  3100. 8343 => 'Tones|Ringtones|World|Zydeco',
  3101. 8345 => 'Tones|Ringtones|Classical|Art Song',
  3102. 8346 => 'Tones|Ringtones|Classical|Brass & Woodwinds',
  3103. 8347 => 'Tones|Ringtones|Classical|Solo Instrumental',
  3104. 8348 => 'Tones|Ringtones|Classical|Contemporary Era',
  3105. 8349 => 'Tones|Ringtones|Classical|Oratorio',
  3106. 8350 => 'Tones|Ringtones|Classical|Cantata',
  3107. 8351 => 'Tones|Ringtones|Classical|Electronic',
  3108. 8352 => 'Tones|Ringtones|Classical|Sacred',
  3109. 8353 => 'Tones|Ringtones|Classical|Guitar',
  3110. 8354 => 'Tones|Ringtones|Classical|Piano',
  3111. 8355 => 'Tones|Ringtones|Classical|Violin',
  3112. 8356 => 'Tones|Ringtones|Classical|Cello',
  3113. 8357 => 'Tones|Ringtones|Classical|Percussion',
  3114. 8358 => 'Tones|Ringtones|Electronic|Dubstep',
  3115. 8359 => 'Tones|Ringtones|Electronic|Bass',
  3116. 8360 => 'Tones|Ringtones|Hip-Hop/Rap|UK Hip Hop',
  3117. 8361 => 'Tones|Ringtones|Reggae|Lovers Rock',
  3118. 8362 => 'Tones|Ringtones|Alternative|EMO',
  3119. 8363 => 'Tones|Ringtones|Alternative|Pop Punk',
  3120. 8364 => 'Tones|Ringtones|Alternative|Indie Pop',
  3121. 8365 => 'Tones|Ringtones|New Age|Yoga',
  3122. 8366 => 'Tones|Ringtones|Pop|Tribute',
  3123. 9002 => 'Books|Nonfiction',
  3124. 9003 => 'Books|Romance',
  3125. 9004 => 'Books|Travel & Adventure',
  3126. 9007 => 'Books|Arts & Entertainment',
  3127. 9008 => 'Books|Biographies & Memoirs',
  3128. 9009 => 'Books|Business & Personal Finance',
  3129. 9010 => 'Books|Children & Teens',
  3130. 9012 => 'Books|Humor',
  3131. 9015 => 'Books|History',
  3132. 9018 => 'Books|Religion & Spirituality',
  3133. 9019 => 'Books|Science & Nature',
  3134. 9020 => 'Books|Sci-Fi & Fantasy',
  3135. 9024 => 'Books|Lifestyle & Home',
  3136. 9025 => 'Books|Health, Mind & Body',
  3137. 9026 => 'Books|Comics & Graphic Novels',
  3138. 9027 => 'Books|Computers & Internet',
  3139. 9028 => 'Books|Cookbooks, Food & Wine',
  3140. 9029 => 'Books|Professional & Technical',
  3141. 9030 => 'Books|Parenting',
  3142. 9031 => 'Books|Fiction & Literature',
  3143. 9032 => 'Books|Mysteries & Thrillers',
  3144. 9033 => 'Books|Reference',
  3145. 9034 => 'Books|Politics & Current Events',
  3146. 9035 => 'Books|Sports & Outdoors',
  3147. 10001 => 'Books|Lifestyle & Home|Antiques & Collectibles',
  3148. 10002 => 'Books|Arts & Entertainment|Art & Architecture',
  3149. 10003 => 'Books|Religion & Spirituality|Bibles',
  3150. 10004 => 'Books|Health, Mind & Body|Spirituality',
  3151. 10005 => 'Books|Business & Personal Finance|Industries & Professions',
  3152. 10006 => 'Books|Business & Personal Finance|Marketing & Sales',
  3153. 10007 => 'Books|Business & Personal Finance|Small Business & Entrepreneurship',
  3154. 10008 => 'Books|Business & Personal Finance|Personal Finance',
  3155. 10009 => 'Books|Business & Personal Finance|Reference',
  3156. 10010 => 'Books|Business & Personal Finance|Careers',
  3157. 10011 => 'Books|Business & Personal Finance|Economics',
  3158. 10012 => 'Books|Business & Personal Finance|Investing',
  3159. 10013 => 'Books|Business & Personal Finance|Finance',
  3160. 10014 => 'Books|Business & Personal Finance|Management & Leadership',
  3161. 10015 => 'Books|Comics & Graphic Novels|Graphic Novels',
  3162. 10016 => 'Books|Comics & Graphic Novels|Manga',
  3163. 10017 => 'Books|Computers & Internet|Computers',
  3164. 10018 => 'Books|Computers & Internet|Databases',
  3165. 10019 => 'Books|Computers & Internet|Digital Media',
  3166. 10020 => 'Books|Computers & Internet|Internet',
  3167. 10021 => 'Books|Computers & Internet|Network',
  3168. 10022 => 'Books|Computers & Internet|Operating Systems',
  3169. 10023 => 'Books|Computers & Internet|Programming',
  3170. 10024 => 'Books|Computers & Internet|Software',
  3171. 10025 => 'Books|Computers & Internet|System Administration',
  3172. 10026 => 'Books|Cookbooks, Food & Wine|Beverages',
  3173. 10027 => 'Books|Cookbooks, Food & Wine|Courses & Dishes',
  3174. 10028 => 'Books|Cookbooks, Food & Wine|Special Diet',
  3175. 10029 => 'Books|Cookbooks, Food & Wine|Special Occasions',
  3176. 10030 => 'Books|Cookbooks, Food & Wine|Methods',
  3177. 10031 => 'Books|Cookbooks, Food & Wine|Reference',
  3178. 10032 => 'Books|Cookbooks, Food & Wine|Regional & Ethnic',
  3179. 10033 => 'Books|Cookbooks, Food & Wine|Specific Ingredients',
  3180. 10034 => 'Books|Lifestyle & Home|Crafts & Hobbies',
  3181. 10035 => 'Books|Professional & Technical|Design',
  3182. 10036 => 'Books|Arts & Entertainment|Theater',
  3183. 10037 => 'Books|Professional & Technical|Education',
  3184. 10038 => 'Books|Nonfiction|Family & Relationships',
  3185. 10039 => 'Books|Fiction & Literature|Action & Adventure',
  3186. 10040 => 'Books|Fiction & Literature|African American',
  3187. 10041 => 'Books|Fiction & Literature|Religious',
  3188. 10042 => 'Books|Fiction & Literature|Classics',
  3189. 10043 => 'Books|Fiction & Literature|Erotica',
  3190. 10044 => 'Books|Sci-Fi & Fantasy|Fantasy',
  3191. 10045 => 'Books|Fiction & Literature|Gay',
  3192. 10046 => 'Books|Fiction & Literature|Ghost',
  3193. 10047 => 'Books|Fiction & Literature|Historical',
  3194. 10048 => 'Books|Fiction & Literature|Horror',
  3195. 10049 => 'Books|Fiction & Literature|Literary',
  3196. 10050 => 'Books|Mysteries & Thrillers|Hard-Boiled',
  3197. 10051 => 'Books|Mysteries & Thrillers|Historical',
  3198. 10052 => 'Books|Mysteries & Thrillers|Police Procedural',
  3199. 10053 => 'Books|Mysteries & Thrillers|Short Stories',
  3200. 10054 => 'Books|Mysteries & Thrillers|British Detectives',
  3201. 10055 => 'Books|Mysteries & Thrillers|Women Sleuths',
  3202. 10056 => 'Books|Romance|Erotic Romance',
  3203. 10057 => 'Books|Romance|Contemporary',
  3204. 10058 => 'Books|Romance|Paranormal',
  3205. 10059 => 'Books|Romance|Historical',
  3206. 10060 => 'Books|Romance|Short Stories',
  3207. 10061 => 'Books|Romance|Suspense',
  3208. 10062 => 'Books|Romance|Western',
  3209. 10063 => 'Books|Sci-Fi & Fantasy|Science Fiction',
  3210. 10064 => 'Books|Sci-Fi & Fantasy|Science Fiction & Literature',
  3211. 10065 => 'Books|Fiction & Literature|Short Stories',
  3212. 10066 => 'Books|Reference|Foreign Languages',
  3213. 10067 => 'Books|Arts & Entertainment|Games',
  3214. 10068 => 'Books|Lifestyle & Home|Gardening',
  3215. 10069 => 'Books|Health, Mind & Body|Health & Fitness',
  3216. 10070 => 'Books|History|Africa',
  3217. 10071 => 'Books|History|Americas',
  3218. 10072 => 'Books|History|Ancient',
  3219. 10073 => 'Books|History|Asia',
  3220. 10074 => 'Books|History|Australia & Oceania',
  3221. 10075 => 'Books|History|Europe',
  3222. 10076 => 'Books|History|Latin America',
  3223. 10077 => 'Books|History|Middle East',
  3224. 10078 => 'Books|History|Military',
  3225. 10079 => 'Books|History|United States',
  3226. 10080 => 'Books|History|World',
  3227. 10081 => "Books|Children & Teens|Children's Fiction",
  3228. 10082 => "Books|Children & Teens|Children's Nonfiction",
  3229. 10083 => 'Books|Professional & Technical|Law',
  3230. 10084 => 'Books|Fiction & Literature|Literary Criticism',
  3231. 10085 => 'Books|Science & Nature|Mathematics',
  3232. 10086 => 'Books|Professional & Technical|Medical',
  3233. 10087 => 'Books|Arts & Entertainment|Music',
  3234. 10088 => 'Books|Science & Nature|Nature',
  3235. 10089 => 'Books|Arts & Entertainment|Performing Arts',
  3236. 10090 => 'Books|Lifestyle & Home|Pets',
  3237. 10091 => 'Books|Nonfiction|Philosophy',
  3238. 10092 => 'Books|Arts & Entertainment|Photography',
  3239. 10093 => 'Books|Fiction & Literature|Poetry',
  3240. 10094 => 'Books|Health, Mind & Body|Psychology',
  3241. 10095 => 'Books|Reference|Almanacs & Yearbooks',
  3242. 10096 => 'Books|Reference|Atlases & Maps',
  3243. 10097 => 'Books|Reference|Catalogs & Directories',
  3244. 10098 => 'Books|Reference|Consumer Guides',
  3245. 10099 => 'Books|Reference|Dictionaries & Thesauruses',
  3246. 10100 => 'Books|Reference|Encyclopedias',
  3247. 10101 => 'Books|Reference|Etiquette',
  3248. 10102 => 'Books|Reference|Quotations',
  3249. 10103 => 'Books|Reference|Words & Language',
  3250. 10104 => 'Books|Reference|Writing',
  3251. 10105 => 'Books|Religion & Spirituality|Bible Studies',
  3252. 10106 => 'Books|Religion & Spirituality|Buddhism',
  3253. 10107 => 'Books|Religion & Spirituality|Christianity',
  3254. 10108 => 'Books|Religion & Spirituality|Hinduism',
  3255. 10109 => 'Books|Religion & Spirituality|Islam',
  3256. 10110 => 'Books|Religion & Spirituality|Judaism',
  3257. 10111 => 'Books|Science & Nature|Astronomy',
  3258. 10112 => 'Books|Science & Nature|Chemistry',
  3259. 10113 => 'Books|Science & Nature|Earth Sciences',
  3260. 10114 => 'Books|Science & Nature|Essays',
  3261. 10115 => 'Books|Science & Nature|History',
  3262. 10116 => 'Books|Science & Nature|Life Sciences',
  3263. 10117 => 'Books|Science & Nature|Physics',
  3264. 10118 => 'Books|Science & Nature|Reference',
  3265. 10119 => 'Books|Health, Mind & Body|Self-Improvement',
  3266. 10120 => 'Books|Nonfiction|Social Science',
  3267. 10121 => 'Books|Sports & Outdoors|Baseball',
  3268. 10122 => 'Books|Sports & Outdoors|Basketball',
  3269. 10123 => 'Books|Sports & Outdoors|Coaching',
  3270. 10124 => 'Books|Sports & Outdoors|Extreme Sports',
  3271. 10125 => 'Books|Sports & Outdoors|Football',
  3272. 10126 => 'Books|Sports & Outdoors|Golf',
  3273. 10127 => 'Books|Sports & Outdoors|Hockey',
  3274. 10128 => 'Books|Sports & Outdoors|Mountaineering',
  3275. 10129 => 'Books|Sports & Outdoors|Outdoors',
  3276. 10130 => 'Books|Sports & Outdoors|Racket Sports',
  3277. 10131 => 'Books|Sports & Outdoors|Reference',
  3278. 10132 => 'Books|Sports & Outdoors|Soccer',
  3279. 10133 => 'Books|Sports & Outdoors|Training',
  3280. 10134 => 'Books|Sports & Outdoors|Water Sports',
  3281. 10135 => 'Books|Sports & Outdoors|Winter Sports',
  3282. 10136 => 'Books|Reference|Study Aids',
  3283. 10137 => 'Books|Professional & Technical|Engineering',
  3284. 10138 => 'Books|Nonfiction|Transportation',
  3285. 10139 => 'Books|Travel & Adventure|Africa',
  3286. 10140 => 'Books|Travel & Adventure|Asia',
  3287. 10141 => 'Books|Travel & Adventure|Specialty Travel',
  3288. 10142 => 'Books|Travel & Adventure|Canada',
  3289. 10143 => 'Books|Travel & Adventure|Caribbean',
  3290. 10144 => 'Books|Travel & Adventure|Latin America',
  3291. 10145 => 'Books|Travel & Adventure|Essays & Memoirs',
  3292. 10146 => 'Books|Travel & Adventure|Europe',
  3293. 10147 => 'Books|Travel & Adventure|Middle East',
  3294. 10148 => 'Books|Travel & Adventure|United States',
  3295. 10149 => 'Books|Nonfiction|True Crime',
  3296. 11001 => 'Books|Sci-Fi & Fantasy|Fantasy|Contemporary',
  3297. 11002 => 'Books|Sci-Fi & Fantasy|Fantasy|Epic',
  3298. 11003 => 'Books|Sci-Fi & Fantasy|Fantasy|Historical',
  3299. 11004 => 'Books|Sci-Fi & Fantasy|Fantasy|Paranormal',
  3300. 11005 => 'Books|Sci-Fi & Fantasy|Fantasy|Short Stories',
  3301. 11006 => 'Books|Sci-Fi & Fantasy|Science Fiction & Literature|Adventure',
  3302. 11007 => 'Books|Sci-Fi & Fantasy|Science Fiction & Literature|High Tech',
  3303. 11008 => 'Books|Sci-Fi & Fantasy|Science Fiction & Literature|Short Stories',
  3304. 11009 => 'Books|Professional & Technical|Education|Language Arts & Disciplines',
  3305. 11010 => 'Books|Communications & Media',
  3306. 11011 => 'Books|Communications & Media|Broadcasting',
  3307. 11012 => 'Books|Communications & Media|Digital Media',
  3308. 11013 => 'Books|Communications & Media|Journalism',
  3309. 11014 => 'Books|Communications & Media|Photojournalism',
  3310. 11015 => 'Books|Communications & Media|Print',
  3311. 11016 => 'Books|Communications & Media|Speech',
  3312. 11017 => 'Books|Communications & Media|Writing',
  3313. 11018 => 'Books|Arts & Entertainment|Art & Architecture|Urban Planning',
  3314. 11019 => 'Books|Arts & Entertainment|Dance',
  3315. 11020 => 'Books|Arts & Entertainment|Fashion',
  3316. 11021 => 'Books|Arts & Entertainment|Film',
  3317. 11022 => 'Books|Arts & Entertainment|Interior Design',
  3318. 11023 => 'Books|Arts & Entertainment|Media Arts',
  3319. 11024 => 'Books|Arts & Entertainment|Radio',
  3320. 11025 => 'Books|Arts & Entertainment|TV',
  3321. 11026 => 'Books|Arts & Entertainment|Visual Arts',
  3322. 11027 => 'Books|Biographies & Memoirs|Arts & Entertainment',
  3323. 11028 => 'Books|Biographies & Memoirs|Business',
  3324. 11029 => 'Books|Biographies & Memoirs|Culinary',
  3325. 11030 => 'Books|Biographies & Memoirs|Gay & Lesbian',
  3326. 11031 => 'Books|Biographies & Memoirs|Historical',
  3327. 11032 => 'Books|Biographies & Memoirs|Literary',
  3328. 11033 => 'Books|Biographies & Memoirs|Media & Journalism',
  3329. 11034 => 'Books|Biographies & Memoirs|Military',
  3330. 11035 => 'Books|Biographies & Memoirs|Politics',
  3331. 11036 => 'Books|Biographies & Memoirs|Religious',
  3332. 11037 => 'Books|Biographies & Memoirs|Science & Technology',
  3333. 11038 => 'Books|Biographies & Memoirs|Sports',
  3334. 11039 => 'Books|Biographies & Memoirs|Women',
  3335. 11040 => 'Books|Romance|New Adult',
  3336. 11042 => 'Books|Romance|Romantic Comedy',
  3337. 11043 => 'Books|Romance|Gay & Lesbian',
  3338. 11044 => 'Books|Fiction & Literature|Essays',
  3339. 11045 => 'Books|Fiction & Literature|Anthologies',
  3340. 11046 => 'Books|Fiction & Literature|Comparative Literature',
  3341. 11047 => 'Books|Fiction & Literature|Drama',
  3342. 11049 => 'Books|Fiction & Literature|Fairy Tales, Myths & Fables',
  3343. 11050 => 'Books|Fiction & Literature|Family',
  3344. 11051 => 'Books|Comics & Graphic Novels|Manga|School Drama',
  3345. 11052 => 'Books|Comics & Graphic Novels|Manga|Human Drama',
  3346. 11053 => 'Books|Comics & Graphic Novels|Manga|Family Drama',
  3347. 11054 => 'Books|Sports & Outdoors|Boxing',
  3348. 11055 => 'Books|Sports & Outdoors|Cricket',
  3349. 11056 => 'Books|Sports & Outdoors|Cycling',
  3350. 11057 => 'Books|Sports & Outdoors|Equestrian',
  3351. 11058 => 'Books|Sports & Outdoors|Martial Arts & Self Defense',
  3352. 11059 => 'Books|Sports & Outdoors|Motor Sports',
  3353. 11060 => 'Books|Sports & Outdoors|Rugby',
  3354. 11061 => 'Books|Sports & Outdoors|Running',
  3355. 11062 => 'Books|Health, Mind & Body|Diet & Nutrition',
  3356. 11063 => 'Books|Science & Nature|Agriculture',
  3357. 11064 => 'Books|Science & Nature|Atmosphere',
  3358. 11065 => 'Books|Science & Nature|Biology',
  3359. 11066 => 'Books|Science & Nature|Ecology',
  3360. 11067 => 'Books|Science & Nature|Environment',
  3361. 11068 => 'Books|Science & Nature|Geography',
  3362. 11069 => 'Books|Science & Nature|Geology',
  3363. 11070 => 'Books|Nonfiction|Social Science|Anthropology',
  3364. 11071 => 'Books|Nonfiction|Social Science|Archaeology',
  3365. 11072 => 'Books|Nonfiction|Social Science|Civics',
  3366. 11073 => 'Books|Nonfiction|Social Science|Government',
  3367. 11074 => 'Books|Nonfiction|Social Science|Social Studies',
  3368. 11075 => 'Books|Nonfiction|Social Science|Social Welfare',
  3369. 11076 => 'Books|Nonfiction|Social Science|Society',
  3370. 11077 => 'Books|Nonfiction|Philosophy|Aesthetics',
  3371. 11078 => 'Books|Nonfiction|Philosophy|Epistemology',
  3372. 11079 => 'Books|Nonfiction|Philosophy|Ethics',
  3373. 11080 => 'Books|Nonfiction|Philosophy|Language',
  3374. 11081 => 'Books|Nonfiction|Philosophy|Logic',
  3375. 11082 => 'Books|Nonfiction|Philosophy|Metaphysics',
  3376. 11083 => 'Books|Nonfiction|Philosophy|Political',
  3377. 11084 => 'Books|Nonfiction|Philosophy|Religion',
  3378. 11085 => 'Books|Reference|Manuals',
  3379. 11086 => 'Books|Kids',
  3380. 11087 => 'Books|Kids|Animals',
  3381. 11088 => 'Books|Kids|Basic Concepts',
  3382. 11089 => 'Books|Kids|Basic Concepts|Alphabet',
  3383. 11090 => 'Books|Kids|Basic Concepts|Body',
  3384. 11091 => 'Books|Kids|Basic Concepts|Colors',
  3385. 11092 => 'Books|Kids|Basic Concepts|Counting & Numbers',
  3386. 11093 => 'Books|Kids|Basic Concepts|Date & Time',
  3387. 11094 => 'Books|Kids|Basic Concepts|General',
  3388. 11095 => 'Books|Kids|Basic Concepts|Money',
  3389. 11096 => 'Books|Kids|Basic Concepts|Opposites',
  3390. 11097 => 'Books|Kids|Basic Concepts|Seasons',
  3391. 11098 => 'Books|Kids|Basic Concepts|Senses & Sensation',
  3392. 11099 => 'Books|Kids|Basic Concepts|Size & Shape',
  3393. 11100 => 'Books|Kids|Basic Concepts|Sounds',
  3394. 11101 => 'Books|Kids|Basic Concepts|Words',
  3395. 11102 => 'Books|Kids|Biography',
  3396. 11103 => 'Books|Kids|Careers & Occupations',
  3397. 11104 => 'Books|Kids|Computers & Technology',
  3398. 11105 => 'Books|Kids|Cooking & Food',
  3399. 11106 => 'Books|Kids|Arts & Entertainment',
  3400. 11107 => 'Books|Kids|Arts & Entertainment|Art',
  3401. 11108 => 'Books|Kids|Arts & Entertainment|Crafts',
  3402. 11109 => 'Books|Kids|Arts & Entertainment|Music',
  3403. 11110 => 'Books|Kids|Arts & Entertainment|Performing Arts',
  3404. 11111 => 'Books|Kids|Family',
  3405. 11112 => 'Books|Kids|Fiction',
  3406. 11113 => 'Books|Kids|Fiction|Action & Adventure',
  3407. 11114 => 'Books|Kids|Fiction|Animals',
  3408. 11115 => 'Books|Kids|Fiction|Classics',
  3409. 11116 => 'Books|Kids|Fiction|Comics & Graphic Novels',
  3410. 11117 => 'Books|Kids|Fiction|Culture, Places & People',
  3411. 11118 => 'Books|Kids|Fiction|Family & Relationships',
  3412. 11119 => 'Books|Kids|Fiction|Fantasy',
  3413. 11120 => 'Books|Kids|Fiction|Fairy Tales, Myths & Fables',
  3414. 11121 => 'Books|Kids|Fiction|Favorite Characters',
  3415. 11122 => 'Books|Kids|Fiction|Historical',
  3416. 11123 => 'Books|Kids|Fiction|Holidays & Celebrations',
  3417. 11124 => 'Books|Kids|Fiction|Monsters & Ghosts',
  3418. 11125 => 'Books|Kids|Fiction|Mysteries',
  3419. 11126 => 'Books|Kids|Fiction|Nature',
  3420. 11127 => 'Books|Kids|Fiction|Religion',
  3421. 11128 => 'Books|Kids|Fiction|Sci-Fi',
  3422. 11129 => 'Books|Kids|Fiction|Social Issues',
  3423. 11130 => 'Books|Kids|Fiction|Sports & Recreation',
  3424. 11131 => 'Books|Kids|Fiction|Transportation',
  3425. 11132 => 'Books|Kids|Games & Activities',
  3426. 11133 => 'Books|Kids|General Nonfiction',
  3427. 11134 => 'Books|Kids|Health',
  3428. 11135 => 'Books|Kids|History',
  3429. 11136 => 'Books|Kids|Holidays & Celebrations',
  3430. 11137 => 'Books|Kids|Holidays & Celebrations|Birthdays',
  3431. 11138 => 'Books|Kids|Holidays & Celebrations|Christmas & Advent',
  3432. 11139 => 'Books|Kids|Holidays & Celebrations|Easter & Lent',
  3433. 11140 => 'Books|Kids|Holidays & Celebrations|General',
  3434. 11141 => 'Books|Kids|Holidays & Celebrations|Halloween',
  3435. 11142 => 'Books|Kids|Holidays & Celebrations|Hanukkah',
  3436. 11143 => 'Books|Kids|Holidays & Celebrations|Other',
  3437. 11144 => 'Books|Kids|Holidays & Celebrations|Passover',
  3438. 11145 => 'Books|Kids|Holidays & Celebrations|Patriotic Holidays',
  3439. 11146 => 'Books|Kids|Holidays & Celebrations|Ramadan',
  3440. 11147 => 'Books|Kids|Holidays & Celebrations|Thanksgiving',
  3441. 11148 => "Books|Kids|Holidays & Celebrations|Valentine's Day",
  3442. 11149 => 'Books|Kids|Humor',
  3443. 11150 => 'Books|Kids|Humor|Jokes & Riddles',
  3444. 11151 => 'Books|Kids|Poetry',
  3445. 11152 => 'Books|Kids|Learning to Read',
  3446. 11153 => 'Books|Kids|Learning to Read|Chapter Books',
  3447. 11154 => 'Books|Kids|Learning to Read|Early Readers',
  3448. 11155 => 'Books|Kids|Learning to Read|Intermediate Readers',
  3449. 11156 => 'Books|Kids|Nursery Rhymes',
  3450. 11157 => 'Books|Kids|Government',
  3451. 11158 => 'Books|Kids|Reference',
  3452. 11159 => 'Books|Kids|Religion',
  3453. 11160 => 'Books|Kids|Science & Nature',
  3454. 11161 => 'Books|Kids|Social Issues',
  3455. 11162 => 'Books|Kids|Social Studies',
  3456. 11163 => 'Books|Kids|Sports & Recreation',
  3457. 11164 => 'Books|Kids|Transportation',
  3458. 11165 => 'Books|Young Adult',
  3459. 11166 => 'Books|Young Adult|Animals',
  3460. 11167 => 'Books|Young Adult|Biography',
  3461. 11168 => 'Books|Young Adult|Careers & Occupations',
  3462. 11169 => 'Books|Young Adult|Computers & Technology',
  3463. 11170 => 'Books|Young Adult|Cooking & Food',
  3464. 11171 => 'Books|Young Adult|Arts & Entertainment',
  3465. 11172 => 'Books|Young Adult|Arts & Entertainment|Art',
  3466. 11173 => 'Books|Young Adult|Arts & Entertainment|Crafts',
  3467. 11174 => 'Books|Young Adult|Arts & Entertainment|Music',
  3468. 11175 => 'Books|Young Adult|Arts & Entertainment|Performing Arts',
  3469. 11176 => 'Books|Young Adult|Family',
  3470. 11177 => 'Books|Young Adult|Fiction',
  3471. 11178 => 'Books|Young Adult|Fiction|Action & Adventure',
  3472. 11179 => 'Books|Young Adult|Fiction|Animals',
  3473. 11180 => 'Books|Young Adult|Fiction|Classics',
  3474. 11181 => 'Books|Young Adult|Fiction|Comics & Graphic Novels',
  3475. 11182 => 'Books|Young Adult|Fiction|Culture, Places & People',
  3476. 11183 => 'Books|Young Adult|Fiction|Dystopian',
  3477. 11184 => 'Books|Young Adult|Fiction|Family & Relationships',
  3478. 11185 => 'Books|Young Adult|Fiction|Fantasy',
  3479. 11186 => 'Books|Young Adult|Fiction|Fairy Tales, Myths & Fables',
  3480. 11187 => 'Books|Young Adult|Fiction|Favorite Characters',
  3481. 11188 => 'Books|Young Adult|Fiction|Historical',
  3482. 11189 => 'Books|Young Adult|Fiction|Holidays & Celebrations',
  3483. 11190 => 'Books|Young Adult|Fiction|Horror, Monsters & Ghosts',
  3484. 11191 => 'Books|Young Adult|Fiction|Crime & Mystery',
  3485. 11192 => 'Books|Young Adult|Fiction|Nature',
  3486. 11193 => 'Books|Young Adult|Fiction|Religion',
  3487. 11194 => 'Books|Young Adult|Fiction|Romance',
  3488. 11195 => 'Books|Young Adult|Fiction|Sci-Fi',
  3489. 11196 => 'Books|Young Adult|Fiction|Coming of Age',
  3490. 11197 => 'Books|Young Adult|Fiction|Sports & Recreation',
  3491. 11198 => 'Books|Young Adult|Fiction|Transportation',
  3492. 11199 => 'Books|Young Adult|Games & Activities',
  3493. 11200 => 'Books|Young Adult|General Nonfiction',
  3494. 11201 => 'Books|Young Adult|Health',
  3495. 11202 => 'Books|Young Adult|History',
  3496. 11203 => 'Books|Young Adult|Holidays & Celebrations',
  3497. 11204 => 'Books|Young Adult|Holidays & Celebrations|Birthdays',
  3498. 11205 => 'Books|Young Adult|Holidays & Celebrations|Christmas & Advent',
  3499. 11206 => 'Books|Young Adult|Holidays & Celebrations|Easter & Lent',
  3500. 11207 => 'Books|Young Adult|Holidays & Celebrations|General',
  3501. 11208 => 'Books|Young Adult|Holidays & Celebrations|Halloween',
  3502. 11209 => 'Books|Young Adult|Holidays & Celebrations|Hanukkah',
  3503. 11210 => 'Books|Young Adult|Holidays & Celebrations|Other',
  3504. 11211 => 'Books|Young Adult|Holidays & Celebrations|Passover',
  3505. 11212 => 'Books|Young Adult|Holidays & Celebrations|Patriotic Holidays',
  3506. 11213 => 'Books|Young Adult|Holidays & Celebrations|Ramadan',
  3507. 11214 => 'Books|Young Adult|Holidays & Celebrations|Thanksgiving',
  3508. 11215 => "Books|Young Adult|Holidays & Celebrations|Valentine's Day",
  3509. 11216 => 'Books|Young Adult|Humor',
  3510. 11217 => 'Books|Young Adult|Humor|Jokes & Riddles',
  3511. 11218 => 'Books|Young Adult|Poetry',
  3512. 11219 => 'Books|Young Adult|Politics & Government',
  3513. 11220 => 'Books|Young Adult|Reference',
  3514. 11221 => 'Books|Young Adult|Religion',
  3515. 11222 => 'Books|Young Adult|Science & Nature',
  3516. 11223 => 'Books|Young Adult|Coming of Age',
  3517. 11224 => 'Books|Young Adult|Social Studies',
  3518. 11225 => 'Books|Young Adult|Sports & Recreation',
  3519. 11226 => 'Books|Young Adult|Transportation',
  3520. 11227 => 'Books|Communications & Media',
  3521. 11228 => 'Books|Military & Warfare',
  3522. 11229 => 'Books|Romance|Inspirational',
  3523. 11231 => 'Books|Romance|Holiday',
  3524. 11232 => 'Books|Romance|Wholesome',
  3525. 11233 => 'Books|Romance|Military',
  3526. 11234 => 'Books|Arts & Entertainment|Art History',
  3527. 11236 => 'Books|Arts & Entertainment|Design',
  3528. 11243 => 'Books|Business & Personal Finance|Accounting',
  3529. 11244 => 'Books|Business & Personal Finance|Hospitality',
  3530. 11245 => 'Books|Business & Personal Finance|Real Estate',
  3531. 11246 => 'Books|Humor|Jokes & Riddles',
  3532. 11247 => 'Books|Religion & Spirituality|Comparative Religion',
  3533. 11255 => 'Books|Cookbooks, Food & Wine|Culinary Arts',
  3534. 11259 => 'Books|Mysteries & Thrillers|Cozy',
  3535. 11260 => 'Books|Politics & Current Events|Current Events',
  3536. 11261 => 'Books|Politics & Current Events|Foreign Policy & International Relations',
  3537. 11262 => 'Books|Politics & Current Events|Local Government',
  3538. 11263 => 'Books|Politics & Current Events|National Government',
  3539. 11264 => 'Books|Politics & Current Events|Political Science',
  3540. 11265 => 'Books|Politics & Current Events|Public Administration',
  3541. 11266 => 'Books|Politics & Current Events|World Affairs',
  3542. 11273 => 'Books|Nonfiction|Family & Relationships|Family & Childcare',
  3543. 11274 => 'Books|Nonfiction|Family & Relationships|Love & Romance',
  3544. 11275 => 'Books|Sci-Fi & Fantasy|Fantasy|Urban',
  3545. 11276 => 'Books|Reference|Foreign Languages|Arabic',
  3546. 11277 => 'Books|Reference|Foreign Languages|Bilingual Editions',
  3547. 11278 => 'Books|Reference|Foreign Languages|African Languages',
  3548. 11279 => 'Books|Reference|Foreign Languages|Ancient Languages',
  3549. 11280 => 'Books|Reference|Foreign Languages|Chinese',
  3550. 11281 => 'Books|Reference|Foreign Languages|English',
  3551. 11282 => 'Books|Reference|Foreign Languages|French',
  3552. 11283 => 'Books|Reference|Foreign Languages|German',
  3553. 11284 => 'Books|Reference|Foreign Languages|Hebrew',
  3554. 11285 => 'Books|Reference|Foreign Languages|Hindi',
  3555. 11286 => 'Books|Reference|Foreign Languages|Italian',
  3556. 11287 => 'Books|Reference|Foreign Languages|Japanese',
  3557. 11288 => 'Books|Reference|Foreign Languages|Korean',
  3558. 11289 => 'Books|Reference|Foreign Languages|Linguistics',
  3559. 11290 => 'Books|Reference|Foreign Languages|Other Languages',
  3560. 11291 => 'Books|Reference|Foreign Languages|Portuguese',
  3561. 11292 => 'Books|Reference|Foreign Languages|Russian',
  3562. 11293 => 'Books|Reference|Foreign Languages|Spanish',
  3563. 11294 => 'Books|Reference|Foreign Languages|Speech Pathology',
  3564. 11295 => 'Books|Science & Nature|Mathematics|Advanced Mathematics',
  3565. 11296 => 'Books|Science & Nature|Mathematics|Algebra',
  3566. 11297 => 'Books|Science & Nature|Mathematics|Arithmetic',
  3567. 11298 => 'Books|Science & Nature|Mathematics|Calculus',
  3568. 11299 => 'Books|Science & Nature|Mathematics|Geometry',
  3569. 11300 => 'Books|Science & Nature|Mathematics|Statistics',
  3570. 11301 => 'Books|Professional & Technical|Medical|Veterinary',
  3571. 11302 => 'Books|Professional & Technical|Medical|Neuroscience',
  3572. 11303 => 'Books|Professional & Technical|Medical|Immunology',
  3573. 11304 => 'Books|Professional & Technical|Medical|Nursing',
  3574. 11305 => 'Books|Professional & Technical|Medical|Pharmacology & Toxicology',
  3575. 11306 => 'Books|Professional & Technical|Medical|Anatomy & Physiology',
  3576. 11307 => 'Books|Professional & Technical|Medical|Dentistry',
  3577. 11308 => 'Books|Professional & Technical|Medical|Emergency Medicine',
  3578. 11309 => 'Books|Professional & Technical|Medical|Genetics',
  3579. 11310 => 'Books|Professional & Technical|Medical|Psychiatry',
  3580. 11311 => 'Books|Professional & Technical|Medical|Radiology',
  3581. 11312 => 'Books|Professional & Technical|Medical|Alternative Medicine',
  3582. 11317 => 'Books|Nonfiction|Philosophy|Political Philosophy',
  3583. 11319 => 'Books|Nonfiction|Philosophy|Philosophy of Language',
  3584. 11320 => 'Books|Nonfiction|Philosophy|Philosophy of Religion',
  3585. 11327 => 'Books|Nonfiction|Social Science|Sociology',
  3586. 11329 => 'Books|Professional & Technical|Engineering|Aeronautics',
  3587. 11330 => 'Books|Professional & Technical|Engineering|Chemical & Petroleum Engineering',
  3588. 11331 => 'Books|Professional & Technical|Engineering|Civil Engineering',
  3589. 11332 => 'Books|Professional & Technical|Engineering|Computer Science',
  3590. 11333 => 'Books|Professional & Technical|Engineering|Electrical Engineering',
  3591. 11334 => 'Books|Professional & Technical|Engineering|Environmental Engineering',
  3592. 11335 => 'Books|Professional & Technical|Engineering|Mechanical Engineering',
  3593. 11336 => 'Books|Professional & Technical|Engineering|Power Resources',
  3594. 11337 => 'Books|Comics & Graphic Novels|Manga|Boys',
  3595. 11338 => 'Books|Comics & Graphic Novels|Manga|Men',
  3596. 11339 => 'Books|Comics & Graphic Novels|Manga|Girls',
  3597. 11340 => 'Books|Comics & Graphic Novels|Manga|Women',
  3598. 11341 => 'Books|Comics & Graphic Novels|Manga|Other',
  3599. 12001 => 'Mac App Store|Business',
  3600. 12002 => 'Mac App Store|Developer Tools',
  3601. 12003 => 'Mac App Store|Education',
  3602. 12004 => 'Mac App Store|Entertainment',
  3603. 12005 => 'Mac App Store|Finance',
  3604. 12006 => 'Mac App Store|Games',
  3605. 12007 => 'Mac App Store|Health & Fitness',
  3606. 12008 => 'Mac App Store|Lifestyle',
  3607. 12010 => 'Mac App Store|Medical',
  3608. 12011 => 'Mac App Store|Music',
  3609. 12012 => 'Mac App Store|News',
  3610. 12013 => 'Mac App Store|Photography',
  3611. 12014 => 'Mac App Store|Productivity',
  3612. 12015 => 'Mac App Store|Reference',
  3613. 12016 => 'Mac App Store|Social Networking',
  3614. 12017 => 'Mac App Store|Sports',
  3615. 12018 => 'Mac App Store|Travel',
  3616. 12019 => 'Mac App Store|Utilities',
  3617. 12020 => 'Mac App Store|Video',
  3618. 12021 => 'Mac App Store|Weather',
  3619. 12022 => 'Mac App Store|Graphics & Design',
  3620. 12201 => 'Mac App Store|Games|Action',
  3621. 12202 => 'Mac App Store|Games|Adventure',
  3622. 12203 => 'Mac App Store|Games|Arcade',
  3623. 12204 => 'Mac App Store|Games|Board',
  3624. 12205 => 'Mac App Store|Games|Card',
  3625. 12206 => 'Mac App Store|Games|Casino',
  3626. 12207 => 'Mac App Store|Games|Dice',
  3627. 12208 => 'Mac App Store|Games|Educational',
  3628. 12209 => 'Mac App Store|Games|Family',
  3629. 12210 => 'Mac App Store|Games|Kids',
  3630. 12211 => 'Mac App Store|Games|Music',
  3631. 12212 => 'Mac App Store|Games|Puzzle',
  3632. 12213 => 'Mac App Store|Games|Racing',
  3633. 12214 => 'Mac App Store|Games|Role Playing',
  3634. 12215 => 'Mac App Store|Games|Simulation',
  3635. 12216 => 'Mac App Store|Games|Sports',
  3636. 12217 => 'Mac App Store|Games|Strategy',
  3637. 12218 => 'Mac App Store|Games|Trivia',
  3638. 12219 => 'Mac App Store|Games|Word',
  3639. 13001 => 'App Store|Newsstand|News & Politics',
  3640. 13002 => 'App Store|Newsstand|Fashion & Style',
  3641. 13003 => 'App Store|Newsstand|Home & Garden',
  3642. 13004 => 'App Store|Newsstand|Outdoors & Nature',
  3643. 13005 => 'App Store|Newsstand|Sports & Leisure',
  3644. 13006 => 'App Store|Newsstand|Automotive',
  3645. 13007 => 'App Store|Newsstand|Arts & Photography',
  3646. 13008 => 'App Store|Newsstand|Brides & Weddings',
  3647. 13009 => 'App Store|Newsstand|Business & Investing',
  3648. 13010 => "App Store|Newsstand|Children's Magazines",
  3649. 13011 => 'App Store|Newsstand|Computers & Internet',
  3650. 13012 => 'App Store|Newsstand|Cooking, Food & Drink',
  3651. 13013 => 'App Store|Newsstand|Crafts & Hobbies',
  3652. 13014 => 'App Store|Newsstand|Electronics & Audio',
  3653. 13015 => 'App Store|Newsstand|Entertainment',
  3654. 13017 => 'App Store|Newsstand|Health, Mind & Body',
  3655. 13018 => 'App Store|Newsstand|History',
  3656. 13019 => 'App Store|Newsstand|Literary Magazines & Journals',
  3657. 13020 => "App Store|Newsstand|Men's Interest",
  3658. 13021 => 'App Store|Newsstand|Movies & Music',
  3659. 13023 => 'App Store|Newsstand|Parenting & Family',
  3660. 13024 => 'App Store|Newsstand|Pets',
  3661. 13025 => 'App Store|Newsstand|Professional & Trade',
  3662. 13026 => 'App Store|Newsstand|Regional News',
  3663. 13027 => 'App Store|Newsstand|Science',
  3664. 13028 => 'App Store|Newsstand|Teens',
  3665. 13029 => 'App Store|Newsstand|Travel & Regional',
  3666. 13030 => "App Store|Newsstand|Women's Interest",
  3667. 15000 => 'Textbooks|Arts & Entertainment',
  3668. 15001 => 'Textbooks|Arts & Entertainment|Art & Architecture',
  3669. 15002 => 'Textbooks|Arts & Entertainment|Art & Architecture|Urban Planning',
  3670. 15003 => 'Textbooks|Arts & Entertainment|Art History',
  3671. 15004 => 'Textbooks|Arts & Entertainment|Dance',
  3672. 15005 => 'Textbooks|Arts & Entertainment|Design',
  3673. 15006 => 'Textbooks|Arts & Entertainment|Fashion',
  3674. 15007 => 'Textbooks|Arts & Entertainment|Film',
  3675. 15008 => 'Textbooks|Arts & Entertainment|Games',
  3676. 15009 => 'Textbooks|Arts & Entertainment|Interior Design',
  3677. 15010 => 'Textbooks|Arts & Entertainment|Media Arts',
  3678. 15011 => 'Textbooks|Arts & Entertainment|Music',
  3679. 15012 => 'Textbooks|Arts & Entertainment|Performing Arts',
  3680. 15013 => 'Textbooks|Arts & Entertainment|Photography',
  3681. 15014 => 'Textbooks|Arts & Entertainment|Theater',
  3682. 15015 => 'Textbooks|Arts & Entertainment|TV',
  3683. 15016 => 'Textbooks|Arts & Entertainment|Visual Arts',
  3684. 15017 => 'Textbooks|Biographies & Memoirs',
  3685. 15018 => 'Textbooks|Business & Personal Finance',
  3686. 15019 => 'Textbooks|Business & Personal Finance|Accounting',
  3687. 15020 => 'Textbooks|Business & Personal Finance|Careers',
  3688. 15021 => 'Textbooks|Business & Personal Finance|Economics',
  3689. 15022 => 'Textbooks|Business & Personal Finance|Finance',
  3690. 15023 => 'Textbooks|Business & Personal Finance|Hospitality',
  3691. 15024 => 'Textbooks|Business & Personal Finance|Industries & Professions',
  3692. 15025 => 'Textbooks|Business & Personal Finance|Investing',
  3693. 15026 => 'Textbooks|Business & Personal Finance|Management & Leadership',
  3694. 15027 => 'Textbooks|Business & Personal Finance|Marketing & Sales',
  3695. 15028 => 'Textbooks|Business & Personal Finance|Personal Finance',
  3696. 15029 => 'Textbooks|Business & Personal Finance|Real Estate',
  3697. 15030 => 'Textbooks|Business & Personal Finance|Reference',
  3698. 15031 => 'Textbooks|Business & Personal Finance|Small Business & Entrepreneurship',
  3699. 15032 => 'Textbooks|Children & Teens',
  3700. 15033 => 'Textbooks|Children & Teens|Fiction',
  3701. 15034 => 'Textbooks|Children & Teens|Nonfiction',
  3702. 15035 => 'Textbooks|Comics & Graphic Novels',
  3703. 15036 => 'Textbooks|Comics & Graphic Novels|Graphic Novels',
  3704. 15037 => 'Textbooks|Comics & Graphic Novels|Manga',
  3705. 15038 => 'Textbooks|Communications & Media',
  3706. 15039 => 'Textbooks|Communications & Media|Broadcasting',
  3707. 15040 => 'Textbooks|Communications & Media|Digital Media',
  3708. 15041 => 'Textbooks|Communications & Media|Journalism',
  3709. 15042 => 'Textbooks|Communications & Media|Photojournalism',
  3710. 15043 => 'Textbooks|Communications & Media|Print',
  3711. 15044 => 'Textbooks|Communications & Media|Speech',
  3712. 15045 => 'Textbooks|Communications & Media|Writing',
  3713. 15046 => 'Textbooks|Computers & Internet',
  3714. 15047 => 'Textbooks|Computers & Internet|Computers',
  3715. 15048 => 'Textbooks|Computers & Internet|Databases',
  3716. 15049 => 'Textbooks|Computers & Internet|Digital Media',
  3717. 15050 => 'Textbooks|Computers & Internet|Internet',
  3718. 15051 => 'Textbooks|Computers & Internet|Network',
  3719. 15052 => 'Textbooks|Computers & Internet|Operating Systems',
  3720. 15053 => 'Textbooks|Computers & Internet|Programming',
  3721. 15054 => 'Textbooks|Computers & Internet|Software',
  3722. 15055 => 'Textbooks|Computers & Internet|System Administration',
  3723. 15056 => 'Textbooks|Cookbooks, Food & Wine',
  3724. 15057 => 'Textbooks|Cookbooks, Food & Wine|Beverages',
  3725. 15058 => 'Textbooks|Cookbooks, Food & Wine|Courses & Dishes',
  3726. 15059 => 'Textbooks|Cookbooks, Food & Wine|Culinary Arts',
  3727. 15060 => 'Textbooks|Cookbooks, Food & Wine|Methods',
  3728. 15061 => 'Textbooks|Cookbooks, Food & Wine|Reference',
  3729. 15062 => 'Textbooks|Cookbooks, Food & Wine|Regional & Ethnic',
  3730. 15063 => 'Textbooks|Cookbooks, Food & Wine|Special Diet',
  3731. 15064 => 'Textbooks|Cookbooks, Food & Wine|Special Occasions',
  3732. 15065 => 'Textbooks|Cookbooks, Food & Wine|Specific Ingredients',
  3733. 15066 => 'Textbooks|Engineering',
  3734. 15067 => 'Textbooks|Engineering|Aeronautics',
  3735. 15068 => 'Textbooks|Engineering|Chemical & Petroleum Engineering',
  3736. 15069 => 'Textbooks|Engineering|Civil Engineering',
  3737. 15070 => 'Textbooks|Engineering|Computer Science',
  3738. 15071 => 'Textbooks|Engineering|Electrical Engineering',
  3739. 15072 => 'Textbooks|Engineering|Environmental Engineering',
  3740. 15073 => 'Textbooks|Engineering|Mechanical Engineering',
  3741. 15074 => 'Textbooks|Engineering|Power Resources',
  3742. 15075 => 'Textbooks|Fiction & Literature',
  3743. 15076 => 'Textbooks|Fiction & Literature|Latino',
  3744. 15077 => 'Textbooks|Fiction & Literature|Action & Adventure',
  3745. 15078 => 'Textbooks|Fiction & Literature|African American',
  3746. 15079 => 'Textbooks|Fiction & Literature|Anthologies',
  3747. 15080 => 'Textbooks|Fiction & Literature|Classics',
  3748. 15081 => 'Textbooks|Fiction & Literature|Comparative Literature',
  3749. 15082 => 'Textbooks|Fiction & Literature|Erotica',
  3750. 15083 => 'Textbooks|Fiction & Literature|Gay',
  3751. 15084 => 'Textbooks|Fiction & Literature|Ghost',
  3752. 15085 => 'Textbooks|Fiction & Literature|Historical',
  3753. 15086 => 'Textbooks|Fiction & Literature|Horror',
  3754. 15087 => 'Textbooks|Fiction & Literature|Literary',
  3755. 15088 => 'Textbooks|Fiction & Literature|Literary Criticism',
  3756. 15089 => 'Textbooks|Fiction & Literature|Poetry',
  3757. 15090 => 'Textbooks|Fiction & Literature|Religious',
  3758. 15091 => 'Textbooks|Fiction & Literature|Short Stories',
  3759. 15092 => 'Textbooks|Health, Mind & Body',
  3760. 15093 => 'Textbooks|Health, Mind & Body|Fitness',
  3761. 15094 => 'Textbooks|Health, Mind & Body|Self-Improvement',
  3762. 15095 => 'Textbooks|History',
  3763. 15096 => 'Textbooks|History|Africa',
  3764. 15097 => 'Textbooks|History|Americas',
  3765. 15098 => 'Textbooks|History|Americas|Canada',
  3766. 15099 => 'Textbooks|History|Americas|Latin America',
  3767. 15100 => 'Textbooks|History|Americas|United States',
  3768. 15101 => 'Textbooks|History|Ancient',
  3769. 15102 => 'Textbooks|History|Asia',
  3770. 15103 => 'Textbooks|History|Australia & Oceania',
  3771. 15104 => 'Textbooks|History|Europe',
  3772. 15105 => 'Textbooks|History|Middle East',
  3773. 15106 => 'Textbooks|History|Military',
  3774. 15107 => 'Textbooks|History|World',
  3775. 15108 => 'Textbooks|Humor',
  3776. 15109 => 'Textbooks|Language Studies',
  3777. 15110 => 'Textbooks|Language Studies|African Languages',
  3778. 15111 => 'Textbooks|Language Studies|Ancient Languages',
  3779. 15112 => 'Textbooks|Language Studies|Arabic',
  3780. 15113 => 'Textbooks|Language Studies|Bilingual Editions',
  3781. 15114 => 'Textbooks|Language Studies|Chinese',
  3782. 15115 => 'Textbooks|Language Studies|English',
  3783. 15116 => 'Textbooks|Language Studies|French',
  3784. 15117 => 'Textbooks|Language Studies|German',
  3785. 15118 => 'Textbooks|Language Studies|Hebrew',
  3786. 15119 => 'Textbooks|Language Studies|Hindi',
  3787. 15120 => 'Textbooks|Language Studies|Indigenous Languages',
  3788. 15121 => 'Textbooks|Language Studies|Italian',
  3789. 15122 => 'Textbooks|Language Studies|Japanese',
  3790. 15123 => 'Textbooks|Language Studies|Korean',
  3791. 15124 => 'Textbooks|Language Studies|Linguistics',
  3792. 15125 => 'Textbooks|Language Studies|Other Language',
  3793. 15126 => 'Textbooks|Language Studies|Portuguese',
  3794. 15127 => 'Textbooks|Language Studies|Russian',
  3795. 15128 => 'Textbooks|Language Studies|Spanish',
  3796. 15129 => 'Textbooks|Language Studies|Speech Pathology',
  3797. 15130 => 'Textbooks|Lifestyle & Home',
  3798. 15131 => 'Textbooks|Lifestyle & Home|Antiques & Collectibles',
  3799. 15132 => 'Textbooks|Lifestyle & Home|Crafts & Hobbies',
  3800. 15133 => 'Textbooks|Lifestyle & Home|Gardening',
  3801. 15134 => 'Textbooks|Lifestyle & Home|Pets',
  3802. 15135 => 'Textbooks|Mathematics',
  3803. 15136 => 'Textbooks|Mathematics|Advanced Mathematics',
  3804. 15137 => 'Textbooks|Mathematics|Algebra',
  3805. 15138 => 'Textbooks|Mathematics|Arithmetic',
  3806. 15139 => 'Textbooks|Mathematics|Calculus',
  3807. 15140 => 'Textbooks|Mathematics|Geometry',
  3808. 15141 => 'Textbooks|Mathematics|Statistics',
  3809. 15142 => 'Textbooks|Medicine',
  3810. 15143 => 'Textbooks|Medicine|Anatomy & Physiology',
  3811. 15144 => 'Textbooks|Medicine|Dentistry',
  3812. 15145 => 'Textbooks|Medicine|Emergency Medicine',
  3813. 15146 => 'Textbooks|Medicine|Genetics',
  3814. 15147 => 'Textbooks|Medicine|Immunology',
  3815. 15148 => 'Textbooks|Medicine|Neuroscience',
  3816. 15149 => 'Textbooks|Medicine|Nursing',
  3817. 15150 => 'Textbooks|Medicine|Pharmacology & Toxicology',
  3818. 15151 => 'Textbooks|Medicine|Psychiatry',
  3819. 15152 => 'Textbooks|Medicine|Psychology',
  3820. 15153 => 'Textbooks|Medicine|Radiology',
  3821. 15154 => 'Textbooks|Medicine|Veterinary',
  3822. 15155 => 'Textbooks|Mysteries & Thrillers',
  3823. 15156 => 'Textbooks|Mysteries & Thrillers|British Detectives',
  3824. 15157 => 'Textbooks|Mysteries & Thrillers|Hard-Boiled',
  3825. 15158 => 'Textbooks|Mysteries & Thrillers|Historical',
  3826. 15159 => 'Textbooks|Mysteries & Thrillers|Police Procedural',
  3827. 15160 => 'Textbooks|Mysteries & Thrillers|Short Stories',
  3828. 15161 => 'Textbooks|Mysteries & Thrillers|Women Sleuths',
  3829. 15162 => 'Textbooks|Nonfiction',
  3830. 15163 => 'Textbooks|Nonfiction|Family & Relationships',
  3831. 15164 => 'Textbooks|Nonfiction|Transportation',
  3832. 15165 => 'Textbooks|Nonfiction|True Crime',
  3833. 15166 => 'Textbooks|Parenting',
  3834. 15167 => 'Textbooks|Philosophy',
  3835. 15168 => 'Textbooks|Philosophy|Aesthetics',
  3836. 15169 => 'Textbooks|Philosophy|Epistemology',
  3837. 15170 => 'Textbooks|Philosophy|Ethics',
  3838. 15171 => 'Textbooks|Philosophy|Philosophy of Language',
  3839. 15172 => 'Textbooks|Philosophy|Logic',
  3840. 15173 => 'Textbooks|Philosophy|Metaphysics',
  3841. 15174 => 'Textbooks|Philosophy|Political Philosophy',
  3842. 15175 => 'Textbooks|Philosophy|Philosophy of Religion',
  3843. 15176 => 'Textbooks|Politics & Current Events',
  3844. 15177 => 'Textbooks|Politics & Current Events|Current Events',
  3845. 15178 => 'Textbooks|Politics & Current Events|Foreign Policy & International Relations',
  3846. 15179 => 'Textbooks|Politics & Current Events|Local Governments',
  3847. 15180 => 'Textbooks|Politics & Current Events|National Governments',
  3848. 15181 => 'Textbooks|Politics & Current Events|Political Science',
  3849. 15182 => 'Textbooks|Politics & Current Events|Public Administration',
  3850. 15183 => 'Textbooks|Politics & Current Events|World Affairs',
  3851. 15184 => 'Textbooks|Professional & Technical',
  3852. 15185 => 'Textbooks|Professional & Technical|Design',
  3853. 15186 => 'Textbooks|Professional & Technical|Language Arts & Disciplines',
  3854. 15187 => 'Textbooks|Professional & Technical|Engineering',
  3855. 15188 => 'Textbooks|Professional & Technical|Law',
  3856. 15189 => 'Textbooks|Professional & Technical|Medical',
  3857. 15190 => 'Textbooks|Reference',
  3858. 15191 => 'Textbooks|Reference|Almanacs & Yearbooks',
  3859. 15192 => 'Textbooks|Reference|Atlases & Maps',
  3860. 15193 => 'Textbooks|Reference|Catalogs & Directories',
  3861. 15194 => 'Textbooks|Reference|Consumer Guides',
  3862. 15195 => 'Textbooks|Reference|Dictionaries & Thesauruses',
  3863. 15196 => 'Textbooks|Reference|Encyclopedias',
  3864. 15197 => 'Textbooks|Reference|Etiquette',
  3865. 15198 => 'Textbooks|Reference|Quotations',
  3866. 15199 => 'Textbooks|Reference|Study Aids',
  3867. 15200 => 'Textbooks|Reference|Words & Language',
  3868. 15201 => 'Textbooks|Reference|Writing',
  3869. 15202 => 'Textbooks|Religion & Spirituality',
  3870. 15203 => 'Textbooks|Religion & Spirituality|Bible Studies',
  3871. 15204 => 'Textbooks|Religion & Spirituality|Bibles',
  3872. 15205 => 'Textbooks|Religion & Spirituality|Buddhism',
  3873. 15206 => 'Textbooks|Religion & Spirituality|Christianity',
  3874. 15207 => 'Textbooks|Religion & Spirituality|Comparative Religion',
  3875. 15208 => 'Textbooks|Religion & Spirituality|Hinduism',
  3876. 15209 => 'Textbooks|Religion & Spirituality|Islam',
  3877. 15210 => 'Textbooks|Religion & Spirituality|Judaism',
  3878. 15211 => 'Textbooks|Religion & Spirituality|Spirituality',
  3879. 15212 => 'Textbooks|Romance',
  3880. 15213 => 'Textbooks|Romance|Contemporary',
  3881. 15214 => 'Textbooks|Romance|Erotic Romance',
  3882. 15215 => 'Textbooks|Romance|Paranormal',
  3883. 15216 => 'Textbooks|Romance|Historical',
  3884. 15217 => 'Textbooks|Romance|Short Stories',
  3885. 15218 => 'Textbooks|Romance|Suspense',
  3886. 15219 => 'Textbooks|Romance|Western',
  3887. 15220 => 'Textbooks|Sci-Fi & Fantasy',
  3888. 15221 => 'Textbooks|Sci-Fi & Fantasy|Fantasy',
  3889. 15222 => 'Textbooks|Sci-Fi & Fantasy|Fantasy|Contemporary',
  3890. 15223 => 'Textbooks|Sci-Fi & Fantasy|Fantasy|Epic',
  3891. 15224 => 'Textbooks|Sci-Fi & Fantasy|Fantasy|Historical',
  3892. 15225 => 'Textbooks|Sci-Fi & Fantasy|Fantasy|Paranormal',
  3893. 15226 => 'Textbooks|Sci-Fi & Fantasy|Fantasy|Short Stories',
  3894. 15227 => 'Textbooks|Sci-Fi & Fantasy|Science Fiction',
  3895. 15228 => 'Textbooks|Sci-Fi & Fantasy|Science Fiction & Literature',
  3896. 15229 => 'Textbooks|Sci-Fi & Fantasy|Science Fiction & Literature|Adventure',
  3897. 15230 => 'Textbooks|Sci-Fi & Fantasy|Science Fiction & Literature|High Tech',
  3898. 15231 => 'Textbooks|Sci-Fi & Fantasy|Science Fiction & Literature|Short Stories',
  3899. 15232 => 'Textbooks|Science & Nature',
  3900. 15233 => 'Textbooks|Science & Nature|Agriculture',
  3901. 15234 => 'Textbooks|Science & Nature|Astronomy',
  3902. 15235 => 'Textbooks|Science & Nature|Atmosphere',
  3903. 15236 => 'Textbooks|Science & Nature|Biology',
  3904. 15237 => 'Textbooks|Science & Nature|Chemistry',
  3905. 15238 => 'Textbooks|Science & Nature|Earth Sciences',
  3906. 15239 => 'Textbooks|Science & Nature|Ecology',
  3907. 15240 => 'Textbooks|Science & Nature|Environment',
  3908. 15241 => 'Textbooks|Science & Nature|Essays',
  3909. 15242 => 'Textbooks|Science & Nature|Geography',
  3910. 15243 => 'Textbooks|Science & Nature|Geology',
  3911. 15244 => 'Textbooks|Science & Nature|History',
  3912. 15245 => 'Textbooks|Science & Nature|Life Sciences',
  3913. 15246 => 'Textbooks|Science & Nature|Nature',
  3914. 15247 => 'Textbooks|Science & Nature|Physics',
  3915. 15248 => 'Textbooks|Science & Nature|Reference',
  3916. 15249 => 'Textbooks|Social Science',
  3917. 15250 => 'Textbooks|Social Science|Anthropology',
  3918. 15251 => 'Textbooks|Social Science|Archaeology',
  3919. 15252 => 'Textbooks|Social Science|Civics',
  3920. 15253 => 'Textbooks|Social Science|Government',
  3921. 15254 => 'Textbooks|Social Science|Social Studies',
  3922. 15255 => 'Textbooks|Social Science|Social Welfare',
  3923. 15256 => 'Textbooks|Social Science|Society',
  3924. 15257 => 'Textbooks|Social Science|Society|African Studies',
  3925. 15258 => 'Textbooks|Social Science|Society|American Studies',
  3926. 15259 => 'Textbooks|Social Science|Society|Asia Pacific Studies',
  3927. 15260 => 'Textbooks|Social Science|Society|Cross-Cultural Studies',
  3928. 15261 => 'Textbooks|Social Science|Society|European Studies',
  3929. 15262 => 'Textbooks|Social Science|Society|Immigration & Emigration',
  3930. 15263 => 'Textbooks|Social Science|Society|Indigenous Studies',
  3931. 15264 => 'Textbooks|Social Science|Society|Latin & Caribbean Studies',
  3932. 15265 => 'Textbooks|Social Science|Society|Middle Eastern Studies',
  3933. 15266 => 'Textbooks|Social Science|Society|Race & Ethnicity Studies',
  3934. 15267 => 'Textbooks|Social Science|Society|Sexuality Studies',
  3935. 15268 => "Textbooks|Social Science|Society|Women's Studies",
  3936. 15269 => 'Textbooks|Social Science|Sociology',
  3937. 15270 => 'Textbooks|Sports & Outdoors',
  3938. 15271 => 'Textbooks|Sports & Outdoors|Baseball',
  3939. 15272 => 'Textbooks|Sports & Outdoors|Basketball',
  3940. 15273 => 'Textbooks|Sports & Outdoors|Coaching',
  3941. 15274 => 'Textbooks|Sports & Outdoors|Equestrian',
  3942. 15275 => 'Textbooks|Sports & Outdoors|Extreme Sports',
  3943. 15276 => 'Textbooks|Sports & Outdoors|Football',
  3944. 15277 => 'Textbooks|Sports & Outdoors|Golf',
  3945. 15278 => 'Textbooks|Sports & Outdoors|Hockey',
  3946. 15279 => 'Textbooks|Sports & Outdoors|Motor Sports',
  3947. 15280 => 'Textbooks|Sports & Outdoors|Mountaineering',
  3948. 15281 => 'Textbooks|Sports & Outdoors|Outdoors',
  3949. 15282 => 'Textbooks|Sports & Outdoors|Racket Sports',
  3950. 15283 => 'Textbooks|Sports & Outdoors|Reference',
  3951. 15284 => 'Textbooks|Sports & Outdoors|Soccer',
  3952. 15285 => 'Textbooks|Sports & Outdoors|Training',
  3953. 15286 => 'Textbooks|Sports & Outdoors|Water Sports',
  3954. 15287 => 'Textbooks|Sports & Outdoors|Winter Sports',
  3955. 15288 => 'Textbooks|Teaching & Learning',
  3956. 15289 => 'Textbooks|Teaching & Learning|Adult Education',
  3957. 15290 => 'Textbooks|Teaching & Learning|Curriculum & Teaching',
  3958. 15291 => 'Textbooks|Teaching & Learning|Educational Leadership',
  3959. 15292 => 'Textbooks|Teaching & Learning|Educational Technology',
  3960. 15293 => 'Textbooks|Teaching & Learning|Family & Childcare',
  3961. 15294 => 'Textbooks|Teaching & Learning|Information & Library Science',
  3962. 15295 => 'Textbooks|Teaching & Learning|Learning Resources',
  3963. 15296 => 'Textbooks|Teaching & Learning|Psychology & Research',
  3964. 15297 => 'Textbooks|Teaching & Learning|Special Education',
  3965. 15298 => 'Textbooks|Travel & Adventure',
  3966. 15299 => 'Textbooks|Travel & Adventure|Africa',
  3967. 15300 => 'Textbooks|Travel & Adventure|Americas',
  3968. 15301 => 'Textbooks|Travel & Adventure|Americas|Canada',
  3969. 15302 => 'Textbooks|Travel & Adventure|Americas|Latin America',
  3970. 15303 => 'Textbooks|Travel & Adventure|Americas|United States',
  3971. 15304 => 'Textbooks|Travel & Adventure|Asia',
  3972. 15305 => 'Textbooks|Travel & Adventure|Caribbean',
  3973. 15306 => 'Textbooks|Travel & Adventure|Essays & Memoirs',
  3974. 15307 => 'Textbooks|Travel & Adventure|Europe',
  3975. 15308 => 'Textbooks|Travel & Adventure|Middle East',
  3976. 15309 => 'Textbooks|Travel & Adventure|Oceania',
  3977. 15310 => 'Textbooks|Travel & Adventure|Specialty Travel',
  3978. 15311 => 'Textbooks|Comics & Graphic Novels|Comics',
  3979. 15312 => 'Textbooks|Reference|Manuals',
  3980. 100000 => 'Music|Christian & Gospel',
  3981. 100001 => 'Music|Classical|Art Song',
  3982. 100002 => 'Music|Classical|Brass & Woodwinds',
  3983. 100003 => 'Music|Classical|Solo Instrumental',
  3984. 100004 => 'Music|Classical|Contemporary Era',
  3985. 100005 => 'Music|Classical|Oratorio',
  3986. 100006 => 'Music|Classical|Cantata',
  3987. 100007 => 'Music|Classical|Electronic',
  3988. 100008 => 'Music|Classical|Sacred',
  3989. 100009 => 'Music|Classical|Guitar',
  3990. 100010 => 'Music|Classical|Piano',
  3991. 100011 => 'Music|Classical|Violin',
  3992. 100012 => 'Music|Classical|Cello',
  3993. 100013 => 'Music|Classical|Percussion',
  3994. 100014 => 'Music|Electronic|Dubstep',
  3995. 100015 => 'Music|Electronic|Bass',
  3996. 100016 => 'Music|Hip-Hop/Rap|UK Hip-Hop',
  3997. 100017 => 'Music|Reggae|Lovers Rock',
  3998. 100018 => 'Music|Alternative|EMO',
  3999. 100019 => 'Music|Alternative|Pop Punk',
  4000. 100020 => 'Music|Alternative|Indie Pop',
  4001. 100021 => 'Music|New Age|Yoga',
  4002. 100022 => 'Music|Pop|Tribute',
  4003. 40000000 => 'iTunes U',
  4004. 40000001 => 'iTunes U|Business',
  4005. 40000002 => 'iTunes U|Business|Economics',
  4006. 40000003 => 'iTunes U|Business|Finance',
  4007. 40000004 => 'iTunes U|Business|Hospitality',
  4008. 40000005 => 'iTunes U|Business|Management',
  4009. 40000006 => 'iTunes U|Business|Marketing',
  4010. 40000007 => 'iTunes U|Business|Personal Finance',
  4011. 40000008 => 'iTunes U|Business|Real Estate',
  4012. 40000009 => 'iTunes U|Engineering',
  4013. 40000010 => 'iTunes U|Engineering|Chemical & Petroleum Engineering',
  4014. 40000011 => 'iTunes U|Engineering|Civil Engineering',
  4015. 40000012 => 'iTunes U|Engineering|Computer Science',
  4016. 40000013 => 'iTunes U|Engineering|Electrical Engineering',
  4017. 40000014 => 'iTunes U|Engineering|Environmental Engineering',
  4018. 40000015 => 'iTunes U|Engineering|Mechanical Engineering',
  4019. 40000016 => 'iTunes U|Art & Architecture',
  4020. 40000017 => 'iTunes U|Art & Architecture|Architecture',
  4021. 40000019 => 'iTunes U|Art & Architecture|Art History',
  4022. 40000020 => 'iTunes U|Art & Architecture|Dance',
  4023. 40000021 => 'iTunes U|Art & Architecture|Film',
  4024. 40000022 => 'iTunes U|Art & Architecture|Design',
  4025. 40000023 => 'iTunes U|Art & Architecture|Interior Design',
  4026. 40000024 => 'iTunes U|Art & Architecture|Music',
  4027. 40000025 => 'iTunes U|Art & Architecture|Theater',
  4028. 40000026 => 'iTunes U|Health & Medicine',
  4029. 40000027 => 'iTunes U|Health & Medicine|Anatomy & Physiology',
  4030. 40000028 => 'iTunes U|Health & Medicine|Behavioral Science',
  4031. 40000029 => 'iTunes U|Health & Medicine|Dentistry',
  4032. 40000030 => 'iTunes U|Health & Medicine|Diet & Nutrition',
  4033. 40000031 => 'iTunes U|Health & Medicine|Emergency Medicine',
  4034. 40000032 => 'iTunes U|Health & Medicine|Genetics',
  4035. 40000033 => 'iTunes U|Health & Medicine|Gerontology',
  4036. 40000034 => 'iTunes U|Health & Medicine|Health & Exercise Science',
  4037. 40000035 => 'iTunes U|Health & Medicine|Immunology',
  4038. 40000036 => 'iTunes U|Health & Medicine|Neuroscience',
  4039. 40000037 => 'iTunes U|Health & Medicine|Pharmacology & Toxicology',
  4040. 40000038 => 'iTunes U|Health & Medicine|Psychiatry',
  4041. 40000039 => 'iTunes U|Health & Medicine|Global Health',
  4042. 40000040 => 'iTunes U|Health & Medicine|Radiology',
  4043. 40000041 => 'iTunes U|History',
  4044. 40000042 => 'iTunes U|History|Ancient History',
  4045. 40000043 => 'iTunes U|History|Medieval History',
  4046. 40000044 => 'iTunes U|History|Military History',
  4047. 40000045 => 'iTunes U|History|Modern History',
  4048. 40000046 => 'iTunes U|History|African History',
  4049. 40000047 => 'iTunes U|History|Asia-Pacific History',
  4050. 40000048 => 'iTunes U|History|European History',
  4051. 40000049 => 'iTunes U|History|Middle Eastern History',
  4052. 40000050 => 'iTunes U|History|North American History',
  4053. 40000051 => 'iTunes U|History|South American History',
  4054. 40000053 => 'iTunes U|Communications & Media',
  4055. 40000054 => 'iTunes U|Philosophy',
  4056. 40000055 => 'iTunes U|Religion & Spirituality',
  4057. 40000056 => 'iTunes U|Language',
  4058. 40000057 => 'iTunes U|Language|African Languages',
  4059. 40000058 => 'iTunes U|Language|Ancient Languages',
  4060. 40000061 => 'iTunes U|Language|English',
  4061. 40000063 => 'iTunes U|Language|French',
  4062. 40000064 => 'iTunes U|Language|German',
  4063. 40000065 => 'iTunes U|Language|Italian',
  4064. 40000066 => 'iTunes U|Language|Linguistics',
  4065. 40000068 => 'iTunes U|Language|Spanish',
  4066. 40000069 => 'iTunes U|Language|Speech Pathology',
  4067. 40000070 => 'iTunes U|Literature',
  4068. 40000071 => 'iTunes U|Literature|Anthologies',
  4069. 40000072 => 'iTunes U|Literature|Biography',
  4070. 40000073 => 'iTunes U|Literature|Classics',
  4071. 40000074 => 'iTunes U|Literature|Literary Criticism',
  4072. 40000075 => 'iTunes U|Literature|Fiction',
  4073. 40000076 => 'iTunes U|Literature|Poetry',
  4074. 40000077 => 'iTunes U|Mathematics',
  4075. 40000078 => 'iTunes U|Mathematics|Advanced Mathematics',
  4076. 40000079 => 'iTunes U|Mathematics|Algebra',
  4077. 40000080 => 'iTunes U|Mathematics|Arithmetic',
  4078. 40000081 => 'iTunes U|Mathematics|Calculus',
  4079. 40000082 => 'iTunes U|Mathematics|Geometry',
  4080. 40000083 => 'iTunes U|Mathematics|Statistics',
  4081. 40000084 => 'iTunes U|Science',
  4082. 40000085 => 'iTunes U|Science|Agricultural',
  4083. 40000086 => 'iTunes U|Science|Astronomy',
  4084. 40000087 => 'iTunes U|Science|Atmosphere',
  4085. 40000088 => 'iTunes U|Science|Biology',
  4086. 40000089 => 'iTunes U|Science|Chemistry',
  4087. 40000090 => 'iTunes U|Science|Ecology',
  4088. 40000091 => 'iTunes U|Science|Geography',
  4089. 40000092 => 'iTunes U|Science|Geology',
  4090. 40000093 => 'iTunes U|Science|Physics',
  4091. 40000094 => 'iTunes U|Psychology & Social Science',
  4092. 40000095 => 'iTunes U|Law & Politics|Law',
  4093. 40000096 => 'iTunes U|Law & Politics|Political Science',
  4094. 40000097 => 'iTunes U|Law & Politics|Public Administration',
  4095. 40000098 => 'iTunes U|Psychology & Social Science|Psychology',
  4096. 40000099 => 'iTunes U|Psychology & Social Science|Social Welfare',
  4097. 40000100 => 'iTunes U|Psychology & Social Science|Sociology',
  4098. 40000101 => 'iTunes U|Society',
  4099. 40000103 => 'iTunes U|Society|Asia Pacific Studies',
  4100. 40000104 => 'iTunes U|Society|European Studies',
  4101. 40000105 => 'iTunes U|Society|Indigenous Studies',
  4102. 40000106 => 'iTunes U|Society|Latin & Caribbean Studies',
  4103. 40000107 => 'iTunes U|Society|Middle Eastern Studies',
  4104. 40000108 => "iTunes U|Society|Women's Studies",
  4105. 40000109 => 'iTunes U|Teaching & Learning',
  4106. 40000110 => 'iTunes U|Teaching & Learning|Curriculum & Teaching',
  4107. 40000111 => 'iTunes U|Teaching & Learning|Educational Leadership',
  4108. 40000112 => 'iTunes U|Teaching & Learning|Family & Childcare',
  4109. 40000113 => 'iTunes U|Teaching & Learning|Learning Resources',
  4110. 40000114 => 'iTunes U|Teaching & Learning|Psychology & Research',
  4111. 40000115 => 'iTunes U|Teaching & Learning|Special Education',
  4112. 40000116 => 'iTunes U|Art & Architecture|Culinary Arts',
  4113. 40000117 => 'iTunes U|Art & Architecture|Fashion',
  4114. 40000118 => 'iTunes U|Art & Architecture|Media Arts',
  4115. 40000119 => 'iTunes U|Art & Architecture|Photography',
  4116. 40000120 => 'iTunes U|Art & Architecture|Visual Art',
  4117. 40000121 => 'iTunes U|Business|Entrepreneurship',
  4118. 40000122 => 'iTunes U|Communications & Media|Broadcasting',
  4119. 40000123 => 'iTunes U|Communications & Media|Digital Media',
  4120. 40000124 => 'iTunes U|Communications & Media|Journalism',
  4121. 40000125 => 'iTunes U|Communications & Media|Photojournalism',
  4122. 40000126 => 'iTunes U|Communications & Media|Print',
  4123. 40000127 => 'iTunes U|Communications & Media|Speech',
  4124. 40000128 => 'iTunes U|Communications & Media|Writing',
  4125. 40000129 => 'iTunes U|Health & Medicine|Nursing',
  4126. 40000130 => 'iTunes U|Language|Arabic',
  4127. 40000131 => 'iTunes U|Language|Chinese',
  4128. 40000132 => 'iTunes U|Language|Hebrew',
  4129. 40000133 => 'iTunes U|Language|Hindi',
  4130. 40000134 => 'iTunes U|Language|Indigenous Languages',
  4131. 40000135 => 'iTunes U|Language|Japanese',
  4132. 40000136 => 'iTunes U|Language|Korean',
  4133. 40000137 => 'iTunes U|Language|Other Languages',
  4134. 40000138 => 'iTunes U|Language|Portuguese',
  4135. 40000139 => 'iTunes U|Language|Russian',
  4136. 40000140 => 'iTunes U|Law & Politics',
  4137. 40000141 => 'iTunes U|Law & Politics|Foreign Policy & International Relations',
  4138. 40000142 => 'iTunes U|Law & Politics|Local Governments',
  4139. 40000143 => 'iTunes U|Law & Politics|National Governments',
  4140. 40000144 => 'iTunes U|Law & Politics|World Affairs',
  4141. 40000145 => 'iTunes U|Literature|Comparative Literature',
  4142. 40000146 => 'iTunes U|Philosophy|Aesthetics',
  4143. 40000147 => 'iTunes U|Philosophy|Epistemology',
  4144. 40000148 => 'iTunes U|Philosophy|Ethics',
  4145. 40000149 => 'iTunes U|Philosophy|Metaphysics',
  4146. 40000150 => 'iTunes U|Philosophy|Political Philosophy',
  4147. 40000151 => 'iTunes U|Philosophy|Logic',
  4148. 40000152 => 'iTunes U|Philosophy|Philosophy of Language',
  4149. 40000153 => 'iTunes U|Philosophy|Philosophy of Religion',
  4150. 40000154 => 'iTunes U|Psychology & Social Science|Archaeology',
  4151. 40000155 => 'iTunes U|Psychology & Social Science|Anthropology',
  4152. 40000156 => 'iTunes U|Religion & Spirituality|Buddhism',
  4153. 40000157 => 'iTunes U|Religion & Spirituality|Christianity',
  4154. 40000158 => 'iTunes U|Religion & Spirituality|Comparative Religion',
  4155. 40000159 => 'iTunes U|Religion & Spirituality|Hinduism',
  4156. 40000160 => 'iTunes U|Religion & Spirituality|Islam',
  4157. 40000161 => 'iTunes U|Religion & Spirituality|Judaism',
  4158. 40000162 => 'iTunes U|Religion & Spirituality|Other Religions',
  4159. 40000163 => 'iTunes U|Religion & Spirituality|Spirituality',
  4160. 40000164 => 'iTunes U|Science|Environment',
  4161. 40000165 => 'iTunes U|Society|African Studies',
  4162. 40000166 => 'iTunes U|Society|American Studies',
  4163. 40000167 => 'iTunes U|Society|Cross-cultural Studies',
  4164. 40000168 => 'iTunes U|Society|Immigration & Emigration',
  4165. 40000169 => 'iTunes U|Society|Race & Ethnicity Studies',
  4166. 40000170 => 'iTunes U|Society|Sexuality Studies',
  4167. 40000171 => 'iTunes U|Teaching & Learning|Educational Technology',
  4168. 40000172 => 'iTunes U|Teaching & Learning|Information/Library Science',
  4169. 40000173 => 'iTunes U|Language|Dutch',
  4170. 40000174 => 'iTunes U|Language|Luxembourgish',
  4171. 40000175 => 'iTunes U|Language|Swedish',
  4172. 40000176 => 'iTunes U|Language|Norwegian',
  4173. 40000177 => 'iTunes U|Language|Finnish',
  4174. 40000178 => 'iTunes U|Language|Danish',
  4175. 40000179 => 'iTunes U|Language|Polish',
  4176. 40000180 => 'iTunes U|Language|Turkish',
  4177. 40000181 => 'iTunes U|Language|Flemish',
  4178. 50000024 => 'Audiobooks',
  4179. 50000040 => 'Audiobooks|Fiction',
  4180. 50000041 => 'Audiobooks|Arts & Entertainment',
  4181. 50000042 => 'Audiobooks|Biography & Memoir',
  4182. 50000043 => 'Audiobooks|Business',
  4183. 50000044 => 'Audiobooks|Kids & Young Adults',
  4184. 50000045 => 'Audiobooks|Classics',
  4185. 50000046 => 'Audiobooks|Comedy',
  4186. 50000047 => 'Audiobooks|Drama & Poetry',
  4187. 50000048 => 'Audiobooks|Speakers & Storytellers',
  4188. 50000049 => 'Audiobooks|History',
  4189. 50000050 => 'Audiobooks|Languages',
  4190. 50000051 => 'Audiobooks|Mystery',
  4191. 50000052 => 'Audiobooks|Nonfiction',
  4192. 50000053 => 'Audiobooks|Religion & Spirituality',
  4193. 50000054 => 'Audiobooks|Science',
  4194. 50000055 => 'Audiobooks|Sci Fi & Fantasy',
  4195. 50000056 => 'Audiobooks|Self Development',
  4196. 50000057 => 'Audiobooks|Sports',
  4197. 50000058 => 'Audiobooks|Technology',
  4198. 50000059 => 'Audiobooks|Travel & Adventure',
  4199. 50000061 => 'Music|Spoken Word',
  4200. 50000063 => 'Music|Disney',
  4201. 50000064 => 'Music|French Pop',
  4202. 50000066 => 'Music|German Pop',
  4203. 50000068 => 'Music|German Folk',
  4204. 50000069 => 'Audiobooks|Romance',
  4205. 50000070 => 'Audiobooks|Audiobooks Latino',
  4206. 50000071 => 'Books|Comics & Graphic Novels|Manga|Action',
  4207. 50000072 => 'Books|Comics & Graphic Novels|Manga|Comedy',
  4208. 50000073 => 'Books|Comics & Graphic Novels|Manga|Erotica',
  4209. 50000074 => 'Books|Comics & Graphic Novels|Manga|Fantasy',
  4210. 50000075 => 'Books|Comics & Graphic Novels|Manga|Four Cell Manga',
  4211. 50000076 => 'Books|Comics & Graphic Novels|Manga|Gay & Lesbian',
  4212. 50000077 => 'Books|Comics & Graphic Novels|Manga|Hard-Boiled',
  4213. 50000078 => 'Books|Comics & Graphic Novels|Manga|Heroes',
  4214. 50000079 => 'Books|Comics & Graphic Novels|Manga|Historical Fiction',
  4215. 50000080 => 'Books|Comics & Graphic Novels|Manga|Mecha',
  4216. 50000081 => 'Books|Comics & Graphic Novels|Manga|Mystery',
  4217. 50000082 => 'Books|Comics & Graphic Novels|Manga|Nonfiction',
  4218. 50000083 => 'Books|Comics & Graphic Novels|Manga|Religious',
  4219. 50000084 => 'Books|Comics & Graphic Novels|Manga|Romance',
  4220. 50000085 => 'Books|Comics & Graphic Novels|Manga|Romantic Comedy',
  4221. 50000086 => 'Books|Comics & Graphic Novels|Manga|Science Fiction',
  4222. 50000087 => 'Books|Comics & Graphic Novels|Manga|Sports',
  4223. 50000088 => 'Books|Fiction & Literature|Light Novels',
  4224. 50000089 => 'Books|Comics & Graphic Novels|Manga|Horror',
  4225. 50000090 => 'Books|Comics & Graphic Novels|Comics',
  4226. },
  4227. },
  4228. grup => 'Grouping', #10
  4229. hdvd => { #10
  4230. Name => 'HDVideo',
  4231. PrintConv => { 0 => 'No', 1 => 'Yes' },
  4232. },
  4233. keyw => 'Keyword', #7
  4234. ldes => 'LongDescription', #10
  4235. pcst => { #7
  4236. Name => 'Podcast',
  4237. PrintConv => { 0 => 'No', 1 => 'Yes' },
  4238. },
  4239. perf => 'Performer',
  4240. plID => { #10 (or TV season)
  4241. Name => 'PlayListID',
  4242. Format => 'int8u', # actually int64u, but split it up
  4243. },
  4244. purd => 'PurchaseDate', #7
  4245. purl => 'PodcastURL', #7
  4246. rtng => { #10
  4247. Name => 'Rating',
  4248. PrintConv => {
  4249. 0 => 'none',
  4250. 1 => 'Explicit',
  4251. 2 => 'Clean',
  4252. 4 => 'Explicit (old)',
  4253. },
  4254. },
  4255. sfID => { #10
  4256. Name => 'AppleStoreCountry',
  4257. Format => 'int32u',
  4258. SeparateTable => 1,
  4259. PrintConv => { #21
  4260. 143441 => 'United States', # USA
  4261. 143442 => 'France', # FRA
  4262. 143443 => 'Germany', # DEU
  4263. 143444 => 'United Kingdom', # GBR
  4264. 143445 => 'Austria', # AUT
  4265. 143446 => 'Belgium', # BEL
  4266. 143447 => 'Finland', # FIN
  4267. 143448 => 'Greece', # GRC
  4268. 143449 => 'Ireland', # IRL
  4269. 143450 => 'Italy', # ITA
  4270. 143451 => 'Luxembourg', # LUX
  4271. 143452 => 'Netherlands', # NLD
  4272. 143453 => 'Portugal', # PRT
  4273. 143454 => 'Spain', # ESP
  4274. 143455 => 'Canada', # CAN
  4275. 143456 => 'Sweden', # SWE
  4276. 143457 => 'Norway', # NOR
  4277. 143458 => 'Denmark', # DNK
  4278. 143459 => 'Switzerland', # CHE
  4279. 143460 => 'Australia', # AUS
  4280. 143461 => 'New Zealand', # NZL
  4281. 143462 => 'Japan', # JPN
  4282. 143463 => 'Hong Kong', # HKG
  4283. 143464 => 'Singapore', # SGP
  4284. 143465 => 'China', # CHN
  4285. 143466 => 'Republic of Korea', # KOR
  4286. 143467 => 'India', # IND
  4287. 143468 => 'Mexico', # MEX
  4288. 143469 => 'Russia', # RUS
  4289. 143470 => 'Taiwan', # TWN
  4290. 143471 => 'Vietnam', # VNM
  4291. 143472 => 'South Africa', # ZAF
  4292. 143473 => 'Malaysia', # MYS
  4293. 143474 => 'Philippines', # PHL
  4294. 143475 => 'Thailand', # THA
  4295. 143476 => 'Indonesia', # IDN
  4296. 143477 => 'Pakistan', # PAK
  4297. 143478 => 'Poland', # POL
  4298. 143479 => 'Saudi Arabia', # SAU
  4299. 143480 => 'Turkey', # TUR
  4300. 143481 => 'United Arab Emirates', # ARE
  4301. 143482 => 'Hungary', # HUN
  4302. 143483 => 'Chile', # CHL
  4303. 143484 => 'Nepal', # NPL
  4304. 143485 => 'Panama', # PAN
  4305. 143486 => 'Sri Lanka', # LKA
  4306. 143487 => 'Romania', # ROU
  4307. 143489 => 'Czech Republic', # CZE
  4308. 143491 => 'Israel', # ISR
  4309. 143492 => 'Ukraine', # UKR
  4310. 143493 => 'Kuwait', # KWT
  4311. 143494 => 'Croatia', # HRV
  4312. 143495 => 'Costa Rica', # CRI
  4313. 143496 => 'Slovakia', # SVK
  4314. 143497 => 'Lebanon', # LBN
  4315. 143498 => 'Qatar', # QAT
  4316. 143499 => 'Slovenia', # SVN
  4317. 143501 => 'Colombia', # COL
  4318. 143502 => 'Venezuela', # VEN
  4319. 143503 => 'Brazil', # BRA
  4320. 143504 => 'Guatemala', # GTM
  4321. 143505 => 'Argentina', # ARG
  4322. 143506 => 'El Salvador', # SLV
  4323. 143507 => 'Peru', # PER
  4324. 143508 => 'Dominican Republic', # DOM
  4325. 143509 => 'Ecuador', # ECU
  4326. 143510 => 'Honduras', # HND
  4327. 143511 => 'Jamaica', # JAM
  4328. 143512 => 'Nicaragua', # NIC
  4329. 143513 => 'Paraguay', # PRY
  4330. 143514 => 'Uruguay', # URY
  4331. 143515 => 'Macau', # MAC
  4332. 143516 => 'Egypt', # EGY
  4333. 143517 => 'Kazakhstan', # KAZ
  4334. 143518 => 'Estonia', # EST
  4335. 143519 => 'Latvia', # LVA
  4336. 143520 => 'Lithuania', # LTU
  4337. 143521 => 'Malta', # MLT
  4338. 143523 => 'Moldova', # MDA
  4339. 143524 => 'Armenia', # ARM
  4340. 143525 => 'Botswana', # BWA
  4341. 143526 => 'Bulgaria', # BGR
  4342. 143528 => 'Jordan', # JOR
  4343. 143529 => 'Kenya', # KEN
  4344. 143530 => 'Macedonia', # MKD
  4345. 143531 => 'Madagascar', # MDG
  4346. 143532 => 'Mali', # MLI
  4347. 143533 => 'Mauritius', # MUS
  4348. 143534 => 'Niger', # NER
  4349. 143535 => 'Senegal', # SEN
  4350. 143536 => 'Tunisia', # TUN
  4351. 143537 => 'Uganda', # UGA
  4352. 143538 => 'Anguilla', # AIA
  4353. 143539 => 'Bahamas', # BHS
  4354. 143540 => 'Antigua and Barbuda', # ATG
  4355. 143541 => 'Barbados', # BRB
  4356. 143542 => 'Bermuda', # BMU
  4357. 143543 => 'British Virgin Islands', # VGB
  4358. 143544 => 'Cayman Islands', # CYM
  4359. 143545 => 'Dominica', # DMA
  4360. 143546 => 'Grenada', # GRD
  4361. 143547 => 'Montserrat', # MSR
  4362. 143548 => 'St. Kitts and Nevis', # KNA
  4363. 143549 => 'St. Lucia', # LCA
  4364. 143550 => 'St. Vincent and The Grenadines', # VCT
  4365. 143551 => 'Trinidad and Tobago', # TTO
  4366. 143552 => 'Turks and Caicos', # TCA
  4367. 143553 => 'Guyana', # GUY
  4368. 143554 => 'Suriname', # SUR
  4369. 143555 => 'Belize', # BLZ
  4370. 143556 => 'Bolivia', # BOL
  4371. 143557 => 'Cyprus', # CYP
  4372. 143558 => 'Iceland', # ISL
  4373. 143559 => 'Bahrain', # BHR
  4374. 143560 => 'Brunei Darussalam', # BRN
  4375. 143561 => 'Nigeria', # NGA
  4376. 143562 => 'Oman', # OMN
  4377. 143563 => 'Algeria', # DZA
  4378. 143564 => 'Angola', # AGO
  4379. 143565 => 'Belarus', # BLR
  4380. 143566 => 'Uzbekistan', # UZB
  4381. 143568 => 'Azerbaijan', # AZE
  4382. 143571 => 'Yemen', # YEM
  4383. 143572 => 'Tanzania', # TZA
  4384. 143573 => 'Ghana', # GHA
  4385. 143575 => 'Albania', # ALB
  4386. 143576 => 'Benin', # BEN
  4387. 143577 => 'Bhutan', # BTN
  4388. 143578 => 'Burkina Faso', # BFA
  4389. 143579 => 'Cambodia', # KHM
  4390. 143580 => 'Cape Verde', # CPV
  4391. 143581 => 'Chad', # TCD
  4392. 143582 => 'Republic of the Congo', # COG
  4393. 143583 => 'Fiji', # FJI
  4394. 143584 => 'Gambia', # GMB
  4395. 143585 => 'Guinea-Bissau', # GNB
  4396. 143586 => 'Kyrgyzstan', # KGZ
  4397. 143587 => "Lao People's Democratic Republic", # LAO
  4398. 143588 => 'Liberia', # LBR
  4399. 143589 => 'Malawi', # MWI
  4400. 143590 => 'Mauritania', # MRT
  4401. 143591 => 'Federated States of Micronesia', # FSM
  4402. 143592 => 'Mongolia', # MNG
  4403. 143593 => 'Mozambique', # MOZ
  4404. 143594 => 'Namibia', # NAM
  4405. 143595 => 'Palau', # PLW
  4406. 143597 => 'Papua New Guinea', # PNG
  4407. 143598 => 'Sao Tome and Principe', # STP (S&atilde;o Tom&eacute; and Pr&iacute;ncipe)
  4408. 143599 => 'Seychelles', # SYC
  4409. 143600 => 'Sierra Leone', # SLE
  4410. 143601 => 'Solomon Islands', # SLB
  4411. 143602 => 'Swaziland', # SWZ
  4412. 143603 => 'Tajikistan', # TJK
  4413. 143604 => 'Turkmenistan', # TKM
  4414. 143605 => 'Zimbabwe', # ZWE
  4415. },
  4416. },
  4417. soaa => 'SortAlbumArtist', #10
  4418. soal => 'SortAlbum', #10
  4419. soar => 'SortArtist', #10
  4420. soco => 'SortComposer', #10
  4421. sonm => 'SortName', #10
  4422. sosn => 'SortShow', #10
  4423. stik => { #10
  4424. Name => 'MediaType',
  4425. PrintConvColumns => 2,
  4426. PrintConv => { #(http://weblog.xanga.com/gryphondwb/615474010/iphone-ringtones---what-did-itunes-741-really-do.html)
  4427. 0 => 'Movie',
  4428. 1 => 'Normal (Music)',
  4429. 2 => 'Audiobook',
  4430. 5 => 'Whacked Bookmark',
  4431. 6 => 'Music Video',
  4432. 9 => 'Short Film',
  4433. 10 => 'TV Show',
  4434. 11 => 'Booklet',
  4435. 14 => 'Ringtone',
  4436. 21 => 'Podcast', #15
  4437. },
  4438. },
  4439. rate => 'RatingPercent', #PH
  4440. titl => 'Title',
  4441. tven => 'TVEpisodeID', #7
  4442. tves => { #7/10
  4443. Name => 'TVEpisode',
  4444. Format => 'int32u',
  4445. },
  4446. tvnn => 'TVNetworkName', #7
  4447. tvsh => 'TVShow', #10
  4448. tvsn => { #7/10
  4449. Name => 'TVSeason',
  4450. Format => 'int32u',
  4451. },
  4452. yrrc => 'Year', #(ffmpeg source)
  4453. itnu => { #PH (iTunes 10.5)
  4454. Name => 'iTunesU',
  4455. Description => 'iTunes U',
  4456. PrintConv => { 0 => 'No', 1 => 'Yes' },
  4457. },
  4458. #https://github.com/communitymedia/mediautilities/blob/master/src/net/sourceforge/jaad/mp4/boxes/BoxTypes.java
  4459. gshh => { Name => 'GoogleHostHeader', Format => 'string' },
  4460. gspm => { Name => 'GooglePingMessage', Format => 'string' },
  4461. gspu => { Name => 'GooglePingURL', Format => 'string' },
  4462. gssd => { Name => 'GoogleSourceData', Format => 'string' },
  4463. gsst => { Name => 'GoogleStartTime', Format => 'string' },
  4464. gstd => { Name => 'GoogleTrackDuration',Format => 'string', ValueConv => '$val / 1000', PrintConv => 'ConvertDuration($val)' },
  4465. # atoms observed in AAX audiobooks (ref PH)
  4466. "\xa9cpy" => { Name => 'Copyright', Groups => { 2 => 'Author' } },
  4467. "\xa9pub" => 'Publisher',
  4468. "\xa9nrt" => 'Narrator',
  4469. '@pti' => 'ParentTitle', # (guess -- same as "\xa9nam")
  4470. '@PST' => 'ParentShortTitle', # (guess -- same as "\xa9nam")
  4471. '@ppi' => 'ParentProductID', # (guess -- same as 'prID')
  4472. '@sti' => 'ShortTitle', # (guess -- same as "\xa9nam")
  4473. prID => 'ProductID',
  4474. rldt => { Name => 'ReleaseDate', Groups => { 2 => 'Time' }},
  4475. CDEK => { Name => 'Unknown_CDEK', Unknown => 1 }, # eg: "B004ZMTFEG" - used in URL's ("asin=")
  4476. CDET => { Name => 'Unknown_CDET', Unknown => 1 }, # eg: "ADBL"
  4477. VERS => 'ProductVersion',
  4478. GUID => 'GUID',
  4479. AACR => { Name => 'Unknown_AACR', Unknown => 1 }, # eg: "CR!1T1H1QH6WX7T714G2BMFX3E9MC4S"
  4480. # ausr - 30 bytes (User Alias?)
  4481. );
  4482. # item list keys (ref PH)
  4483. %Image::ExifTool::QuickTime::Keys = (
  4484. PROCESS_PROC => \&Image::ExifTool::QuickTime::ProcessKeys,
  4485. VARS => { LONG_TAGS => 1 },
  4486. NOTES => q{
  4487. This directory contains a list of key names which are used to decode
  4488. ItemList tags written by the "mdta" handler. The prefix of
  4489. "com.apple.quicktime." has been removed from all TagID's below.
  4490. },
  4491. version => 'Version',
  4492. album => 'Album',
  4493. artist => { },
  4494. artwork => { },
  4495. author => { Name => 'Author', Groups => { 2 => 'Author' } },
  4496. comment => { },
  4497. copyright => { Name => 'Copyright', Groups => { 2 => 'Author' } },
  4498. creationdate=> {
  4499. Name => 'CreationDate',
  4500. Groups => { 2 => 'Time' },
  4501. ValueConv => q{
  4502. require Image::ExifTool::XMP;
  4503. $val = Image::ExifTool::XMP::ConvertXMPDate($val,1);
  4504. $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
  4505. return $val;
  4506. },
  4507. PrintConv => '$self->ConvertDateTime($val)',
  4508. },
  4509. description => { },
  4510. director => { },
  4511. title => { }, #22
  4512. genre => { },
  4513. information => { },
  4514. keywords => { },
  4515. producer => { }, #22
  4516. make => { Name => 'Make', Groups => { 2 => 'Camera' } },
  4517. model => { Name => 'Model', Groups => { 2 => 'Camera' } },
  4518. publisher => { },
  4519. software => { },
  4520. year => { Groups => { 2 => 'Time' } },
  4521. 'camera.identifier' => 'CameraIdentifier', # (iPhone 4)
  4522. 'camera.framereadouttimeinmicroseconds' => { # (iPhone 4)
  4523. Name => 'FrameReadoutTime',
  4524. ValueConv => '$val * 1e-6',
  4525. PrintConv => '$val * 1e6 . " microseconds"',
  4526. },
  4527. 'location.ISO6709' => {
  4528. Name => 'GPSCoordinates',
  4529. Groups => { 2 => 'Location' },
  4530. ValueConv => \&ConvertISO6709,
  4531. PrintConv => \&PrintGPSCoordinates,
  4532. },
  4533. 'location.name' => { Name => 'LocationName', Groups => { 2 => 'Location' } },
  4534. 'location.body' => { Name => 'LocationBody', Groups => { 2 => 'Location' } },
  4535. 'location.note' => { Name => 'LocationNote', Groups => { 2 => 'Location' } },
  4536. 'location.role' => {
  4537. Name => 'LocationRole',
  4538. Groups => { 2 => 'Location' },
  4539. PrintConv => {
  4540. 0 => 'Shooting Location',
  4541. 1 => 'Real Location',
  4542. 2 => 'Fictional Location',
  4543. },
  4544. },
  4545. 'location.date' => {
  4546. Name => 'LocationDate',
  4547. Groups => { 2 => 'Time' },
  4548. ValueConv => q{
  4549. require Image::ExifTool::XMP;
  4550. $val = Image::ExifTool::XMP::ConvertXMPDate($val);
  4551. $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
  4552. return $val;
  4553. },
  4554. PrintConv => '$self->ConvertDateTime($val)',
  4555. },
  4556. 'direction.facing' => { Name => 'CameraDirection', Groups => { 2 => 'Location' } },
  4557. 'direction.motion' => { Name => 'CameraMotion', Groups => { 2 => 'Location' } },
  4558. 'location.body' => { Name => 'LocationBody', Groups => { 2 => 'Location' } },
  4559. 'player.version' => 'PlayerVersion',
  4560. 'player.movie.visual.brightness'=> 'Brightness',
  4561. 'player.movie.visual.color' => 'Color',
  4562. 'player.movie.visual.tint' => 'Tint',
  4563. 'player.movie.visual.contrast' => 'Contrast',
  4564. 'player.movie.audio.gain' => 'AudioGain',
  4565. 'player.movie.audio.treble' => 'Trebel',
  4566. 'player.movie.audio.bass' => 'Bass',
  4567. 'player.movie.audio.balance' => 'Balance',
  4568. 'player.movie.audio.pitchshift' => 'PitchShift',
  4569. 'player.movie.audio.mute' => {
  4570. Name => 'Mute',
  4571. Format => 'int8u',
  4572. PrintConv => { 0 => 'Off', 1 => 'On' },
  4573. },
  4574. 'rating.user' => 'UserRating', # (Canon ELPH 510 HS)
  4575. 'collection.user' => 'UserCollection', #22
  4576. 'Encoded_With' => 'EncodedWith',
  4577. );
  4578. # iTunes info ('----') atoms
  4579. %Image::ExifTool::QuickTime::iTunesInfo = (
  4580. PROCESS_PROC => \&ProcessMOV,
  4581. GROUPS => { 2 => 'Audio' },
  4582. NOTES => q{
  4583. ExifTool will extract any iTunesInfo tags that exist, even if they are not
  4584. defined in this table.
  4585. },
  4586. # 'mean'/'name'/'data' atoms form a triplet, but unfortunately
  4587. # I haven't been able to find any documentation on this.
  4588. # 'mean' is normally 'com.apple.iTunes'
  4589. mean => {
  4590. Name => 'Mean',
  4591. # the 'Triplet' flag tells ProcessMOV() to generate
  4592. # a single tag from the mean/name/data triplet
  4593. Triplet => 1,
  4594. Hidden => 1,
  4595. },
  4596. name => {
  4597. Name => 'Name',
  4598. Triplet => 1,
  4599. Hidden => 1,
  4600. },
  4601. data => {
  4602. Name => 'Data',
  4603. Triplet => 1,
  4604. Hidden => 1,
  4605. },
  4606. # the tag ID's below are composed from "mean/name",
  4607. # but "mean/" is omitted if it is "com.apple.iTunes/":
  4608. 'iTunMOVI' => {
  4609. Name => 'iTunMOVI',
  4610. SubDirectory => { TagTable => 'Image::ExifTool::PLIST::Main' },
  4611. },
  4612. 'tool' => {
  4613. Name => 'iTunTool',
  4614. Description => 'iTunTool',
  4615. Format => 'int32u',
  4616. PrintConv => 'sprintf("0x%.8x",$val)',
  4617. },
  4618. 'iTunEXTC' => {
  4619. Name => 'ContentRating',
  4620. Notes => 'standard | rating | score | reasons',
  4621. # eg. 'us-tv|TV-14|500|V', 'mpaa|PG-13|300|For violence and sexuality'
  4622. # (see http://shadowofged.blogspot.ca/2008/06/itunes-content-ratings.html)
  4623. },
  4624. 'iTunNORM' => {
  4625. Name => 'VolumeNormalization',
  4626. PrintConv => '$val=~s/ 0+(\w)/ $1/g; $val=~s/^\s+//; $val',
  4627. },
  4628. 'iTunSMPB' => {
  4629. Name => 'iTunSMPB',
  4630. Description => 'iTunSMPB',
  4631. # hex format, similar to iTunNORM, but 12 words instead of 10,
  4632. # and 4th word is 16 hex digits (all others are 8)
  4633. # (gives AAC encoder delay, ref http://code.google.com/p/l-smash/issues/detail?id=1)
  4634. PrintConv => '$val=~s/ 0+(\w)/ $1/g; $val=~s/^\s+//; $val',
  4635. },
  4636. # (CDDB = Compact Disc DataBase)
  4637. # iTunes_CDDB_1 = <CDDB1 disk ID>+<# tracks>+<logical block address for each track>...
  4638. 'iTunes_CDDB_1' => 'CDDB1Info',
  4639. 'iTunes_CDDB_TrackNumber' => 'CDDBTrackNumber',
  4640. 'Encoding Params' => {
  4641. Name => 'EncodingParams',
  4642. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::EncodingParams' },
  4643. },
  4644. # also heard about 'iTunPGAP', but I haven't seen a sample
  4645. DISCNUMBER => 'DiscNumber', #PH
  4646. TRACKNUMBER => 'TrackNumber', #PH
  4647. popularimeter => 'Popularimeter', #PH
  4648. );
  4649. # iTunes audio encoding parameters
  4650. # ref https://developer.apple.com/library/mac/#documentation/MusicAudio/Reference/AudioCodecServicesRef/Reference/reference.html
  4651. %Image::ExifTool::QuickTime::EncodingParams = (
  4652. PROCESS_PROC => \&ProcessEncodingParams,
  4653. GROUPS => { 2 => 'Audio' },
  4654. # (I have commented out the ones that don't have integer values because they
  4655. # probably don't appear, and definitly wouldn't work with current decoding - PH)
  4656. # global codec properties
  4657. #'lnam' => 'AudioCodecName',
  4658. #'lmak' => 'AudioCodecManufacturer',
  4659. #'lfor' => 'AudioCodecFormat',
  4660. 'vpk?' => 'AudioHasVariablePacketByteSizes',
  4661. #'ifm#' => 'AudioSupportedInputFormats',
  4662. #'ofm#' => 'AudioSupportedOutputFormats',
  4663. #'aisr' => 'AudioAvailableInputSampleRates',
  4664. #'aosr' => 'AudioAvailableOutputSampleRates',
  4665. 'abrt' => 'AudioAvailableBitRateRange',
  4666. 'mnip' => 'AudioMinimumNumberInputPackets',
  4667. 'mnop' => 'AudioMinimumNumberOutputPackets',
  4668. 'cmnc' => 'AudioAvailableNumberChannels',
  4669. 'lmrc' => 'AudioDoesSampleRateConversion',
  4670. #'aicl' => 'AudioAvailableInputChannelLayoutTags',
  4671. #'aocl' => 'AudioAvailableOutputChannelLayoutTags',
  4672. #'if4o' => 'AudioInputFormatsForOutputFormat',
  4673. #'of4i' => 'AudioOutputFormatsForInputFormat',
  4674. #'acfi' => 'AudioFormatInfo',
  4675. # instance codec properties
  4676. 'tbuf' => 'AudioInputBufferSize',
  4677. 'pakf' => 'AudioPacketFrameSize',
  4678. 'pakb' => 'AudioMaximumPacketByteSize',
  4679. #'ifmt' => 'AudioCurrentInputFormat',
  4680. #'ofmt' => 'AudioCurrentOutputFormat',
  4681. #'kuki' => 'AudioMagicCookie',
  4682. 'ubuf' => 'AudioUsedInputBufferSize',
  4683. 'init' => 'AudioIsInitialized',
  4684. 'brat' => 'AudioCurrentTargetBitRate',
  4685. #'cisr' => 'AudioCurrentInputSampleRate',
  4686. #'cosr' => 'AudioCurrentOutputSampleRate',
  4687. 'srcq' => 'AudioQualitySetting',
  4688. #'brta' => 'AudioApplicableBitRateRange',
  4689. #'isra' => 'AudioApplicableInputSampleRates',
  4690. #'osra' => 'AudioApplicableOutputSampleRates',
  4691. 'pad0' => 'AudioZeroFramesPadded',
  4692. 'prmm' => 'AudioCodecPrimeMethod',
  4693. #'prim' => 'AudioCodecPrimeInfo',
  4694. #'icl ' => 'AudioInputChannelLayout',
  4695. #'ocl ' => 'AudioOutputChannelLayout',
  4696. #'acs ' => 'AudioCodecSettings',
  4697. #'acfl' => 'AudioCodecFormatList',
  4698. 'acbf' => 'AudioBitRateControlMode',
  4699. 'vbrq' => 'AudioVBRQuality',
  4700. 'mdel' => 'AudioMinimumDelayMode',
  4701. # deprecated
  4702. 'pakd' => 'AudioRequiresPacketDescription',
  4703. #'brt#' => 'AudioAvailableBitRates',
  4704. 'acef' => 'AudioExtendFrequencies',
  4705. 'ursr' => 'AudioUseRecommendedSampleRate',
  4706. 'oppr' => 'AudioOutputPrecedence',
  4707. #'loud' => 'AudioCurrentLoudnessStatistics',
  4708. # others
  4709. 'vers' => 'AudioEncodingParamsVersion', #PH
  4710. 'cdcv' => { #PH
  4711. Name => 'AudioComponentVersion',
  4712. ValueConv => 'join ".", unpack("ncc", pack("N",$val))',
  4713. },
  4714. );
  4715. # print to video data block
  4716. %Image::ExifTool::QuickTime::Video = (
  4717. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  4718. GROUPS => { 2 => 'Video' },
  4719. 0 => {
  4720. Name => 'DisplaySize',
  4721. PrintConv => {
  4722. 0 => 'Normal',
  4723. 1 => 'Double Size',
  4724. 2 => 'Half Size',
  4725. 3 => 'Full Screen',
  4726. 4 => 'Current Size',
  4727. },
  4728. },
  4729. 6 => {
  4730. Name => 'SlideShow',
  4731. PrintConv => {
  4732. 0 => 'No',
  4733. 1 => 'Yes',
  4734. },
  4735. },
  4736. );
  4737. # 'hnti' atoms
  4738. %Image::ExifTool::QuickTime::HintInfo = (
  4739. PROCESS_PROC => \&ProcessMOV,
  4740. GROUPS => { 2 => 'Video' },
  4741. 'rtp ' => {
  4742. Name => 'RealtimeStreamingProtocol',
  4743. PrintConv => '$val=~s/^sdp /(SDP) /; $val',
  4744. },
  4745. 'sdp ' => 'StreamingDataProtocol',
  4746. );
  4747. # 'hinf' atoms
  4748. %Image::ExifTool::QuickTime::HintTrackInfo = (
  4749. PROCESS_PROC => \&ProcessMOV,
  4750. GROUPS => { 2 => 'Video' },
  4751. trpY => { Name => 'TotalBytes', Format => 'int64u' }, #(documented)
  4752. trpy => { Name => 'TotalBytes', Format => 'int64u' }, #(observed)
  4753. totl => { Name => 'TotalBytes', Format => 'int32u' },
  4754. nump => { Name => 'NumPackets', Format => 'int64u' },
  4755. npck => { Name => 'NumPackets', Format => 'int32u' },
  4756. tpyl => { Name => 'TotalBytesNoRTPHeaders', Format => 'int64u' },
  4757. tpaY => { Name => 'TotalBytesNoRTPHeaders', Format => 'int32u' }, #(documented)
  4758. tpay => { Name => 'TotalBytesNoRTPHeaders', Format => 'int32u' }, #(observed)
  4759. maxr => {
  4760. Name => 'MaxDataRate',
  4761. Format => 'int32u',
  4762. Count => 2,
  4763. PrintConv => 'my @a=split(" ",$val);sprintf("%d bytes in %.3f s",$a[1],$a[0]/1000)',
  4764. },
  4765. dmed => { Name => 'MediaTrackBytes', Format => 'int64u' },
  4766. dimm => { Name => 'ImmediateDataBytes', Format => 'int64u' },
  4767. drep => { Name => 'RepeatedDataBytes', Format => 'int64u' },
  4768. tmin => {
  4769. Name => 'MinTransmissionTime',
  4770. Format => 'int32u',
  4771. PrintConv => 'sprintf("%.3f s",$val/1000)',
  4772. },
  4773. tmax => {
  4774. Name => 'MaxTransmissionTime',
  4775. Format => 'int32u',
  4776. PrintConv => 'sprintf("%.3f s",$val/1000)',
  4777. },
  4778. pmax => { Name => 'LargestPacketSize', Format => 'int32u' },
  4779. dmax => {
  4780. Name => 'LargestPacketDuration',
  4781. Format => 'int32u',
  4782. PrintConv => 'sprintf("%.3f s",$val/1000)',
  4783. },
  4784. payt => {
  4785. Name => 'PayloadType',
  4786. Format => 'undef', # (necessary to prevent decoding as string!)
  4787. ValueConv => 'unpack("N",$val) . " " . substr($val, 5)',
  4788. PrintConv => '$val=~s/ /, /;$val',
  4789. },
  4790. );
  4791. # MP4 media box (ref 5)
  4792. %Image::ExifTool::QuickTime::Media = (
  4793. PROCESS_PROC => \&ProcessMOV,
  4794. WRITE_PROC => \&WriteQuickTime,
  4795. GROUPS => { 1 => 'Track#', 2 => 'Video' },
  4796. NOTES => 'MP4 media box.',
  4797. mdhd => {
  4798. Name => 'MediaHeader',
  4799. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MediaHeader' },
  4800. },
  4801. hdlr => {
  4802. Name => 'Handler',
  4803. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Handler' },
  4804. },
  4805. minf => {
  4806. Name => 'MediaInfo',
  4807. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MediaInfo' },
  4808. },
  4809. );
  4810. # MP4 media header box (ref 5)
  4811. %Image::ExifTool::QuickTime::MediaHeader = (
  4812. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  4813. WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
  4814. GROUPS => { 1 => 'Track#', 2 => 'Video' },
  4815. FORMAT => 'int32u',
  4816. DATAMEMBER => [ 0, 1, 2, 3, 4 ],
  4817. 0 => {
  4818. Name => 'MediaHeaderVersion',
  4819. RawConv => '$$self{MediaHeaderVersion} = $val',
  4820. },
  4821. 1 => {
  4822. Name => 'MediaCreateDate',
  4823. Groups => { 2 => 'Time' },
  4824. %timeInfo,
  4825. # this is int64u if MediaHeaderVersion == 1 (ref 5/13)
  4826. Hook => '$$self{MediaHeaderVersion} and $format = "int64u", $varSize += 4',
  4827. },
  4828. 2 => {
  4829. Name => 'MediaModifyDate',
  4830. Groups => { 2 => 'Time' },
  4831. %timeInfo,
  4832. # this is int64u if MediaHeaderVersion == 1 (ref 5/13)
  4833. Hook => '$$self{MediaHeaderVersion} and $format = "int64u", $varSize += 4',
  4834. },
  4835. 3 => {
  4836. Name => 'MediaTimeScale',
  4837. RawConv => '$$self{MediaTS} = $val',
  4838. },
  4839. 4 => {
  4840. Name => 'MediaDuration',
  4841. RawConv => '$$self{MediaTS} ? $val / $$self{MediaTS} : $val',
  4842. PrintConv => '$$self{MediaTS} ? ConvertDuration($val) : $val',
  4843. # this is int64u if MediaHeaderVersion == 1 (ref 5/13)
  4844. Hook => '$$self{MediaHeaderVersion} and $format = "int64u", $varSize += 4',
  4845. },
  4846. 5 => {
  4847. Name => 'MediaLanguageCode',
  4848. Format => 'int16u',
  4849. RawConv => '$val ? $val : undef',
  4850. # allow both Macintosh (for MOV files) and ISO (for MP4 files) language codes
  4851. ValueConv => '$val < 0x400 ? $val : pack "C*", map { (($val>>$_)&0x1f)+0x60 } 10, 5, 0',
  4852. PrintConv => q{
  4853. return $val unless $val =~ /^\d+$/;
  4854. require Image::ExifTool::Font;
  4855. return $Image::ExifTool::Font::ttLang{Macintosh}{$val} || "Unknown ($val)";
  4856. },
  4857. },
  4858. );
  4859. # MP4 media information box (ref 5)
  4860. %Image::ExifTool::QuickTime::MediaInfo = (
  4861. PROCESS_PROC => \&ProcessMOV,
  4862. GROUPS => { 1 => 'Track#', 2 => 'Video' },
  4863. NOTES => 'MP4 media info box.',
  4864. vmhd => {
  4865. Name => 'VideoHeader',
  4866. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::VideoHeader' },
  4867. },
  4868. smhd => {
  4869. Name => 'AudioHeader',
  4870. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::AudioHeader' },
  4871. },
  4872. hmhd => {
  4873. Name => 'HintHeader',
  4874. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HintHeader' },
  4875. },
  4876. nmhd => {
  4877. Name => 'NullMediaHeader',
  4878. Flags => ['Binary','Unknown'],
  4879. },
  4880. dinf => {
  4881. Name => 'DataInfo',
  4882. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::DataInfo' },
  4883. },
  4884. gmhd => {
  4885. Name => 'GenMediaHeader',
  4886. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::GenMediaHeader' },
  4887. },
  4888. hdlr => { #PH
  4889. Name => 'Handler',
  4890. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Handler' },
  4891. },
  4892. stbl => {
  4893. Name => 'SampleTable',
  4894. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::SampleTable' },
  4895. },
  4896. );
  4897. # MP4 video media header (ref 5)
  4898. %Image::ExifTool::QuickTime::VideoHeader = (
  4899. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  4900. GROUPS => { 2 => 'Video' },
  4901. NOTES => 'MP4 video media header.',
  4902. FORMAT => 'int16u',
  4903. 2 => {
  4904. Name => 'GraphicsMode',
  4905. PrintHex => 1,
  4906. SeparateTable => 'GraphicsMode',
  4907. PrintConv => \%graphicsMode,
  4908. },
  4909. 3 => { Name => 'OpColor', Format => 'int16u[3]' },
  4910. );
  4911. # MP4 audio media header (ref 5)
  4912. %Image::ExifTool::QuickTime::AudioHeader = (
  4913. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  4914. GROUPS => { 2 => 'Audio' },
  4915. NOTES => 'MP4 audio media header.',
  4916. FORMAT => 'int16u',
  4917. 2 => { Name => 'Balance', Format => 'fixed16s' },
  4918. );
  4919. # MP4 hint media header (ref 5)
  4920. %Image::ExifTool::QuickTime::HintHeader = (
  4921. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  4922. NOTES => 'MP4 hint media header.',
  4923. FORMAT => 'int16u',
  4924. 2 => 'MaxPDUSize',
  4925. 3 => 'AvgPDUSize',
  4926. 4 => { Name => 'MaxBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' },
  4927. 6 => { Name => 'AvgBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' },
  4928. );
  4929. # MP4 sample table box (ref 5)
  4930. %Image::ExifTool::QuickTime::SampleTable = (
  4931. PROCESS_PROC => \&ProcessMOV,
  4932. GROUPS => { 2 => 'Video' },
  4933. NOTES => 'MP4 sample table box.',
  4934. stsd => [
  4935. {
  4936. Name => 'AudioSampleDesc',
  4937. Condition => '$$self{HandlerType} and $$self{HandlerType} eq "soun"',
  4938. SubDirectory => {
  4939. TagTable => 'Image::ExifTool::QuickTime::AudioSampleDesc',
  4940. Start => 8, # skip version number and count
  4941. },
  4942. },{
  4943. Name => 'VideoSampleDesc',
  4944. Condition => '$$self{HandlerType} and $$self{HandlerType} eq "vide"',
  4945. SubDirectory => {
  4946. TagTable => 'Image::ExifTool::QuickTime::ImageDesc',
  4947. Start => 8, # skip version number and count
  4948. },
  4949. },{
  4950. Name => 'HintSampleDesc',
  4951. Condition => '$$self{HandlerType} and $$self{HandlerType} eq "hint"',
  4952. SubDirectory => {
  4953. TagTable => 'Image::ExifTool::QuickTime::HintSampleDesc',
  4954. Start => 8, # skip version number and count
  4955. },
  4956. },{
  4957. Name => 'OtherSampleDesc',
  4958. SubDirectory => {
  4959. TagTable => 'Image::ExifTool::QuickTime::OtherSampleDesc',
  4960. Start => 8, # skip version number and count
  4961. },
  4962. },
  4963. # (Note: "alis" HandlerType handled by the parent audio or video handler)
  4964. ],
  4965. stts => [ # decoding time-to-sample table
  4966. {
  4967. Name => 'VideoFrameRate',
  4968. Notes => 'average rate calculated from time-to-sample table for video media',
  4969. Condition => '$$self{HandlerType} and $$self{HandlerType} eq "vide"',
  4970. Format => 'undef', # (necessary to prevent decoding as string!)
  4971. # (must be RawConv so appropriate MediaTS is used in calculation)
  4972. RawConv => 'Image::ExifTool::QuickTime::CalcSampleRate($self, \$val)',
  4973. PrintConv => 'int($val * 1000 + 0.5) / 1000',
  4974. },
  4975. {
  4976. Name => 'TimeToSampleTable',
  4977. Flags => ['Binary','Unknown'],
  4978. },
  4979. ],
  4980. ctts => {
  4981. Name => 'CompositionTimeToSample',
  4982. Flags => ['Binary','Unknown'],
  4983. },
  4984. stsc => {
  4985. Name => 'SampleToChunk',
  4986. Flags => ['Binary','Unknown'],
  4987. },
  4988. stsz => {
  4989. Name => 'SampleSizes',
  4990. Flags => ['Binary','Unknown'],
  4991. },
  4992. stz2 => {
  4993. Name => 'CompactSampleSizes',
  4994. Flags => ['Binary','Unknown'],
  4995. },
  4996. stco => {
  4997. Name => 'ChunkOffset',
  4998. Flags => ['Binary','Unknown'],
  4999. },
  5000. co64 => {
  5001. Name => 'ChunkOffset64',
  5002. Flags => ['Binary','Unknown'],
  5003. },
  5004. stss => {
  5005. Name => 'SyncSampleTable',
  5006. Flags => ['Binary','Unknown'],
  5007. },
  5008. stsh => {
  5009. Name => 'ShadowSyncSampleTable',
  5010. Flags => ['Binary','Unknown'],
  5011. },
  5012. padb => {
  5013. Name => 'SamplePaddingBits',
  5014. Flags => ['Binary','Unknown'],
  5015. },
  5016. stdp => {
  5017. Name => 'SampleDegradationPriority',
  5018. Flags => ['Binary','Unknown'],
  5019. },
  5020. sdtp => {
  5021. Name => 'IdependentAndDisposableSamples',
  5022. Flags => ['Binary','Unknown'],
  5023. },
  5024. sbgp => {
  5025. Name => 'SampleToGroup',
  5026. Flags => ['Binary','Unknown'],
  5027. },
  5028. sgpd => {
  5029. Name => 'SampleGroupDescription',
  5030. Flags => ['Binary','Unknown'],
  5031. },
  5032. subs => {
  5033. Name => 'Sub-sampleInformation',
  5034. Flags => ['Binary','Unknown'],
  5035. },
  5036. cslg => {
  5037. Name => 'CompositionToDecodeTimelineMapping',
  5038. Flags => ['Binary','Unknown'],
  5039. },
  5040. stps => {
  5041. Name => 'PartialSyncSamples',
  5042. ValueConv => 'join " ",unpack("x8N*",$val)',
  5043. },
  5044. );
  5045. # MP4 audio sample description box (ref 5/AtomicParsley 0.9.4 parsley.cpp)
  5046. %Image::ExifTool::QuickTime::AudioSampleDesc = (
  5047. PROCESS_PROC => \&ProcessHybrid,
  5048. VARS => { ID_LABEL => 'ID/Index' },
  5049. GROUPS => { 2 => 'Audio' },
  5050. NOTES => q{
  5051. MP4 audio sample description. This hybrid atom contains both data and child
  5052. atoms.
  5053. },
  5054. 4 => {
  5055. Name => 'AudioFormat',
  5056. Format => 'undef[4]',
  5057. RawConv => q{
  5058. $$self{AudioFormat} = $val;
  5059. return undef unless $val =~ /^[\w ]{4}$/i;
  5060. # check for protected audio format
  5061. $self->OverrideFileType('M4P') if $val eq 'drms' and $$self{VALUE}{FileType} eq 'M4A';
  5062. return $val;
  5063. },
  5064. },
  5065. 20 => { #PH
  5066. Name => 'AudioVendorID',
  5067. Condition => '$$self{AudioFormat} ne "mp4s"',
  5068. Format => 'undef[4]',
  5069. RawConv => '$val eq "\0\0\0\0" ? undef : $val',
  5070. PrintConv => \%vendorID,
  5071. SeparateTable => 'VendorID',
  5072. },
  5073. 24 => { Name => 'AudioChannels', Format => 'int16u' },
  5074. 26 => { Name => 'AudioBitsPerSample', Format => 'int16u' },
  5075. 32 => { Name => 'AudioSampleRate', Format => 'fixed32u' },
  5076. #
  5077. # Observed offsets for child atoms of various AudioFormat types:
  5078. #
  5079. # AudioFormat Offset Child atoms
  5080. # ----------- ------ ----------------
  5081. # mp4a 52 * wave, chan, esds
  5082. # in24 52 wave, chan
  5083. # "ms\0\x11" 52 wave
  5084. # sowt 52 chan
  5085. # mp4a 36 * esds, pinf
  5086. # drms 36 esds, sinf
  5087. # samr 36 damr
  5088. # alac 36 alac
  5089. # ac-3 36 dac3
  5090. #
  5091. # (* child atoms found at different offsets in mp4a)
  5092. #
  5093. pinf => {
  5094. Name => 'PurchaseInfo',
  5095. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ProtectionInfo' },
  5096. },
  5097. sinf => { # "protection scheme information"
  5098. Name => 'ProtectionInfo', #3
  5099. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ProtectionInfo' },
  5100. },
  5101. # chan - 16/36 bytes
  5102. # esds - 31/40/42/43 bytes - ES descriptor (ref 3)
  5103. damr => { #3
  5104. Name => 'DecodeConfig',
  5105. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::DecodeConfig' },
  5106. },
  5107. wave => {
  5108. Name => 'Wave',
  5109. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Wave' },
  5110. },
  5111. # alac - 28 bytes
  5112. # adrm - AAX DRM atom? 148 bytes
  5113. # aabd - AAX unknown 17kB (contains 'aavd' strings)
  5114. );
  5115. # AMR decode config box (ref 3)
  5116. %Image::ExifTool::QuickTime::DecodeConfig = (
  5117. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  5118. GROUPS => { 2 => 'Audio' },
  5119. 0 => {
  5120. Name => 'EncoderVendor',
  5121. Format => 'undef[4]',
  5122. },
  5123. 4 => 'EncoderVersion',
  5124. # 5 - int16u - packet modes
  5125. # 7 - int8u - number of packet mode changes
  5126. # 8 - int8u - bytes per packet
  5127. );
  5128. %Image::ExifTool::QuickTime::ProtectionInfo = (
  5129. PROCESS_PROC => \&ProcessMOV,
  5130. GROUPS => { 2 => 'Audio' },
  5131. NOTES => 'Child atoms found in "sinf" and/or "pinf" atoms.',
  5132. frma => 'OriginalFormat',
  5133. # imif - IPMP information
  5134. schm => {
  5135. Name => 'SchemeType',
  5136. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::SchemeType' },
  5137. },
  5138. schi => {
  5139. Name => 'SchemeInfo',
  5140. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::SchemeInfo' },
  5141. },
  5142. # skcr
  5143. # enda
  5144. );
  5145. %Image::ExifTool::QuickTime::Wave = (
  5146. PROCESS_PROC => \&ProcessMOV,
  5147. frma => 'PurchaseFileFormat',
  5148. # "ms\0\x11" - 20 bytes
  5149. );
  5150. # scheme type atom
  5151. # ref http://xhelmboyx.tripod.com/formats/mp4-layout.txt
  5152. %Image::ExifTool::QuickTime::SchemeType = (
  5153. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  5154. GROUPS => { 2 => 'Audio' },
  5155. # 0 - 4 bytes version
  5156. 4 => { Name => 'SchemeType', Format => 'undef[4]' },
  5157. 8 => { Name => 'SchemeVersion', Format => 'int16u' },
  5158. 10 => { Name => 'SchemeURL', Format => 'string[$size-10]' },
  5159. );
  5160. %Image::ExifTool::QuickTime::SchemeInfo = (
  5161. PROCESS_PROC => \&ProcessMOV,
  5162. GROUPS => { 2 => 'Audio' },
  5163. user => {
  5164. Name => 'UserID',
  5165. Groups => { 2 => 'Author' },
  5166. ValueConv => '"0x" . unpack("H*",$val)',
  5167. },
  5168. cert => { # ref http://www.onvif.org/specs/stream/ONVIF-ExportFileFormat-Spec-v100.pdf
  5169. Name => 'Certificate',
  5170. ValueConv => '"0x" . unpack("H*",$val)',
  5171. },
  5172. 'key ' => {
  5173. Name => 'KeyID',
  5174. ValueConv => '"0x" . unpack("H*",$val)',
  5175. },
  5176. iviv => {
  5177. Name => 'InitializationVector',
  5178. ValueConv => 'unpack("H*",$val)',
  5179. },
  5180. righ => {
  5181. Name => 'Rights',
  5182. Groups => { 2 => 'Author' },
  5183. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Rights' },
  5184. },
  5185. name => { Name => 'UserName', Groups => { 2 => 'Author' } },
  5186. # chtb
  5187. # priv - private data
  5188. # sign
  5189. # adkm - Adobe DRM key management system (ref http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf)
  5190. # iKMS
  5191. # iSFM
  5192. # iSLT
  5193. );
  5194. %Image::ExifTool::QuickTime::Rights = (
  5195. PROCESS_PROC => \&ProcessRights,
  5196. GROUPS => { 2 => 'Audio' },
  5197. veID => 'ItemVendorID', #PH ("VendorID" ref 19)
  5198. plat => 'Platform', #18?
  5199. aver => 'VersionRestrictions', #19 ("appversion?" ref 18)
  5200. tran => 'TransactionID', #18
  5201. song => 'ItemID', #19 ("appid" ref 18)
  5202. tool => {
  5203. Name => 'ItemTool', #PH (guess) ("itunes build?" ref 18)
  5204. Format => 'string',
  5205. },
  5206. medi => 'MediaFlags', #PH (?)
  5207. mode => 'ModeFlags', #PH (?) 0x04 is HD flag (https://compilr.com/heksesang/requiem-mac/UnDrm.java)
  5208. );
  5209. # MP4 hint sample description box (ref 5)
  5210. # (ref https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-SW1)
  5211. %Image::ExifTool::QuickTime::HintSampleDesc = (
  5212. PROCESS_PROC => \&ProcessHybrid,
  5213. VARS => { ID_LABEL => 'ID/Index' },
  5214. NOTES => 'MP4 hint sample description.',
  5215. 4 => { Name => 'HintFormat', Format => 'undef[4]' },
  5216. # 14 - int16u DataReferenceIndex
  5217. 16 => { Name => 'HintTrackVersion', Format => 'int16u' },
  5218. # 18 - int16u LastCompatibleHintTrackVersion
  5219. 20 => { Name => 'MaxPacketSize', Format => 'int32u' },
  5220. #
  5221. # Observed offsets for child atoms of various HintFormat types:
  5222. #
  5223. # HintFormat Offset Child atoms
  5224. # ----------- ------ ----------------
  5225. # "rtp " 24 tims
  5226. #
  5227. tims => { Name => 'RTPTimeScale', Format => 'int32u' },
  5228. tsro => { Name => 'TimestampRandomOffset', Format => 'int32u' },
  5229. snro => { Name => 'SequenceNumberRandomOffset', Format => 'int32u' },
  5230. );
  5231. # MP4 generic sample description box
  5232. %Image::ExifTool::QuickTime::OtherSampleDesc = (
  5233. PROCESS_PROC => \&ProcessHybrid,
  5234. 4 => { Name => 'OtherFormat', Format => 'undef[4]' },
  5235. #
  5236. # Observed offsets for child atoms of various OtherFormat types:
  5237. #
  5238. # OtherFormat Offset Child atoms
  5239. # ----------- ------ ----------------
  5240. # avc1 86 avcC
  5241. # mp4a 36 esds
  5242. # mp4s 16 esds
  5243. # tmcd 34 name
  5244. #
  5245. ftab => { Name => 'FontTable', Format => 'undef', ValueConv => 'substr($val, 5)' },
  5246. );
  5247. # MP4 data information box (ref 5)
  5248. %Image::ExifTool::QuickTime::DataInfo = (
  5249. PROCESS_PROC => \&ProcessMOV,
  5250. NOTES => 'MP4 data information box.',
  5251. dref => {
  5252. Name => 'DataRef',
  5253. SubDirectory => {
  5254. TagTable => 'Image::ExifTool::QuickTime::DataRef',
  5255. Start => 8,
  5256. },
  5257. },
  5258. );
  5259. # Generic media header
  5260. %Image::ExifTool::QuickTime::GenMediaHeader = (
  5261. PROCESS_PROC => \&ProcessMOV,
  5262. gmin => {
  5263. Name => 'GenMediaInfo',
  5264. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::GenMediaInfo' },
  5265. },
  5266. text => {
  5267. Name => 'Text',
  5268. Flags => ['Binary','Unknown'],
  5269. },
  5270. tmcd => {
  5271. Name => 'TimeCode',
  5272. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TimeCode' },
  5273. },
  5274. );
  5275. # TimeCode header
  5276. %Image::ExifTool::QuickTime::TimeCode = (
  5277. PROCESS_PROC => \&ProcessMOV,
  5278. tcmi => {
  5279. Name => 'TCMediaInfo',
  5280. SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TCMediaInfo' },
  5281. },
  5282. );
  5283. # TimeCode media info (ref 12)
  5284. %Image::ExifTool::QuickTime::TCMediaInfo = (
  5285. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  5286. GROUPS => { 2 => 'Video' },
  5287. 4 => {
  5288. Name => 'TextFont',
  5289. Format => 'int16u',
  5290. PrintConv => { 0 => 'System' },
  5291. },
  5292. 6 => {
  5293. Name => 'TextFace',
  5294. Format => 'int16u',
  5295. PrintConv => {
  5296. 0 => 'Plain',
  5297. BITMASK => {
  5298. 0 => 'Bold',
  5299. 1 => 'Italic',
  5300. 2 => 'Underline',
  5301. 3 => 'Outline',
  5302. 4 => 'Shadow',
  5303. 5 => 'Condense',
  5304. 6 => 'Extend',
  5305. },
  5306. },
  5307. },
  5308. 8 => {
  5309. Name => 'TextSize',
  5310. Format => 'int16u',
  5311. },
  5312. # 10 - reserved
  5313. 12 => {
  5314. Name => 'TextColor',
  5315. Format => 'int16u[3]',
  5316. },
  5317. 18 => {
  5318. Name => 'BackgroundColor',
  5319. Format => 'int16u[3]',
  5320. },
  5321. 24 => {
  5322. Name => 'FontName',
  5323. Format => 'pstring',
  5324. ValueConv => '$self->Decode($val, $self->Options("CharsetQuickTime"))',
  5325. },
  5326. );
  5327. # Generic media info (ref http://sourceforge.jp/cvs/view/ntvrec/ntvrec/libqtime/gmin.h?view=co)
  5328. %Image::ExifTool::QuickTime::GenMediaInfo = (
  5329. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  5330. GROUPS => { 2 => 'Video' },
  5331. 0 => 'GenMediaVersion',
  5332. 1 => { Name => 'GenFlags', Format => 'int8u[3]' },
  5333. 4 => { Name => 'GenGraphicsMode',
  5334. Format => 'int16u',
  5335. PrintHex => 1,
  5336. SeparateTable => 'GraphicsMode',
  5337. PrintConv => \%graphicsMode,
  5338. },
  5339. 6 => { Name => 'GenOpColor', Format => 'int16u[3]' },
  5340. 12 => { Name => 'GenBalance', Format => 'fixed16s' },
  5341. );
  5342. # MP4 data reference box (ref 5)
  5343. %Image::ExifTool::QuickTime::DataRef = (
  5344. PROCESS_PROC => \&ProcessMOV,
  5345. NOTES => 'MP4 data reference box.',
  5346. 'url ' => {
  5347. Name => 'URL',
  5348. Format => 'undef', # (necessary to prevent decoding as string!)
  5349. RawConv => q{
  5350. # ignore if self-contained (flags bit 0 set)
  5351. return undef if unpack("N",$val) & 0x01;
  5352. $_ = substr($val,4); s/\0.*//s; $_;
  5353. },
  5354. },
  5355. 'urn ' => {
  5356. Name => 'URN',
  5357. Format => 'undef', # (necessary to prevent decoding as string!)
  5358. RawConv => q{
  5359. return undef if unpack("N",$val) & 0x01;
  5360. $_ = substr($val,4); s/\0.*//s; $_;
  5361. },
  5362. },
  5363. );
  5364. # MP4 handler box (ref 5)
  5365. %Image::ExifTool::QuickTime::Handler = (
  5366. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  5367. GROUPS => { 2 => 'Video' },
  5368. 4 => { #PH
  5369. Name => 'HandlerClass',
  5370. Format => 'undef[4]',
  5371. RawConv => '$val eq "\0\0\0\0" ? undef : $val',
  5372. PrintConv => {
  5373. mhlr => 'Media Handler',
  5374. dhlr => 'Data Handler',
  5375. },
  5376. },
  5377. 8 => {
  5378. Name => 'HandlerType',
  5379. Format => 'undef[4]',
  5380. RawConv => '$$self{HandlerType} = $val unless $val eq "alis" or $val eq "url "; $val',
  5381. PrintConvColumns => 2,
  5382. PrintConv => {
  5383. alis => 'Alias Data', #PH
  5384. crsm => 'Clock Reference', #3
  5385. hint => 'Hint Track',
  5386. ipsm => 'IPMP', #3
  5387. m7sm => 'MPEG-7 Stream', #3
  5388. meta => 'NRT Metadata', #PH
  5389. mdir => 'Metadata', #3
  5390. mdta => 'Metadata Tags', #PH
  5391. mjsm => 'MPEG-J', #3
  5392. ocsm => 'Object Content', #3
  5393. odsm => 'Object Descriptor', #3
  5394. priv => 'Private', #PH
  5395. sdsm => 'Scene Description', #3
  5396. soun => 'Audio Track',
  5397. text => 'Text', #PH (but what type? subtitle?)
  5398. tmcd => 'Time Code', #PH
  5399. 'url '=> 'URL', #3
  5400. vide => 'Video Track',
  5401. subp => 'Subpicture', #http://www.google.nl/patents/US7778526
  5402. nrtm => 'Non-Real Time Metadata', #PH (Sony ILCE-7S) [how is this different from "meta"?]
  5403. },
  5404. },
  5405. 12 => { #PH
  5406. Name => 'HandlerVendorID',
  5407. Format => 'undef[4]',
  5408. RawConv => '$val eq "\0\0\0\0" ? undef : $val',
  5409. PrintConv => \%vendorID,
  5410. SeparateTable => 'VendorID',
  5411. },
  5412. 24 => {
  5413. Name => 'HandlerDescription',
  5414. Format => 'string',
  5415. # (sometimes this is a Pascal string, and sometimes it is a C string)
  5416. RawConv => q{
  5417. $val=substr($val,1,ord($1)) if $val=~/^([\0-\x1f])/ and ord($1)<length($val);
  5418. length $val ? $val : undef;
  5419. },
  5420. },
  5421. );
  5422. # Flip uuid data (ref PH)
  5423. %Image::ExifTool::QuickTime::Flip = (
  5424. PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
  5425. FORMAT => 'int32u',
  5426. FIRST_ENTRY => 0,
  5427. NOTES => 'Found in MP4 files from Flip Video cameras.',
  5428. GROUPS => { 1 => 'MakerNotes', 2 => 'Image' },
  5429. 1 => 'PreviewImageWidth',
  5430. 2 => 'PreviewImageHeight',
  5431. 13 => 'PreviewImageLength',
  5432. 14 => { # (confirmed for FlipVideoMinoHD)
  5433. Name => 'SerialNumber',
  5434. Groups => { 2 => 'Camera' },
  5435. Format => 'string[16]',
  5436. },
  5437. 28 => {
  5438. Name => 'PreviewImage',
  5439. Groups => { 2 => 'Preview' },
  5440. Format => 'undef[$val{13}]',
  5441. RawConv => '$self->ValidateImage(\$val, $tag)',
  5442. },
  5443. );
  5444. # QuickTime composite tags
  5445. %Image::ExifTool::QuickTime::Composite = (
  5446. GROUPS => { 2 => 'Video' },
  5447. Rotation => {
  5448. Require => {
  5449. 0 => 'QuickTime:MatrixStructure',
  5450. 1 => 'QuickTime:HandlerType',
  5451. },
  5452. ValueConv => 'Image::ExifTool::QuickTime::CalcRotation($self)',
  5453. },
  5454. AvgBitrate => {
  5455. Priority => 0, # let QuickTime::AvgBitrate take priority
  5456. Require => {
  5457. 0 => 'QuickTime::MovieDataSize',
  5458. 1 => 'QuickTime::Duration',
  5459. },
  5460. RawConv => q{
  5461. return undef unless $val[1];
  5462. $val[1] /= $$self{TimeScale} if $$self{TimeScale};
  5463. my $key = 'MovieDataSize';
  5464. my $size = $val[0];
  5465. for (;;) {
  5466. $key = $self->NextTagKey($key) or last;
  5467. $size += $self->GetValue($key, 'ValueConv');
  5468. }
  5469. return int($size * 8 / $val[1] + 0.5);
  5470. },
  5471. PrintConv => 'ConvertBitrate($val)',
  5472. },
  5473. GPSLatitude => {
  5474. Require => 'QuickTime:GPSCoordinates',
  5475. Groups => { 2 => 'Location' },
  5476. ValueConv => 'my @c = split " ", $val; $c[0]',
  5477. PrintConv => q{
  5478. require Image::ExifTool::GPS;
  5479. Image::ExifTool::GPS::ToDMS($self, $val, 1, 'N');
  5480. },
  5481. },
  5482. GPSLongitude => {
  5483. Require => 'QuickTime:GPSCoordinates',
  5484. Groups => { 2 => 'Location' },
  5485. ValueConv => 'my @c = split " ", $val; $c[1]',
  5486. PrintConv => q{
  5487. require Image::ExifTool::GPS;
  5488. Image::ExifTool::GPS::ToDMS($self, $val, 1, 'E');
  5489. },
  5490. },
  5491. # split altitude into GPSAltitude/GPSAltitudeRef like EXIF and XMP
  5492. GPSAltitude => {
  5493. Require => 'QuickTime:GPSCoordinates',
  5494. Groups => { 2 => 'Location' },
  5495. Priority => 0, # (because it may not exist)
  5496. ValueConv => 'my @c = split " ", $val; defined $c[2] ? abs($c[2]) : undef',
  5497. PrintConv => '"$val m"',
  5498. },
  5499. GPSAltitudeRef => {
  5500. Require => 'QuickTime:GPSCoordinates',
  5501. Groups => { 2 => 'Location' },
  5502. Priority => 0, # (because altitude information may not exist)
  5503. ValueConv => 'my @c = split " ", $val; defined $c[2] ? ($c[2] < 0 ? 1 : 0) : undef',
  5504. PrintConv => {
  5505. 0 => 'Above Sea Level',
  5506. 1 => 'Below Sea Level',
  5507. },
  5508. },
  5509. GPSLatitude2 => {
  5510. Name => 'GPSLatitude',
  5511. Require => 'QuickTime:LocationInformation',
  5512. Groups => { 2 => 'Location' },
  5513. ValueConv => '$val =~ /Lat=([-+.\d]+)/; $1',
  5514. PrintConv => q{
  5515. require Image::ExifTool::GPS;
  5516. Image::ExifTool::GPS::ToDMS($self, $val, 1, 'N');
  5517. },
  5518. },
  5519. GPSLongitude2 => {
  5520. Name => 'GPSLongitude',
  5521. Require => 'QuickTime:LocationInformation',
  5522. Groups => { 2 => 'Location' },
  5523. ValueConv => '$val =~ /Lon=([-+.\d]+)/; $1',
  5524. PrintConv => q{
  5525. require Image::ExifTool::GPS;
  5526. Image::ExifTool::GPS::ToDMS($self, $val, 1, 'E');
  5527. },
  5528. },
  5529. GPSAltitude2 => {
  5530. Name => 'GPSAltitude',
  5531. Require => 'QuickTime:LocationInformation',
  5532. Groups => { 2 => 'Location' },
  5533. ValueConv => '$val =~ /Alt=([-+.\d]+)/; abs($1)',
  5534. PrintConv => '"$val m"',
  5535. },
  5536. GPSAltitudeRef2 => {
  5537. Name => 'GPSAltitudeRef',
  5538. Require => 'QuickTime:LocationInformation',
  5539. Groups => { 2 => 'Location' },
  5540. ValueConv => '$val =~ /Alt=([-+.\d]+)/; $1 < 0 ? 1 : 0',
  5541. PrintConv => {
  5542. 0 => 'Above Sea Level',
  5543. 1 => 'Below Sea Level',
  5544. },
  5545. },
  5546. CDDBDiscPlayTime => {
  5547. Require => 'CDDB1Info',
  5548. Groups => { 2 => 'Audio' },
  5549. ValueConv => '$val =~ /^..([a-z0-9]{4})/i ? hex($1) : undef',
  5550. PrintConv => 'ConvertDuration($val)',
  5551. },
  5552. CDDBDiscTracks => {
  5553. Require => 'CDDB1Info',
  5554. Groups => { 2 => 'Audio' },
  5555. ValueConv => '$val =~ /^.{6}([a-z0-9]{2})/i ? hex($1) : undef',
  5556. },
  5557. );
  5558. # add our composite tags
  5559. Image::ExifTool::AddCompositeTags('Image::ExifTool::QuickTime');
  5560. #------------------------------------------------------------------------------
  5561. # AutoLoad our writer routines when necessary
  5562. #
  5563. sub AUTOLOAD
  5564. {
  5565. return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
  5566. }
  5567. #------------------------------------------------------------------------------
  5568. # Calculate rotation of video track
  5569. # Inputs: 0) ExifTool object ref
  5570. # Returns: rotation angle or undef
  5571. sub CalcRotation($)
  5572. {
  5573. my $et = shift;
  5574. my $value = $$et{VALUE};
  5575. my ($i, $track);
  5576. # get the video track family 1 group (eg. "Track1");
  5577. for ($i=0; ; ++$i) {
  5578. my $idx = $i ? " ($i)" : '';
  5579. my $tag = "HandlerType$idx";
  5580. last unless $$value{$tag};
  5581. next unless $$value{$tag} eq 'vide';
  5582. $track = $et->GetGroup($tag, 1);
  5583. last;
  5584. }
  5585. return undef unless $track;
  5586. # get the video track matrix
  5587. for ($i=0; ; ++$i) {
  5588. my $idx = $i ? " ($i)" : '';
  5589. my $tag = "MatrixStructure$idx";
  5590. last unless $$value{$tag};
  5591. next unless $et->GetGroup($tag, 1) eq $track;
  5592. my @a = split ' ', $$value{$tag};
  5593. return undef unless $a[0] or $a[1];
  5594. # calculate the rotation angle (assume uniform rotation)
  5595. my $angle = atan2($a[1], $a[0]) * 180 / 3.14159;
  5596. $angle += 360 if $angle < 0;
  5597. return int($angle * 1000 + 0.5) / 1000;
  5598. }
  5599. return undef;
  5600. }
  5601. #------------------------------------------------------------------------------
  5602. # Determine the average sample rate from a time-to-sample table
  5603. # Inputs: 0) ExifTool object ref, 1) time-to-sample table data ref
  5604. # Returns: average sample rate (in Hz)
  5605. sub CalcSampleRate($$)
  5606. {
  5607. my ($et, $valPt) = @_;
  5608. my @dat = unpack('N*', $$valPt);
  5609. my ($num, $dur) = (0, 0);
  5610. my $i;
  5611. for ($i=2; $i<@dat-1; $i+=2) {
  5612. $num += $dat[$i]; # total number of samples
  5613. $dur += $dat[$i] * $dat[$i+1]; # total sample duration
  5614. }
  5615. return undef unless $num and $dur and $$et{MediaTS};
  5616. return $num * $$et{MediaTS} / $dur;
  5617. }
  5618. #------------------------------------------------------------------------------
  5619. # Fix incorrect format for ImageWidth/Height as written by Pentax
  5620. sub FixWrongFormat($)
  5621. {
  5622. my $val = shift;
  5623. return undef unless $val;
  5624. if ($val & 0xffff0000) {
  5625. $val = unpack('n',pack('N',$val));
  5626. }
  5627. return $val;
  5628. }
  5629. #------------------------------------------------------------------------------
  5630. # Convert ISO 6709 string to standard lag/lon format
  5631. # Inputs: 0) ISO 6709 string (lat, lon, and optional alt)
  5632. # Returns: position in decimal degress with altitude if available
  5633. # Notes: Wikipedia indicates altitude may be in feet -- how is this specified?
  5634. sub ConvertISO6709($)
  5635. {
  5636. my $val = shift;
  5637. if ($val =~ /^([-+]\d{2}(?:\.\d*)?)([-+]\d{3}(?:\.\d*)?)([-+]\d+)?/) {
  5638. $val = ($1 + 0) . ' ' . ($2 + 0);
  5639. $val .= ' ' . ($3 + 0) if $3;
  5640. } elsif ($val =~ /^([-+])(\d{2})(\d{2}(?:\.\d*)?)([-+])(\d{3})(\d{2}(?:\.\d*)?)([-+]\d+)?/) {
  5641. my $lat = $2 + $3 / 60;
  5642. $lat = -$lat if $1 eq '-';
  5643. my $lon = $5 + $6 / 60;
  5644. $lon = -$lon if $4 eq '-';
  5645. $val = "$lat $lon";
  5646. $val .= ' ' . ($7 + 0) if $7;
  5647. } elsif ($val =~ /^([-+])(\d{2})(\d{2})(\d{2}(?:\.\d*)?)([-+])(\d{3})(\d{2})(\d{2}(?:\.\d*)?)([-+]\d+)?/) {
  5648. my $lat = $2 + $3 / 60 + $4 / 3600;
  5649. $lat = -$lat if $1 eq '-';
  5650. my $lon = $6 + $7 / 60 + $8 / 3600;
  5651. $lon = -$lon if $5 eq '-';
  5652. $val = "$lat $lon";
  5653. $val .= ' ' . ($9 + 0) if $9;
  5654. }
  5655. return $val;
  5656. }
  5657. #------------------------------------------------------------------------------
  5658. # Convert Nero chapter list (ref ffmpeg libavformat/movenc.c)
  5659. # Inputs: 0) binary chpl data
  5660. # Returns: chapter list
  5661. sub ConvertChapterList($)
  5662. {
  5663. my $val = shift;
  5664. my $size = length $val;
  5665. return '<invalid>' if $size < 9;
  5666. my $num = Get8u(\$val, 8);
  5667. my ($i, @chapters);
  5668. my $pos = 9;
  5669. for ($i=0; $i<$num; ++$i) {
  5670. last if $pos + 9 > $size;
  5671. my $dur = Get64u(\$val, $pos) / 10000000;
  5672. my $len = Get8u(\$val, $pos + 8);
  5673. last if $pos + 9 + $len > $size;
  5674. my $title = substr($val, $pos + 9, $len);
  5675. $pos += 9 + $len;
  5676. push @chapters, "$dur $title";
  5677. }
  5678. return \@chapters; # return as a list
  5679. }
  5680. #------------------------------------------------------------------------------
  5681. # Print conversion for a Nero chapter list item
  5682. # Inputs: 0) ValueConv chapter string
  5683. # Returns: formatted chapter string
  5684. sub PrintChapter($)
  5685. {
  5686. my $val = shift;
  5687. $val =~ /^(\S+) (.*)/ or return $val;
  5688. my ($dur, $title) = ($1, $2);
  5689. my $h = int($dur / 3600);
  5690. $dur -= $h * 3600;
  5691. my $m = int($dur / 60);
  5692. my $s = $dur - $m * 60;
  5693. return sprintf("[%d:%.2d:%06.3f] %s",$h,$m,$s,$title);
  5694. }
  5695. #------------------------------------------------------------------------------
  5696. # Format GPSCoordinates for printing
  5697. # Inputs: 0) string with numerical lat, lon and optional alt, separated by spaces
  5698. # 1) ExifTool object reference
  5699. # Returns: PrintConv value
  5700. sub PrintGPSCoordinates($)
  5701. {
  5702. my ($val, $et) = @_;
  5703. require Image::ExifTool::GPS;
  5704. my @v = split ' ', $val;
  5705. my $prt = Image::ExifTool::GPS::ToDMS($et, $v[0], 1, "N") . ', ' .
  5706. Image::ExifTool::GPS::ToDMS($et, $v[1], 1, "E");
  5707. if (defined $v[2]) {
  5708. $prt .= ', ' . ($v[2] < 0 ? -$v[2] . ' m Below' : $v[2] . ' m Above') . ' Sea Level';
  5709. }
  5710. return $prt;
  5711. }
  5712. #------------------------------------------------------------------------------
  5713. # Unpack packed ISO 639/T language code
  5714. # Inputs: 0) packed language code (or undef)
  5715. # Returns: language code, or undef for default language, or 'err' for format error
  5716. sub UnpackLang($)
  5717. {
  5718. my $lang = shift;
  5719. if ($lang) {
  5720. # language code is packed in 5-bit characters
  5721. $lang = pack "C*", map { (($lang>>$_)&0x1f)+0x60 } 10, 5, 0;
  5722. # validate language code
  5723. if ($lang =~ /^[a-z]+$/) {
  5724. # treat 'eng' or 'und' as the default language
  5725. undef $lang if $lang eq 'und' or $lang eq 'eng';
  5726. } else {
  5727. $lang = 'err'; # invalid language code
  5728. }
  5729. }
  5730. return $lang;
  5731. }
  5732. #------------------------------------------------------------------------------
  5733. # Get langInfo hash and save details about alt-lang tags
  5734. # Inputs: 0) ExifTool ref, 1) tagInfo hash ref, 2) locale code
  5735. # Returns: new tagInfo hash ref, or undef if invalid
  5736. sub GetLangInfoQT($$$)
  5737. {
  5738. my ($et, $tagInfo, $langCode) = @_;
  5739. my $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $langCode);
  5740. if ($langInfo) {
  5741. $$et{QTLang} or $$et{QTLang} = [ ];
  5742. push @{$$et{QTLang}}, $$langInfo{Name};
  5743. }
  5744. return $langInfo;
  5745. }
  5746. #------------------------------------------------------------------------------
  5747. # Process MPEG-4 MTDT atom (ref 11)
  5748. # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
  5749. # Returns: 1 on success
  5750. sub ProcessMetaData($$$)
  5751. {
  5752. my ($et, $dirInfo, $tagTablePtr) = @_;
  5753. my $dataPt = $$dirInfo{DataPt};
  5754. my $dirLen = length $$dataPt;
  5755. my $verbose = $et->Options('Verbose');
  5756. return 0 unless $dirLen >= 2;
  5757. my $count = Get16u($dataPt, 0);
  5758. $verbose and $et->VerboseDir('MetaData', $count);
  5759. my $i;
  5760. my $pos = 2;
  5761. for ($i=0; $i<$count; ++$i) {
  5762. last if $pos + 10 > $dirLen;
  5763. my $size = Get16u($dataPt, $pos);
  5764. last if $size < 10 or $size + $pos > $dirLen;
  5765. my $tag = Get32u($dataPt, $pos + 2);
  5766. my $lang = Get16u($dataPt, $pos + 6);
  5767. my $enc = Get16u($dataPt, $pos + 8);
  5768. my $val = substr($$dataPt, $pos + 10, $size);
  5769. my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
  5770. if ($tagInfo) {
  5771. # convert language code to ASCII (ignore read-only bit)
  5772. $lang = UnpackLang($lang);
  5773. # handle alternate languages
  5774. if ($lang) {
  5775. my $langInfo = GetLangInfoQT($et, $tagInfo, $lang);
  5776. $tagInfo = $langInfo if $langInfo;
  5777. }
  5778. $verbose and $et->VerboseInfo($tag, $tagInfo,
  5779. Value => $val,
  5780. DataPt => $dataPt,
  5781. Start => $pos + 10,
  5782. Size => $size - 10,
  5783. );
  5784. # convert from UTF-16 BE if necessary
  5785. $val = $et->Decode($val, 'UCS2') if $enc == 1;
  5786. if ($enc == 0 and $$tagInfo{Unknown}) {
  5787. # binary data
  5788. $et->FoundTag($tagInfo, \$val);
  5789. } else {
  5790. $et->FoundTag($tagInfo, $val);
  5791. }
  5792. }
  5793. $pos += $size;
  5794. }
  5795. return 1;
  5796. }
  5797. #------------------------------------------------------------------------------
  5798. # Process hybrid binary data + QuickTime container (ref PH)
  5799. # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
  5800. # Returns: 1 on success
  5801. sub ProcessHybrid($$$)
  5802. {
  5803. my ($et, $dirInfo, $tagTablePtr) = @_;
  5804. # brute-force search for child atoms after first 8 bytes of binary data
  5805. my $dataPt = $$dirInfo{DataPt};
  5806. my $pos = ($$dirInfo{DirStart} || 0) + 8;
  5807. my $len = length($$dataPt);
  5808. my $try = $pos;
  5809. my $childPos;
  5810. while ($pos <= $len - 8) {
  5811. my $tag = substr($$dataPt, $try+4, 4);
  5812. # look only for well-behaved tag ID's
  5813. $tag =~ /[^\w ]/ and $try = ++$pos, next;
  5814. my $size = Get32u($dataPt, $try);
  5815. if ($size + $try == $len) {
  5816. # the atom ends exactly at the end of the parent -- this must be it
  5817. $childPos = $pos;
  5818. $$dirInfo{DirLen} = $pos; # the binary data ends at the first child atom
  5819. last;
  5820. }
  5821. if ($size < 8 or $size + $try > $len - 8) {
  5822. $try = ++$pos; # fail. try next position
  5823. } else {
  5824. $try += $size; # could be another atom following this
  5825. }
  5826. }
  5827. # process binary data
  5828. $$dirInfo{MixedTags} = 1; # ignore non-integer tag ID's
  5829. $et->ProcessBinaryData($dirInfo, $tagTablePtr);
  5830. # process child atoms if found
  5831. if ($childPos) {
  5832. $$dirInfo{DirStart} = $childPos;
  5833. $$dirInfo{DirLen} = $len - $childPos;
  5834. ProcessMOV($et, $dirInfo, $tagTablePtr);
  5835. }
  5836. return 1;
  5837. }
  5838. #------------------------------------------------------------------------------
  5839. # Process iTunes 'righ' atom (ref PH)
  5840. # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
  5841. # Returns: 1 on success
  5842. sub ProcessRights($$$)
  5843. {
  5844. my ($et, $dirInfo, $tagTablePtr) = @_;
  5845. my $dataPt = $$dirInfo{DataPt};
  5846. my $dataPos = $$dirInfo{Base};
  5847. my $dirLen = length $$dataPt;
  5848. my $unknown = $$et{OPTIONS}{Unkown} || $$et{OPTIONS}{Verbose};
  5849. my $pos;
  5850. $et->VerboseDir('righ', $dirLen / 8);
  5851. for ($pos = 0; $pos + 8 <= $dirLen; $pos += 8) {
  5852. my $tag = substr($$dataPt, $pos, 4);
  5853. last if $tag eq "\0\0\0\0";
  5854. my $val = substr($$dataPt, $pos + 4, 4);
  5855. my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
  5856. unless ($tagInfo) {
  5857. next unless $unknown;
  5858. my $name = $tag;
  5859. $name =~ s/([\x00-\x1f\x7f-\xff])/'x'.unpack('H*',$1)/eg;
  5860. $tagInfo = {
  5861. Name => "Unknown_$name",
  5862. Description => "Unknown $name",
  5863. Unknown => 1,
  5864. },
  5865. AddTagToTable($tagTablePtr, $tag, $tagInfo);
  5866. }
  5867. $val = '0x' . unpack('H*', $val) unless $$tagInfo{Format};
  5868. $et->HandleTag($tagTablePtr, $tag, $val,
  5869. DataPt => $dataPt,
  5870. DataPos => $dataPos,
  5871. Start => $pos + 4,
  5872. Size => 4,
  5873. );
  5874. }
  5875. return 1;
  5876. }
  5877. #------------------------------------------------------------------------------
  5878. # Process iTunes Encoding Params (ref PH)
  5879. # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
  5880. # Returns: 1 on success
  5881. sub ProcessEncodingParams($$$)
  5882. {
  5883. my ($et, $dirInfo, $tagTablePtr) = @_;
  5884. my $dataPt = $$dirInfo{DataPt};
  5885. my $dirLen = length $$dataPt;
  5886. my $pos;
  5887. $et->VerboseDir('Encoding Params', $dirLen / 8);
  5888. for ($pos = 0; $pos + 8 <= $dirLen; $pos += 8) {
  5889. my ($tag, $val) = unpack("x${pos}a4N", $$dataPt);
  5890. $et->HandleTag($tagTablePtr, $tag, $val);
  5891. }
  5892. return 1;
  5893. }
  5894. #------------------------------------------------------------------------------
  5895. # Process Meta keys and add tags to the ItemList table ('mdta' handler) (ref PH)
  5896. # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
  5897. # Returns: 1 on success
  5898. sub ProcessKeys($$$)
  5899. {
  5900. local $_;
  5901. my ($et, $dirInfo, $tagTablePtr) = @_;
  5902. my $dataPt = $$dirInfo{DataPt};
  5903. my $dirLen = length $$dataPt;
  5904. my $out;
  5905. if ($et->Options('Verbose')) {
  5906. $et->VerboseDir('Keys');
  5907. $out = $et->Options('TextOut');
  5908. }
  5909. my $pos = 8;
  5910. my $index = 1;
  5911. ++$$et{KeyCount}; # increment key count for this directory
  5912. my $infoTable = GetTagTable('Image::ExifTool::QuickTime::ItemList');
  5913. my $userTable = GetTagTable('Image::ExifTool::QuickTime::UserData');
  5914. while ($pos < $dirLen - 4) {
  5915. my $len = unpack("x${pos}N", $$dataPt);
  5916. last if $len < 8 or $pos + $len > $dirLen;
  5917. delete $$tagTablePtr{$index};
  5918. my $ns = substr($$dataPt, $pos + 4, 4);
  5919. my $tag = substr($$dataPt, $pos + 8, $len - 8);
  5920. $tag =~ s/\0.*//s; # truncate at null
  5921. if ($ns eq 'mdta') {
  5922. $tag =~ s/^com\.apple\.quicktime\.//; # remove common apple quicktime domain
  5923. }
  5924. next unless $tag;
  5925. # (I have some samples where the tag is a reversed ItemList or UserData tag ID)
  5926. my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
  5927. unless ($tagInfo) {
  5928. $tagInfo = $et->GetTagInfo($infoTable, $tag);
  5929. unless ($tagInfo) {
  5930. $tagInfo = $et->GetTagInfo($userTable, $tag);
  5931. if (not $tagInfo and $tag =~ /^\w{3}\xa9$/) {
  5932. $tag = pack('N', unpack('V', $tag));
  5933. $tagInfo = $et->GetTagInfo($infoTable, $tag);
  5934. $tagInfo or $tagInfo = $et->GetTagInfo($userTable, $tag);
  5935. }
  5936. }
  5937. }
  5938. my ($newInfo, $msg);
  5939. if ($tagInfo) {
  5940. $newInfo = {
  5941. Name => $$tagInfo{Name},
  5942. Format => $$tagInfo{Format},
  5943. ValueConv => $$tagInfo{ValueConv},
  5944. PrintConv => $$tagInfo{PrintConv},
  5945. };
  5946. my $groups = $$tagInfo{Groups};
  5947. $$newInfo{Groups} = { %$groups } if $groups;
  5948. } elsif ($tag =~ /^[-\w.]+$/) {
  5949. # create info for tags with reasonable id's
  5950. my $name = $tag;
  5951. $name =~ s/\.(.)/\U$1/g;
  5952. $newInfo = { Name => ucfirst($name) };
  5953. $msg = ' (Unknown)';
  5954. }
  5955. # substitute this tag in the ItemList table with the given index
  5956. my $id = $$et{KeyCount} . '.' . $index;
  5957. if (ref $$infoTable{$id} eq 'HASH') {
  5958. # delete other languages too if they exist
  5959. my $oldInfo = $$infoTable{$id};
  5960. if ($$oldInfo{OtherLang}) {
  5961. delete $$infoTable{$_} foreach @{$$oldInfo{OtherLang}};
  5962. }
  5963. delete $$infoTable{$id};
  5964. }
  5965. if ($newInfo) {
  5966. $msg or $msg = '';
  5967. AddTagToTable($infoTable, $id, $newInfo);
  5968. $out and print $out "$$et{INDENT}Added ItemList Tag $id = $tag$msg\n";
  5969. }
  5970. $pos += $len;
  5971. ++$index;
  5972. }
  5973. return 1;
  5974. }
  5975. #------------------------------------------------------------------------------
  5976. # Process a QuickTime atom
  5977. # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) optional tag table ref
  5978. # Returns: 1 on success
  5979. sub ProcessMOV($$;$)
  5980. {
  5981. my ($et, $dirInfo, $tagTablePtr) = @_;
  5982. my $raf = $$dirInfo{RAF};
  5983. my $dataPt = $$dirInfo{DataPt};
  5984. my $verbose = $et->Options('Verbose');
  5985. my $dataPos = $$dirInfo{Base} || 0;
  5986. my $charsetQuickTime = $et->Options('CharsetQuickTime');
  5987. my ($buff, $tag, $size, $track, $isUserData, %triplet, $doDefaultLang);
  5988. unless (defined $$et{KeyCount}) {
  5989. $$et{KeyCount} = 0; # initialize ItemList key directory count
  5990. $doDefaultLang = 1; # flag to generate default language tags
  5991. }
  5992. # more convenient to package data as a RandomAccess file
  5993. $raf or $raf = new File::RandomAccess($dataPt);
  5994. # skip leading bytes if necessary
  5995. if ($$dirInfo{DirStart}) {
  5996. $raf->Seek($$dirInfo{DirStart}, 1) or return 0;
  5997. $dataPos += $$dirInfo{DirStart};
  5998. }
  5999. # read size/tag name atom header
  6000. $raf->Read($buff,8) == 8 or return 0;
  6001. $dataPos += 8;
  6002. if ($tagTablePtr) {
  6003. $isUserData = ($tagTablePtr eq \%Image::ExifTool::QuickTime::UserData);
  6004. } else {
  6005. $tagTablePtr = GetTagTable('Image::ExifTool::QuickTime::Main');
  6006. }
  6007. ($size, $tag) = unpack('Na4', $buff);
  6008. if ($dataPt) {
  6009. $verbose and $et->VerboseDir($$dirInfo{DirName});
  6010. } else {
  6011. # check on file type if called with a RAF
  6012. $$tagTablePtr{$tag} or return 0;
  6013. if ($tag eq 'ftyp' and $size >= 12) {
  6014. # read ftyp atom to see what type of file this is
  6015. my $fileType;
  6016. if ($raf->Read($buff, $size-8) == $size-8) {
  6017. $raf->Seek(-($size-8), 1);
  6018. my $type = substr($buff, 0, 4);
  6019. # see if we know the extension for this file type
  6020. if ($ftypLookup{$type} and $ftypLookup{$type} =~ /\(\.(\w+)/) {
  6021. $fileType = $1;
  6022. # check compatible brands
  6023. } elsif ($buff =~ /^.{8}(.{4})+(mp41|mp42|avc1)/s) {
  6024. $fileType = 'MP4';
  6025. } elsif ($buff =~ /^.{8}(.{4})+(f4v )/s) {
  6026. $fileType = 'F4V';
  6027. } elsif ($buff =~ /^.{8}(.{4})+(qt )/s) {
  6028. $fileType = 'MOV';
  6029. }
  6030. }
  6031. $fileType or $fileType = 'MP4'; # default to MP4
  6032. $et->SetFileType($fileType, $mimeLookup{$fileType} || 'video/mp4');
  6033. } else {
  6034. $et->SetFileType(); # MOV
  6035. }
  6036. SetByteOrder('MM');
  6037. $$et{PRIORITY_DIR} = 'XMP'; # have XMP take priority
  6038. }
  6039. for (;;) {
  6040. if ($size < 8) {
  6041. if ($size == 0) {
  6042. if ($dataPt) {
  6043. # a zero size isn't legal for contained atoms, but Canon uses it to
  6044. # terminate the CNTH atom (eg. CanonEOS100D.mov), so tolerate it here
  6045. my $pos = $raf->Tell() - 4;
  6046. $raf->Seek(0,2);
  6047. my $str = $$dirInfo{DirName} . ' with ' . ($raf->Tell() - $pos) . ' bytes';
  6048. $et->VPrint(0,"$$et{INDENT}\[Terminator found in $str remaining]");
  6049. } else {
  6050. $tag = sprintf("0x%.8x",Get32u(\$tag,0)) if $tag =~ /[\x00-\x1f\x7f-\xff]/;
  6051. $et->VPrint(0,"$$et{INDENT}Tag '$tag' extends to end of file");
  6052. }
  6053. last;
  6054. }
  6055. $size == 1 or $et->Warn('Invalid atom size'), last;
  6056. # read extended atom size
  6057. $raf->Read($buff, 8) == 8 or last;
  6058. $dataPos += 8;
  6059. my ($hi, $lo) = unpack('NN', $buff);
  6060. if ($hi or $lo > 0x7fffffff) {
  6061. if ($hi > 0x7fffffff) {
  6062. $et->Warn('Invalid atom size');
  6063. last;
  6064. } elsif (not $et->Options('LargeFileSupport')) {
  6065. $et->Warn('End of processing at large atom (LargeFileSupport not enabled)');
  6066. last;
  6067. }
  6068. }
  6069. $size = $hi * 4294967296 + $lo - 16;
  6070. $size < 0 and $et->Warn('Invalid extended size'), last;
  6071. } else {
  6072. $size -= 8;
  6073. }
  6074. if ($isUserData and $$et{SET_GROUP1}) {
  6075. my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
  6076. # add track name to UserData tags inside tracks
  6077. $tag = $$et{SET_GROUP1} . $tag;
  6078. if (not $$tagTablePtr{$tag} and $tagInfo) {
  6079. my %newInfo = %$tagInfo;
  6080. foreach ('Name', 'Description') {
  6081. next unless $$tagInfo{$_};
  6082. $newInfo{$_} = $$et{SET_GROUP1} . $$tagInfo{$_};
  6083. $newInfo{$_} =~ s/^(Track\d+)Track/$1/; # remove duplicate "Track" in name
  6084. }
  6085. AddTagToTable($tagTablePtr, $tag, \%newInfo);
  6086. }
  6087. }
  6088. my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
  6089. # allow numerical tag ID's
  6090. unless ($tagInfo) {
  6091. my $id = $$et{KeyCount} . '.' . unpack('N', $tag);
  6092. if ($$tagTablePtr{$id}) {
  6093. $tagInfo = $et->GetTagInfo($tagTablePtr, $id);
  6094. $tag = $id;
  6095. }
  6096. }
  6097. # generate tagInfo if Unknown option set
  6098. if (not defined $tagInfo and ($$et{OPTIONS}{Unknown} or
  6099. $verbose or $tag =~ /^\xa9/))
  6100. {
  6101. my $name = $tag;
  6102. my $n = ($name =~ s/([\x00-\x1f\x7f-\xff])/'x'.unpack('H*',$1)/eg);
  6103. # print in hex if tag is numerical
  6104. $name = sprintf('0x%.4x',unpack('N',$tag)) if $n > 2;
  6105. if ($name =~ /^xa9(.*)/) {
  6106. $tagInfo = {
  6107. Name => "UserData_$1",
  6108. Description => "User Data $1",
  6109. };
  6110. } else {
  6111. $tagInfo = {
  6112. Name => "Unknown_$name",
  6113. Description => "Unknown $name",
  6114. Unknown => 1,
  6115. Binary => 1,
  6116. };
  6117. }
  6118. AddTagToTable($tagTablePtr, $tag, $tagInfo);
  6119. }
  6120. # save required tag sizes
  6121. if ($$tagTablePtr{"$tag-size"}) {
  6122. $et->HandleTag($tagTablePtr, "$tag-size", $size);
  6123. $et->HandleTag($tagTablePtr, "$tag-offset", $raf->Tell()) if $$tagTablePtr{"$tag-offset"};
  6124. }
  6125. # load values only if associated with a tag (or verbose) and not too big
  6126. my $ignore;
  6127. if ($size > 0x2000000) { # start to get worried above 32 MB
  6128. $ignore = 1;
  6129. if ($tagInfo and not $$tagInfo{Unknown}) {
  6130. my $t = $tag;
  6131. $t =~ s/([\x00-\x1f\x7f-\xff])/'x'.unpack('H*',$1)/eg;
  6132. if ($size > 0x8000000) {
  6133. $et->Warn("Skipping '$t' atom > 128 MB", 1);
  6134. } else {
  6135. $et->Warn("Skipping '$t' atom > 32 MB", 2) or $ignore = 0;
  6136. }
  6137. }
  6138. }
  6139. if (defined $tagInfo and not $ignore) {
  6140. my $val;
  6141. my $missing = $size - $raf->Read($val, $size);
  6142. if ($missing) {
  6143. $et->Warn("Truncated '$tag' data (missing $missing bytes)");
  6144. last;
  6145. }
  6146. # use value to get tag info if necessary
  6147. $tagInfo or $tagInfo = $et->GetTagInfo($tagTablePtr, $tag, \$val);
  6148. my $hasData = ($$dirInfo{HasData} and $val =~ /\0...data\0/s);
  6149. if ($verbose and not $hasData) {
  6150. my $tval;
  6151. if ($tagInfo and $$tagInfo{Format}) {
  6152. $tval = ReadValue(\$val, 0, $$tagInfo{Format}, $$tagInfo{Count}, length($val));
  6153. }
  6154. $et->VerboseInfo($tag, $tagInfo,
  6155. Value => $tval,
  6156. DataPt => \$val,
  6157. DataPos => $dataPos,
  6158. Size => $size,
  6159. Format => $tagInfo ? $$tagInfo{Format} : undef,
  6160. );
  6161. }
  6162. # handle iTunesInfo mean/name/data triplets
  6163. if ($tagInfo and $$tagInfo{Triplet}) {
  6164. if ($tag eq 'data' and $triplet{mean} and $triplet{name}) {
  6165. $tag = $triplet{name};
  6166. # add 'mean' to name unless it is 'com.apple.iTunes'
  6167. $tag = $triplet{mean} . '/' . $tag unless $triplet{mean} eq 'com.apple.iTunes';
  6168. $tagInfo = $et->GetTagInfo($tagTablePtr, $tag, \$val);
  6169. unless ($tagInfo) {
  6170. my $name = $triplet{name};
  6171. my $desc = $name;
  6172. $name =~ tr/-_a-zA-Z0-9//dc;
  6173. $desc =~ tr/_/ /;
  6174. $tagInfo = {
  6175. Name => $name,
  6176. Description => $desc,
  6177. };
  6178. AddTagToTable($tagTablePtr, $tag, $tagInfo);
  6179. }
  6180. # ignore 8-byte header
  6181. $val = substr($val, 8) if length($val) >= 8;
  6182. unless ($$tagInfo{Format} or $$tagInfo{SubDirectory}) {
  6183. # extract as binary if it contains any non-ASCII or control characters
  6184. if ($val =~ /[^\x20-\x7e]/) {
  6185. my $buff = $val;
  6186. $val = \$buff;
  6187. }
  6188. }
  6189. undef %triplet;
  6190. } else {
  6191. undef %triplet if $tag eq 'mean';
  6192. $triplet{$tag} = substr($val,4) if length($val) > 4;
  6193. undef $tagInfo; # don't store this tag
  6194. }
  6195. }
  6196. if ($tagInfo) {
  6197. my $subdir = $$tagInfo{SubDirectory};
  6198. if ($subdir) {
  6199. my $start = $$subdir{Start} || 0;
  6200. my ($base, $dPos) = ($dataPos, 0);
  6201. if ($$subdir{Base}) {
  6202. $dPos -= eval $$subdir{Base};
  6203. $base -= $dPos;
  6204. }
  6205. my %dirInfo = (
  6206. DataPt => \$val,
  6207. DataLen => $size,
  6208. DirStart => $start,
  6209. DirLen => $size - $start,
  6210. DirName => $$subdir{DirName} || $$tagInfo{Name},
  6211. HasData => $$subdir{HasData},
  6212. Multi => $$subdir{Multi},
  6213. IgnoreProp => $$subdir{IgnoreProp}, # (XML hack)
  6214. DataPos => $dPos,
  6215. Base => $base, # (needed for IsOffset tags in binary data)
  6216. );
  6217. $dirInfo{BlockInfo} = $tagInfo if $$tagInfo{BlockExtract};
  6218. if ($$subdir{ByteOrder} and $$subdir{ByteOrder} =~ /^Little/) {
  6219. SetByteOrder('II');
  6220. }
  6221. my $oldGroup1 = $$et{SET_GROUP1};
  6222. if ($$tagInfo{Name} eq 'Track') {
  6223. $track or $track = 0;
  6224. $$et{SET_GROUP1} = 'Track' . (++$track);
  6225. }
  6226. my $subTable = GetTagTable($$subdir{TagTable});
  6227. my $proc = $$subdir{ProcessProc};
  6228. # make ProcessMOV() the default processing procedure for subdirectories
  6229. $proc = \&ProcessMOV unless $proc or $$subTable{PROCESS_PROC};
  6230. $et->ProcessDirectory(\%dirInfo, $subTable, $proc) if $size > $start;
  6231. $$et{SET_GROUP1} = $oldGroup1;
  6232. SetByteOrder('MM');
  6233. } elsif ($hasData) {
  6234. # handle atoms containing 'data' tags
  6235. # (currently ignore contained atoms: 'itif', 'name', etc.)
  6236. my $pos = 0;
  6237. for (;;) {
  6238. last if $pos + 16 > $size;
  6239. my ($len, $type, $flags, $ctry, $lang) = unpack("x${pos}Na4Nnn", $val);
  6240. last if $pos + $len > $size;
  6241. my $value;
  6242. my $format = $$tagInfo{Format};
  6243. if ($type eq 'data' and $len >= 16) {
  6244. $pos += 16;
  6245. $len -= 16;
  6246. $value = substr($val, $pos, $len);
  6247. # format flags (ref 12):
  6248. # 0x0=binary, 0x1=UTF-8, 0x2=UTF-16, 0x3=ShiftJIS,
  6249. # 0x4=UTF-8 0x5=UTF-16, 0xd=JPEG, 0xe=PNG,
  6250. # 0x15=signed int, 0x16=unsigned int, 0x17=float,
  6251. # 0x18=double, 0x1b=BMP, 0x1c='meta' atom
  6252. if ($stringEncoding{$flags}) {
  6253. # handle all string formats
  6254. $value = $et->Decode($value, $stringEncoding{$flags});
  6255. # (shouldn't be null terminated, but some software writes it anyway)
  6256. $value =~ s/\0$// unless $$tagInfo{Binary};
  6257. } else {
  6258. if (not $format) {
  6259. if ($flags == 0x15 or $flags == 0x16) {
  6260. $format = { 1=>'int8', 2=>'int16', 4=>'int32' }->{$len};
  6261. $format .= $flags == 0x15 ? 's' : 'u' if $format;
  6262. } elsif ($flags == 0x17) {
  6263. $format = 'float';
  6264. } elsif ($flags == 0x18) {
  6265. $format = 'double';
  6266. } elsif ($flags == 0x00) {
  6267. # read 1 and 2-byte binary as integers
  6268. if ($len == 1) {
  6269. $format = 'int8u',
  6270. } elsif ($len == 2) {
  6271. $format = 'int16u',
  6272. }
  6273. }
  6274. }
  6275. if ($format) {
  6276. $value = ReadValue(\$value, 0, $format, $$tagInfo{Count}, $len);
  6277. } elsif (not $$tagInfo{ValueConv}) {
  6278. # make binary data a scalar reference unless a ValueConv exists
  6279. my $buf = $value;
  6280. $value = \$buf;
  6281. }
  6282. }
  6283. }
  6284. my $langInfo;
  6285. if ($ctry or $lang) {
  6286. # ignore country ('ctry') and language lists ('lang') for now
  6287. undef $ctry if $ctry and $ctry <= 255;
  6288. undef $lang if $lang and $lang <= 255;
  6289. $lang = UnpackLang($lang);
  6290. # add country code if specified
  6291. if ($ctry) {
  6292. $ctry = unpack('a2',pack('n',$ctry)); # unpack as ISO 3166-1
  6293. # treat 'ZZ' like a default country (see ref 12)
  6294. undef $ctry if $ctry eq 'ZZ';
  6295. if ($ctry and $ctry =~ /^[A-Z]{2}$/) {
  6296. $lang or $lang = 'und';
  6297. $lang .= "-$ctry";
  6298. }
  6299. }
  6300. if ($lang) {
  6301. # get tagInfo for other language
  6302. $langInfo = GetLangInfoQT($et, $tagInfo, $lang);
  6303. # save other language tag ID's so we can delete later if necessary
  6304. if ($langInfo) {
  6305. $$tagInfo{OtherLang} or $$tagInfo{OtherLang} = [ ];
  6306. push @{$$tagInfo{OtherLang}}, $$langInfo{TagID};
  6307. }
  6308. }
  6309. }
  6310. $langInfo or $langInfo = $tagInfo;
  6311. $et->VerboseInfo($tag, $langInfo,
  6312. Value => ref $value ? $$value : $value,
  6313. DataPt => \$val,
  6314. DataPos => $dataPos,
  6315. Start => $pos,
  6316. Size => $len,
  6317. Format => $format,
  6318. Extra => sprintf(", Type='$type', Flags=0x%x",$flags)
  6319. ) if $verbose;
  6320. $et->FoundTag($langInfo, $value) if defined $value;
  6321. $pos += $len;
  6322. }
  6323. } elsif ($tag =~ /^\xa9/ or $$tagInfo{IText}) {
  6324. # parse international text to extract all languages
  6325. my $pos = 0;
  6326. for (;;) {
  6327. last if $pos + 4 > $size;
  6328. my ($len, $lang) = unpack("x${pos}nn", $val);
  6329. $pos += 4;
  6330. # according to the QuickTime spec (ref 12), $len should include
  6331. # 4 bytes for length and type words, but nobody (including
  6332. # Apple, Pentax and Kodak) seems to add these in, so try
  6333. # to allow for either
  6334. if ($pos + $len > $size) {
  6335. $len -= 4;
  6336. last if $pos + $len > $size or $len < 0;
  6337. }
  6338. # ignore any empty entries (or null padding) after the first
  6339. next if not $len and $pos;
  6340. my $str = substr($val, $pos, $len);
  6341. my $langInfo;
  6342. if ($lang < 0x400) {
  6343. # this is a Macintosh language code
  6344. # a language code of 0 is Macintosh english, so treat as default
  6345. if ($lang) {
  6346. # use Font.pm to look up language string
  6347. require Image::ExifTool::Font;
  6348. $lang = $Image::ExifTool::Font::ttLang{Macintosh}{$lang};
  6349. }
  6350. # the spec says only "Macintosh text encoding", but
  6351. # allow this to be configured by the user
  6352. $str = $et->Decode($str, $charsetQuickTime);
  6353. } else {
  6354. # convert language code to ASCII (ignore read-only bit)
  6355. $lang = UnpackLang($lang);
  6356. # may be either UTF-8 or UTF-16BE
  6357. my $enc = $str=~s/^\xfe\xff// ? 'UTF16' : 'UTF8';
  6358. $str = $et->Decode($str, $enc);
  6359. }
  6360. $langInfo = GetLangInfoQT($et, $tagInfo, $lang) if $lang;
  6361. $et->FoundTag($langInfo || $tagInfo, $str);
  6362. $pos += $len;
  6363. }
  6364. } else {
  6365. my $format = $$tagInfo{Format};
  6366. if ($format) {
  6367. $val = ReadValue(\$val, 0, $format, $$tagInfo{Count}, length($val));
  6368. }
  6369. my $oldBase;
  6370. if ($$tagInfo{SetBase}) {
  6371. $oldBase = $$et{BASE};
  6372. $$et{BASE} = $dataPos;
  6373. }
  6374. my $key = $et->FoundTag($tagInfo, $val);
  6375. $$et{BASE} = $oldBase if defined $oldBase;
  6376. # decode if necessary (NOTE: must be done after RawConv)
  6377. if (defined $key and (not $format or $format =~ /^string/) and
  6378. not $$tagInfo{Unknown} and not $$tagInfo{ValueConv} and
  6379. not $$tagInfo{Binary} and defined $$et{VALUE}{$key} and not ref $val)
  6380. {
  6381. my $vp = \$$et{VALUE}{$key};
  6382. if (not ref $$vp and length($$vp) <= 65536 and $$vp =~ /[\x80-\xff]/) {
  6383. # the encoding of this is not specified, so use CharsetQuickTime
  6384. # unless the string is valid UTF-8
  6385. require Image::ExifTool::XMP;
  6386. my $enc = Image::ExifTool::XMP::IsUTF8($vp) > 0 ? 'UTF8' : $charsetQuickTime;
  6387. $$vp = $et->Decode($$vp, $enc);
  6388. }
  6389. }
  6390. }
  6391. }
  6392. } else {
  6393. $et->VerboseInfo($tag, $tagInfo,
  6394. Size => $size,
  6395. Extra => sprintf(' at offset 0x%.4x', $raf->Tell()),
  6396. ) if $verbose;
  6397. $raf->Seek($size, 1) or $et->Warn("Truncated '$tag' data"), last;
  6398. }
  6399. $raf->Read($buff, 8) == 8 or last;
  6400. $dataPos += $size + 8;
  6401. ($size, $tag) = unpack('Na4', $buff);
  6402. }
  6403. # fill in missing defaults for alternate language tags
  6404. # (the first language is taken as the default)
  6405. if ($doDefaultLang and $$et{QTLang}) {
  6406. foreach $tag (@{$$et{QTLang}}) {
  6407. next unless defined $$et{VALUE}{$tag};
  6408. my $langInfo = $$et{TAG_INFO}{$tag} or next;
  6409. my $tagInfo = $$langInfo{SrcTagInfo} or next;
  6410. next if defined $$et{VALUE}{$$tagInfo{Name}};
  6411. $et->FoundTag($tagInfo, $$et{VALUE}{$tag});
  6412. }
  6413. delete $$et{QTLang};
  6414. }
  6415. return 1;
  6416. }
  6417. #------------------------------------------------------------------------------
  6418. # Process a QuickTime Image File
  6419. # Inputs: 0) ExifTool object reference, 1) directory information reference
  6420. # Returns: 1 on success
  6421. sub ProcessQTIF($$)
  6422. {
  6423. my ($et, $dirInfo) = @_;
  6424. my $table = GetTagTable('Image::ExifTool::QuickTime::ImageFile');
  6425. return ProcessMOV($et, $dirInfo, $table);
  6426. }
  6427. 1; # end
  6428. __END__
  6429. =head1 NAME
  6430. Image::ExifTool::QuickTime - Read QuickTime and MP4 meta information
  6431. =head1 SYNOPSIS
  6432. This module is used by Image::ExifTool
  6433. =head1 DESCRIPTION
  6434. This module contains routines required by Image::ExifTool to extract
  6435. information from QuickTime and MP4 video, and M4A audio files.
  6436. =head1 AUTHOR
  6437. Copyright 2003-2016, Phil Harvey (phil at owl.phy.queensu.ca)
  6438. This library is free software; you can redistribute it and/or modify it
  6439. under the same terms as Perl itself.
  6440. =head1 REFERENCES
  6441. =over 4
  6442. =item L<http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html>
  6443. =item L<http://search.cpan.org/dist/MP4-Info-1.04/>
  6444. =item L<http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt>
  6445. =item L<http://wiki.multimedia.cx/index.php?title=Apple_QuickTime>
  6446. =item L<http://atomicparsley.sourceforge.net/mpeg-4files.html>
  6447. =item L<http://wiki.multimedia.cx/index.php?title=QuickTime_container>
  6448. =item L<http://code.google.com/p/mp4v2/wiki/iTunesMetadata>
  6449. =item L<http://www.canieti.com.mx/assets/files/1011/IEC_100_1384_DC.pdf>
  6450. =item L<http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf>
  6451. =back
  6452. =head1 SEE ALSO
  6453. L<Image::ExifTool::TagNames/QuickTime Tags>,
  6454. L<Image::ExifTool(3pm)|Image::ExifTool>
  6455. =cut