bmc/main.py

224 lines
7.2 KiB
Python
Raw Normal View History

2014-04-25 14:13:37 +02:00
#!/usr/bin/env python2
# -*- coding: utf8 -*-
import os
import re
2014-04-24 00:18:49 +02:00
import shutil
import subprocess
import sys
import tempfile
import backend
import fetcher
import tearpages
import tools
import params
2014-04-24 00:18:49 +02:00
from bibtexparser.bparser import BibTexParser
from bibtexparser.customization import homogeneize_latex_encoding
2014-04-24 00:18:49 +02:00
EDITOR = os.environ.get('EDITOR') if os.environ.get('EDITOR') else 'vim'
2014-04-24 00:18:49 +02:00
def checkBibtex(filename, bibtex):
print("The bibtex entry found for "+filename+" is :")
bibtex = BibTexParser(bibtex, customization=homogeneize_latex_encoding)
2014-04-25 14:13:37 +02:00
bibtex = bibtex.get_entry_dict()
if len(bibtex) > 0:
bibtex_name = bibtex.keys()[0]
bibtex = bibtex[bibtex_name]
bibtex_string = backend.parsed2Bibtex(bibtex)
else:
bibtex_string = ''
print(bibtex_string)
2014-04-28 22:23:05 +02:00
check = tools.rawInput("Is it correct ? [Y/n] ")
2014-04-25 14:13:37 +02:00
while check.lower() == 'n':
with tempfile.NamedTemporaryFile(suffix=".tmp") as tmpfile:
tmpfile.write(bibtex_string)
tmpfile.flush()
subprocess.call([EDITOR, tmpfile.name])
bibtex = BibTexParser(tmpfile.read()+"\n",
customization=homogeneize_latex_encoding)
bibtex = bibtex.get_entry_dict()
if len(bibtex) > 0:
bibtex_name = bibtex.keys()[0]
bibtex = bibtex[bibtex_name]
bibtex_string = backend.parsed2Bibtex(bibtex)
else:
bibtex_string = ''
2014-04-25 14:13:37 +02:00
print("\nThe bibtex entry for "+filename+" is :")
print(bibtex_string)
2014-04-28 22:23:05 +02:00
check = tools.rawInput("Is it correct ? [Y/n] ")
return bibtex
def addFile(src, filetype):
2014-04-24 00:18:49 +02:00
"""
Add a file to the library
"""
if filetype == 'article' or filetype is None:
doi = fetcher.findDOI(src)
if filetype == 'book' or (filetype is None and doi is False):
isbn = fetcher.findISBN(src)
if doi is False and isbn is False:
if filetype is None:
tools.warning("Could not determine the DOI or the ISBN for " +
src+"."+"Switching to manual entry.")
doi_isbn = ''
while doi_isbn not in ['doi', 'isbn']:
2014-04-28 22:23:05 +02:00
doi_isbn = tools.rawInput("DOI / ISBN ? ").lower()
if doi_isbn == 'doi':
2014-04-28 22:23:05 +02:00
doi = tools.rawInput('DOI ? ')
else:
2014-04-28 22:23:05 +02:00
isbn = tools.rawInput('ISBN ? ')
elif filetype == 'article':
2014-04-28 22:23:05 +02:00
tools.warning("Could not determine the DOI for "+src +
", switching to manual entry.")
2014-04-28 22:23:05 +02:00
doi = tools.rawInput('DOI ? ')
elif filetype == 'book':
2014-04-28 22:23:05 +02:00
tools.warning("Could not determine the ISBN for "+src +
", switching to manual entry.")
2014-04-28 22:23:05 +02:00
isbn = tools.rawInput('ISBN ? ')
elif doi is not False:
print("DOI for "+src+" is "+doi+".")
elif isbn is not False:
print("ISBN for "+src+" is "+isbn+".")
if doi is not False and doi != '':
2014-04-25 14:13:37 +02:00
# Add extra \n for bibtexparser
bibtex = fetcher.doi2Bib(doi).strip().replace(',', ",\n")+"\n"
elif isbn is not False and isbn != '':
2014-04-25 14:13:37 +02:00
# Idem
bibtex = fetcher.isbn2Bib(isbn).strip()+"\n"
else:
bibtex = ''
bibtex = checkBibtex(src, bibtex)
authors = re.split(' and ', bibtex['author'])
if bibtex['type'] == 'article':
new_name = params.format_articles
try:
new_name = new_name.replace("%j", bibtex['journal'])
except:
pass
elif bibtex['type'] == 'book':
new_name = params.format_books
new_name = new_name.replace("%t", bibtex['title'])
try:
new_name = new_name.replace("%Y", bibtex['year'])
except:
pass
new_name = new_name.replace("%f", authors[0].split(',')[0].strip())
new_name = new_name.replace("%l", authors[-1].split(',')[0].strip())
new_name = new_name.replace("%a", ', '.join([i.split(',')[0].strip()
for i in authors]))
2014-04-28 22:23:05 +02:00
new_name = params.folder+tools.slugify(new_name)+tools.getExtension(src)
2014-04-24 00:18:49 +02:00
while os.path.exists(new_name):
2014-04-28 22:23:05 +02:00
tools.warning("file "+new_name+" already exists.")
default_rename = new_name.replace(tools.getExtension(new_name),
" (2)"+tools.getExtension(new_name))
rename = tools.rawInput("New name ["+default_rename+"] ? ")
if rename == '':
new_name = default_rename
else:
new_name = rename
2014-04-25 15:36:54 +02:00
bibtex['file'] = new_name
2014-04-24 00:18:49 +02:00
try:
shutil.copy2(src, new_name)
except IOError:
new_name = False
sys.exit("Unable to move file to library dir " + params.folder+".")
2014-04-24 00:18:49 +02:00
# Remove first page of IOP papers
if 'IOP' in bibtex['publisher'] and bibtex['type'] == 'article':
tearpages.tearpage(new_name)
backend.bibtexAppend(bibtex)
return new_name
2014-04-24 00:18:49 +02:00
def downloadFile(url, filetype):
2014-04-28 22:23:05 +02:00
dl, contenttype = fetcher.download(url)
2014-04-26 18:40:32 +02:00
if dl is not False:
tmp = tempfile.NamedTemporaryFile(suffix='.'+contenttype)
with open(tmp.name, 'w+') as fh:
2014-04-26 18:40:32 +02:00
fh.write(dl)
new_name = addFile(tmp.name, filetype)
tmp.close()
return new_name
else:
2014-04-28 22:23:05 +02:00
tools.warning("Could not fetch "+url)
return False
2014-04-24 00:18:49 +02:00
if __name__ == '__main__':
try:
if len(sys.argv) < 2:
sys.exit("Usage : TODO")
2014-04-24 00:18:49 +02:00
if sys.argv[1] == 'download':
if len(sys.argv) < 3:
sys.exit("Usage : " + sys.argv[0] +
" download FILE [article|book]")
filetype = None
if len(sys.argv) > 3 and sys.argv[3] in ["article", "book"]:
filetype = sys.argv[3].lower()
new_name = downloadFile(sys.argv[2], filetype)
if new_name is not False:
print(sys.argv[2]+" successfully imported as "+new_name)
sys.exit()
2014-04-24 00:18:49 +02:00
if sys.argv[1] == 'import':
if len(sys.argv) < 3:
sys.exit("Usage : " + sys.argv[0] +
" import FILE [article|book]")
filetype = None
if len(sys.argv) > 3 and sys.argv[3] in ["article", "book"]:
filetype = sys.argv[3].lower()
2014-04-24 00:18:49 +02:00
new_name = addFile(sys.argv[2], filetype)
if new_name is not False:
print(sys.argv[2]+" successfully imported as "+new_name+".")
sys.exit()
2014-04-24 00:18:49 +02:00
2014-04-25 14:22:34 +02:00
elif sys.argv[1] == 'delete':
2014-04-25 15:36:54 +02:00
if len(sys.argv) < 3:
sys.exit("Usage : " + sys.argv[0] + " delete FILE|ID")
confirm = tools.rawInput("Are you sure you want to delete " +
sys.argv[2]+" ? [y/N] ")
if confirm.lower() == 'y':
if not backend.deleteId(sys.argv[2]):
if not backend.deleteFile(sys.argv[2]):
2014-04-28 22:23:05 +02:00
tools.warning("Unable to delete "+sys.argv[2])
sys.exit(1)
2014-04-25 15:36:54 +02:00
print(sys.argv[2]+" successfully deleted.")
2014-04-25 15:36:54 +02:00
sys.exit()
2014-04-25 14:22:34 +02:00
elif sys.argv[1] == 'list':
raise Exception('TODO')
2014-04-24 00:18:49 +02:00
elif sys.argv[1] == 'search':
raise Exception('TODO')
2014-04-25 15:36:54 +02:00
elif sys.argv[1] == 'rebuild':
raise Exception('TODO')
except KeyboardInterrupt:
sys.exit()