1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310
|
"""$Id: itunes.py 988 2008-03-12 18:22:48Z sa3ruby $"""
__author__ = "Sam Ruby <http://intertwingly.net/> and Mark Pilgrim <http://diveintomark.org/>"
__version__ = "$Revision: 988 $"
__copyright__ = "Copyright (c) 2002 Sam Ruby and Mark Pilgrim"
from validators import *
class itunes:
def do_itunes_author(self):
return lengthLimitedText(255), noduplicates()
def do_itunes_block(self):
return yesnoclean(), noduplicates()
def do_itunes_explicit(self):
return yesnoclean(), noduplicates()
def do_itunes_keywords(self):
return lengthLimitedText(255), keywords(), noduplicates()
def do_itunes_subtitle(self):
return lengthLimitedText(255), noduplicates()
def do_itunes_summary(self):
return lengthLimitedText(4000), noduplicates()
def do_itunes_image(self):
return image(), noduplicates()
class itunes_channel(itunes):
from logging import MissingItunesElement
def validate(self):
if not 'language' in self.children and not self.xmlLang:
self.log(MissingItunesElement({"parent":self.name, "element":'language'}))
if not 'itunes_category' in self.children:
self.log(MissingItunesElement({"parent":self.name, "element":'itunes:category'}))
if not 'itunes_explicit' in self.children:
self.log(MissingItunesElement({"parent":self.name, "element":'itunes:explicit'}))
if not 'itunes_owner' in self.children:
self.log(MissingItunesEmail({"parent":self.name, "element":'itunes:email'}))
def setItunes(self, value):
if value and not self.itunes:
if self.dispatcher.encoding.lower() not in ['utf-8','utf8']:
from logging import NotUTF8
self.log(NotUTF8({"parent":self.parent.name, "element":self.name}))
if self.getFeedType() == TYPE_ATOM and 'entry' in self.children:
self.validate()
self.itunes |= value
def do_itunes_owner(self):
return owner(), noduplicates()
def do_itunes_category(self):
return category()
def do_itunes_pubDate(self):
return rfc822(), noduplicates()
def do_itunes_new_feed_url(self):
if self.child != 'itunes_new-feed-url':
self.log(UndefinedElement({"parent":self.name.replace("_",":"), "element":self.child}))
return rfc2396_full(), noduplicates()
class itunes_item(itunes):
supported_formats = ['m4a', 'mp3', 'mov', 'mp4', 'm4v', 'pdf']
def validate(self):
pass
def setItunes(self, value):
if value and not self.itunes:
self.parent.setItunes(True)
self.itunes = value
if hasattr(self, 'enclosures'):
save, self.enclosures = self.enclosures, []
for enclosure in save:
self.setEnclosure(enclosure)
def setEnclosure(self, url):
if self.itunes:
# http://www.apple.com/itunes/podcasts/techspecs.html#_Toc526931678
ext = url.split('.')[-1]
if ext not in itunes_item.supported_formats:
from logging import UnsupportedItunesFormat
self.log(UnsupportedItunesFormat({"parent":self.parent.name, "element":self.name, "extension":ext}))
if not hasattr(self, 'enclosures'): self.enclosures = []
self.enclosures.append(url)
def do_itunes_duration(self):
return duration(), noduplicates()
class owner(validatorBase):
def validate(self):
if not "itunes_email" in self.children:
self.log(MissingElement({"parent":self.name.replace("_",":"),
"element":"itunes:email"}))
def do_itunes_email(self):
return email(), noduplicates()
def do_itunes_name(self):
return lengthLimitedText(255), noduplicates()
class subcategory(validatorBase):
def __init__(self, newlist, oldlist):
validatorBase.__init__(self)
self.newlist = newlist
self.oldlist = oldlist
self.text = None
def getExpectedAttrNames(self):
return [(None, u'text')]
def prevalidate(self):
try:
self.text=self.attrs.getValue((None, "text"))
if not self.text in self.newlist:
if self.text in self.oldlist:
self.log(ObsoleteItunesCategory({"parent":self.parent.name.replace("_",":"),
"element":self.name.replace("_",":"),
"text":self.text}))
else:
self.log(InvalidItunesCategory({"parent":self.parent.name.replace("_",":"),
"element":self.name.replace("_",":"),
"text":self.text}))
except KeyError:
self.log(MissingAttribute({"parent":self.parent.name.replace("_",":"),
"element":self.name.replace("_",":"),
"attr":"text"}))
class image(validatorBase):
def getExpectedAttrNames(self):
return [(None, u'href')]
def prevalidate(self):
self.validate_required_attribute((None,'href'), httpURL)
class category(subcategory):
def __init__(self):
subcategory.__init__(self, valid_itunes_categories.keys(),
old_itunes_categories.keys())
def do_itunes_category(self):
if not self.text: return eater()
return subcategory(valid_itunes_categories.get(self.text,[]),
old_itunes_categories.get(self.text,[]))
valid_itunes_categories = {
"Arts": [
"Design",
"Fashion & Beauty",
"Food",
"Literature",
"Performing Arts",
"Visual Arts"],
"Business": [
"Business News",
"Careers",
"Investing",
"Management & Marketing",
"Shopping"],
"Comedy": [],
"Education": [
"Education Technology",
"Higher Education",
"K-12",
"Language Courses",
"Training"],
"Games & Hobbies": [
"Automotive",
"Aviation",
"Hobbies",
"Other Games",
"Video Games"],
"Government & Organizations": [
"Local",
"National",
"Non-Profit",
"Regional"],
"Health": [
"Alternative Health",
"Fitness & Nutrition",
"Self-Help",
"Sexuality"],
"Kids & Family": [],
"Music": [],
"News & Politics": [],
"Religion & Spirituality": [
"Buddhism",
"Christianity",
"Hinduism",
"Islam",
"Judaism",
"Other",
"Spirituality"],
"Science & Medicine": [
"Medicine",
"Natural Sciences",
"Social Sciences"],
"Society & Culture": [
"History",
"Personal Journals",
"Philosophy",
"Places & Travel"],
"Sports & Recreation": [
"Amateur",
"College & High School",
"Outdoor",
"Professional"],
"Technology": [
"Gadgets",
"Tech News",
"Podcasting",
"Software How-To"],
"TV & Film": [],
}
old_itunes_categories = {
"Arts & Entertainment": [
"Architecture",
"Books",
"Design",
"Entertainment",
"Games",
"Performing Arts",
"Photography",
"Poetry",
"Science Fiction"],
"Audio Blogs": [],
"Business": [
"Careers",
"Finance",
"Investing",
"Management",
"Marketing"],
"Comedy": [],
"Education": [
"Higher Education",
"K-12"],
"Family": [],
"Food": [],
"Health": [
"Diet & Nutrition",
"Fitness",
"Relationships",
"Self-Help",
"Sexuality"],
"International": [
"Australian",
"Belgian",
"Brazilian",
"Canadian",
"Chinese",
"Dutch",
"French",
"German",
"Hebrew",
"Italian",
"Japanese",
"Norwegian",
"Polish",
"Portuguese",
"Spanish",
"Swedish"],
"Movies & Television": [],
"Music": [],
"News": [],
"Politics": [],
"Public Radio": [],
"Religion & Spirituality": [
"Buddhism",
"Christianity",
"Islam",
"Judaism",
"New Age",
"Philosophy",
"Spirituality"],
"Science": [],
"Sports": [],
"Talk Radio": [],
"Technology": [
"Computers",
"Developers",
"Gadgets",
"Information Technology",
"News",
"Operating Systems",
"Podcasting",
"Smart Phones",
"Text/Speech"],
"Transportation": [
"Automotive",
"Aviation",
"Bicycles",
"Commuting"],
"Travel": []
}
class yesnoclean(text):
def normalizeWhitespace(self):
pass
def validate(self):
if not self.value.lower() in ['yes','no','clean']:
self.log(InvalidYesNoClean({"parent":self.parent.name, "element":self.name,"value":self.value}))
|