Compare commits

...

9 Commits
v1.0.0 ... main

Author SHA1 Message Date
pinb 115eb8d0c6 Merge pull request 'update' (#1) from update into main
Reviewed-on: #1
3 months ago
pinb-mini abf1d1ee95 add gitignore 3 months ago
pinb-mini 82ec2d220b bug fix: add try~catch 3 months ago
pinb 722aa4ef3a 업데이트 'readme.md' 5 months ago
pinb 7364546549 update 5 months ago
pinb 4300bf5d1d update 5 months ago
pinb 4904b88760 update 5 months ago
pinb fb8b702b69 update readme 5 months ago
pinb 6a2efb03e5 fix - mac compile 5 months ago

6
.gitignore vendored

@ -0,0 +1,6 @@
/venv
/dist
/build
/__pycache__
my_data.db
.DS_Store

@ -13,4 +13,4 @@ if __name__ == '__main__':
sys.exit(app.exec_())
# pyinstaller --onefile bunnysync.py --add-data "images/realrabbit.png;images" --add-data "images/realrabbit2.png;images" --icon=images/realrabbit.png --noconsole
# pyinstaller --onefile bunnysync.py --add-data "images/realrabbit.png:images" --add-data "images/realrabbit2.png:images" --icon=images/realrabbit.png --noconsole

@ -0,0 +1,45 @@
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['bunnysync.py'],
pathex=[],
binaries=[],
datas=[('images/realrabbit.ico', 'images'), ('images/realrabbit2.png', 'images')],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='bunnysync',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon=['images/realrabbit.ico'],
)
app = BUNDLE(
exe,
name='bunnysync.app',
icon='images/realrabbit.ico',
bundle_identifier=None,
)

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

@ -10,7 +10,7 @@ class MainWindow(QMainWindow):
super().__init__()
self.setWindowTitle("Bunny Sync Application")
self.setGeometry(100, 100, 800, 600)
image_path = self.resource_path("images/realrabbit.png")
image_path = self.resource_path("images/realrabbit.ico")
self.setWindowIcon(QIcon(image_path))
self.setup_ui()

@ -0,0 +1,43 @@
# Bunny Sync
## Introduce
![About](./upload/src0.png)
🔥*Bunny Sync*🔥는 폴더간 실시간 동기화를 시킬 수 있습니다.
만든 목적은 Obsidian을 iPad에서 iCloud로 밖에 저장이 안 되어서 iCloud와 NAS를 동기화 시키려는 의도로 만들었습니다.
(⭐주의할 점은 파일간 동기화이므로 동시에 같은 파일에 대한 접근 시 문제가 발생할 수 있습니다.)
## 주요 기능
- **실시간 동기화**: Job을 생성하여 두 폴더를 실시간으로 동기화합니다.
- **로그 기록**: 동기화 과정에서 발생한 이벤트를 로그로 출력합니다.
## 설치 방법
[⭐Release](https://gitea.pinblog.codes/pinb/BunnySync/releases)
릴리즈 버전(Windows or Mac)을 다운 받아 실행합니다.
(⭐Windows에서는 보안프로그램에 실행이 막힐 수 있습니다.)
## 사용 방법
![How to use](./upload/how_to.gif)
### 메인 화면
![Main](./upload/src1.png)
- **Job**: 정보를 입력하여 Add 버튼을 클릭하면 Job이 생성됩니다.
- **Interval**: 초(sec)단위 입니다.
- **Play**: 버튼을 클릭하면 해당 Job이 시작됩니다.
- **Pause**: 버튼을 클릭하면 해당 Job이 종료됩니다.
- **Sync**: 버튼을 클릭하면 해당 Job을 한 번 동기화 합니다.
### 로그 화면
![Log](./upload/src2.png)
## 기여
기여를 원하시면 이 저장소를 포크하고 풀 리퀘스트를 생성해주세요.
버그 보고 및 기능 제안도 환영합니다.
## 라이선스
이 프로젝트는 MIT 라이선스에 따라 배포됩니다.

@ -74,32 +74,35 @@ class FolderSynchronizer:
count_sync = 0
for root, _, files in os.walk(src_folder):
for filename in files:
src_path = os.path.join(root, filename)
rel_dir = os.path.relpath(root, src_folder)
dest_path = os.path.join(dest_folder, rel_dir, filename)
total_sync += 1
src_modified = os.path.getmtime(src_path)
file_info = self.get_file_info(rel_dir, filename)
if not file_info:
# New file
os.makedirs(os.path.dirname(dest_path), exist_ok=True)
shutil.copy2(src_path, dest_path)
count_sync += 1
dest_modified = current_time
modified1, exist1, modified2, exist2 = src_modified, 1, dest_modified, 1
else:
# Existing file
if src_modified > file_info[3] or not file_info[4]:
shutil.copy2(src_path, dest_path)
count_sync += 1
dest_modified = current_time
modified1, exist1, modified2, exist2 = src_modified, 1, dest_modified, 1
try:
src_path = os.path.join(root, filename)
rel_dir = os.path.relpath(root, src_folder)
dest_path = os.path.join(dest_folder, rel_dir, filename)
total_sync += 1
src_modified = os.path.getmtime(src_path)
file_info = self.get_file_info(rel_dir, filename)
if not file_info:
# New file
os.makedirs(os.path.dirname(dest_path), exist_ok=True)
shutil.copy2(src_path, dest_path)
count_sync += 1
dest_modified = current_time
modified1, exist1, modified2, exist2 = src_modified, 1, dest_modified, 1
else:
modified1, exist1, modified2, exist2 = src_modified, 1, file_info[5], file_info[6]
self.update_db(rel_dir, filename, modified1, exist1, modified2, exist2)
# Existing file
if src_modified > file_info[3] or not file_info[4]:
shutil.copy2(src_path, dest_path)
count_sync += 1
dest_modified = current_time
modified1, exist1, modified2, exist2 = src_modified, 1, dest_modified, 1
else:
modified1, exist1, modified2, exist2 = src_modified, 1, file_info[5], file_info[6]
except:
pass
finally:
self.update_db(rel_dir, filename, modified1, exist1, modified2, exist2)
return total_sync, count_sync

Before

Width:  |  Height:  |  Size: 4.6 MiB

After

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Loading…
Cancel
Save