Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

converturl2abspath does not work in Windows and the temporary workaround #16

Open
yishilin14 opened this issue Mar 25, 2019 · 9 comments

Comments

@yishilin14
Copy link

yishilin14 commented Mar 25, 2019

The bat files do not work in Windows as indicated in #13.

The python itself does not work too. The function converturl2abspath does not return the correct file name in Windows. When url is file:///C:/Users/xxxxxx/xxxxxx.pdf, it returns C:/C:/Users/xxxxxx/xxxxxx.pdf.


Here goes my temporary fix, just in case some one need it in the future.

In menextract2pdf.py

  1. Add import urllib, urllib.request at the beginning.
  2. In converturl2abspath, change the return line to return urllib.request.url2pathname(pth).

Then run the following command.

python menextract2pdf.py "C:\Users\xxxxx\AppData\Local\Mendeley Ltd.\Mendeley Desktop\username@email.com@www.mendeley.com.sqlite" "C:\Users\xxxxx\AppData\Local\Mendeley Ltd.\Mendeley Desktop\Downloaded_new"

Now it works like magic!

@solarchemist
Copy link

I can confirm this issue on Windows 10. Also, my sincere thanks to @yishilin14 for the suggested fix and to @cycomanic for this fantastic script. I had reconciled myself with losing all my Mendeley annotations upon moving to Zotero (Mendeley is evil) but no more!

I almost never work on Windows, but since Mendeley encrypted the database I've had a v1.18 installation on a Windows 10 box. That meant all the PDF paths in the Mendeley database were Windows paths, so that's why I had to run this extraction on Windows.
In the hopes it might benefit someone else, here's the steps I took.

Windows 10 with Python (pip is apparently built-in these days):

> python -V
Python 3.7.2
> pip list
Package         Version
--------------- -------
pip             19.0.3
PyPDF2          1.26.0
python-dateutil 2.8.0
setuptools      40.6.2
six             1.12.0

I cloned this repo, and made only the following edits (note the slightly tweaked import compared to above):

$ git diff
diff --git a/src/menextract2pdf.py b/src/menextract2pdf.py
index c91a811..9b6ab5a 100644
--- a/src/menextract2pdf.py
+++ b/src/menextract2pdf.py
@@ -4,6 +4,7 @@
 # GPLv3 licence. See the COPYING file for details
 
 from __future__ import print_function
+from six.moves import urllib
 import sqlite3
 try:
     from urllib.parse import unquote, urlparse
@@ -28,7 +29,8 @@ def converturl2abspath(url):
         pth = unquote(urlparse(url).path) #this is necessary for filenames with unicode strings
     except:
         pth = unquote(str(urlparse(url).path)).decode("utf8") #this is necessary for filenames with unicode strings
