Пример #1
0
    try:
        firstid = None
        arcyear = None
        fid = len ( arcdom.getElementsByTagName('id') )
        fi = 0
        while (fi < fid):
            if arcdom.getElementsByTagName('id')[fi].parentNode.nodeName == 'first_appeared_in_issue':
                if not arcdom.getElementsByTagName('id')[fi].firstChild.wholeText == xmlid:
                    logger.fdebug('hit it.')
                    firstid = arcdom.getElementsByTagName('id')[fi].firstChild.wholeText
                    break # - dont' break out here as we want to gather ALL the issue ID's since it's here
            fi+=1
        logger.fdebug('firstid: ' + str(firstid))
        if firstid is not None:
            firstdom = cv.pulldetails(comicid=None, type='firstissue', issueid=firstid)
            logger.fdebug('success')
            arcyear = cv.GetFirstIssue(firstid,firstdom)
    except:
        logger.fdebug('Unable to retrieve first issue details. Not caclulating at this time.')

    if (arcdom.getElementsByTagName('image')[0].childNodes[0].nodeValue) is None:
        xmlimage = arcdom.getElementsByTagName('super_url')[0].firstChild.wholeText
    else:
        xmlimage = "cache/blankcover.jpg"

    try:
        xmldesc = arcdom.getElementsByTagName('desc')[0].firstChild.wholeText
    except:
        xmldesc = "None"
Пример #2
0
def storyarcinfo(xmlid):

    comicLibrary = listStoryArcs()

    arcinfo = {}

    if mylar.CONFIG.COMICVINE_API == 'None' or mylar.CONFIG.COMICVINE_API is None:
        logger.warn(
            'You have not specified your own ComicVine API key - this is a requirement. Get your own @ http://api.comicvine.com.'
        )
        return
    else:
        comicapi = mylar.CONFIG.COMICVINE_API

    #respawn to the exact id for the story arc and count the # of issues present.
    ARCPULL_URL = mylar.CVURL + 'story_arc/4045-' + str(
        xmlid
    ) + '/?api_key=' + str(
        comicapi
    ) + '&field_list=issues,publisher,name,first_appeared_in_issue,deck,image&format=xml&offset=0'
    #logger.fdebug('arcpull_url:' + str(ARCPULL_URL))

    #new CV API restriction - one api request / second.
    if mylar.CONFIG.CVAPI_RATE is None or mylar.CONFIG.CVAPI_RATE < 2:
        time.sleep(2)
    else:
        time.sleep(mylar.CONFIG.CVAPI_RATE)

    #download the file:
    payload = None

    try:
        r = requests.get(ARCPULL_URL,
                         params=payload,
                         verify=mylar.CONFIG.CV_VERIFY,
                         headers=mylar.CV_HEADERS)
    except Exception as e:
        logger.warn('While parsing data from ComicVine, got exception: %s' % e)
        return

    try:
        arcdom = parseString(r.content)
    except ExpatError:
        if '<title>Abnormal Traffic Detected' in r.content:
            logger.error(
                'ComicVine has banned this server\'s IP address because it exceeded the API rate limit.'
            )
        else:
            logger.warn(
                'While parsing data from ComicVine, got exception: %s for data: %s'
                % (e, r.content))
        return
    except Exception as e:
        logger.warn(
            'While parsing data from ComicVine, got exception: %s for data: %s'
            % (e, r.content))
        return

    try:
        logger.fdebug('story_arc ascension')
        issuedom = arcdom.getElementsByTagName('issue')
        issuecount = len(issuedom)  #arcdom.getElementsByTagName('issue') )
        isc = 0
        arclist = ''
        ordernum = 1
        for isd in issuedom:
            zeline = isd.getElementsByTagName('id')
            isdlen = len(zeline)
            isb = 0
            while (isb < isdlen):
                if isc == 0:
                    arclist = str(zeline[isb].firstChild.wholeText).strip(
                    ) + ',' + str(ordernum)
                else:
                    arclist += '|' + str(zeline[isb].firstChild.wholeText
                                         ).strip() + ',' + str(ordernum)
                ordernum += 1
                isb += 1

            isc += 1

    except:
        logger.fdebug('unable to retrive issue count - nullifying value.')
        issuecount = 0

    try:
        firstid = None
        arcyear = None
        fid = len(arcdom.getElementsByTagName('id'))
        fi = 0
        while (fi < fid):
            if arcdom.getElementsByTagName(
                    'id')[fi].parentNode.nodeName == 'first_appeared_in_issue':
                if not arcdom.getElementsByTagName(
                        'id')[fi].firstChild.wholeText == xmlid:
                    logger.fdebug('hit it.')
                    firstid = arcdom.getElementsByTagName(
                        'id')[fi].firstChild.wholeText
                    break  # - dont' break out here as we want to gather ALL the issue ID's since it's here
            fi += 1
        logger.fdebug('firstid: ' + str(firstid))
        if firstid is not None:
            firstdom = cv.pulldetails(comicid=None,
                                      type='firstissue',
                                      issueid=firstid)
            logger.fdebug('success')
            arcyear = cv.Getissue(firstid, firstdom, 'firstissue')
    except:
        logger.fdebug(
            'Unable to retrieve first issue details. Not caclulating at this time.'
        )

    try:
        xmlimage = arcdom.getElementsByTagName(
            'super_url')[0].firstChild.wholeText
    except:
        xmlimage = "cache/blankcover.jpg"

    try:
        xmldesc = arcdom.getElementsByTagName('desc')[0].firstChild.wholeText
    except:
        xmldesc = "None"

    try:
        xmlpub = arcdom.getElementsByTagName(
            'publisher')[0].firstChild.wholeText
    except:
        xmlpub = "None"

    try:
        xmldeck = arcdom.getElementsByTagName('deck')[0].firstChild.wholeText
    except:
        xmldeck = "None"

    if xmlid in comicLibrary:
        haveit = comicLibrary[xmlid]
    else:
        haveit = "No"

    arcinfo = {
        #'name':                 xmlTag,    #theese four are passed into it only when it's a new add
        #'url':                  xmlurl,    #needs to be modified for refreshing to work completely.
        #'publisher':            xmlpub,
        'comicyear': arcyear,
        'comicid': xmlid,
        'issues': issuecount,
        'comicimage': xmlimage,
        'description': xmldesc,
        'deck': xmldeck,
        'arclist': arclist,
        'haveit': haveit,
        'publisher': xmlpub
    }

    return arcinfo
