Something went wrong. Try again.
moderation music collection code, output, history etc.
Something went wrong. Try again.
moderation moderation.py
7.7 kB · 218 lines
Python
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219import csv, urllib, time, datetime, operator, gzip, shutil, Zopflifrom time import localtime, strftime
# retreive csv data from google docs# data = urllib.urlopen("https://docs.google.com/a/sooper.org/spreadsheet/pub?key=0AtnmrDi58ubkdEt5cUtmMndoalNpSWdmYjFuQjhKTFE&single=true&gid=0&output=csv")data = urllib.urlopen("https://docs.google.com/a/sooper.org/spreadsheets/d/1BF8fMUb6OixAlgis2sZq7j_HxltlGswjd6lanvsdrpI/export?format=csv&gid=0")
# persist to csvc = open('moderation.csv', 'w')c.write(data.read())c.close()
data = open('moderation.csv', 'r')collection = csv.reader(data, delimiter=',', quotechar='"')
rowcount = len(list(collection)) - 1
data.seek(0) # reset file iterator after determining number or rowscollection.next()
collection = sorted(collection, key=lambda k: (k[0].lower(), k[2].lower(), k[1].lower()), reverse=False)
data.close()
dstamp = datetime.datetime.utcfromtimestamp(time.time())updated = dstamp.strftime('%Y-%m-%dT%H:%M:%S.000Z')
output = ''
output += '<!DOCTYPE html>'# output += '<html manifest=manifest.appcache>'output += '<head>'output += '<meta charset=utf-8>'output += '<title>moderation » ' + str(rowcount) + ' total » updated @ ' + updated + '</title>'output += '<link rel=icon href=/favicon.ico>'output += '<link rel=stylesheet href=moderation.css media=all>'output += '</head>'output += '<body>'output += '<table id=moderation><caption>moderation cd collection</caption>'output += '<thead><tr><th title="click to sort by Artist">Artist<th title="click to sort by Title">Title<th title="click to sort by Year">Year<th title="click to sort by Label">Label<th title=serial>Serial<th title=search>Search<tbody>'
prior = ''for row in collection: output += '<tr>' artist = '<td' if row[0] != prior: # artist += ' id=' + ''.join(row[0].split()).lower() artist += ' id=' + filter(str.isalpha, row[0]).lower() if len(row) > 12 and len(row[12]): if '=' in row[12]: artist += ' class="a w"><a href="http://' + row[12].replace('&', '&') + '">' + row[0].replace('&', '&') + '</a>' else: artist += ' class="a w"><a href=http://' + row[12].replace('&', '&') + '>' + row[0].replace('&', '&') + '</a>' else: artist += ' class=a>' + row[0].replace('&', '&') prior = row[0] output += artist output += '<td class=t>' + row[1].replace('&', '&')
more = '' if len(row) > 14 and len(row[14]): if 'Split' in row[14]: more += '<span title="Split EP">Ø</span>' if 'Limited' in row[14]: more += '<span title="Limited Edition">Γ</span>' if 'Box' in row[14]: more += '<span title="Box Set">ß</span>' if 'Double' in row[14]: more += '<span title="Double CD">Ð</span>' if 'Multimedia' in row[14]: more += '<span title="Multimedia Interactive">Μ</span>' if 'Reissue' in row[14]: more += '<span title="Reissue">Ζ</span>' if 'Amazon' in row[14]: more += '<span title="Electronic | Amazon">€</span>' if 'iTunes' in row[14]: more += '<span title="Electronic | iTunes">€</span>' if 'DRM' in row[14]: more += '<span title="DRM">©</span>' if 'MP3' in row[14] and not 'Amazon' in row[14] and not 'iTunes' in row[14]: more += '<span title="Electronic | MP3">Γ</span>' if 'Controlled' in row[14]: more += '<span title="Copy Controlled">©</span>' if 'Soundtrack' in row[14]: more += '<span title="Soundtrack">§</span>' if 'Paypal' in row[14]: more += '<span title="Paypal">¢</span>'
output += more
output += '<td class=y>' + row[2] output += '<td class=l>' + row[5] output += '<td class=s>' + row[7].replace('&', '&')
meta = '<td class=m' if len(row) > 9 and len(row[9]): meta += ' data-upc=' + row[9] if len(row) > 11 and len(row[11]): meta += ' data-asin=' + row[11] meta += '>'
output += meta
output += '</table>'
output += '<div class=total>' + str(rowcount) + '</div><div class=scroller></div>'
output += '''
<div class=visualise><a title="SVG visualisation" href=moderation.svgz>SVG</a> | <a title="Google Docs" href="https://moderation-4np.pages.dev/">DOC</a> | <a title="Google Docs list view" href="https://moderation-4np.pages.dev/">LIST</a></div><script>
var artist, title, combo, asin, upc, a, b, g, m, d, t, meta = 0, i = 1, am = 'http://www.amazon.com/exec/obidos', ba = 'http://music.barnesandnoble.com/search', rows = document.querySelectorAll('tr'), numrows = rows.length, v = document.createElement('a'), f = document.createDocumentFragment();
var w = v.cloneNode(false); w.appendChild(document.createTextNode('\u0391'));
var x = v.cloneNode(false); x.appendChild(document.createTextNode('\u0392'));
var y = v.cloneNode(false); y.appendChild(document.createTextNode('\u0393'));
var z = v.cloneNode(false); z.appendChild(document.createTextNode('\u039c'));
var s = v.cloneNode(false); s.appendChild(document.createTextNode('\u00d0'));
var u = v.cloneNode(false); u.appendChild(document.createTextNode('\u03a4'));
for (i; i < numrows; i++) {
artist = rows[i].querySelector('td.a').textContent; title = rows[i].querySelector('td.t').textContent; meta = rows[i].querySelectorAll('td.t > span').length; if ( meta ) { title = title.substr(0, title.length - meta); } combo = artist + '\"+\"' + title + '\"';
a = w.cloneNode(true); asin = rows[i].querySelector('td.m').getAttribute('data-asin'); var d = ( asin ) ? a.setAttribute('href', am + '/ASIN/' + asin) : a.setAttribute('href', am + '/external-search/?mode=music&keyword=\"' + combo);
b = x.cloneNode(true); upc = rows[i].querySelector('td.m').getAttribute('data-upc'); var e = ( upc ) ? b.setAttribute('href', ba + '/product.asp?ean=' + upc) : b.setAttribute('href', ba + '/results.asp?WRD=\"' + combo);
g = y.cloneNode(true); g.setAttribute('href', 'https://encrypted.google.com/search?q=\"' + combo);
m = z.cloneNode(true); m.setAttribute('href', 'http://musicbrainz.org/taglookup.html?artist=\"' + artist + '\"&album=\"' + title + '\"');
d = s.cloneNode(true); d.setAttribute('href', 'http://www.discogs.com/search?type=all&artist=' + artist + '&title=' + title);
t = u.cloneNode(true); t.setAttribute('href', 'http://toma.hk/album/' + artist + '/' + title);
f.appendChild(a); f.appendChild(b); f.appendChild(g); f.appendChild(m); f.appendChild(d); f.appendChild(t);
rows[i].querySelector('td.m').appendChild(f); }
</script><script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><script src="//cdnjs.cloudflare.com/ajax/libs/datatables/1.10.3/js/jquery.dataTables.min.js"></script><script src="//cdnjs.cloudflare.com/ajax/libs/datatables-fixedheader/2.1.1/dataTables.fixedHeader.min.js"></script><script>
$(document).ready( function () { var oTable = $('#moderation').dataTable( { "bPaginate": false, "bLengthChange": false, "bFilter": true, "bSort": true, "bInfo": false, "bAutoWidth": false, "aaSorting": [], "aoColumns": [ { "sType": "html" }, null, null, null, { "bSortable": false }, { "bSortable": false } ] } ); new FixedHeader( oTable ); } );
</script><!-- 01101101 01101111 01100100 01100101 01110010 01100001 01110100 01101001 01101111 01101110 --></body></html>
'''
o = open('index.html', 'w')o.write(output)o.close()
f = open('index.html') # text file to compresst = gzip.GzipFile('index.htmlz', 'wb') # archive fileshutil.copyfileobj(f, t)f.close()
Zopfli.compress_file('index.html', 'index.html.gz')
f = open('moderation.css') # text file to compresst = gzip.GzipFile('moderation.cssz', 'wb') # archive fileshutil.copyfileobj(f, t)f.close()
Zopfli.compress_file('moderation.css', 'moderation.css.gz')