alexgand / springer_free_books

Python script to download all Springer books released for free during the 2020 COVID-19 quarantine
GNU General Public License v3.0
1.65k stars 366 forks source link

Problem with temporary directory in Windows OS #70

Open derwyddon opened 4 years ago

derwyddon commented 4 years ago

Inside helper.py the subfolder "./tmp" is not welcomed in my Windows 10 I have replaced the line path = create_path('tmp') with path = create_path(os.path.join(book_path, 'tmp'))

I have added also a shutil.rmtree(os.path.join(book_path, 'tmp')) at the end of the _download_book(url, book_path) function

I made the workaraound without inspecting the whole code. But it is working fine now in my Windows machine. I thinks it is also compatible with other OS's as I have used os.path.join without the os.path.sep, but I have not tested it.

chaosAD commented 4 years ago

As far as I know, Python open() can handle both format, unless it breaks somewhere else. I am running under Windows 10 too and it works just fine. It might break if you changed the code by adding other libraries on your own which cannot handle the forward-slash path.

What was the error?

Can you try changing create_path() to the following to see if it works out fine:

def create_path(path):
    path = os.path.join('', path)
    if not os.path.exists(path):
        os.makedirs(path)
    return path
derwyddon commented 4 years ago

The error is (for each book that needs the 'tmp'): [WinError 123] El nombre de archivo, el nombre de directorio o la sintaxis de la etiqueta del volumen no son correctos: '.\tmp' that in english seems to translate as "The filename, directory name, or volume label syntax is incorrect" that is a bit generic error.

Unfortunatelly I made a mistake with the first workaround and I finished with subdirs with the name of the books with the book inside with name "_-_tempfile-_.bak". Due I supposed book_path was only the book path without including the book name.

With this _download_book tunned function I have downloaded all the books in my Win 10 Spanish (but I have not tested it in other OS's:

def _download_book(url, book_path):
    if not os.path.exists(book_path):
        with requests.get(url, stream=True) as req:
            # path = create_path('.\tmp')
            tmp_folder = os.path.join(os.path.split(book_path)[0], 'tmp')
            path = create_path(tmp_folder)
            tmp_file = os.path.join(path, '_-_temp_file_-_.bak')
            with open(tmp_file, 'wb') as out_file:
                shutil.copyfileobj(req.raw, out_file)
                out_file.close()
            shutil.move(tmp_file, book_path)
            shutil.rmtree(tmp_folder)

I have used the os.path functions join and split to create a tmp folder inside each book genre and I removed it (each time a book is downloaded... I know is not very optimized) with rmtree from shutil

derwyddon commented 4 years ago

As far as I know, Python open() can handle both format, unless it breaks somewhere else. I am running under Windows 10 too and it works just fine. It might break if you changed the code by adding other libraries on your own which cannot handle the forward-slash path.

What was the error?

Can you try changing create_path() to the following to see if it works out fine:

def create_path(path):
    path = os.path.join('', path)
    if not os.path.exists(path):
        os.makedirs(path)
    return path

I forget to comment that I tried firstly your tunned function create_path but I have found the same "[WinError 123] " than with the original one.