| 1 | /** |
|---|
| 2 | * General functionality of all feedtype-parsers. |
|---|
| 3 | * |
|---|
| 4 | * @author Jeroen Wijering |
|---|
| 5 | * @version 1.3 |
|---|
| 6 | **/ |
|---|
| 7 | |
|---|
| 8 | |
|---|
| 9 | import com.jeroenwijering.utils.StringMagic; |
|---|
| 10 | |
|---|
| 11 | |
|---|
| 12 | class com.jeroenwijering.feeds.AbstractParser { |
|---|
| 13 | |
|---|
| 14 | |
|---|
| 15 | /** All elements that can be parsed without manipulations **/ |
|---|
| 16 | private var elements:Object; |
|---|
| 17 | /** Accepted mimetypes for enclosures **/ |
|---|
| 18 | private var mimetypes:Object; |
|---|
| 19 | /** Timezone abbreviation offsets **/ |
|---|
| 20 | private var timezones:Object = { IDLW:-12,NT:-11,AHST:-10,CAT:-10,HST:-10, |
|---|
| 21 | YST:-9,PST:-8,MST:-7,PDT:-7,CST:-6,EST:-5,CDT:-5,EDT:-4,ADT:-3,WBT:-4, |
|---|
| 22 | AST:-4,NT:-3.5,EBT:-3,AT:-2,WAT:-1,UTC:0,UT:0,GMT:0,WET:0,CET:1, |
|---|
| 23 | CEST:1,EET:2,EEDT:3,MSK:3,IRT:3.5,SAMT:4,YEKT:5,TMT:5,TJT:5,OMST:6, |
|---|
| 24 | NOVT:6,LKT:6,MMT:6.5,KRAT:7,ICT:7,WIT:7,WAST:7,IRKT:8,ULAT:8,CST:8, |
|---|
| 25 | CIT:8,BNT:8,YAKT:9,JST:9,KST:9,EIT:9,ACST:9.5,VLAT:10,ACDT:10.5, |
|---|
| 26 | SAKT:10,GST:10,MAGT:11,IDLE:12,PETT:12,NZST:12 |
|---|
| 27 | }; |
|---|
| 28 | /** Supporting array to translate RFC2822 months to number. **/ |
|---|
| 29 | private var MONTH_INDEXES:Object = {January:0,February:1,March:2,April:3, |
|---|
| 30 | May:4,June:5,July:6,August:7,September:8,October:9,November:10, |
|---|
| 31 | December:11,Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,Aug:7,Sep:8, |
|---|
| 32 | Oct:9,Nov:10,Dec:11}; |
|---|
| 33 | |
|---|
| 34 | |
|---|
| 35 | /** Constructor. **/ |
|---|
| 36 | function AbstractParser(pre:String) { |
|---|
| 37 | setElements(); |
|---|
| 38 | setMimes(); |
|---|
| 39 | }; |
|---|
| 40 | |
|---|
| 41 | |
|---|
| 42 | /** build an array with all regular elements **/ |
|---|
| 43 | private function setElements() { |
|---|
| 44 | elements = new Object(); |
|---|
| 45 | }; |
|---|
| 46 | |
|---|
| 47 | |
|---|
| 48 | /** build an array with all registered mimetypes **/ |
|---|
| 49 | private function setMimes() { |
|---|
| 50 | mimetypes = new Object(); |
|---|
| 51 | mimetypes["mp3"] = "mp3"; |
|---|
| 52 | mimetypes["audio/mpeg"] = "mp3"; |
|---|
| 53 | mimetypes["flv"] = "flv"; |
|---|
| 54 | mimetypes["video/x-flv"] = "flv"; |
|---|
| 55 | mimetypes["jpeg"] = "jpg"; |
|---|
| 56 | mimetypes["jpg"] = "jpg"; |
|---|
| 57 | mimetypes["image/jpeg"] = "jpg"; |
|---|
| 58 | mimetypes["png"] = "png"; |
|---|
| 59 | mimetypes["image/png"] = "png"; |
|---|
| 60 | mimetypes["gif"] = "gif"; |
|---|
| 61 | mimetypes["image/gif"] = "gif"; |
|---|
| 62 | mimetypes["rtmp"] = "rtmp"; |
|---|
| 63 | mimetypes["swf"] = "swf"; |
|---|
| 64 | mimetypes["mov"] = "mov"; |
|---|
| 65 | mimetypes["application/x-shockwave-flash"] = "swf"; |
|---|
| 66 | mimetypes["rtmp"] = "rtmp"; |
|---|
| 67 | mimetypes["application/x-fcs"] = "rtmp"; |
|---|
| 68 | mimetypes["audio/x-m4a"] = "m4a"; |
|---|
| 69 | mimetypes["audio/x-mp4"] = "mp4"; |
|---|
| 70 | mimetypes["video/x-m4v"] = "m4v"; |
|---|
| 71 | mimetypes["video/mp4"] = "mp4"; |
|---|
| 72 | mimetypes["video/h264"] = "mp4"; |
|---|
| 73 | mimetypes["video/3gpp"] = "3gp"; |
|---|
| 74 | mimetypes["video/x-3gpp2"] = "3g2"; |
|---|
| 75 | mimetypes["audio/x-3gpp2"] = "3g2"; |
|---|
| 76 | }; |
|---|
| 77 | |
|---|
| 78 | |
|---|
| 79 | /** Parse a specific object. **/ |
|---|
| 80 | function parse(xml:XML):Array { |
|---|
| 81 | var arr:Array = new Array(); |
|---|
| 82 | for(var i=0; i<xml.firstChild.childNodes.length; i++) { |
|---|
| 83 | arr.push(xml.firstChild.childNodes[i].nodeName); |
|---|
| 84 | } |
|---|
| 85 | return arr; |
|---|
| 86 | }; |
|---|
| 87 | |
|---|
| 88 | |
|---|
| 89 | /** Translate RFC2822 date strings to timestamp. **/ |
|---|
| 90 | private function rfc2Date(dat:String):Number { |
|---|
| 91 | if(isNaN(dat)) { |
|---|
| 92 | var darr:Array = dat.split(' '); |
|---|
| 93 | darr[1] == "" ? darr.splice(1,1) : null; |
|---|
| 94 | var month:Number = MONTH_INDEXES[darr[2]]; |
|---|
| 95 | var date:Number = darr[1].substring(0,2); |
|---|
| 96 | var year:Number = darr[3]; |
|---|
| 97 | var zone = darr[5]; |
|---|
| 98 | var tarr = darr[4].split(':'); |
|---|
| 99 | var myDate = new Date(year,month,date,tarr[0],tarr[1],tarr[2]); |
|---|
| 100 | var stamp = Math.round(myDate.valueOf()/1000) - |
|---|
| 101 | myDate.getTimezoneOffset()*60; |
|---|
| 102 | if(isNaN(zone)) { |
|---|
| 103 | stamp -= 3600*timezones[zone]; |
|---|
| 104 | } else { |
|---|
| 105 | stamp -= 3600*Number(zone.substring(0,3)) - |
|---|
| 106 | 60*Number(zone.substring(3,2)); |
|---|
| 107 | } |
|---|
| 108 | return stamp; |
|---|
| 109 | } else { |
|---|
| 110 | return Number(dat); |
|---|
| 111 | } |
|---|
| 112 | }; |
|---|
| 113 | |
|---|
| 114 | |
|---|
| 115 | /** Translate ISO8601 date strings to timestamp. **/ |
|---|
| 116 | private function iso2Date(dat):Number { |
|---|
| 117 | if(isNaN(dat)) { |
|---|
| 118 | while(dat.indexOf(" ") > -1) { |
|---|
| 119 | var idx = dat.indexOf(" "); |
|---|
| 120 | dat = dat.substr(0,idx) + dat.substr(idx+1); |
|---|
| 121 | } |
|---|
| 122 | var myDate = new Date(dat.substr(0,4),dat.substr(5,2)-1, |
|---|
| 123 | dat.substr(8,2),dat.substr(11,2),dat.substr(14,2), |
|---|
| 124 | dat.substr(17,2)); |
|---|
| 125 | var stamp = Math.round(myDate.valueOf()/1000) - |
|---|
| 126 | myDate.getTimezoneOffset()*60; |
|---|
| 127 | if(dat.length > 20) { |
|---|
| 128 | var hr:Number = Number(dat.substr(20,2)); |
|---|
| 129 | var mn:Number = Number(dat.substr(23,2)); |
|---|
| 130 | if(dat.charAt(19) == "-") { |
|---|
| 131 | stamp = stamp - hr*3600 - mn*60; |
|---|
| 132 | } else { |
|---|
| 133 | stamp += hr*3600 + mn*60; |
|---|
| 134 | } |
|---|
| 135 | } |
|---|
| 136 | return stamp; |
|---|
| 137 | } else { |
|---|
| 138 | return dat; |
|---|
| 139 | } |
|---|
| 140 | }; |
|---|
| 141 | |
|---|
| 142 | |
|---|
| 143 | } |
|---|