Пример #3
0
def findComic(name, mode, issue, limityear=None, explicit=None, type=None):

    #with mb_lock:       
    comiclist = []
    comicResults = None
    comicLibrary = listLibrary()
    
    chars = set('!?*')
    if any((c in chars) for c in name):
        name = '"'+name+'"'

    #print ("limityear: " + str(limityear))            
    if limityear is None: limityear = 'None'
    
    comicquery = name
    #comicquery=name.replace(" ", "%20")

    if explicit is None:
        #logger.fdebug('explicit is None. Setting to Default mode of ALL search words.')
        #comicquery=name.replace(" ", " AND ")
        explicit = 'all'

    #OR
    if explicit == 'loose':
        logger.fdebug('Changing to loose mode - this will match ANY of the search words')
        comicquery = name.replace(" ", " OR ")
    elif explicit == 'explicit':
        logger.fdebug('Changing to explicit mode - this will match explicitly on the EXACT words')
        comicquery=name.replace(" ", " AND ")
    else:
        logger.fdebug('Default search mode - this will match on ALL search words')
        comicquery = name.replace(" ", " AND ")
        explicit = 'all'


    if mylar.COMICVINE_API == 'None' or mylar.COMICVINE_API is None or mylar.COMICVINE_API == mylar.DEFAULT_CVAPI:
        logger.warn('You have not specified your own ComicVine API key - alot of things will be limited. Get your own @ http://api.comicvine.com.')
        comicapi = mylar.DEFAULT_CVAPI
    else:
        comicapi = mylar.COMICVINE_API

    if type is None:
        type = 'volume'

    #let's find out how many results we get from the query...    
    searched = pullsearch(comicapi,comicquery,0,explicit,type)
    if searched is None: return False
    totalResults = searched.getElementsByTagName('number_of_total_results')[0].firstChild.wholeText
    logger.fdebug("there are " + str(totalResults) + " search results...")
    if not totalResults:
        return False
    countResults = 0
    while (countResults < int(totalResults)):
        #logger.fdebug("querying " + str(countResults))
        if countResults > 0:
            #2012/22/02 - CV API flipped back to offset usage instead of page 
            if explicit == 'all' or explicit == 'loose':
                #all / loose uses page for offset
                offsetcount = (countResults/100) + 1
            else:
                #explicit uses offset
                offsetcount = countResults
            
            searched = pullsearch(comicapi,comicquery,offsetcount,explicit,type)
        comicResults = searched.getElementsByTagName(type) #('volume')
        body = ''
        n = 0        
        if not comicResults:
           break        
        for result in comicResults:
                #retrieve the first xml tag (<tag>data</tag>)
                #that the parser finds with name tagName:
                arclist = []
                if type == 'story_arc':
                    #call cv.py here to find out issue count in story arc
                    try:
                        logger.fdebug('story_arc ascension')
                        names = len( result.getElementsByTagName('name') )
                        n = 0
                        logger.fdebug('length: ' + str(names))
                        xmlpub = None #set this incase the publisher field isn't populated in the xml
                        while ( n < names ):
                            logger.fdebug(result.getElementsByTagName('name')[n].parentNode.nodeName)
                            if result.getElementsByTagName('name')[n].parentNode.nodeName == 'story_arc':
                                logger.fdebug('yes')
                                try:
                                    xmlTag = result.getElementsByTagName('name')[n].firstChild.wholeText
                                    xmlTag = xmlTag.rstrip()
                                    logger.fdebug('name: ' + str(xmlTag))
                                except:
                                    logger.error('There was a problem retrieving the given data from ComicVine. Ensure that www.comicvine.com is accessible.')
                                    return

                            elif result.getElementsByTagName('name')[n].parentNode.nodeName == 'publisher':
                                logger.fdebug('publisher check.')
                                xmlpub = result.getElementsByTagName('name')[n].firstChild.wholeText

                            n+=1
                    except:
                        logger.warn('error retrieving story arc search results.')
                        return

                    siteurl = len( result.getElementsByTagName('site_detail_url') )
                    s = 0
                    logger.fdebug('length: ' + str(names))
                    xmlurl = None
                    while ( s < siteurl ):
                        logger.fdebug(result.getElementsByTagName('site_detail_url')[s].parentNode.nodeName)
                        if result.getElementsByTagName('site_detail_url')[s].parentNode.nodeName == 'story_arc':
                            try:
                                xmlurl = result.getElementsByTagName('site_detail_url')[s].firstChild.wholeText
                            except:
                                logger.error('There was a problem retrieving the given data from ComicVine. Ensure that www.comicvine.com is accessible.')
                                return
                        s+=1

                    xmlid = result.getElementsByTagName('id')[0].firstChild.wholeText

                    if xmlid is not None:
                        #respawn to the exact id for the story arc and count the # of issues present.
                        ARCPULL_URL = mylar.CVURL + 'story_arc/4045-' + str(xmlid) + '/?api_key=' + str(comicapi) + '&field_list=issues,name,first_appeared_in_issue,deck,image&format=xml&offset=0'
                        logger.fdebug('arcpull_url:' + str(ARCPULL_URL))
                        if mylar.CVAPI_COUNT == 0 or mylar.CVAPI_COUNT >= mylar.CVAPI_MAX:
                            cvapi_check()
                        try:
                            file = urllib2.urlopen(ARCPULL_URL)
                        except urllib2.HTTPError, err:
                            logger.error('err : ' + str(err))
                            logger.error('There was a major problem retrieving data from ComicVine - on their end.')
                            return

                        mylar.CVAPI_COUNT +=1
                        arcdata = file.read()
                        file.close()
                        arcdom = parseString(arcdata)

                        try:
                            logger.fdebug('story_arc ascension')
                            issuecount = len( arcdom.getElementsByTagName('issue') )
                            issuedom = arcdom.getElementsByTagName('issue')
                            isc = 0 
                            arclist = ''
                            for isd in issuedom:
                                zeline = isd.getElementsByTagName('id')
                                isdlen = len( zeline )
                                isb = 0
                                while ( isb < isdlen):
                                    if isc == 0:
                                        arclist = str(zeline[isb].firstChild.wholeText).strip()
                                    else:
                                        arclist += '|' + str(zeline[isb].firstChild.wholeText).strip()
                                    isb+=1

                                isc+=1

                        except:
                            logger.fdebug('unable to retrive issue count - nullifying value.')
                            issuecount = 0

                        try:
                            firstid = None
                            arcyear = None
                            fid = len ( arcdom.getElementsByTagName('id') )
                            fi = 0
                            while (fi < fid):
                                if arcdom.getElementsByTagName('id')[fi].parentNode.nodeName == 'first_appeared_in_issue':
                                    if not arcdom.getElementsByTagName('id')[fi].firstChild.wholeText == xmlid:
                                        logger.fdebug('hit it.')
                                        firstid = arcdom.getElementsByTagName('id')[fi].firstChild.wholeText
                                        break # - dont' break out here as we want to gather ALL the issue ID's since it's here
                                fi+=1
                            logger.fdebug('firstid: ' + str(firstid))
                            if firstid is not None:
                                firstdom = cv.pulldetails(comicid=None, type='firstissue', issueid=firstid)
                                logger.fdebug('success')
                                arcyear = cv.GetFirstIssue(firstid,firstdom)
                        except:
                            logger.fdebug('Unable to retrieve first issue details. Not caclulating at this time.')

                        if (arcdom.getElementsByTagName('image')[0].childNodes[0].nodeValue) is None:
                            xmlimage = arcdom.getElementsByTagName('super_url')[0].firstChild.wholeText
                        else:
                            xmlimage = "cache/blankcover.jpg"

                        try:
                            xmldesc = arcdom.getElementsByTagName('desc')[0].firstChild.wholeText
                        except:
                            xmldesc = "None"

                        try:
                            xmldeck = arcdom.getElementsByTagName('deck')[0].firstChild.wholeText
                        except:
                            xmldeck = "None"
                            
                        if xmlid in comicLibrary:
                            haveit = comicLibrary[xmlid]
                        else:
                            haveit = "No"

                    comiclist.append({
                            'name':                 xmlTag,
                            'comicyear':            arcyear,
                            'comicid':              xmlid,
                            'url':                  xmlurl,
                            'issues':               issuecount,
                            'comicimage':           xmlimage,
                            'publisher':            xmlpub,
                            'description':          xmldesc,
                            'deck':                 xmldeck,
                            'arclist':              arclist,
                            'haveit':               haveit
                            })

                    logger.fdebug('IssueID\'s that are a part of ' + xmlTag + ' : ' + str(arclist))
    
                else:
                    xmlcnt = result.getElementsByTagName('count_of_issues')[0].firstChild.wholeText
                    #here we can determine what called us, and either start gathering all issues or just limited ones.
                    if issue is not None and str(issue).isdigit():
                        #this gets buggered up with NEW/ONGOING series because the db hasn't been updated
                        #to reflect the proper count. Drop it by 1 to make sure.
                        limiter = int(issue) - 1
                    else: limiter = 0
                    #get the first issue # (for auto-magick calcs)
                    try:
                        xmlfirst = result.getElementsByTagName('issue_number')[0].firstChild.wholeText
                        if '\xbd' in xmlfirst:
                            xmlfirst = "1"  #if the first issue is 1/2, just assume 1 for logistics
                    except:
                        xmlfirst = '1'

                    #logger.info('There are : ' + str(xmlcnt) + ' issues in this series.')
                    #logger.info('The first issue started at # ' + str(xmlfirst))
                    
                    cnt_numerical = int(xmlcnt) + int(xmlfirst) # (of issues + start of first issue = numerical range)
                    #logger.info('The maximum issue number should be roughly # ' + str(cnt_numerical))
                    #logger.info('The limiter (issue max that we know of) is # ' + str(limiter))
                    if cnt_numerical >= limiter:
                        cnl = len ( result.getElementsByTagName('name') )
                        cl = 0
                        xmlTag = 'None'
                        xmlimage = "cache/blankcover.jpg"
                        while (cl < cnl):
                            if result.getElementsByTagName('name')[cl].parentNode.nodeName == 'volume':
                                xmlTag = result.getElementsByTagName('name')[cl].firstChild.wholeText
                                #break

                            if result.getElementsByTagName('name')[cl].parentNode.nodeName == 'image':
                                xmlimage = result.getElementsByTagName('super_url')[0].firstChild.wholeText

                            cl+=1

                        if (result.getElementsByTagName('start_year')[0].firstChild) is not None:
                            xmlYr = result.getElementsByTagName('start_year')[0].firstChild.wholeText
                        else: xmlYr = "0000"
                        #logger.info('name:' + str(xmlTag) + ' -- ' + str(xmlYr))
                        if xmlYr in limityear or limityear == 'None':
                            xmlurl = result.getElementsByTagName('site_detail_url')[0].firstChild.wholeText
                            idl = len ( result.getElementsByTagName('id') )
                            idt = 0
                            xmlid = None
                            while (idt < idl):
                                if result.getElementsByTagName('id')[idt].parentNode.nodeName == 'volume':
                                    xmlid = result.getElementsByTagName('id')[idt].firstChild.wholeText
                                    break
                                idt+=1

                            if xmlid is None:
                                logger.error('Unable to figure out the comicid - skipping this : ' + str(xmlurl))
                                continue    
                            #logger.info('xmlid: ' + str(xmlid))
                            publishers = result.getElementsByTagName('publisher')
                            if len(publishers) > 0:
                                pubnames = publishers[0].getElementsByTagName('name')
                                if len(pubnames) >0:
                                    xmlpub = pubnames[0].firstChild.wholeText
                                else:
                                    xmlpub = "Unknown"
                            else:
                                xmlpub = "Unknown"

                            try:
                                xmldesc = result.getElementsByTagName('description')[0].firstChild.wholeText
                            except:
                                xmldesc = "None"

                            #this is needed to display brief synopsis for each series on search results page.
                            try:
                                xmldeck = result.getElementsByTagName('deck')[0].firstChild.wholeText
                            except:
                                xmldeck = "None"


                            if xmlid in comicLibrary:
                                haveit = comicLibrary[xmlid]
                            else:
                                haveit = "No"
                            comiclist.append({
                                    'name':                 xmlTag,
                                    'comicyear':            xmlYr,
                                    'comicid':              xmlid,
                                    'url':                  xmlurl,
                                    'issues':               xmlcnt,
                                    'comicimage':           xmlimage,
                                    'publisher':            xmlpub,
                                    'description':          xmldesc,
                                    'deck':                 xmldeck,
                                    'haveit':               haveit
                                    })
                            #logger.fdebug('year: ' + str(xmlYr) + ' - constraint met: ' + str(xmlTag) + '[' + str(xmlYr) + '] --- 4050-' + str(xmlid))
                        else:
                            pass
                            #logger.fdebug('year: ' + str(xmlYr) + ' -  contraint not met. Has to be within ' + str(limityear)) 
                n+=1    
        #search results are limited to 100 and by pagination now...let's account for this.
        countResults = countResults + 100
