View Single Post
Lanjelin viss du vil ha en Python 3.6 version i Repo ditt.
Skrevet rask om med hjelp av noen verktøy,også litt nærmere PEP-8 .
Jeg trenges ikke og nevnes viss du bruker koden i Repo.
SPOILER ALERT! Vis spoiler

Kode

# nbno_3.py
# A rewrite to Python 3.6 of @Lanjelin nbno.py
# It works just the same:
# python nbno_3.py --id 2007091701011
import io
import urllib.request
import urllib.error
import urllib.parse
import os
import argparse
from PIL import Image

class theURL():
    def __init__(self, bokID):
        self.bokID = str(bokID)
        self.side = '0001'
        self.level = 5
        self.maxLevel = 5
        self.col = 0
        self.maxcol = 0
        self.row = 0
        self.maxrow = 0
        self.resX = '9999'
        self.resY = '9999'
        self.tileWidth = '1024'
        self.tileHeight = '1024'
        self.URL = ''

    def setLevel(self, level):
        self.level = int(level)

    def setMaxLevel(self, maxLevel):
        self.maxLevel = int(maxLevel)

    def updateURL(self):
        self.URL = 'http://www.nb.no/services/image/resolver?url_ver=geneza&urn=URN:NBN:no-nb_digibok_' +\
            str(self.bokID) + '_' + self.side +\
            '&maxLevel=' + str(self.maxLevel) + '&level=' + str(self.level) +\
            '&col=' + str(self.col) + '&row=' + str(self.row) +\
            '&resX=' + str(self.resX) + '&resY=' + str(self.resY) +\
            '&tileWidth=' + str(self.tileWidth) + \
            '&tileHeight=' + str(self.tileWidth)

    def newURL(self, side, col, row):
        self.side = str(side)
        self.col = int(col)
        self.row = int(row)
        self.updateURL()
        return self.URL

    def updateMaxColRow(self, side):
        c, r = 0, 0
        while True:
            xUrl = self.newURL(side, c, '0')
            try:
                req = urllib.request.Request(
                    xUrl, headers={'User-Agent': 'Mozilla/5.0'})
                response = urllib.request.urlopen(req)
            except urllib.error.HTTPError as e:
                c -= 1
                break
            else:
                c += 1
        while True:
            xUrl = self.newURL(side, '0', r)
            try:
                req = urllib.request.Request(
                    xUrl, headers={'User-Agent': 'Mozilla/5.0'})
                response = urllib.request.urlopen(req)
            except urllib.error.HTTPError as e:
                r -= 1
                break
            else:
                r += 1
        self.maxcol = int(c)
        self.maxrow = int(r)
        return str(c) + str(r)

def downloadPage(pageNum, bok):
    imageParts = []
    maxWidth, maxHeight = 0, 0
    r = 0
    while (r <= bok.maxrow):
        c = 0
        while (c <= bok.maxcol):
            url = bok.newURL(pageNum, c, r)
            try:
                req = urllib.request.Request(
                    url, headers={'User-Agent': 'Mozilla/5.0'})
                response = urllib.request.urlopen(req).read()
            except urllib.error.HTTPError as e:
                # print e
                error = e  # spiser bare denne da første ugyldige side spytter ut feilmeldinger før stopp
            else:
                img = Image.open(io.BytesIO(response))
                imageParts.append(img)
                if (r == 0):
                    maxWidth += img.size[0]
                if (c == 0):
                    maxHeight += img.size[1]
            c += 1
        r += 1
    if (len(imageParts) == 0):
        print('Ferdig med å laste ned alle sider.')
        exit()
    else:
        sinWidth, sinHeight = imageParts[0].size
        newImg = Image.new('RGB', (maxWidth, maxHeight))
        r = 0
        partCount = 0
        while (r <= bok.maxrow):
            c = 0
            while (c <= bok.maxcol):
                newImg.paste(imageParts[partCount],
                             ((c * sinWidth), (r * sinHeight)))
                partCount += 1
                c += 1
            r += 1
        newImg.save(folder + str(pageNum) + '.jpg')
        print('Lagret side ' + pageNum + '.jpg')
        # print 'MaxWidth: '+str(maxWidth)+' MaxHeight: '+str(maxHeight)
        # print 'SingleWidth: '+str(sinWidth)+' SingleHeight: '+str(sinHeight)
        # print 'Antall bilder per side: '+str(len(imageParts))

parser = argparse.ArgumentParser()
optional = parser._action_groups.pop()
required = parser.add_argument_group('required arguments')
required.add_argument('--id', metavar='<bokID>',help='IDen på boken som skal lastes ned', default=False)
optional.add_argument('--start', metavar='<int>', help='Sidetall å starte på', default=False)
optional.add_argument('--stop', metavar='<int>', help='Sidetall å stoppe på', default=False)
optional.add_argument('--level', metavar='<int>', help='Sett Level', default=False)
optional.add_argument('--maxlevel', metavar='<int>', help='Sett MaxLevel', default=False)
parser._action_groups.append(optional)
args = parser.parse_args()

if args.id:
    x = theURL(str(args.id))
    print('Laster ned bok med ID: ' + str(args.id))
    folder = '.' + os.path.sep + str(x.bokID) + os.path.sep
    try:
        os.stat(folder)
    except:
        os.mkdir(folder)
    if args.level:
        x.setLevel(int(args.level))
    if args.maxlevel:
        x.setMaxLevel(int(args.maxlevel))
    x.updateMaxColRow('C1')
    downloadPage('C1', x)
    x.updateMaxColRow('C2')
    downloadPage('C2', x)
    x.updateMaxColRow('C3')
    downloadPage('C3', x)
    x.updateMaxColRow('0001')
    if args.start:
        pageCounter = int(args.start)
    else:
        pageCounter = 1
    if args.stop:
        stopPage = int(args.stop)
    else:
        stopPage = 9999
    while True:
        downloadPage(str(pageCounter).rjust(4, '0'), x)
        if (pageCounter == stopPage):
            print('Ferdig med å laste ned alle sider.')
            exit()
        pageCounter += 1
else:
    parser.print_help()
    exit()