Initial commit
This commit is contained in:
commit
94e57f51f5
11
.gitignore
vendored
Normal file
11
.gitignore
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
24
LICENSE
Normal file
24
LICENSE
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
Copyright (c) 2020, Thibaud Gasser
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the <organization> nor the
|
||||||
|
names of its contributors may be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
||||||
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
3
README.md
Normal file
3
README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Wallabag tools
|
||||||
|
|
||||||
|
Python tools using the wallabag API.
|
7
config.ini
Normal file
7
config.ini
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
[Wallabag Configuration]
|
||||||
|
host=
|
||||||
|
grant_type =
|
||||||
|
client_id =
|
||||||
|
client_secret =
|
||||||
|
username =
|
||||||
|
password =
|
3
dev-requirements.txt
Normal file
3
dev-requirements.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
black==19.10b0
|
||||||
|
mypy==0.770
|
||||||
|
pylint==2.4.4
|
2
requirements.txt
Normal file
2
requirements.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
aiohttp==3.6.2
|
||||||
|
wallabag-api==1.2.3
|
85
wallabag_mass_import.py
Normal file
85
wallabag_mass_import.py
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
import asyncio
|
||||||
|
import configparser
|
||||||
|
import logging
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
from typing import Any, Dict, List
|
||||||
|
|
||||||
|
import aiohttp
|
||||||
|
from wallabag_api.wallabag import Wallabag
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
|
||||||
|
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
CONFIG_PATH = os.path.join(ROOT_DIR, "config.ini")
|
||||||
|
ARTICLES_PATH = os.path.join(ROOT_DIR, "articles.json")
|
||||||
|
|
||||||
|
|
||||||
|
def load_configuration(path):
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
config.read(path)
|
||||||
|
return config["Wallabag Configuration"]
|
||||||
|
|
||||||
|
|
||||||
|
async def connect_to_wallabag(
|
||||||
|
configuration: Dict[str, str], session: aiohttp.ClientSession
|
||||||
|
) -> Wallabag:
|
||||||
|
configuration["access_token"] = await Wallabag.get_token(**configuration)
|
||||||
|
|
||||||
|
return Wallabag(
|
||||||
|
host=configuration["host"],
|
||||||
|
token=configuration["access_token"],
|
||||||
|
client_id=configuration["client_id"],
|
||||||
|
client_secret=configuration["client_secret"],
|
||||||
|
aio_sess=session,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def read_urls_file(f):
|
||||||
|
while True:
|
||||||
|
line = f.readline()
|
||||||
|
if line:
|
||||||
|
yield line
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
async def import_articles(w_api: Wallabag, path: str, limit=0):
|
||||||
|
entries_id = []
|
||||||
|
with open(path) as f:
|
||||||
|
for index, item in enumerate(json.load(f)):
|
||||||
|
if limit > 0 and index == limit:
|
||||||
|
break
|
||||||
|
|
||||||
|
entry = await w_api.post_entries(
|
||||||
|
url=item["url"],
|
||||||
|
archive=item["is_archived"],
|
||||||
|
starred=item["is_starred"],
|
||||||
|
original_url=item["origin_url"],
|
||||||
|
tags=",".join(item["tags"]),
|
||||||
|
)
|
||||||
|
logging.info(
|
||||||
|
f"Entry url {item['url']} posted to wallabag with id {entry['id']}"
|
||||||
|
)
|
||||||
|
entries_id.append(entry["id"])
|
||||||
|
|
||||||
|
return entries_id
|
||||||
|
|
||||||
|
|
||||||
|
async def delete_all_entries(ids: List[int], w_api: Wallabag):
|
||||||
|
for id in ids:
|
||||||
|
entry = await w_api.delete_entries(id)
|
||||||
|
logging.info(f"Deleted wallabag entry with id {entry['id']}")
|
||||||
|
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
async with aiohttp.ClientSession(loop=asyncio.get_event_loop()) as session:
|
||||||
|
configuration = dict(load_configuration(CONFIG_PATH))
|
||||||
|
w_api = await connect_to_wallabag(configuration, session)
|
||||||
|
|
||||||
|
entries_id = await import_articles(w_api, "articles.json", limit=1)
|
||||||
|
await delete_all_entries(entries_id, w_api)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
asyncio.run(main())
|
Loading…
Reference in New Issue
Block a user