-    return os.path.abspath(pth)
+    return urllib.request.url2pathname(pth)
 
 def get_highlights_from_db(db, results={}):
     """Extract the locations of highlights from the Mendeley database

I did try import urllib, urllib.request but got syntax errors, and using just import urllib gave AttributeError: module 'urllib' has no attribute 'request'. I'm not very familiar with Python, but this SO answer made me try from six.moves import urllib instead and that worked with the return line as-is.

> python .\menextract2pdf.py 'C:\Users\chepec\AppData\Local\Mendeley Ltd\Mendeley Desktop\chepec@www.mendeley.com.sqlite' Z:\chepec\literature\menextract\

Success, and over a thousand highlights will live to see another day :-)

@brendonyoder
Copy link

brendonyoder commented Jun 19, 2019

I am not a programmer. I am trying to import my Mendeley database, with thousands of highlights and notes, into Zotero. I've tried using this script as described in https://www.zotero.org/support/kb/mendeley_import, as well as the various fixes here. None of them works. Any help?

@cycomanic
Copy link
Owner

@chepec I only wrote the script with python2 initially, so the error you were encountering was an incompatibility with python3. I don't have a mendeley installation anymore, which makes keeping this updated a bit challenging. Maybe I will have to create an installation just to check things.

@cycomanic
Copy link
Owner

@brendonyoder what OS and what are the errors?

@brendonyoder
Copy link

I'm running Windows 10 and have Python 2.7 installed. I navigate to the extracted Menextract2pdf-master folder and enter menextract2pdf_overwrite.bat "%LOCALAPPDATA%\Mendeley Ltd.\Mendeley Desktop\" "%LOCALAPPDATA%\Mendeley Ltd.\Mendeley Desktop\Downloaded\"
and get REM Helps to find the right mendeley.sqlite-DB 1\*www.mendeley.com.sqlite"') do @set mendeleydb=a was unexpected at this time.

@daledali
Copy link

I'm running Windows 10 and have Python 2.7 installed. I navigate to the extracted Menextract2pdf-master folder and enter menextract2pdf_overwrite.bat "%LOCALAPPDATA%\Mendeley Ltd.\Mendeley Desktop\" "%LOCALAPPDATA%\Mendeley Ltd.\Mendeley Desktop\Downloaded\"
and get REM Helps to find the right mendeley.sqlite-DB 1\*www.mendeley.com.sqlite"') do @set mendeleydb=a was unexpected at this time.

same here

@daledali
Copy link

The bat files do not work in Windows as indicated in #13.

The python itself does not work too. The function converturl2abspath does not return the correct file name in Windows. When url is file:///C:/Users/xxxxxx/xxxxxx.pdf, it returns C:/C:/Users/xxxxxx/xxxxxx.pdf.

Here goes my temporary fix, just in case some one need it in the future.

In menextract2pdf.py

  1. Add import urllib, urllib.request at the beginning.
  2. In converturl2abspath, change the return line to return urllib.request.url2pathname(pth).

Then run the following command.

python menextract2pdf.py "C:\Users\xxxxx\AppData\Local\Mendeley Ltd.\Mendeley Desktop\username@email.com@www.mendeley.com.sqlite" "C:\Users\xxxxx\AppData\Local\Mendeley Ltd.\Mendeley Desktop\Downloaded_new"

Now it works like magic!

this worked!

@jorishijmans
Copy link

jorishijmans commented Oct 29, 2020

After following direction above, I receive the following error:

Traceback (most recent call last):

File "C:\Users\XXXX\Downloads\Menextract2pdf-master\menextract2pdf.py", line 200, in <module> mendeley2pdf(fn, dir_pdf)

File "C:\Users\XXXX\Downloads\Menextract2pdf-master\menextract2pdf.py", line 175, in mendeley2pdf highlights = get_highlights_from_db(db)

File "C:\Users\XXXX\Downloads\Menextract2pdf-master\menextract2pdf.py", line 60, in get_highlights_from_db ret = db.execute(query)

sqlite3.OperationalError: no such table: Files

Help with resolving this error would be much appreciated as it may preserve countless annotations.

@PHJT003
Copy link

PHJT003 commented Nov 21, 2020

I am experiencing the same issue @J-FSS has. At the moment, my Mendeley's version is 1.19.4 and am not sure whether I need to downgrade it to 1.18 for the temporary fix of @yishilin14 to work.
Can anybody help, please?

Below is the output I get in my terminal, when I run the code from an anaconda environment with Python 2.7.

(pyenv_27) C:\Users\Valerio\Downloads\Menextract2pdf-master\src>python menextract2pdf.py "C:\Users\Valerio\AppData\Local\Mendeley Ltd.\Mendeley Desktop\valerio***@***@www.mendeley.com.sqlite" "C:\Users\Valerio\AppData\Local\Mendeley Ltd.\Mendeley Desktop\Downloaded_new"
Traceback (most recent call last):
  File "menextract2pdf.py", line 199, in <module>
    mendeley2pdf(fn, dir_pdf)
  File "menextract2pdf.py", line 174, in mendeley2pdf
    highlights = get_highlights_from_db(db)
  File "menextract2pdf.py", line 59, in get_highlights_from_db
    ret = db.execute(query)
sqlite3.OperationalError: no such table: Files

Thanks a lot!

P.S.: I really would like to migrate to Zotero, but must keep my notes and highlights from Mendeley... please, help us leave Mendeley! Thanks again.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants