ComicRack_Scripts/CVIssueCount/v2/CVIssueCount.py

272 lines
8.2 KiB
Python

#
#CVIssueCount.py
#
#Author: Quinyd
#
#Description: Complete Story Arc with the Comic Vine info
#
#Versions:
# 0.1 First version
# 0.2 Added Progressbar, start and cancel buttons
# 0.3 Added issue count
#
#ComicRack Declarations
#
#@Name CVIssueCount
#@Hook Books
#@Key CVIssueCount
#@PCount 0
# $ cd "..\..\Program Files\ComicRack\
# $ ComicRack.exe -ssc
from __future__ import unicode_literals
import clr, re, sys, os, urlparse, time
from System.Diagnostics import Process
clr.AddReference("System.xml")
import System
from System import *
from System.IO import *
from System.Collections import *
from System.Threading import *
from System.Net import *
from System.Text import *
clr.AddReference('System')
clr.AddReference("System.Windows.Forms")
clr.AddReference("System.Drawing")
import System.Drawing
import System.Windows.Forms
from System.Drawing import *
from System.Windows.Forms import *
clr.AddReference('System.Drawing')
from System.Drawing import Point, Size, ContentAlignment, Color, SystemColors, Icon
clr.AddReference('System.Threading')
from System.Threading import *
from datetime import datetime
import ssl, urllib
from System.ComponentModel import BackgroundWorker
stop=False
def CVIssueCount(books):
if books:
f = CVIssueCountForm(books)
r = f.ShowDialog()
else:
MessageBox.Show("No books selected")
return
class CVIssueCountForm(Form):
def __init__(self, books):
self.InitializeComponent()
self.books = books
self.percentage = 1.0/len(books)*100
self.progresspercent = 0.0
self.stop = False
def InitializeComponent(self):
self._label1 = System.Windows.Forms.Label()
self._Okay = System.Windows.Forms.Button();
self._Cancel = System.Windows.Forms.Button();
#resultLabel = System.Windows.Forms.Label();
self._progress = System.Windows.Forms.ProgressBar();
self.worker = BackgroundWorker();
self.SuspendLayout()
self.worker.WorkerSupportsCancellation = True
self.worker.WorkerReportsProgress = True
self.worker.DoWork += self.DoWork
self.worker.ProgressChanged += self.ReportProgress
self.worker.RunWorkerCompleted += self.WorkerCompleted
self._progress.Location = System.Drawing.Point(12, 114)
self._progress.Size = System.Drawing.Size(456, 17)
self._progress.TabIndex = 4
#
# label1
#
self._label1.AutoSize = True
self._label1.Location = System.Drawing.Point(12, 53)
self._label1.Name = "label1"
self._label1.Size = System.Drawing.Size(16, 13)
self._label1.TabIndex = 3
self._label1.Text = "Start searching Comicvine for issue counts using the 'Start' button"
#
# Okay
#
self._Okay.Location = System.Drawing.Point(312, 137)
self._Okay.Name = "Okay"
self._Okay.Size = System.Drawing.Size(75, 23)
self._Okay.TabIndex = 5
self._Okay.Text = "Start"
self._Okay.UseVisualStyleBackColor = True
self._Okay.Click += self.OkayClicked
#
# Cancel
#
self._Cancel.Location = System.Drawing.Point(393, 137)
self._Cancel.Name = "Cancel"
self._Cancel.Size = System.Drawing.Size(75, 23)
self._Cancel.TabIndex = 6
self._Cancel.Text = "Cancel"
self._Cancel.Enabled = False
self._Cancel.UseVisualStyleBackColor = True
self._Cancel.Click += self.CancelClicked
self.ClientSize = System.Drawing.Size(483, 170)
self.Controls.Add(self._Cancel)
self.Controls.Add(self._Okay)
self.Controls.Add(self._progress)
self.Controls.Add(self._label1)
self.Name = "CVIssueCount"
self.Text = "Get issue Count from CV"
self.MinimizeBox = False
self.MaximizeBox = False
self.AcceptButton = self._Okay
self.FormBorderStyle = FormBorderStyle.FixedDialog
self.StartPosition = FormStartPosition.CenterParent
self.ResumeLayout(False)
self.PerformLayout()
self.FormClosing += self.CheckClosing
def CheckClosing(self, sender, e):
if self.worker.IsBusy:
self.worker.CancelAsync()
e.Cancel = True
#print "close"
def OkayClicked(self, sender, e):
if self._Okay.Text == "Start":
if self.worker.IsBusy == False:
self.worker.RunWorkerAsync()
self._Cancel.Enabled = True
self._Okay.Enabled = False
#else:
#self.DialogResult = DialogResult.OK
def CancelClicked(self, sender, e):
if self.worker.IsBusy:
self.worker.CancelAsync()
self._Cancel.Enabled = False
def DoWork(self, sender, e):
e.Result = getIssueCount(sender,self.books)
def ReportProgress(self, sender, e):
self.progresspercent = self.percentage*e.ProgressPercentage
self._progress.Value = int(round(self.progresspercent))
self._label1.Text = "Searching for " + e.UserState.ToString()
def WorkerCompleted(self, sender, e):
self._Okay.Text = "Done"
self.Close()
self.Dispose()
def getIssueCount(worker,books):
API_KEY="<API_KEY>"
all_books_original = ComicRack.App.GetLibraryBooks()
stop=False
CheckedVolumes=list()
IssueCountList=list()
IssueCount=0
failed = 0
count = 0
report = System.Text.StringBuilder()
for book in books:
if worker.CancellationPending:
return failed,report.ToString()
volume = book.GetCustomValue("comicvine_volume")
seriesVolume = volume
bookinfo = "#" + str(book.Number) + " " + book.Series + " (" + str(book.Volume) + ")"
count += 1
worker.ReportProgress(count,bookinfo)
if volume not in CheckedVolumes:
QUERY = "https://comicvine.gamespot.com/api/volume/4050-"+ volume +"/?api_key=" + API_KEY + "&format=xml&field_list=count_of_issues"
print QUERY
data = _read_url(QUERY.encode('utf-8'))
time.sleep(10)
doc = System.Xml.XmlDocument()
doc.LoadXml(data)
elemList = doc.GetElementsByTagName("count_of_issues")
for i in elemList:
IssueCount = int(i.InnerXml)
if i.InnerText == "":
failed += 1
report.Append(i.InnerText)
else:
report.Append(i.InnerText)
print str(volume) + "'s count is " + str(IssueCount)
CheckedVolumes.append(volume)
IssueCountList.append(IssueCount)
for book in all_books_original:
volume = book.GetCustomValue("comicvine_volume")
if volume == seriesVolume:
if book.Number.isnumeric:
book.Count = IssueCount
book.SetCustomValue("comicvine_issue_count",str(IssueCount))
return failed,report.ToString()
def _read_url(url):
page = ''
requestUri = url
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
Req = HttpWebRequest.Create(requestUri)
Req.Timeout = 60000
Req.UserAgent = "CVIssueCount/" + " (https://gitea.baerentsen.space/FrederikBaerentsen/ComicRack_Scripts/src/branch/master/CVIssueCount)"
Req.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
#Req.Referer = requestUri
Req.Accept = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'
Req.Headers.Add('Accept-Language','en-US,en;q=0.9,it;q=0.8,fr;q=0.7,de-DE;q=0.6,de;q=0.5')
Req.KeepAlive = True
webresponse = Req.GetResponse()
a = webresponse.Cookies
inStream = webresponse.GetResponseStream()
encode = Encoding.GetEncoding("utf-8")
ReadStream = StreamReader(inStream, encode)
page = ReadStream.ReadToEnd()
try:
inStream.Close()
webresponse.Close()
except:
pass
return page