summaryrefslogblamecommitdiffstats
path: root/main.py
blob: 64602d67889cbce67f5985a9a1e2ed327dd98284 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13












                                     
                                                                                                













                                                                                   
 

                                                                                 
 








                                                                                       




                                                                                   
                                     
                                                      








































                                                                                        


                                             


                                                                                   
                                                                                        
            
                                                
         








                                                                        


                                                                       



                                                      
                  

                                                      



           
                                                                                                          







































                                                                                          
                                      



                          
#!/usr/bin/env python

import os
import sys
import getopt
import traceback

from pathlib import Path
from datetime import datetime
from configparser import ConfigParser


def usage():
    print(os.path.basename(sys.argv[0]) + " [-h|--help] [-t|--title title] [-c|--correspondent "
                                          "correspondent] [--tags tags] file")
    print("    -h|--help           prints this help and exits")
    print("    -t|--title          title to give to the file")
    print("    -c|--correspondent  correspondent of the file")
    print("    --tags              comma-separated additional tags for the file")
    print("    file                path to pdf to upload")


def read_config():
    config_object = ConfigParser()
    config_object.read(os.environ.get('XDG_CONFIG_HOME') + "/paperless_upload.ini")

    sever_info = config_object["SERVER_CONFIG"]
    state = config_object["STATE"]

    # if the year in the config doesn't match the current one, reset id back to 1
    year = state["year"]

    file_id = state["current_id"]

    if str(year) != str(datetime.now().strftime("%Y")):
        file_id = 1

    return sever_info["remote"], sever_info["remote_path"], sever_info["user"], file_id


def update_state(new_id):
    config_object = ConfigParser()
    config_object.read(os.environ.get('XDG_CONFIG_HOME') + "/paperless_upload.ini")

    state = config_object["STATE"]

    state["current_id"] = str(new_id)
    state["year"] = str(datetime.now().strftime("%Y"))

    # Write changes back to file
    with open(os.environ.get('XDG_CONFIG_HOME') + "/paperless_upload.ini", 'w') as conf:
        config_object.write(conf)


def upload(remote, remote_path, username, file_id, path, title, correspondent, tags):
    if not remote_path:
        remote_path = input("Remote path: ")
    if not remote:
        remote = input("Remote: ")
    if not remote_path:
        remote_path = input("Consumer path: ")
    if not username:
        username = input("Username: ")
    if not file_id:
        file_id = input("File ID: ")
    if not title:
        title = input("Title: ")
    if not correspondent:
        correspondent = input("Correspondent: ")

    if not remote:
        print("You need to name a remote server to push to!")
        sys.exit(6)
    if not remote_path:
        print("You need to name a remote path to push to!")
        sys.exit(6)
    if not username:
        print("You need to provide a username to login with!")
        sys.exit(6)
    if not file_id:
        file_id = "NONE"
    if not title:
        title = Path(path).with_suffix('').__str__()
    if not correspondent:
        correspondent = "UNSET"

    # current date and time
    now = datetime.now()
    zulu_format = "%Y%m%d%H%M%S"
    year_format = "%Y"
    time_stamp = now.strftime(zulu_format)
    check_in_year = now.strftime(year_format)

    # https://paperless.readthedocs.io/en/latest/guesswork.html?highlight=guesswork
    # --> "Date - Correspondent - Title - tag,tag,tag.pdf"
    prefix = f"{time_stamp}Z - {correspondent} - {title} - id{file_id},y{check_in_year}"
    if tags:
        guess_work_name = f"{prefix},{tags}.pdf"
    else:
        guess_work_name = f"{prefix}.pdf"

    print("")
    print(f"  #######################################")
    print(f"  # file the document \"{title}\" with the following infos")
    print(f"  #   year: {check_in_year}")
    print(f"  #     id: {file_id}")
    print(f"  #   tags: {tags}")
    print(f"  #######################################")

    remote_file = (remote_path + guess_work_name).replace(" ", "\\\\ ")
    command = f"scp {path} {username}@{remote}:\"{remote_file}\""
    print("")
    print("  #######################################")
    print("  # use the following command to upload")
    print("")
    print(command)
    print("")
    print("  #######################################")


def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "ht:c:a:", ["help", "title=", "correspondent=", "tags="])
    except getopt.GetoptError as err:
        # print help information and exit:
        print(err)  # will print something like "option -a not recognized"
        usage()
        sys.exit(2)

    title = ""
    correspondent = ""
    tags = ""

    for o, a in opts:
        if o in ("-h", "--help"):
            usage()
            sys.exit()
        elif o in ("-t", "--title"):
            title = a
        elif o in ("-c", "--correspondent"):
            correspondent = a
        elif o == "--tags":
            tags = a
        else:
            assert False, "unhandled option: " + o

    if len(args) != 1:
        usage()
        sys.exit(3)

    try:
        remote, remote_path, username, file_id = read_config()
    except Exception:
        traceback.print_exc()
        sys.exit(4)

    try:
        upload(remote=remote, remote_path=remote_path, username=username, file_id=file_id,
               path=args[0], title=title, correspondent=correspondent, tags=tags)
    except Exception:
        traceback.print_exc()
        sys.exit(5)
    else:
        update_state(int(file_id) + 1)


if __name__ == "__main__":
    main()