Пример #4
0
def findComic(name, mode, issue, limityear=None, explicit=None, type=None):

    #with mb_lock:
    comiclist = []
    comicResults = None
    comicLibrary = listLibrary()

    chars = set('!?*')
    if any((c in chars) for c in name):
        name = '"' + name + '"'

    #print ("limityear: " + str(limityear))
    if limityear is None: limityear = 'None'

    comicquery = name
    #comicquery=name.replace(" ", "%20")

    if explicit is None:
        #logger.fdebug('explicit is None. Setting to Default mode of ALL search words.')
        #comicquery=name.replace(" ", " AND ")
        explicit = 'all'

    #OR
    if explicit == 'loose':
        logger.fdebug(
            'Changing to loose mode - this will match ANY of the search words')
        comicquery = name.replace(" ", " OR ")
    elif explicit == 'explicit':
        logger.fdebug(
            'Changing to explicit mode - this will match explicitly on the EXACT words'
        )
        comicquery = name.replace(" ", " AND ")
    else:
        logger.fdebug(
            'Default search mode - this will match on ALL search words')
        comicquery = name.replace(" ", " AND ")
        explicit = 'all'

    if mylar.COMICVINE_API == 'None' or mylar.COMICVINE_API is None or mylar.COMICVINE_API == mylar.DEFAULT_CVAPI:
        logger.warn(
            'You have not specified your own ComicVine API key - alot of things will be limited. Get your own @ http://api.comicvine.com.'
        )
        comicapi = mylar.DEFAULT_CVAPI
    else:
        comicapi = mylar.COMICVINE_API

    if type is None:
        type = 'volume'

    #let's find out how many results we get from the query...
    searched = pullsearch(comicapi, comicquery, 0, explicit, type)
    if searched is None: return False
    totalResults = searched.getElementsByTagName(
        'number_of_total_results')[0].firstChild.wholeText
    logger.fdebug("there are " + str(totalResults) + " search results...")
    if not totalResults:
        return False
    countResults = 0
    while (countResults < int(totalResults)):
        #logger.fdebug("querying " + str(countResults))
        if countResults > 0:
            #2012/22/02 - CV API flipped back to offset usage instead of page
            if explicit == 'all' or explicit == 'loose':
                #all / loose uses page for offset
                offsetcount = (countResults / 100) + 1
            else:
                #explicit uses offset
                offsetcount = countResults

            searched = pullsearch(comicapi, comicquery, offsetcount, explicit,
                                  type)
        comicResults = searched.getElementsByTagName(type)  #('volume')
        body = ''
        n = 0
        if not comicResults:
            break
        for result in comicResults:
            #retrieve the first xml tag (<tag>data</tag>)
            #that the parser finds with name tagName:
            arclist = []
            if type == 'story_arc':
                #call cv.py here to find out issue count in story arc
                try:
                    logger.fdebug('story_arc ascension')
                    names = len(result.getElementsByTagName('name'))
                    n = 0
                    logger.fdebug('length: ' + str(names))
                    xmlpub = None  #set this incase the publisher field isn't populated in the xml
                    while (n < names):
                        logger.fdebug(
                            result.getElementsByTagName('name')
                            [n].parentNode.nodeName)
                        if result.getElementsByTagName(
                                'name')[n].parentNode.nodeName == 'story_arc':
                            logger.fdebug('yes')
                            try:
                                xmlTag = result.getElementsByTagName(
                                    'name')[n].firstChild.wholeText
                                xmlTag = xmlTag.rstrip()
                                logger.fdebug('name: ' + str(xmlTag))
                            except:
                                logger.error(
                                    'There was a problem retrieving the given data from ComicVine. Ensure that www.comicvine.com is accessible.'
                                )
                                return

                        elif result.getElementsByTagName(
                                'name')[n].parentNode.nodeName == 'publisher':
                            logger.fdebug('publisher check.')
                            xmlpub = result.getElementsByTagName(
                                'name')[n].firstChild.wholeText

                        n += 1
                except:
                    logger.warn('error retrieving story arc search results.')
                    return

                siteurl = len(result.getElementsByTagName('site_detail_url'))
                s = 0
                logger.fdebug('length: ' + str(names))
                xmlurl = None
                while (s < siteurl):
                    logger.fdebug(
                        result.getElementsByTagName('site_detail_url')
                        [s].parentNode.nodeName)
                    if result.getElementsByTagName('site_detail_url')[
                            s].parentNode.nodeName == 'story_arc':
                        try:
                            xmlurl = result.getElementsByTagName(
                                'site_detail_url')[s].firstChild.wholeText
                        except:
                            logger.error(
                                'There was a problem retrieving the given data from ComicVine. Ensure that www.comicvine.com is accessible.'
                            )
                            return
                    s += 1

                xmlid = result.getElementsByTagName(
                    'id')[0].firstChild.wholeText

                if xmlid is not None:
                    #respawn to the exact id for the story arc and count the # of issues present.
                    ARCPULL_URL = mylar.CVURL + 'story_arc/4045-' + str(
                        xmlid
                    ) + '/?api_key=' + str(
                        comicapi
                    ) + '&field_list=issues,name,first_appeared_in_issue,deck,image&format=xml&offset=0'
                    logger.fdebug('arcpull_url:' + str(ARCPULL_URL))
                    if mylar.CVAPI_COUNT == 0 or mylar.CVAPI_COUNT >= mylar.CVAPI_MAX:
                        cvapi_check()
                    try:
                        file = urllib2.urlopen(ARCPULL_URL)
                    except urllib2.HTTPError, err:
                        logger.error('err : ' + str(err))
                        logger.error(
                            'There was a major problem retrieving data from ComicVine - on their end.'
                        )
                        return

                    mylar.CVAPI_COUNT += 1
                    arcdata = file.read()
                    file.close()
                    arcdom = parseString(arcdata)

                    try:
                        logger.fdebug('story_arc ascension')
                        issuecount = len(arcdom.getElementsByTagName('issue'))
                        issuedom = arcdom.getElementsByTagName('issue')
                        isc = 0
                        arclist = ''
                        for isd in issuedom:
                            zeline = isd.getElementsByTagName('id')
                            isdlen = len(zeline)
                            isb = 0
                            while (isb < isdlen):
                                if isc == 0:
                                    arclist = str(zeline[isb].firstChild.
                                                  wholeText).strip()
                                else:
                                    arclist += '|' + str(zeline[isb].firstChild
                                                         .wholeText).strip()
                                isb += 1

                            isc += 1

                    except:
                        logger.fdebug(
                            'unable to retrive issue count - nullifying value.'
                        )
                        issuecount = 0

                    try:
                        firstid = None
                        arcyear = None
                        fid = len(arcdom.getElementsByTagName('id'))
                        fi = 0
                        while (fi < fid):
                            if arcdom.getElementsByTagName(
                                    'id'
                            )[fi].parentNode.nodeName == 'first_appeared_in_issue':
                                if not arcdom.getElementsByTagName('id')[
                                        fi].firstChild.wholeText == xmlid:
                                    logger.fdebug('hit it.')
                                    firstid = arcdom.getElementsByTagName(
                                        'id')[fi].firstChild.wholeText
                                    break  # - dont' break out here as we want to gather ALL the issue ID's since it's here
                            fi += 1
                        logger.fdebug('firstid: ' + str(firstid))
                        if firstid is not None:
                            firstdom = cv.pulldetails(comicid=None,
                                                      type='firstissue',
                                                      issueid=firstid)
                            logger.fdebug('success')
                            arcyear = cv.GetFirstIssue(firstid, firstdom)
                    except:
                        logger.fdebug(
                            'Unable to retrieve first issue details. Not caclulating at this time.'
                        )

                    if (arcdom.getElementsByTagName('image')
                        [0].childNodes[0].nodeValue) is None:
                        xmlimage = arcdom.getElementsByTagName(
                            'super_url')[0].firstChild.wholeText
                    else:
                        xmlimage = "cache/blankcover.jpg"

                    try:
                        xmldesc = arcdom.getElementsByTagName(
                            'desc')[0].firstChild.wholeText
                    except:
                        xmldesc = "None"

                    try:
                        xmldeck = arcdom.getElementsByTagName(
                            'deck')[0].firstChild.wholeText
                    except:
                        xmldeck = "None"

                    if xmlid in comicLibrary:
                        haveit = comicLibrary[xmlid]
                    else:
                        haveit = "No"

                comiclist.append({
                    'name': xmlTag,
                    'comicyear': arcyear,
                    'comicid': xmlid,
                    'url': xmlurl,
                    'issues': issuecount,
                    'comicimage': xmlimage,
                    'publisher': xmlpub,
                    'description': xmldesc,
                    'deck': xmldeck,
                    'arclist': arclist,
                    'haveit': haveit
                })

                logger.info(arclist)

            else:
                xmlcnt = result.getElementsByTagName(
                    'count_of_issues')[0].firstChild.wholeText
                #here we can determine what called us, and either start gathering all issues or just limited ones.
                if issue is not None and str(issue).isdigit():
                    #this gets buggered up with NEW/ONGOING series because the db hasn't been updated
                    #to reflect the proper count. Drop it by 1 to make sure.
                    limiter = int(issue) - 1
                else:
                    limiter = 0
                #get the first issue # (for auto-magick calcs)
                try:
                    xmlfirst = result.getElementsByTagName(
                        'issue_number')[0].firstChild.wholeText
                    if '\xbd' in xmlfirst:
                        xmlfirst = "1"  #if the first issue is 1/2, just assume 1 for logistics
                except:
                    xmlfirst = '1'

                #logger.info('There are : ' + str(xmlcnt) + ' issues in this series.')
                #logger.info('The first issue started at # ' + str(xmlfirst))

                cnt_numerical = int(xmlcnt) + int(
                    xmlfirst
                )  # (of issues + start of first issue = numerical range)
                #logger.info('The maximum issue number should be roughly # ' + str(cnt_numerical))
                #logger.info('The limiter (issue max that we know of) is # ' + str(limiter))
                if cnt_numerical >= limiter:
                    cnl = len(result.getElementsByTagName('name'))
                    cl = 0
                    xmlTag = 'None'
                    xmlimage = "cache/blankcover.jpg"
                    while (cl < cnl):
                        if result.getElementsByTagName(
                                'name')[cl].parentNode.nodeName == 'volume':
                            xmlTag = result.getElementsByTagName(
                                'name')[cl].firstChild.wholeText
                            #break

                        if result.getElementsByTagName(
                                'name')[cl].parentNode.nodeName == 'image':
                            xmlimage = result.getElementsByTagName(
                                'super_url')[0].firstChild.wholeText

                        cl += 1

                    if (result.getElementsByTagName('start_year')[0].firstChild
                        ) is not None:
                        xmlYr = result.getElementsByTagName(
                            'start_year')[0].firstChild.wholeText
                    else:
                        xmlYr = "0000"
                    #logger.info('name:' + str(xmlTag) + ' -- ' + str(xmlYr))
                    if xmlYr in limityear or limityear == 'None':
                        xmlurl = result.getElementsByTagName(
                            'site_detail_url')[0].firstChild.wholeText
                        idl = len(result.getElementsByTagName('id'))
                        idt = 0
                        xmlid = None
                        while (idt < idl):
                            if result.getElementsByTagName(
                                    'id')[idt].parentNode.nodeName == 'volume':
                                xmlid = result.getElementsByTagName(
                                    'id')[idt].firstChild.wholeText
                                break
                            idt += 1

                        if xmlid is None:
                            logger.error(
                                'Unable to figure out the comicid - skipping this : '
                                + str(xmlurl))
                            continue
                        #logger.info('xmlid: ' + str(xmlid))
                        publishers = result.getElementsByTagName('publisher')
                        if len(publishers) > 0:
                            pubnames = publishers[0].getElementsByTagName(
                                'name')
                            if len(pubnames) > 0:
                                xmlpub = pubnames[0].firstChild.wholeText
                            else:
                                xmlpub = "Unknown"
                        else:
                            xmlpub = "Unknown"

                        try:
                            xmldesc = result.getElementsByTagName(
                                'description')[0].firstChild.wholeText
                        except:
                            xmldesc = "None"

                        #this is needed to display brief synopsis for each series on search results page.
                        try:
                            xmldeck = result.getElementsByTagName(
                                'deck')[0].firstChild.wholeText
                        except:
                            xmldeck = "None"

                        if xmlid in comicLibrary:
                            haveit = comicLibrary[xmlid]
                        else:
                            haveit = "No"
                        comiclist.append({
                            'name': xmlTag,
                            'comicyear': xmlYr,
                            'comicid': xmlid,
                            'url': xmlurl,
                            'issues': xmlcnt,
                            'comicimage': xmlimage,
                            'publisher': xmlpub,
                            'description': xmldesc,
                            'deck': xmldeck,
                            'haveit': haveit
                        })
                        #logger.fdebug('year: ' + str(xmlYr) + ' - constraint met: ' + str(xmlTag) + '[' + str(xmlYr) + '] --- 4050-' + str(xmlid))
                    else:
                        logger.fdebug(
                            'year: ' + str(xmlYr) +
                            ' -  contraint not met. Has to be within ' +
                            str(limityear))
            n += 1
        #search results are limited to 100 and by pagination now...let's account for this.
        countResults = countResults + 100
