mirror of
https://github.com/Garmelon/PFERD.git
synced 2023-12-21 10:23:01 +01:00
Remove unnecessary files
This commit is contained in:
parent
dfddc93039
commit
f1ba618378
@ -1,80 +0,0 @@
|
||||
# From https://charemza.name/blog/posts/python/asyncio/read-write-lock/
|
||||
# https://gist.github.com/michalc/ab9bd571cfab09216c0316f2302a76b0#file-asyncio_read_write_lock-py
|
||||
|
||||
import asyncio
|
||||
import collections
|
||||
import contextlib
|
||||
|
||||
|
||||
class _ReadWaiter(asyncio.Future):
|
||||
pass
|
||||
|
||||
class _WriteWaiter(asyncio.Future):
|
||||
pass
|
||||
|
||||
class ReadWriteLock():
|
||||
|
||||
def __init__(self):
|
||||
self._waiters = collections.deque()
|
||||
self._reads_held = 0
|
||||
self._write_held = False
|
||||
|
||||
def _pop_queued_waiters(self, waiter_type):
|
||||
while True:
|
||||
correct_type = self._waiters and isinstance(self._waiters[0], waiter_type)
|
||||
cancelled = self._waiters and self._waiters[0].cancelled()
|
||||
|
||||
if correct_type or cancelled:
|
||||
waiter = self._waiters.popleft()
|
||||
|
||||
if correct_type and not cancelled:
|
||||
yield waiter
|
||||
|
||||
if not correct_type and not cancelled:
|
||||
break
|
||||
|
||||
def _resolve_queued_waiters(self):
|
||||
if not self._write_held:
|
||||
for waiter in self._pop_queued_waiters(_ReadWaiter):
|
||||
self._reads_held += 1
|
||||
waiter.set_result(None)
|
||||
|
||||
if not self._write_held and not self._reads_held:
|
||||
for waiter in self._pop_queued_waiters(_WriteWaiter):
|
||||
self._write_held = True
|
||||
waiter.set_result(None)
|
||||
break
|
||||
|
||||
def _on_read_release(self):
|
||||
self._reads_held -= 1
|
||||
|
||||
def _on_write_release(self):
|
||||
self._write_held = False
|
||||
|
||||
@contextlib.asynccontextmanager
|
||||
async def _acquire(self, waiter_type, on_release):
|
||||
waiter = waiter_type()
|
||||
self._waiters.append(waiter)
|
||||
self._resolve_queued_waiters()
|
||||
|
||||
try:
|
||||
await waiter
|
||||
except asyncio.CancelledError:
|
||||
self._resolve_queued_waiters()
|
||||
raise
|
||||
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
on_release()
|
||||
self._resolve_queued_waiters()
|
||||
|
||||
@contextlib.asynccontextmanager
|
||||
async def read(self):
|
||||
async with self._acquire(_ReadWaiter, self._on_read_release):
|
||||
yield
|
||||
|
||||
@contextlib.asynccontextmanager
|
||||
async def write(self):
|
||||
async with self._acquire(_WriteWaiter, self._on_write_release):
|
||||
yield
|
87
plan.md
87
plan.md
@ -1,87 +0,0 @@
|
||||
# Config
|
||||
|
||||
- python script as config
|
||||
- imports PFERD as library
|
||||
- operates relative to its own path
|
||||
|
||||
## Example folder structure
|
||||
|
||||
```
|
||||
.../
|
||||
Vorlesungen/
|
||||
PFERD/ as symlink, locally or in python's import path
|
||||
PFERDconf.py does things relative to its own location (hopefully)
|
||||
GBI/ folder to synchronize files into
|
||||
...
|
||||
Prog/ folder to synchronize files into
|
||||
...
|
||||
```
|
||||
|
||||
## Example config
|
||||
|
||||
```python
|
||||
import PFERD
|
||||
|
||||
def gbi_filter(ilias_path):
|
||||
... # rename and move files, or filter them
|
||||
return local_path # or None if file should be ignored
|
||||
|
||||
kit = PFERD.KIT()
|
||||
kit.synchronize("crs_855240", "GBI", filter=gbi_filter)
|
||||
kit.synchronize("crs_851237", "Prog") # default filter preserves paths
|
||||
```
|
||||
|
||||
# Structure
|
||||
|
||||
## Things that need to be done
|
||||
|
||||
- figure out where config file is located
|
||||
- get and store shibboleth session cookie
|
||||
- get and store ilias session cookie
|
||||
- download specific ilias urls (mostly goto.php, probably)
|
||||
- parse web page
|
||||
- determine if logging in is necessary
|
||||
- authenticate if necessary
|
||||
- don't re-login if shibboleth session cookie is still valid
|
||||
- find folders in current folder
|
||||
- find files to download in current folder
|
||||
- ignore LA1 test thingy
|
||||
- crawl folders and create directory-like structure/file paths
|
||||
- use filter function for paths
|
||||
- download files to local file paths
|
||||
- create folders as necessary
|
||||
- remember downloaded files
|
||||
- find files that were not previously downloaded
|
||||
- remove un-downloaded files
|
||||
- remove unnecessary folders (prompt user before deleting!)
|
||||
- logging
|
||||
- display crawl progress
|
||||
- display structure of found files using neat box drawing characters
|
||||
- display download progress
|
||||
|
||||
## How those things are usually done
|
||||
|
||||
Step 3. to 5. are run for each synchronize() call.
|
||||
|
||||
1. launch script
|
||||
- load cookie files
|
||||
2. authenticate
|
||||
(assuming enough time has passed for the session cookies to become invalid)
|
||||
- prompt user for username
|
||||
- prompt user for password (no echo)
|
||||
- somehow obtain valid session cookies
|
||||
3. crawl
|
||||
- start at the id specified in synchronize() args
|
||||
- search for folders and files to download
|
||||
- build directory structure
|
||||
4. download
|
||||
- run each path through filter function
|
||||
- if file was not filtered:
|
||||
- download file and save result to filtered path
|
||||
- use sync directory specified in synchronize() args
|
||||
- remember the filtered path for later
|
||||
5. cleanup
|
||||
- search sync directory for files
|
||||
- for each file not previously downloaded:
|
||||
- prompt user if they want to delete the file (default: No)
|
||||
- delete file if user answered Yes
|
44
test.py
44
test.py
@ -1,44 +0,0 @@
|
||||
import PFERD
|
||||
import asyncio
|
||||
import logging
|
||||
import pathlib
|
||||
import os
|
||||
import sys
|
||||
|
||||
logging.basicConfig(level=logging.DEBUG, format=PFERD.LOG_FORMAT)
|
||||
#logging.basicConfig(level=logging.INFO, format=PFERD.LOG_FORMAT)
|
||||
|
||||
async def test_download():
|
||||
base_path = pathlib.Path(".")
|
||||
sync_path = pathlib.Path(base_path, "synctest")
|
||||
|
||||
orga = PFERD.Organizer(base_path, sync_path)
|
||||
auth = PFERD.ShibbolethAuthenticator(cookie_path="cookie_jar")
|
||||
#soup = await auth.get_webpage("885157")
|
||||
|
||||
orga.clean_temp_dir()
|
||||
|
||||
filename = orga.temp_file()
|
||||
await auth.download_file("file_886544_download", filename)
|
||||
orga.add_file(filename, pathlib.Path("test.pdf"))
|
||||
|
||||
filename = orga.temp_file()
|
||||
await auth.download_file("file_886544_download", filename)
|
||||
orga.add_file(filename, pathlib.Path("bla/test2.pdf"))
|
||||
|
||||
orga.clean_sync_dir()
|
||||
orga.clean_temp_dir()
|
||||
await auth.close()
|
||||
|
||||
def main():
|
||||
#print(f" os.getcwd(): {os.getcwd()}")
|
||||
#print(f" sys.argv[0]: {sys.argv[0]}")
|
||||
#print(f" both: {os.path.dirname(os.getcwd() + '/' + sys.argv[0])}")
|
||||
#print(f" __file__: {__file__}")
|
||||
#print(f"stackoverflow: {os.path.dirname(os.path.abspath(__file__))}")
|
||||
|
||||
#asyncio.run(test_download(), debug=True)
|
||||
asyncio.run(test_download())
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in New Issue
Block a user