coding: utf-8

May 19, 2021 ยท View on GitHub

#!/usr/bin/env python

coding: utf-8

What is this?

This script is for logseq webapp users that want to switch to the local version.

It will download all images that are linked inside your graph and store them in the local "/assets/" folder.

Remarks

1. Only supports Markdown files (for now)

2. Filnames are not preserved. The filenames will be a news random string. (Let me know if you need it otherwise.)

2. Make sure you close Logseq Desktop app and disconnect web app before starting!

3. Use at your own risk! Verify everything worked before permanently moving to the new local version!

How to use

1. Download your logseq repository from Github to your local machine.

2. Run the script with "-f "

3. Reccomended if you know how: Check the uncommitted changes to the repository. This is an easy way to check if everything worked as intended.

3. Open that folder in the logseq client.

import glob import re import uuid import urllib.request from urllib.error import HTTPError import shutil from pathlib import Path import argparse

regex_markdownFile = re.compile(r'![[^]]](([^)]))') # markdown file syntax

def save_file_locally(logseq_dir, url): try: with urllib.request.urlopen(url) as r: file_ending = "." + r.info().get_content_subtype() filename = str(uuid.uuid4().hex) + str(uuid.uuid4().hex) + str(uuid.uuid4().hex) + file_ending

        with open(logseq_dir+"assets/"+filename, 'wb') as out_file:
            shutil.copyfileobj(r, out_file)
    return "../assets/"+ filename
except HTTPError as err:
    print(F"Error! Could not load file from {url}!")
    print(err)
    return False
except ValueError as err:
    print(F"Error! Could not load file for regex match: {url}!")
    print(err)
    return False

def run_dl(logseq_dir): for fPath in glob.glob(f"{logseq_dir}**/*.md", recursive=True): matches = [] with open(fPath) as _file: filedata = _file.read() _file.seek(0) for i, line in enumerate(_file.readlines()): matches.extend(regex_markdownFile.findall(line)) for match in matches: new_url = save_file_locally(logseq_dir=logseq_dir, url=match) if new_url: filedata = filedata.replace(match, new_url)

    with open(fPath, 'w') as _file:
        _file.write(filedata)
    print(fPath)
    

if name == "main": # Program arguments. parser = argparse.ArgumentParser( description="Script to download the images of your git logseq graph to local asset folder." ) parser.add_argument( "-f", type=str, default=None, metavar="", help="Absolute path to your local repository copy of your logseq graph.", )

args = parser.parse_args()

if not args.f:
    print("Please give me the absolute path to your local repository copy of your logseq graph with:")
    print("-f <Path>")
logseq_dir = args.f
print(f"Starting download of files to: {logseq_dir}")
run_dl(logseq_dir)