Пример #5
0
def storyarcinfo(xmlid):

    comicLibrary = listStoryArcs()

    arcinfo = {}

    if mylar.CONFIG.COMICVINE_API == 'None' or mylar.CONFIG.COMICVINE_API is None:
        logger.warn('You have not specified your own ComicVine API key - this is a requirement. Get your own @ http://api.comicvine.com.')
        return
    else:
        comicapi = mylar.CONFIG.COMICVINE_API

    #respawn to the exact id for the story arc and count the # of issues present.
    ARCPULL_URL = mylar.CVURL + 'story_arc/4045-' + str(xmlid) + '/?api_key=' + str(comicapi) + '&field_list=issues,publisher,name,first_appeared_in_issue,deck,image&format=xml&offset=0'
    #logger.fdebug('arcpull_url:' + str(ARCPULL_URL))

    #new CV API restriction - one api request / second.
    if mylar.CONFIG.CVAPI_RATE is None or mylar.CONFIG.CVAPI_RATE < 2:
        time.sleep(2)
    else:
        time.sleep(mylar.CONFIG.CVAPI_RATE)

    #download the file:
    payload = None

    try:
        r = requests.get(ARCPULL_URL, params=payload, verify=mylar.CONFIG.CV_VERIFY, headers=mylar.CV_HEADERS)
    except Exception as e:
        logger.warn('While parsing data from ComicVine, got exception: %s' % e)
        return

    try:
        arcdom = parseString(r.content)
    except ExpatError:
        if u'<title>Abnormal Traffic Detected' in r.content:
            logger.error('ComicVine has banned this server\'s IP address because it exceeded the API rate limit.')
        else:
            logger.warn('While parsing data from ComicVine, got exception: %s for data: %s' % (e, r.content))
        return
    except Exception as e:
        logger.warn('While parsing data from ComicVine, got exception: %s for data: %s' % (e, r.content))
        return

    try:
        logger.fdebug('story_arc ascension')
        issuedom = arcdom.getElementsByTagName('issue')
        issuecount = len( issuedom ) #arcdom.getElementsByTagName('issue') )
        isc = 0
        arclist = ''
        ordernum = 1
        for isd in issuedom:
            zeline = isd.getElementsByTagName('id')
            isdlen = len( zeline )
            isb = 0
            while ( isb < isdlen):
                if isc == 0:
                    arclist = str(zeline[isb].firstChild.wholeText).strip() + ',' + str(ordernum)
                else:
                    arclist += '|' + str(zeline[isb].firstChild.wholeText).strip() + ',' + str(ordernum)
                ordernum+=1 
                isb+=1

            isc+=1

    except:
        logger.fdebug('unable to retrive issue count - nullifying value.')
        issuecount = 0

    try:
        firstid = None
        arcyear = None
        fid = len ( arcdom.getElementsByTagName('id') )
        fi = 0
        while (fi < fid):
            if arcdom.getElementsByTagName('id')[fi].parentNode.nodeName == 'first_appeared_in_issue':
                if not arcdom.getElementsByTagName('id')[fi].firstChild.wholeText == xmlid:
                    logger.fdebug('hit it.')
                    firstid = arcdom.getElementsByTagName('id')[fi].firstChild.wholeText
                    break # - dont' break out here as we want to gather ALL the issue ID's since it's here
            fi+=1
        logger.fdebug('firstid: ' + str(firstid))
        if firstid is not None:
            firstdom = cv.pulldetails(comicid=None, type='firstissue', issueid=firstid)
            logger.fdebug('success')
            arcyear = cv.Getissue(firstid,firstdom,'firstissue')
    except:
        logger.fdebug('Unable to retrieve first issue details. Not caclulating at this time.')

    try:
        xmlimage = arcdom.getElementsByTagName('super_url')[0].firstChild.wholeText
    except:
        xmlimage = "cache/blankcover.jpg"

    try:
        xmldesc = arcdom.getElementsByTagName('desc')[0].firstChild.wholeText
    except:
        xmldesc = "None"

    try:
        xmlpub = arcdom.getElementsByTagName('publisher')[0].firstChild.wholeText
    except:
        xmlpub = "None"

    try:
        xmldeck = arcdom.getElementsByTagName('deck')[0].firstChild.wholeText
    except:
        xmldeck = "None"

    if xmlid in comicLibrary:
        haveit = comicLibrary[xmlid]
    else:
        haveit = "No"

    arcinfo = {
            #'name':                 xmlTag,    #theese four are passed into it only when it's a new add
            #'url':                  xmlurl,    #needs to be modified for refreshing to work completely.
            #'publisher':            xmlpub,
            'comicyear':            arcyear,
            'comicid':              xmlid,
            'issues':               issuecount,
            'comicimage':           xmlimage,
            'description':          xmldesc,
            'deck':                 xmldeck,
            'arclist':              arclist,
            'haveit':               haveit,
            'publisher':            xmlpub
            }

    return arcinfo