diff --git a/.github/workflows/greetings.yml b/.github/workflows/greetings.yml deleted file mode 100644 index 46774343..00000000 --- a/.github/workflows/greetings.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Greetings - -on: [pull_request_target, issues] - -jobs: - greeting: - runs-on: ubuntu-latest - permissions: - issues: write - pull-requests: write - steps: - - uses: actions/first-interaction@v1 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - issue-message: "Message that will be displayed on users' first issue" - pr-message: "Message that will be displayed on users' first pull request" diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml deleted file mode 100644 index 4702124a..00000000 --- a/.github/workflows/installer.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Create Zip File - -on: - push: - branches: - - main # Replace with the branch you want to trigger the workflow - -jobs: - create_zip_file: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: cd folder - run: | - cd source_code/ - working-directory: ${{ github.workspace }} - - - - name: Create Zip File - run: | - zip -r source_code/software_files.zip * - working-directory: ${{ github.workspace }} - - - name: Upload Zip Artifact - uses: actions/upload-artifact@v2 - with: - name: software_files.zip - path: $working-directory/software_files.zip diff --git a/.github/workflows/publish-cli.yml b/.github/workflows/publish-cli.yml new file mode 100644 index 00000000..f449dc5f --- /dev/null +++ b/.github/workflows/publish-cli.yml @@ -0,0 +1,56 @@ +name: Build and Release CLI + +on: + push: + tags: + - 'v*' + +jobs: + build: + runs-on: windows-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + + - name: Install dependencies + run: | + pip install pyinstaller music_tag jibrish_to_hebrew + + - name: Build EXE + run: | + pyinstaller --onefile --add-data "src/core/app/singer-list.csv;app" --name "Singles-Sorter" --icon "src/core/assets/icon.ico" "src/core/singles_sorter_v3.py" + + - name: Get the version + id: get_version + run: echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/v} + + - name: Rename output file + run: | + move dist\Singles-Sorter.exe dist\Singles-Sorter-cli-${{ steps.get_version.outputs.VERSION }}.exe + + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} + draft: true + prerelease: true + + - name: Upload Release Asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./dist/singles-sorter-cli-${{ steps.get_version.outputs.VERSION }}.exe + asset_name: singles-sorter-cli-${{ steps.get_version.outputs.VERSION }}.exe + asset_content_type: application/octet-stream diff --git a/.github/workflows/publisher.yml b/.github/workflows/publisher.yml index 839e3f59..4ad3ccba 100644 --- a/.github/workflows/publisher.yml +++ b/.github/workflows/publisher.yml @@ -1,67 +1,45 @@ -name: Publish Release +name: Publish EXE on: push: tags: - - 'v*.*' + - 'v*' jobs: build: runs-on: windows-latest + steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Python - uses: actions/setup-python@v3 + uses: actions/setup-python@v5 with: python-version: '3.10' - name: Install dependencies run: | - pip install pyinstaller music_tag + pip install pyinstaller music_tag jibrish_to_hebrew flet==0.22.0 - name: Build EXE run: | - # Get the version number from the tag (e.g., v1.0.0) - $env:VERSION = $env:GITHUB_REF -replace '^refs/tags/v', '' - - # Run PyInstaller with custom name and version - pyinstaller --noconfirm --onefile --console --name "singles_sorter_func.exe" python-project/singles_sorter_func.py - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - VERSION: ${{ github.ref }} - - + flet pack -i src/core/assets/icon.ico src/core/main.py --product-name "Singles Sorter" --product-version "13.0" --file-description "Singles Sorter" --copyright "nh.local11@gmail.com" - name: Create Artifact Directory run: mkdir -p artifacts - name: Copy Output File to Artifact Directory - run: copy dist\singles_sorter_func.exe artifacts\ - - - name: Prepare Additional Files - run: | - copy source_code\*.* artifacts\ + run: copy dist\main.exe artifacts\ - name: Zip Artifact Directory run: | cd artifacts powershell -Command "Compress-Archive -Path * -DestinationPath Singles-Sorter.zip" - - - - name: Set version number - run: | - # Get the version number from the tag (e.g., v1.0.0) - $env:VERSION = $env:GITHUB_REF -replace '^refs/tags/v', '' - echo $env:VERSION > version.txt # Update version.txt with your desired version - - - name: Create Release - id: create_release - uses: softprops/action-gh-release@v1 + - name: Upload Artifact + uses: actions/upload-artifact@v4 with: - files: "artifacts/Singles-Sorter.zip" - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + name: singles-sorter + path: artifacts/Singles-Sorter.zip diff --git "a/\327\224\327\225\327\250\327\220\327\225\327\252 \327\251\327\231\327\236\327\225\327\251 \327\221\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235.pdf" "b/docs/\327\224\327\225\327\250\327\220\327\225\327\252 \327\251\327\231\327\236\327\225\327\251 \327\221\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235.pdf" similarity index 100% rename from "\327\224\327\225\327\250\327\220\327\225\327\252 \327\251\327\231\327\236\327\225\327\251 \327\221\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235.pdf" rename to "docs/\327\224\327\225\327\250\327\220\327\225\327\252 \327\251\327\231\327\236\327\225\327\251 \327\221\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235.pdf" diff --git "a/base-files/icons/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 \327\220\327\231\327\231\327\247\327\225\327\237.jpg" "b/docs/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 \327\220\327\231\327\231\327\247\327\225\327\237.jpg" similarity index 100% rename from "base-files/icons/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 \327\220\327\231\327\231\327\247\327\225\327\237.jpg" rename to "docs/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 \327\220\327\231\327\231\327\247\327\225\327\237.jpg" diff --git "a/base-files/help/\327\242\327\226\327\250\327\224 \327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 10.docx" "b/docs/\327\242\327\226\327\250\327\224 \327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 10.docx" similarity index 100% rename from "base-files/help/\327\242\327\226\327\250\327\224 \327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 10.docx" rename to "docs/\327\242\327\226\327\250\327\224 \327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 10.docx" diff --git a/base-files/icons/logo.ico b/legacy/12.8v/assets/logo.ico similarity index 100% rename from base-files/icons/logo.ico rename to legacy/12.8v/assets/logo.ico diff --git a/base-files/icons/logo.png b/legacy/12.8v/assets/logo.png similarity index 100% rename from base-files/icons/logo.png rename to legacy/12.8v/assets/logo.png diff --git a/base-files/icons/logo_install.ico b/legacy/12.8v/assets/logo_install.ico similarity index 100% rename from base-files/icons/logo_install.ico rename to legacy/12.8v/assets/logo_install.ico diff --git a/base-files/icons/logo_install.png b/legacy/12.8v/assets/logo_install.png similarity index 100% rename from base-files/icons/logo_install.png rename to legacy/12.8v/assets/logo_install.png diff --git a/installer.bat b/legacy/12.8v/installer.bat similarity index 100% rename from installer.bat rename to legacy/12.8v/installer.bat diff --git a/source_code/RunMesader.bat b/legacy/12.8v/program/RunMesader.bat similarity index 100% rename from source_code/RunMesader.bat rename to legacy/12.8v/program/RunMesader.bat diff --git a/source_code/SinglesSorterC.bat b/legacy/12.8v/program/SinglesSorterC.bat similarity index 100% rename from source_code/SinglesSorterC.bat rename to legacy/12.8v/program/SinglesSorterC.bat diff --git a/source_code/disable-singer-list.csv b/legacy/12.8v/program/disable-singer-list.csv similarity index 100% rename from source_code/disable-singer-list.csv rename to legacy/12.8v/program/disable-singer-list.csv diff --git a/source_code/help_ss.pdf b/legacy/12.8v/program/help_ss.pdf similarity index 100% rename from source_code/help_ss.pdf rename to legacy/12.8v/program/help_ss.pdf diff --git a/source_code/logo.ico b/legacy/12.8v/program/logo.ico similarity index 100% rename from source_code/logo.ico rename to legacy/12.8v/program/logo.ico diff --git a/source_code/logo.png b/legacy/12.8v/program/logo.png similarity index 100% rename from source_code/logo.png rename to legacy/12.8v/program/logo.png diff --git a/source_code/logo_install.ico b/legacy/12.8v/program/logo_install.ico similarity index 100% rename from source_code/logo_install.ico rename to legacy/12.8v/program/logo_install.ico diff --git a/source_code/remover_ss.bat b/legacy/12.8v/program/remover_ss.bat similarity index 100% rename from source_code/remover_ss.bat rename to legacy/12.8v/program/remover_ss.bat diff --git a/source_code/revsecurity.dll b/legacy/12.8v/program/revsecurity.dll similarity index 100% rename from source_code/revsecurity.dll rename to legacy/12.8v/program/revsecurity.dll diff --git a/python-project/data update/singer-list.csv b/legacy/12.8v/program/singer-list.csv similarity index 100% rename from python-project/data update/singer-list.csv rename to legacy/12.8v/program/singer-list.csv diff --git a/source_code/singles_sorter_func.exe b/legacy/12.8v/program/singles_sorter_func.exe similarity index 100% rename from source_code/singles_sorter_func.exe rename to legacy/12.8v/program/singles_sorter_func.exe diff --git "a/source_code/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 12.8.livecode" "b/legacy/12.8v/program/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 12.8.livecode" similarity index 100% rename from "source_code/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 12.8.livecode" rename to "legacy/12.8v/program/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 12.8.livecode" diff --git "a/source_code/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235.exe" "b/legacy/12.8v/program/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235.exe" similarity index 100% rename from "source_code/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235.exe" rename to "legacy/12.8v/program/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235.exe" diff --git "a/source_code/\342\200\217\342\200\217add_uninstall_list.reg" "b/legacy/12.8v/program/\342\200\217\342\200\217add_uninstall_list.reg" similarity index 100% rename from "source_code/\342\200\217\342\200\217add_uninstall_list.reg" rename to "legacy/12.8v/program/\342\200\217\342\200\217add_uninstall_list.reg" diff --git a/python-project/run.bat b/legacy/12.8v/run.bat similarity index 100% rename from python-project/run.bat rename to legacy/12.8v/run.bat diff --git a/python-project/singles_sorter_func.py b/legacy/12.8v/singles_sorterv1.py similarity index 100% rename from python-project/singles_sorter_func.py rename to legacy/12.8v/singles_sorterv1.py diff --git a/base-files/inside/old-versions/MediaInfo.exe b/legacy/9.0v/MediaInfo.exe similarity index 100% rename from base-files/inside/old-versions/MediaInfo.exe rename to legacy/9.0v/MediaInfo.exe diff --git a/base-files/inside/old-versions/compressed-2-txt self delete.bat b/legacy/9.0v/compressed-2-txt self delete.bat similarity index 100% rename from base-files/inside/old-versions/compressed-2-txt self delete.bat rename to legacy/9.0v/compressed-2-txt self delete.bat diff --git a/base-files/inside/old-versions/conver.exe b/legacy/9.0v/conver.exe similarity index 100% rename from base-files/inside/old-versions/conver.exe rename to legacy/9.0v/conver.exe diff --git a/base-files/inside/old-versions/help-singles-sorter.pdf b/legacy/9.0v/help-singles-sorter.pdf similarity index 100% rename from base-files/inside/old-versions/help-singles-sorter.pdf rename to legacy/9.0v/help-singles-sorter.pdf diff --git a/base-files/inside/old-versions/singer-list.csv~.bat b/legacy/9.0v/singer-list.csv~.bat similarity index 100% rename from base-files/inside/old-versions/singer-list.csv~.bat rename to legacy/9.0v/singer-list.csv~.bat diff --git "a/base-files/inside/old-versions/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 9.0.exe" "b/legacy/9.0v/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 9.0.exe" similarity index 100% rename from "base-files/inside/old-versions/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 9.0.exe" rename to "legacy/9.0v/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 9.0.exe" diff --git "a/base-files/inside/\327\242\327\226\327\250\327\224 \327\220\327\225\327\244\327\234\327\231\327\231\327\237.txt" "b/legacy/9.0v/\327\242\327\226\327\250\327\224 \327\220\327\225\327\244\327\234\327\231\327\231\327\237.txt" similarity index 100% rename from "base-files/inside/\327\242\327\226\327\250\327\224 \327\220\327\225\327\244\327\234\327\231\327\231\327\237.txt" rename to "legacy/9.0v/\327\242\327\226\327\250\327\224 \327\220\327\225\327\244\327\234\327\231\327\231\327\237.txt" diff --git "a/base-files/inside/old-versions/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 9.2.bat" "b/legacy/9.0v/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 9.2.bat" similarity index 100% rename from "base-files/inside/old-versions/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 9.2.bat" rename to "legacy/9.0v/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 9.2.bat" diff --git "a/base-files/inside/Intermediate-versions/\327\236\327\231\327\225\327\237 \327\234\327\244\327\231 \327\220\327\236\327\237 1.bat" "b/legacy/Intermediate/\327\236\327\231\327\225\327\237 \327\234\327\244\327\231 \327\220\327\236\327\237 1.bat" similarity index 100% rename from "base-files/inside/Intermediate-versions/\327\236\327\231\327\225\327\237 \327\234\327\244\327\231 \327\220\327\236\327\237 1.bat" rename to "legacy/Intermediate/\327\236\327\231\327\225\327\237 \327\234\327\244\327\231 \327\220\327\236\327\237 1.bat" diff --git "a/base-files/inside/Intermediate-versions/\327\236\327\241\327\223\327\250-\327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235-8.9.3.bat" "b/legacy/Intermediate/\327\236\327\241\327\223\327\250-\327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235-8.9.3.bat" similarity index 100% rename from "base-files/inside/Intermediate-versions/\327\236\327\241\327\223\327\250-\327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235-8.9.3.bat" rename to "legacy/Intermediate/\327\236\327\241\327\223\327\250-\327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235-8.9.3.bat" diff --git "a/base-files/inside/Intermediate-versions/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.2.bat" "b/legacy/Intermediate/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.2.bat" similarity index 100% rename from "base-files/inside/Intermediate-versions/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.2.bat" rename to "legacy/Intermediate/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.2.bat" diff --git "a/base-files/inside/Intermediate-versions/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.6 - \327\224\327\236\327\225\327\236\327\234\327\245.bat" "b/legacy/Intermediate/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.6 - \327\224\327\236\327\225\327\236\327\234\327\245.bat" similarity index 100% rename from "base-files/inside/Intermediate-versions/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.6 - \327\224\327\236\327\225\327\236\327\234\327\245.bat" rename to "legacy/Intermediate/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.6 - \327\224\327\236\327\225\327\236\327\234\327\245.bat" diff --git "a/base-files/inside/Intermediate-versions/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.4 - \327\242\327\221\327\225\327\223\327\224 \327\242\327\235 \327\247\327\225\327\221\327\245 \327\220\327\227\327\223.bat" "b/legacy/Intermediate/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.4 - \327\242\327\221\327\225\327\223\327\224 \327\242\327\235 \327\247\327\225\327\221\327\245 \327\220\327\227\327\223.bat" similarity index 100% rename from "base-files/inside/Intermediate-versions/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.4 - \327\242\327\221\327\225\327\223\327\224 \327\242\327\235 \327\247\327\225\327\221\327\245 \327\220\327\227\327\223.bat" rename to "legacy/Intermediate/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.4 - \327\242\327\221\327\225\327\223\327\224 \327\242\327\235 \327\247\327\225\327\221\327\245 \327\220\327\227\327\223.bat" diff --git "a/base-files/inside/Intermediate-versions/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.7 - \327\236\327\251\327\225\327\234\327\221 \327\244\327\231\327\231\327\252\327\225\327\237.bat" "b/legacy/Intermediate/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.7 - \327\236\327\251\327\225\327\234\327\221 \327\244\327\231\327\231\327\252\327\225\327\237.bat" similarity index 100% rename from "base-files/inside/Intermediate-versions/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.7 - \327\236\327\251\327\225\327\234\327\221 \327\244\327\231\327\231\327\252\327\225\327\237.bat" rename to "legacy/Intermediate/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.7 - \327\236\327\251\327\225\327\234\327\221 \327\244\327\231\327\231\327\252\327\225\327\237.bat" diff --git "a/base-files/inside/Intermediate-versions/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.8 - \327\234\327\234\327\220 \327\241\327\231\327\240\327\225\327\237 \327\226\327\236\327\250\327\231\327\235.bat" "b/legacy/Intermediate/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.8 - \327\234\327\234\327\220 \327\241\327\231\327\240\327\225\327\237 \327\226\327\236\327\250\327\231\327\235.bat" similarity index 100% rename from "base-files/inside/Intermediate-versions/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.8 - \327\234\327\234\327\220 \327\241\327\231\327\240\327\225\327\237 \327\226\327\236\327\250\327\231\327\235.bat" rename to "legacy/Intermediate/\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\342\200\217\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 8.9.8 - \327\234\327\234\327\220 \327\241\327\231\327\240\327\225\327\237 \327\226\327\236\327\250\327\231\327\235.bat" diff --git a/python-project/__pycache__/check_name.cpython-312.pyc b/python-project/__pycache__/check_name.cpython-312.pyc deleted file mode 100644 index 86f612da..00000000 Binary files a/python-project/__pycache__/check_name.cpython-312.pyc and /dev/null differ diff --git a/python-project/__pycache__/singles_sorter_func.cpython-312.pyc b/python-project/__pycache__/singles_sorter_func.cpython-312.pyc deleted file mode 100644 index e35a9686..00000000 Binary files a/python-project/__pycache__/singles_sorter_func.cpython-312.pyc and /dev/null differ diff --git a/python-project/singer-list.csv b/python-project/singer-list.csv deleted file mode 100644 index 0af2739c..00000000 --- a/python-project/singer-list.csv +++ /dev/null @@ -1,1192 +0,0 @@ - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , -. , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - ,' -' ,' - ,' -' ,' -' ,' -' ,' -' ,' - ,' - ,' -' ,' -'' ,' - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - ', ' - , - , - , - , - , - , - , - , - ', ' - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - ', ' - , - , - , - , - , - , - , - , - , - , - , - , - , - , - D, D - , - , - ', ' - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - -, - - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , -- ,- - , - , - , - , - , - -, - - , -' ,' - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , -' ,' -'' ,'' -' ,' - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , -, - , - , - , - , - , - , - , - , -, -, - , - , - , - , - , - , - , -, - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - ', ' - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - ', ' - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , -, - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - ', ' - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - ', ' - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - ', ' - , - , - ', ' - , - , - , - , - , - , - , - , - , - , - ', - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , -, - , - ', ' - ', ' - ', ' - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , -, - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - ', ' - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - ', ' - , -. ,. - , - , - , - , - , - , - , - , - , - , - , - , - ', ' - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , -, - , - , - , - , - , - , - , - , - , -' ,' - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , -, - , -, -, -, - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , -, - ', ' - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , diff --git a/python-project/singles_sorter_oop.py b/python-project/singles_sorter_oop.py deleted file mode 100644 index 3b343c48..00000000 --- a/python-project/singles_sorter_oop.py +++ /dev/null @@ -1,251 +0,0 @@ -import os -from shutil import copy, move -from music_tag import load_file -from os.path import join -import csv -from jibrish_to_hebrew import jibrish_to_hebrew -from identify_similarities import similarity_sure -from check_name import check_exact_name - - -class MusicFile: - """Represents a music file and handles its metadata.""" - - def __init__(self, file_path): - """Initialize a MusicFile instance. - - Args: - file_path (str): The path to the music file. - """ - self.file_path = file_path - self.metadata = self.load_metadata() - - def load_metadata(self): - """Load metadata from the music file. - - Returns: - dict: Metadata dictionary. - """ - try: - return load_file(self.file_path) - except Exception as e: - print(f"Error loading metadata for {self.file_path}: {e}") - return None - - def get_artist(self): - """Get the artist from the metadata. - - Returns: - str: The artist's name. - """ - if self.metadata and 'artist' in self.metadata: - artist = self.metadata['artist'].value - return jibrish_to_hebrew(artist, "heb") if artist else None - - elif self.metadata and 'title' in self.metadata: - title = metadata_file['title'].value - title = jibrish_to_hebrew(title, "heb") - for source_name, target_name in self.singer_list: - if source_name in title: - exact = check_exact_name(title, source_name) - if exact: - artist = target_name - return artist - return None - - for source_name, target_name in self.singer_list: - if source_name in artist: - artist = target_name - return artist - - check_answer = self.check_artist(artist) - if check_answer == False: return - - return artist - - - -class ArtistFile: - - def __init__(self, file_path): - self.file_path = file_path - self.load_singer_list() - - def get_artist(self): - split_file = self._process_file_name() - - for source_name, target_name in self.singer_list: - if source_name in split_file: - exact = check_exact_name(split_file, source_name) - if exact: - artist = target_name - return artist - - - - def load_singer_list(self): - csv_path = "singer-list.csv" - with open(csv_path, 'r') as file: - csv_reader = csv.reader(file) - self.singer_list = [tuple(row) for row in csv_reader] - - if os.path.isfile("personal-singer-list.csv"): - with open("personal-singer-list.csv", 'r') as file: - csv_reader = csv.reader(file) - personal_list = [tuple(row) for row in csv_reader] - self.singer_list.extend(personal_list) - - - - def _process_file_name(self): - split_file = os.path.split(self.file_path)[1] - split_file = split_file.replace('_', ' ') - split_file = split_file.replace('-', ' ') - return split_file - - - - def check_artist(artist): - """Check if the artist name is valid. - - Args: - artist (str): The artist's name. - - Returns: - bool: True if the artist name is valid, False otherwise. - """ - unusual_list = ["סינגלים", "סינגל", "אבגדהוזחטיכלמנסעפצקרשתךםןץ", "אמן לא ידוע", "טוב", "לא ידוע", "תודה לך ה"] - unusual_str = similarity_sure(artist, unusual_list, True) - if artist in unusual_list or unusual_str[0] or len(artist.split()) >= 4 or len(artist.split()) <= 0 \ - or not all(c in "אבגדהוזחטיכלמנסעפצקרשתךםןףץ'׳ " for c in artist): - return False - return True - - - - -class MusicOrganizer: - """Organizes music files based on metadata.""" - - def __init__(self, dir_path, target_dir, copy_mode=False, abc_sort=False, exist_only=False, singles_folder=True, tree_folders=False): - """Initialize a MusicOrganizer instance. - - Args: - dir_path (str): The path to the source directory. - target_dir (str): The path to the target directory. - copy_mode (bool): True for copying, False for moving. - abc_sort (bool): True for sorting by artist name, False for default sorting. - exist_only (bool): True to organize existing directories only. - singles_folder (bool): True to create a 'Singles' folder for each artist. - tree_folders (bool): True to scan the directory tree, False for only the immediate directory. - """ - self.dir_path = dir_path - self.target_dir = target_dir - self.copy_mode = copy_mode - self.abc_sort = abc_sort - self.exist_only = exist_only - self.singles_folder = singles_folder - self.tree_folders = tree_folders - - def scan_directory(self): - """Scan the directory for music files and retrieve artist information.""" - info_list = [] - if self.tree_folders: - for root, dirs, files in os.walk(self.dir_path): - for my_file in files: - file_path = os.path.join(root, my_file) - if my_file.lower().endswith((".mp3", ".wma", ".wav")): - music_file = MusicFile(file_path) - artist = music_file.get_artist() - if artist: - info_list.append((file_path, artist)) - else: - for my_file in os.listdir(self.dir_path): - file_path = os.path.join(self.dir_path, my_file) - if os.path.isfile(file_path) and my_file.lower().endswith((".mp3", ".wma", ".wav")): - music_file = MusicFile(file_path) - artist = music_file.get_artist() - if artist: - info_list.append((file_path, artist)) - return info_list - - - def organize_music(self, info_list): - """Organize music files based on metadata. - - Args: - info_list (list): List of tuples containing file paths and artists. - """ - len_dir = len(info_list) - len_item = 0 - - for file_path, artist in info_list: - len_item += 1 - show_len = len_item * 100 // len_dir - print(" " * 30, str(show_len), "% ", "Completed", end='\r') - - target_path = self.get_target_path(artist) - if target_path and not os.path.isdir(target_path) and not self.exist_only: - try: - os.makedirs(target_path) - except Exception as e: - print(f"Error creating directory {target_path}: {e}") - - if target_path: - self.move_or_copy_file(file_path, target_path) - - def get_target_path(self, artist): - """Get the target path based on artist and organization options. - - Args: - artist (str): The artist's name. - - Returns: - str: The target path. - """ - if self.singles_folder and self.abc_sort: - return os.path.join(self.target_dir, artist[0], artist, "סינגלים") - elif self.singles_folder: - return os.path.join(self.target_dir, artist, "סינגלים") - elif self.abc_sort: - return os.path.join(self.target_dir, artist[0], artist) - else: - return os.path.join(self.target_dir, artist) - - def move_or_copy_file(self, file_path, target_path): - """Move or copy a file to the target path. - - Args: - file_path (str): The path to the source file. - target_path (str): The path to the target directory. - """ - try: - if self.copy_mode and os.path.isdir(target_path): - copy(file_path, target_path) - elif os.path.isdir(target_path): - move(file_path, target_path) - except Exception as e: - print(f"Error moving/copying file {file_path} to {target_path}: {e}") - - - -def main(): - try: - dir_path = os.path.join(argv[1]) - target_dir = os.path.join(argv[2]) - copy_mode = True if eval(argv[3]) else False - tree_folders = True if eval(argv[4]) else False - singles_folder = True if eval(argv[5]) else False - exist_only = True if eval(argv[6]) else False - abc_sort = True if eval(argv[7]) else False - - music_organizer = MusicOrganizer(dir_path, target_dir, copy_mode, abc_sort, exist_only, singles_folder, tree_folders) - info_list = music_organizer.scan_directory() - music_organizer.organize_music(info_list) - - except Exception as e: - print("Error: {}".format(e)) - - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/site/[removal.ai]_tmp-63f14fbe4dfb5.png b/site/[removal.ai]_tmp-63f14fbe4dfb5.png deleted file mode 100644 index 0727d4ef..00000000 Binary files a/site/[removal.ai]_tmp-63f14fbe4dfb5.png and /dev/null differ diff --git a/site/a-futuristic-and-immersive-artwork-by-digital-artist-max-li-that-features-a-light-yellow-color-schem-455072206.png b/site/a-futuristic-and-immersive-artwork-by-digital-artist-max-li-that-features-a-light-yellow-color-schem-455072206.png deleted file mode 100644 index 39b1e91b..00000000 Binary files a/site/a-futuristic-and-immersive-artwork-by-digital-artist-max-li-that-features-a-light-yellow-color-schem-455072206.png and /dev/null differ diff --git a/site/current-ver b/site/current-ver deleted file mode 100644 index 7ef6ffee..00000000 --- a/site/current-ver +++ /dev/null @@ -1 +0,0 @@ -12.5 \ No newline at end of file diff --git a/site/favicon_io/android-chrome-192x192.png b/site/favicon_io/android-chrome-192x192.png deleted file mode 100644 index 8331cccf..00000000 Binary files a/site/favicon_io/android-chrome-192x192.png and /dev/null differ diff --git a/site/favicon_io/android-chrome-512x512.png b/site/favicon_io/android-chrome-512x512.png deleted file mode 100644 index ce2df895..00000000 Binary files a/site/favicon_io/android-chrome-512x512.png and /dev/null differ diff --git a/site/favicon_io/apple-touch-icon.png b/site/favicon_io/apple-touch-icon.png deleted file mode 100644 index 37d4db3c..00000000 Binary files a/site/favicon_io/apple-touch-icon.png and /dev/null differ diff --git a/site/favicon_io/favicon-16x16.png b/site/favicon_io/favicon-16x16.png deleted file mode 100644 index aa38ca0e..00000000 Binary files a/site/favicon_io/favicon-16x16.png and /dev/null differ diff --git a/site/favicon_io/favicon-32x32.png b/site/favicon_io/favicon-32x32.png deleted file mode 100644 index dc69907c..00000000 Binary files a/site/favicon_io/favicon-32x32.png and /dev/null differ diff --git a/site/favicon_io/favicon.ico b/site/favicon_io/favicon.ico deleted file mode 100644 index dd0c2107..00000000 Binary files a/site/favicon_io/favicon.ico and /dev/null differ diff --git a/site/favicon_io/favicon_io.zip b/site/favicon_io/favicon_io.zip deleted file mode 100644 index 63fd092b..00000000 Binary files a/site/favicon_io/favicon_io.zip and /dev/null differ diff --git a/site/favicon_io/site.webmanifest b/site/favicon_io/site.webmanifest deleted file mode 100644 index 45dc8a20..00000000 --- a/site/favicon_io/site.webmanifest +++ /dev/null @@ -1 +0,0 @@ -{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/src/core/.gitignore b/src/core/.gitignore new file mode 100644 index 00000000..68bc17f9 --- /dev/null +++ b/src/core/.gitignore @@ -0,0 +1,160 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/src/core/app/about.md b/src/core/app/about.md new file mode 100644 index 00000000..a868ab07 --- /dev/null +++ b/src/core/app/about.md @@ -0,0 +1,10 @@ +**מסדר הסינגלים** הוא כלי מתקדם למיון אוטומטי של קבצי הסינגלים שלך לפי שמות הזמרים. + +### למידע נוסף: +- **[אתר התוכנה](https://nhlocal.github.io/Singles-Sorter?utm_source=singles_sorter_program&utm_medium=desktop)** +- **[דף התוכנה בגיטאהב](https://github.com/NHLOCAL/Singles-Sorter)** + +### אודות המפתח: +פותח ועוצב על ידי **[nh.local11@gmail.com](mailto:nh.local11@gmail.com)** + +© כל הזכויות שמורות - ניתן להעתיק ולהפיץ גרסה זו ללא תשלום \ No newline at end of file diff --git a/src/core/app/add_singers.md b/src/core/app/add_singers.md new file mode 100644 index 00000000..eed7aa29 --- /dev/null +++ b/src/core/app/add_singers.md @@ -0,0 +1,11 @@ +הוספת זמרים מתבצעת באמצעות **קובץ אקסל**. + +בתוך הקובץ יש לרשום את **שם הזמר** ו**שם התיקיה**, שם הזמר בטור הראשון ושם התיקיה בטור השני. + +**שם הזמר** = השם אותו התוכנה תחפש בשמות השירים ובמאפיינים שלהם + +**שם התיקיה** = שם התיקיה אליה יועברו שירי הזמר + +**לדוגמה:** ניתן להגדיר ששירים בהם מופיע השם "מ.ב.ד." יועברו לתיקיה בשם "מרדכי בן דוד". + +ניתן לייצא את הקובץ כדי שתוכלו להשתמש בו גם במחשב אחר או לייבא קובץ מוכן (עדיין לא זמין כרגע) \ No newline at end of file diff --git a/src/core/app/config.pkl b/src/core/app/config.pkl new file mode 100644 index 00000000..ea500d9c Binary files /dev/null and b/src/core/app/config.pkl differ diff --git a/src/core/app/disable-singer-list.csv b/src/core/app/disable-singer-list.csv new file mode 100644 index 00000000..6ac42bd7 --- /dev/null +++ b/src/core/app/disable-singer-list.csv @@ -0,0 +1 @@ + , diff --git a/src/core/app/first_run b/src/core/app/first_run new file mode 100644 index 00000000..e69de29b diff --git a/src/core/app/help.md b/src/core/app/help.md new file mode 100644 index 00000000..858d3dbd --- /dev/null +++ b/src/core/app/help.md @@ -0,0 +1,38 @@ +**מסדר הסינגלים** הוא כלי מתקדם שמבצע סדר בקבצי הסינגלים שלך וממיין אותם באופן אוטומטי בתיקיות לפי שמות הזמרים. +מומלץ לקרוא בעיון את ההוראות הבאות כדי להפיק את המירב מהשימוש בתוכנה. + +## בחירת תיקיות +1. **תיקיית הסינגלים שלך**: לחץ על "בחר תיקייה" ובחר את התיקייה המכילה את הסינגלים שלך, או תיקיה ראשית המכילה מספר תיקיות סינגלים. +2. **תיקיית יעד**: לחץ על "בחר תיקייה" ובחר את התיקייה אליה יועתקו הסינגלים המסודרים. מומלץ לבחור בתיקיה ריקה או בתיקיה המכילה את הזמרים שלך + +## אפשרויות נוספות + +ניתן להגדיר אפשרויות שונות למיון מותאם לצרכים שלך. +אם אתה מסתבך - פשוט דלג על קטע זה. + +### הגדרות בסיסיות +- **העתק קבצים**: סמן אם ברצונך להעתיק את הקבצים במקום להעבירם. כברירת מחדל תתבצע העברה. +- **סרוק תיקייה ראשית בלבד**: אם מסומן, התוכנה תסרוק רק את התיקייה הראשית ולא תתי תיקיות. + +### מתקדם +- **צור תיקיות סינגלים פנימיות**: סמן אם ברצונך ליצור תיקיות פנימיות בתוך תיקיות הזמרים אליהם יועברו הסינגלים. +- **השתמש בתיקיות קיימות בלבד**: אם מסומן, התוכנה תעביר קבצים רק לתיקיות זמרים קיימות ולא תיצור חדשות. +- **צור תיקיות ראשיות לפי א'-ב'**: אם מסומן, התוכנה תיצור תיקיה ראשית לכל אות באלפבית. + +## הפעלת התהליך +לאחר שבחרת את התיקיות והגדרת את האפשרויות הנוספות, לחץ על כפתור **הפעל כעת** כדי להתחיל את תהליך סידור הסינגלים. + +### חשוב לשים לב! + +- **שימוש זהיר**: ודא שאתה מבין את פעולות התוכנה לפני שתתחיל בתהליך. פעולה שגויה עלולה לגרום לאובדן נתונים. +- **בדוק הגדרות**: בדוק את כל ההגדרות לפני הלחיצה על "הפעל כעת" + +## אזהרות + +- **מיון אלבומים:** התוכנה מיועדת למיון סינגלים בלבד, מיון תיקיות אלבום עשוי לשבש אותם! +- **דואטים:** התוכנה אינה יודעת לזהות שירי דואט. +- **זיהוי מוטעה:** לעיתים נדירות התוכנה עשויה לזהות שמות זמרים באופן מוטעה. + +--- + +כל הזכויות שמורות © nh.local11@gmail.com \ No newline at end of file diff --git a/src/core/app/singer-list.csv b/src/core/app/singer-list.csv new file mode 100644 index 00000000..03cd2717 --- /dev/null +++ b/src/core/app/singer-list.csv @@ -0,0 +1,1192 @@ +אבי אילסון,אבי אילסון +אבי בבאי,אבי בבאי +אבי ביר,אבי ביר +אבי בן ישראל,אבי בן ישראל +אבי בניון,אבי בניון +אבי ברק,אבי ברק +אבי זוהר,אבי זוהר +אבי חן,אבי חן +אבי לנקרי,אבי לנקרי +אבי לרנר,אבי לרנר +אבי מילר,אבי מילר +אבי מן,אבי מן +אבי פדולינסקי,אבי פדולינסקי +אבי פרייר,אבי פרייר +אבי פרץ,אבי פרץ +אבי צליח,אבי צליח +אבי קונטנר,אבי קונטנר +אבי קראוס,אבי קראוס +אבי שרון,אבי שרון +אביב צורף,אביב צורף +אביגדור גביש,אביגדור גביש +אביגדור רוט,אביגדור רוט +אביחי דרף,אביחי דרף +אביחי חגג,אביחי חגג +אביחי חדד,אביחי חדד +אביחי נזרי,אביחי נזרי +אביחי צנעני,אביחי צנעני +אביעד גיל,אביעד גיל +אבירם שוקרון,אבירם שוקרון +אבירן אהרון,אבירן אהרון +אבישי אשל,אבישי אשל +אבישי בדין,אבישי בדין +אבישי לוי,אבישי לוי +אבישי רוזן,אבישי רוזן +אביתר בנאי,אביתר בנאי +אביתר צדוק,אביתר צדוק +אבנר דניאל,אבנר דניאל +אברהם אבוטבול,אברהם אבוטבול +אברהם דהאן,אברהם דהאן +אברהם דוד,אברהם דוד +אברהם דוד ורצברגר,אברהם דוד ורצברגר +אברהם דויטש,אברהם דויטש +אברהם טל,אברהם טל +אברהם יעקב טיילור,אברהם יעקב טיילור +אברהם מרדכי שוורץ,אברהם מרדכי שוורץ +אברהם סאמעט,אברהם סאמעט +א. פריד,אברהם פריד +אבריימל פריד,אברהם פריד +אברהם פריד,אברהם פריד +אברומי ויינברג,אברומי ויינברג +אברומי וינברג,אברומי ויינברג +אברומי ספיץ,אברומי ספיץ +אברומי פלאם,אברומי פלאם +אברומי פרייליך,אברומי פרייליך +אברומי שפיץ,אברומי שפיץ +אבריימי רוט,אבריימי רוט +אברהמי רוט,אבריימי רוט +אברימי רוט,אבריימי רוט +אברמי רוט,אבריימי רוט +אבריימי רוט,אבריימי רוט +אברימי גולדשטיין,אברימי גולדשטיין +אברימי לונגר,אברימי לונגר +אברימי שטראוס,אברימי שטראוס +אדיר גץ,אדיר גץ +אהבת ישראל,אהבת ישראל +אהוד בנאי,אהוד בנאי +אהוד חמו,אהוד חמו +אהרלה ויינטרוב,אהרל'ה וינטרוב +אהרל'ה ויינטרוב,אהרל'ה וינטרוב +אהרלה וינטרוב,אהרל'ה וינטרוב +אהרל'ה וינטרוב,אהרל'ה וינטרוב +אהרל'ה סמט,אהרל'ה סמט +אהרל'ה סאמט,אהרל'ה סמט +אהרל'ה סאמעט,אהרל'ה סמט +אהרלה סאמעט,אהרל'ה סמט +אהרלה סמט,אהרל'ה סמט +אהר'לה סאמעט,אהרל'ה סמט +אהר''לה סמט,אהרל'ה סמט +אהרן אהרוני,אהרן אהרוני +אהרן דויטש,אהרן דויטש +אהרן דנין,אהרן דנין +אהרן הלוי,אהרן הלוי +אהרן ויין,אהרן ויין +אהרן מיכאל,אהרן מיכאל +אהרן סגל,אהרן סגל +אהרן סיטבון,אהרן סיטבון +אהרן עמרם,אהרן עמרם +אהרן פרוכטר,אהרן פרוכטר +אהרן קליין,אהרן קליין +אהרון רזאל,אהרן רזאל +אהרן רזאל,אהרן רזאל +אהרן שלמה וייסמן,אהרן שלמה וייסמן +אודי אולמן,אודי אולמן +אודי דוידי,אודי דוידי +אודי דמארי,אודי דמארי +אודי טופלברג,אודי טופלברג +אוהד חתוכה,אוהד חתוכה +אוהד כהן,אוהד כהן +אוהד מושקוביץ,אוהד מושקוביץ +אוהד משיח,אוהד משיח +אוהד עוזרי,אוהד עוזרי +אוסף חזנות באידיש,אוסף חזנות באידיש +אוף שימחעס,אוף שימחעס +אופיר אלבז,אופיר אלבז +אופיר סלומון,אופיר סלומון +אור מויאל,אור מויאל +אוראל כהן,אוראל כהן +אורי אל,אורי אל +אורי אליאב,אורי אליאב +אורי גברא,אורי גברא +אורי דוידי,אורי דוידי +אורי הלר,אורי הלר +אורי זר,אורי זר +אורי פרג'ון,אורי פרג'ון +אורי שבח,אורי שבח +אוריאל אלבליה,אוריאל אלבליה +אוריאל לוי,אוריאל לוי +אוריאל מאור,אוריאל מאור +אורן ארנון,אורן ארנון +אורן ברג,אורן ברג +אורן דוד,אורן דוד +אורן צור,אורן צור +אורן תורג'מן,אורן תורג'מן +אושרי טויטו,אושרי טויטו +אחדות הנוער,אחדות הנוער +אחיה הכהן,אחיה הכהן +אחיה רובין,אחיה רובין +אחיעד חודפי,אחיעד חודפי +אידיש נחת,אידיש נחת +אידן ודותן,אידן ודותן +אייזיק האניג,אייזיק האניג +אייל אביב,אייל אביב +אייל דביר,אייל דביר +אייל טוויטו,אייל טוויטו +אייל ימין,אייל ימין +אייל כהן,אייל כהן +אייל עובד,אייל עובד +אייל עמרם,אייל עמרם +איילת השחר,איילת השחר +איל טהר,איל טהר +אילון גלזר,אילון גלזר +אילן אטדגי,אילן אטדגי +אילן דמרי,אילן דמרי +איצי וולדנר,איצי וולדנר +איצי ספינר,איצי ספינר +איצי קופולוביץ,איצי קופולוביץ +איצי קליין,איצי קליין +איצי שווארץ,איצי שווארץ +איציק אורלב,איציק אורלב +איציק אשל,איציק אשל +איציק דדיה,איציק דדיה +איציק ויינגרטן,איציק ויינגרטן +איציק וינגרטן,איציק וינגרטן +איציק כהן,איציק כהן +איציק ליפסקר,איציק ליפסקר +איציק קלה,איציק קלה +איציק שוורץ,איציק שוורץ +איתי עמרן,איתי עמרן +איתמר ארגעל,איתמר ארגעל +איתמר שטיין,איתמר שטיין +איתן כהן,איתן כהן +איתן כץ,איתן כץ +איתן לאופר,איתן לאופר +איתן קלינמן,איתן קלינמן +איתן רבני,איתן רבני +אלון מיטב,אלון מיטב +אלחי אזרד,אלחי אזרד +אלחנן נגר,אלחנן נגר +אלחנן ענבל,אלחנן ענבל +אלי אטיאס,אלי אטיאס +אלי ביגון,אלי ביגון +אלי ביער,אלי ביער +אלי גרשטנר,אלי גרשטנר +אלי דן,אלי דן +אלי הרצליך,אלי הרצליך +אלי ווייס,אלי וייס +אלי וייס,אלי וייס +אלי יפה,אלי יפה +אלי כהן,אלי כהן +אלי לאופר,אלי לאופר +אלי לוין,אלי לוין +אלי ליפסקר,אלי ליפסקר +אלי מילר,אלי מילר +אלי מנדלבאום,אלי מנדלבאום +אלי מרכוס,אלי מרכוס +אלי סלומון,אלי סלומון +אלי פרידמן,אלי פרידמן +אלי ציון,אלי ציון +אלי קליין,אלי קליין +אלי שוובל,אלי שוובל +אלי שוובר,אלי שוובר +אליאב שבו,אליאב שבו +אליה ביתן,אליה ביתן +אליה גבאי,אליה גבאי +אליה והב,אליה והב +אליהו בוזגלו,אליהו בוזגלו +אליהו חייט,אליהו חייט +אליהו לייפער,אליהו לייפער +אליהו צ'ייט,אליהו צ'ייט +אליהו שטיין,אליהו שטיין +אלימלך זינגער,אלימלך זינגער +אלימלך כהן,אלימלך כהן +אליסף חפץ,אליסף חפץ +אליעד אליהו,אליעד אליהו +אליעד נחום,אליעד נחום +אליעד ספיר,אליעד ספיר +אליעזר אוירבך,אליעזר אוירבך +אליעזר בלומן,אליעזר בלומן +אליעזר חרלפ,אליעזר חרלפ +אליעזר קאליש,אליעזר קאליש +אליקים בוטה,אליקים בוטה +אליקים ביננשטוק,אליקים ביננשטוק +אליקם בוטה,אליקם בוטה +אלירן D,אלירן D +אלישיב כהן,אלישיב כהן +אלכס קלייר,אלכס קלייר +אלנתן אברג'ל,אלנתן אברג'ל +אלעד גבאי,אלעד גבאי +אלעד גפרי,אלעד גפרי +אלעד כהן,אלעד כהן +אלעד שער,אלעד שער +אלעזר אסתרון,אלעזר אסתרון +אלעזר אסתרזון,אלעזר אסתרזון +אלעזר ולדמן,אלעזר ולדמן +אלעזר פודור,אלעזר פודור +אלעזר פרץ,אלעזר פרץ +אלקנה מרציאנו,אלקנה מרציאנו +אמיל זריהן,אמיל זריהן +אמיר אליהו,אמיר אליהו +אמיר דדון,אמיר דדון +אמיתי צדוק,אמיתי צדוק +אמני ישראל,אמני ישראל +אנדי פרידמן,אנדי פרידמן +אנשי עקשטיין,אנשי עקשטיין +אסף הרוש,אסף הרוש +אסף לוי,אסף לוי +אסף משיח,אסף משיח +אסף נגל,אסף נגל +אסף שפר,אסף שפר +אפי גרין,אפי גרין +אפרים דוד,אפרים דוד +אפרים מנדלסון,אפרים מנדלסון +אפרים מרקוביץ,אפרים מרקוביץ +ארז יחיאל,ארז יחיאל +ארי בולזנשטיין,ארי בולזנשטיין +ארי בן-ים,ארי בן-ים +ארי ברמן,ארי ברמן +ארי גולד,ארי גולד +ארי גולדוואג,ארי גולדוואג +ארי היל,ארי היל +ארי הרמן,ארי הרמן +ארי קליין,ארי קליין +ארי רוטבלט,ארי רוטבלט +ארי רייך,ארי רייך +אריאל זילבר,אריאל זילבר +אריאל כהן,אריאל כהן +אריאל רייכל,אריאל רייכל +אריה ברגר,אריה ברגר +אריה ברונר,אריה ברונר +אריה גולדברג,אריה גולדברג +אריה דרעי,אריה דרעי +אריה קונסטלר,אריה קונסטלר +אריה קרלינסקי,אריה קרלינסקי +אריה קרלניסקי,אריה קרלניסקי +אריה קרלניסקי,אריה קרלניסקי +אריין טירי,אריין טירי +אריק איינשטיין,אריק איינשטיין +אריק דביר,אריק דביר +אריק וולהיים,אריק וולהיים +אריק רודיך,אריק רודיך +ארמונד סוסנה,ארמונד סוסנה +אשר אלפסי,אשר אלפסי +אשר בנשעיה,אשר בנשעיה +אשר ברדה,אשר ברדה +אשר היינוביץ,אשר היינוביץ +אשר קרמר,אשר קרמר +בהרוז אהרוני,בהרוז אהרוני +בוכי גליק,בוכי גליק +בועז גדקה,בועז גדקה +בי-אונד עדן,בי-אונד עדן +בין השמשות,בין השמשות +ביני לנדאו,ביני לנדאו +בן סנוף,בן סנוף +בן ציון ויטלר,בן ציון ויטלר +בן ציון מילר,בן ציון מילר +בן ציון קופב-קגן,בן ציון קופב-קגן +בן ציון שנקר,בן ציון שנקר +בנג'ו בילי,בנג'ו בילי +בנגי רפאל,בנגי רפאל +בני אלבז,בני אלבז +בני הרבנים,בני הרבנים +בני לאופר,בני לאופר +בני מזרחי,בני מזרחי +בני עמר,בני עמר +בני פרידמן,בני פרידמן +בני קטן,בני קטן +בני רבינוביץ,בני רבינוביץ +בניה ברבי,בניה ברבי +בנימין אצרף,בנימין אצרף +בנימין יפת,בנימין יפת +בנימין ישראל,בנימין ישראל +בנימין כהן,בנימין כהן +בנימין מולר,בנימין מולר +בנימין פייל,בנימין פייל +בנימין שרף,בנימין שרף +בנצי טאבאק,בנצי טאבאק +בנצי קלצקין,בנצי קלצקין +בנצי שטיין,בנצי שטיין +בנציון ווברמן,בנציון ווברמן +בערי וועבר,בערי וועבר +בערי וועבער,בערי וועבר +בערי וובער,בערי וועבר +ברי וובער,בערי וועבר +בערל צוקר,בערל צוקר +בצלאל גולד,בצלאל גולד +ברוך אביטן,ברוך אביטן +ברוך אקשטיין,ברוך אקשטיין +ברוך ויזל,ברוך ויזל +ברוך חייט,ברוך חייט +ברוך כהן,ברוך כהן +ברוך לוין,ברוך לוין +ברוך נפתל,ברוך נפתל +ברוך נפתלי,ברוך נפתלי +ברוך עבוד,ברוך עבוד +ברוך שלום,ברוך שלום +בריו חקשור,בריו חקשור +ברל חגי,ברל חגי +ברק גרוסברג,ברק גרוסברג +ברק כהן,ברק כהן +ברק קרמר,ברק קרמר +ג'ו עמר,ג'ו עמר +ג'ורג' בר,ג'ורג' בר +ג'קי אליהו,ג'קי אליהו +גבי אהרון,גבי אהרון +גבי כהן,גבי כהן +גבי שטרנגר,גבי שטרנגר +גבריאל חסון,גבריאל חסון +גבריאל כהנא,גבריאל כהנא +גד אלבז,גד אלבז +גד ליאור,גד ליאור +גד פוריזן,גד פוריזן +גדי פייגולד,גדי פייגולד +גדליה סלושי,גדליה סלושי +גדעון אנה,גדעון אנה +גדעון בר,גדעון בר +גדעון לוין,גדעון לוין +גדעון פריזנט,גדעון פריזנט +גולן יונתן,גולן יונתן +גיא קהלני,גיא קהלני +גידי דבוש,גידי דבוש +גיל ישראלוב,גיל ישראלוב +גיל עקביוב,גיל עקביוב +גיל עקיביוב,גיל עקיביוב +גיל רבי,גיל רבי +גל אורן,גל אורן +גל חייק,גל חייק +גלעד בראונשטיין,גלעד בראונשטיין +גלעד פוטולסקי,גלעד פוטולסקי +גקי אלקים,גקי אלקים +גרוב סגול,גרוב סגול +גרשון ורובה,גרשון ורובה +גרשון סירוטה,גרשון סירוטה +גרשון פריישטט,גרשון פריישטט +גרשי אורי,גרשי אורי +גרשי שווארץ,גרשי שווארץ +דב אינדיג,דב אינדיג +דב הופמאן,דב הופמאן +דב הנדלר,דב הנדלר +דב לוין,דב לוין +דב פרקש,דב פרקש +דב שורין,דב שורין +דדי גראוכר,דדי גראוכר +דובי ברסטון,דובי ברסטון +דובי דוד,דובי דוד +דובי מיזלס,דובי מייזלס +דובי מייזלס,דובי מייזלס +דוד אבבו,דוד אבבו +דוד אולמן,דוד אולמן +דוד אצרף,דוד אצרף +דוד אשר,דוד אשר +דוד בארי,דוד בארי +דוד בן ארזה,דוד בן ארזה +דוד ברג,דוד ברג +דוד גבאי,דוד גבאי +דוד גרוס,דוד גרוס +דוד גרין,דוד גרין +דוד דאור,דוד דאור +דוד האניג,דוד האניג +דוד היל,דוד היל +דוד ויינבך,דוד ויינבך +דוד ורדיגר,דוד ורדיגר +דוד חזיזה,דוד חזיזה +דוד חפצדי,דוד חפצדי +דוד יהושע,דוד יהושע +דוד יצחק,דוד יצחק +דוד כהן,דוד כהן +דוד לואי,דוד לואי +דוד לייפער,דוד לייפער +דוד לעוי,דוד לעוי +דוד מושקוביץ,דוד מושקוביץ +דוד מרגליות,דוד מרגליות +דוד נחום,דוד נחום +דוד ניר,דוד ניר +דוד סיטבון,דוד סיטבון +דוד סקייסט,דוד סקייסט +דוד סרברו,דוד סרברו +דוד פרופיס,דוד פרופיס +דוד פרלמן,דוד פרלמן +דוד צוברי,דוד צוברי +דוד קוסביצקי,דוד קוסביצקי +דוד קלצקין,דוד קלצקין +דוד רויטמן,דוד רויטמן +דוד ריימונד,דוד ריימונד +דוד שאבי,דוד שאבי +דוד שאמולא,דוד שאמולא +דוד שוורץ,דוד שוורץ +דוד שטיין,דוד שטיין +דוד שירו,דוד שירו +דוד שליסלברג,דוד שליסלברג +דוד שמחה,דוד שמחה +דוד שפירא,דוד שפירא +דודו אהרון,דודו אהרון +דודו דרעי,דודו דרעי +דודו פישר,דודו פישר +דודי הרץ,דודי הרץ +דודי הרשקופ,דודי הרשקופ +דודי לינקר,דודי לינקר +דודי פלדמן,דודי פלדמן +דודי פרימשן,דודי פרימשן +דודי קאליש,דודי קאליש +דודי קנאפלער,דודי קנאפלער +דודי קנופלר,דודי קנופלר +דודי קנפלר,דודי קנפלר +דודי קפלר,דודי קפלר +דודי רוט,דודי רוט +דוי פלדמן,דוי פלדמן +דוידי נחשון,דוידי נחשון +דורון ברדא,דורון ברדא +דייויד טויב,דייויד טויב +דן אביחי,דן אביחי +דן סלומון,דן סלומון +דן פולייף,דן פולייף +דני גולן,דני גולן +דני ממן,דני ממן +דני פלגון,דני פלגון +דני קונסטלר,דני קונסטלר +דניאל אדמון,דניאל אדמון +דניאל גרינוואוד,דניאל גרינוואוד +דניאל דהאן,דניאל דהאן +דניאל וולדמן,דניאל וולדמן +דניאל ישי,דניאל ישי +דניאל ישראל,דניאל ישראל +דניאל לוי,דניאל לוי +דניאל מזרחי,דניאל מזרחי +דניאל סעדון,דניאל סעדון +דניאל צאיג,דניאל צאיג +דניאל קדוש,דניאל קדוש +דניאל קרייטנברגר,דניאל קרייטנברגר +דניאל רחמים,דניאל רחמים +דרך אחים,דרך אחים +האחים אזולאי,האחים אזולאי +האחים בוקסבוים,האחים בוקסבוים +האחים ברונר,האחים ברונר +האחים ברקו,האחים ברקו +האחים הורביץ,האחים הורביץ +האחים ויינברג,האחים ויינברג +האחים למר,האחים למר +האחים סלומון,האחים סלומון +האחים פורטנוי,האחים פורטנוי +האחים שפירא,האחים שפירא +האסק,האסק +הורה קדצקה,הורה קדצקה +הינדיק הפקות,הינדיק הפקות +הלל זכאי,הלל זכאי +הלל מאיר,הלל מאיר +הלל פולק,הלל פולק +הלל פלאי,הלל פלאי +הלל קפלניק,הלל קפלניק +המאמינים האנונימיים,המאמינים האנונימיים +המזמרים,המזמרים +המנגנים,המנגנים +הנערים שרים,הנערים שרים +הערשי אייזינבך,הערשי אייזינבך +הערשי וייס,הערשי וייס +הערשי וינברגר,הערשי וינברגר +הערשי ויינברגר,הערשי וינברגר +הערשי רוזנבאום,הערשי רוזנבאום +הערשי רוטנברג,הערשי רוטנברג +הקינדרלעך,הקינדרלעך +הראל חדד,הראל חדד +הראל טל,הראל טל +הראל מויאל,הראל מויאל +הראל סקעת,הראל סקעת +הרשי מושקוביץ,הרשי מושקוביץ +הרשי רוטנברג,הרשי רוטנברג +השי רובי,השי רובי +וולוול מרנץ,וולוול מרנץ +זאבי הופמן,זאבי הופמן +זאבי וולס,זאבי וולס +זאבי קאופמן,זאבי קאופמן +זאבי קראושר,זאבי קראושר +זאנוויל ויינברגר,זאנוויל ויינברגר +זאנוויל ויינברגר,זאנוויל ויינברגר +זבולון נתנוב,זבולון נתנוב +זושא ולנזבאום,זושא ולנזבאום +זושא שמעלצר,זושא שמעלצר +זכריה מקייטן,זכריה מקייטן +זלמן פולק,זלמן פולק +זלמן שטוב,זלמן שטוב +זמר הפקות,זמר הפקות +חברים בנוף,חברים בנוף +חגי ימיני,חגי ימיני +חוני מילקי,חוני מילקי +חזקי טאלר,חזקי טאלר +חיים אדלר,חיים אדלר +חיים איפרגן,חיים איפרגן +חיים אלטמן,חיים אלטמן +חיים אליעזר הרשטיק,חיים אליעזר הרשטיק +חיים בלומפלד,חיים בלומפלד +חיים בנעט,חיים בנט +חיים בנט,חיים בנט +חיים באנעט,חיים בנט +חיים בר,חיים בר +חיים ברוין,חיים ברוין +חיים ברקוביץ,חיים ברקוביץ +חיים ג'רבי,חיים ג'רבי +חיים גולד,חיים גולד +חיים גנץ,חיים גנץ +חיים גרין,חיים גרין +חיים דבש,חיים דבש +חיים דוד,חיים דוד +חיים וייס,חיים וייס +חיים חדד,חיים חדד +חיים ישכיל,חיים ישכיל +חיים ישראל,חיים ישראל +חיים מרדכי אקשטיין,חיים מרדכי אקשטיין +חיים נוטוביץ,חיים נוטוביץ +חיים נחמן,חיים נחמן +חיים סוזנה,חיים סוזנה +חיים עקשטיין,חיים עקשטיין +חיים צדיק,חיים צדיק +חיים ציפל,חיים ציפל +חיים קוזוכוביץ,חיים קוזוכוביץ +חיים קניג,חיים קניג +חיים רביבו,חיים רביבו +חיים שלמה מאייעס,חיים שלמה מאייעס +חיים שלמה מייעס,חיים שלמה מייעס +חיים שלמה מייעס,חיים שלמה מייעס +חילו גנוט,חילו גנוט +חיליק פראנק,חיליק פראנק +חנן בן ארי,חנן בן ארי +חננאל אוחנה,חננאל אוחנה +חנניה אלמליח,חנניה אלמליח +חנניה ביגון,חנניה ביגון +טוביה בולטון,טוביה בולטון +טום קשתי,טום קשתי +טל גור,טל גור +טל נאה,טל נאה +טל שגב,טל שגב +יאיר אלייצור,יאיר אליצור +יאיר אליצור,יאיר אליצור +יאיר גדסי,יאיר גדסי +יאיר דוד,יאיר דוד +יאיר וכטל,יאיר וכטל +יאיר כלב,יאיר כלב +יאיר שריון,יאיר שריון +יאן פריס,יאן פריס +יגאל צליק,יגאל צליק +יגל אלנקרי,יגל אלנקרי +יגל הרוש,יגל הרוש +יגל צברי,יגל צברי +ידידיה וקסלר,ידידיה וקסלר +ידידיה חייט,ידידיה חייט +ידידיה יהושע,ידידיה יהושע +ידן כהן,ידן כהן +יהודה ברוך,יהודה ברוך +יהודה גלאנץ,יהודה גלאנץ +יהודה גרין,יהודה גרין +יהודה דים,יהודה דים +יהודה וחבריו,יהודה וחבריו +יהודה וייס,יהודה וייס +יהודה זיתון,יהודה זיתון +יהודה לויכטר,יהודה לויכטר +יהודה מור,יהודה מור +יהודה מעטוף,יהודה מעטוף +יהודה ניצן,יהודה ניצן +יהודה סעדו,יהודה סעדו +יהודה פליישמן,יהודה פליישמן +יהודה פרוינדליך,יהודה פרוינדליך +יהודה צ'יק,יהודה צ'יק +יהודה קובלסקי,יהודה קובלסקי +יהודה רוטנר,יהודה רוטנר +יהודה שובל,יהודה שובל +יהודה שוקרון,יהודה שוקרון +יהודה שמעה,יהודה שמעה +יהודה שפירו,יהודה שפירו +יהונתן ניצן,יהונתן ניצן +יהורם גאון,יהורם גאון +יהושע אנגלמן,יהושע אנגלמן +יהושע בערקא,יהושע בערקא +יהושע האנשטטר,יהושע האנשטטר +יהושע ווידער,יהושע ווידער +יהושע לימוני,יהושע לימוני +יהושע מנדלוביץ,יהושע מנדלוביץ +יהושע רוט,יהושע רוט +יואל אלהרר,יואל אלהרר +יואל בריזל,יואל בריזל +יואל גליק,יואל גליק +יואל דוד,יואל דוד +יואל וייס,יואל וייס +יואל טייכמן,יואל טייכמן +יואל נפחא,יואל נפחא +יואל פאלקוויטש,יואל פאלקוויטש +יואל פרידמן,יואל פרידמן +יואל ראטה,יואל ראטה +יואל רוט,יואל רוט +יואלי גליק,יואלי גליק +יואלי גרינפלד,יואלי גרינפלד +יואלי דוידוביץ,יואלי דוידוביץ +יואלי דיקמן,יואלי דיקמן +יואלי וייס,יואלי וייס +יואלי פלקוביץ,יואלי פלקוביץ +יואלי קליין,יואלי קליין +יואלי שטיינברג,יואלי שטיינברג +יובל טייב,יובל טייב +יובל מנצורה,יובל מנצורה +יובל פרוינד,יובל פרוינד +יוהן מיכאל,יוהן מיכאל +יוחאי כהן,יוחאי כהן +יוחי בריסקמן,יוחי בריסקמן +יוחנן אורי,יוחנן אורי +יומי ולייזער,יומי ולייזער +יומי לואי,יומי לואי +יומי רוזנבאום,יומי רוזנבאום +יונגערליך,יונגערליך +יונה קריאף,יונה קריאף +יוני גנוט,יוני גנוט +יוני זיגלבוים,יוני זיגלבוים +יוני זיגמונד,יוני זיגמונד +יוני זיגמונד,יוני זיגמונד +יוני זינגלבוים,יוני זינגלבוים +יוני יעיש,יוני יעיש +יוני רכטר,יוני רכטר +יוני שלמה,יוני שלמה +יונתן דרור,יונתן דרור +יונתן היל,יונתן היל +יונתן ווייס,יונתן ווייס +יונתן ויניק,יונתן ויניק +יונתן זילברשייד,יונתן זילברשייד +יונתן חן,יונתן חן +יונתן מנת,יונתן מנת +יונתן רזאל,יונתן רזאל +יונתן שווארץ,יונתן שווארץ +יונתן שחר,יונתן שחר +יונתן שטנצל,יונתן שטנצל +יונתן שטרן,יונתן שטרן +יונתן שיינפלד,יונתן שיינפלד +יונתן שינפלד,יונתן שיינפלד +יונתן שיינפלד,יונתן שיינפלד +יונתן שלגבוים,יונתן שלגבוים +יוסי אוברמייסטר,יוסי אוברמייסטר +יוסי אזולאי,יוסי אזולאי +יוסי בלומבערג,יוסי בלומבערג +יוסי ברגר,יוסי ברגר +יוסי ברדא,יוסי ברדא +יוסי ג'ייקובס,יוסי ג'ייקובס +יוסי גולדשטיין,יוסי גולדשטיין +יוסי גלנץ,יוסי גלנץ +יוסי גרוס,יוסי גרוס +יוסי גרין,יוסי גרין +יוסי חגבי,יוסי חגבי +יוסי כהן,יוסי כהן +יוסי לוונבראון,יוסי לוונבראון +יוסי נטיב,יוסי נטיב +יוסלה ורשבסקי,יוסלה ורשבסקי +יוסלה רוזנבלט,יוסלה רוזנבלט +יוסלה רוזנבלט חדש,יוסלה רוזנבלט חדש +יוסף ברגר,יוסף ברגר +יוסף דוד גוטסמן,יוסף דוד גוטסמן +יוסף וורטלסקי,יוסף וורטלסקי +יוסף חיים ביטון,יוסף חיים ביטון +יוסף חיים שוואקי,יוסף חיים שוואקי +יוסף מור,יוסף מור +יוסף מלובני,יוסף מלובני +יוסף משה כהנא,יוסף משה כהנא +יוסף נטיב,יוסף נטיב +יוסף עבאדי,יוסף עבאדי +יוסף קוגלר,יוסף קוגלר +יוסף קרדונר,יוסף קרדונר +יוסף שילסקי,יוסף שילסקי +יורם צוברי,יורם צוברי +יחזקאל בראון,יחזקאל בראון +יחזקאל קלאנג,יחזקאל קלאנג +יחיאל ליכטיגר,יחיאל ליכטיגר +יידל ורדיגר,יידל ורדיגר +ילדי המלאכים,ילדי המלאכים +ילדי המלך,ילדי המלך +ילדי סוריה,ילדי סוריה +ינון טייב,ינון טייב +ינון מרדכי,ינון מרדכי +יענקי ברוין,יענקי ברוין +יענקי ומאיר,יענקי ומאיר +יענקי זינגבוים,יענקי זינגבוים +יענקי עקשטיין,יענקי עקשטיין +יענקי שטרן,יענקי שטרן +יעקב אונגר,יעקב אונגר +יעקב ברינה,יעקב ברינה +יעקב הערבליך,יעקב הערבליך +יעקב יוסף שטארק,יעקב יוסף שטארק +יעקב יצחק רויזנפלד,יעקב יצחק רויזנפלד +יעקב כץ,יעקב כץ +יעקב מוצן,יעקב מוצן +יעקב מוצן,יעקב מוצן +יעקב פלדשטיין,יעקב פלדשטיין +יעקב קליין,יעקב קליין +יעקב רוזנפלד,יעקב רוזנפלד +יעקב רוטבלט,יעקב רוטבלט +יעקב שוואקי,יעקב שוואקי +יעקב שטיינרמן,יעקב שטיינרמן +יפתח דקל,יפתח דקל +יצחק ביטון,יצחק ביטון +יצחק דוד ברייטשטין,יצחק דוד ברייטשטין +יצחק הלוי,יצחק הלוי +יצחק מאיר,יצחק מאיר +יצחק מאיר הלפגוט,יצחק מאיר הלפגוט +יצחק משענייה,יצחק משענייה +יצחק פנחסי,יצחק פנחסי +יקיר יאיר,יקיר יאיר +ירון בר,ירון בר +ישי ביטון,ישי ביטון +ישי לפידות,ישי לפידות +ישי מאיר,ישי מאיר +ישי מדר,ישי מדר +ישי סיידוף,ישי סיידוף +ישי ריבו,ישי ריבו +ישי שין,ישי שין +ישי שיין,ישי שין +ישיבה בויס,ישיבה בויס +ישיבת אשרינו,ישיבת אשרינו +ישיבת וואטרברי,ישיבת וואטרברי +ישיבת משכנותיך,ישיבת משכנותיך +ישעי לברון,ישעי לברון +ישעיה אילאוויטש,ישעיה אילאוויטש +ישעיה מנדלוביץ,ישעיה מנדלוביץ +ישראל אדלר,ישראל אדלר +ישראל אליאס,ישראל אליאס +ישראל ברגמן,ישראל ברגמן +ישראל ג'רופי,ישראל ג'רופי +ישראל גברא,ישראל גברא +ישראל גינסברג,ישראל גינסברג +ישראל גרופי,ישראל גרופי +ישראל דגן,ישראל דגן +ישראל דנגר,ישראל דנגר +ישראל ויליגר,ישראל ויליגר +ישראל וקסלמן,ישראל וקסלמן +ישראל ורדיגר,ישראל ורדיגר +ישראל לאוב,ישראל לאוב +ישראל מן,ישראל מן +ישראל נחמן,ישראל נחמן +ישראל סוסנה,ישראל סוסנה +ישראל צוברי,ישראל צוברי +ישראל ראנד,ישראל ראנד +ישראל רנד,ישראל רנד +ישראל שאר,ישראל שאר +ישראל שטרן,ישראל שטרן +ישראל שכטר,ישראל שכטר +לב טהור,לב טהור +להקת ארמוניה,להקת ארמוניה +להקת דביקות,להקת דביקות +להקת המדרגות,להקת המדרגות +להקת המושב,להקת המושב +להקת חסידיזיץ,להקת חסידיזיץ +להקת כוונה,להקת כוונה +להקת לכתחילה,להקת לכתחילה +להקת נהורא,להקת נהורא +להקת סינגרס,להקת סינגרס +להקת שחר,להקת שחר +להקת שלוה,להקת שלוה +להקת שפתיים,להקת שפתיים +לוי כהן,לוי כהן +לוי פלקוביץ,לוי פלקוביץ +לחיים גרין,לחיים גרין +ליאור דוד,ליאור דוד +ליאור פרחי,ליאור פרחי +לייבלה גלאנץ,לייבלה גלאנץ +לייבלה השל,לייבלה השל +לייבלה ולדמן,לייבלה ולדמן +ליפא גלנץ,ליפא גלנץ +ליפא חממי,ליפא חממי +ליפא שמעלצר,ליפא שמעלצר +ליפא שמעלצער,ליפא שמעלצר +לירון דקל,לירון דקל +מאור אדרי,מאור אדרי +מאור אשואל,מאור אשואל +מאיר אדלר,מאיר אדלר +מאיר אמסילי,מאיר אמסילי +מאיר בורשטיין,מאיר בורשטיין +מאיר גפני,מאיר גפני +מאיר גרינוולד,מאיר גרינוולד +מאיר הופשטטר,מאיר הופשטטר +מאיר חג'בי,מאיר חג'בי +מאיר ישראל,מאיר ישראל +מאיר מסוארי,מאיר מסוארי +מאיר צ'טרקוב,מאיר צ'טרקוב +מאיר קליין,מאיר קליין +מאיר קליינר,מאיר קליינר +מאיר רוזבלום,מאיר רוזבלום +מאיר רוזנברג,מאיר רוזנברג +מאיר ריבקין,מאיר ריבקין +מוטי אטיאס,מוטי אטיאס +מוטי אילוויטש,מוטי אילוביץ +מוטי אילאוויטש,מוטי אילוביץ +מאטי אילוויטש,מוטי אילוביץ +מוטי אילוביץ,מוטי אילוביץ +מוטי אילוביץ',מוטי אילוביץ +מוטי איילוביץ,מוטי אילוביץ +מוטי אילוויטש,מוטי אילוויטש +מוטי אלטמן,מוטי אלטמן +מוטי גולדמן,מוטי גולדמן +מוטי ויזל,מוטי ויזל +מוטי וייס,מוטי וייס +מוטי כהן,מוטי כהן +מוטי כץ,מוטי כץ +מוטי פלדמן,מוטי פלדמן +מוטי רוזנפלד,מוטי רוזנפלד +מוטי רוטלר,מוטי רוטלר +מוטי שטיינמץ,מוטי שטיינמץ +מוטי שטרן,מוטי שטרן +מוישי גרין,מוישי גרין +מוישי וייס,מוישי וייס +מוישי ולדמן,מוישי ולדמן +מוישי ניילנדר,מוישי ניילנדר +מוישי פריינד,מוישי פריינד +מוישי פריינד,מוישי פריינד +מוישי שוורץ,מוישי שוורץ +מונה רוזנבלום,מונה רוזנבלום +מורן קריטי,מורן קריטי +מזמור הפקות,מזמור הפקות +מידד טסה,מידד טסה +מיילך קהאן,מיילך קהאן +מייקי מוקטון,מייקי מוקטון +מיכאל אזולאי,מיכאל אזולאי +מיכאל נדטה,מיכאל נדטה +מיכאל פרוזנסקי,מיכאל פרוזנסקי +מיכאל פרץ,מיכאל פרץ +מיכאל צידון,מיכאל צידון +מיכאל שטרייכר,מיכאל שטרייכר +מיכאל שניצלר,מיכאל שניצלר +מיכה גמרמן,מיכה גמרמן +מיכה שקד,מיכה שקד +מיקי מוקטון,מיקי מוקטון +מיקי שפיצר,מיקי שפיצר +מישל פרדס,מישל פרדס +מכביטס,מכביטס +מלך זילברשלג,מלך זילברשלג +מנדי ג'יי,מנדי ג'יי +מנדי ג'קובס,מנדי ג'קובס +מנדי ג'רופי,מנדי ג'רופי +מנדי גרופי,מנדי גרופי +מנדי ווארש,מנדי ווארש +מנדי וורך,מנדי וורך +מנדי ויינרב,מנדי ויינרב +מנדי וייס,מנדי וייס +מנדי פורטנוי,מנדי פורטנוי +מנדי שפירא,מנדי שפירא +מנדל גולדמן,מנדל גולדמן +מנחם אירנשטיין,מנחם אירנשטיין +מנחם בלוי,מנחם בלוי +מנחם לוי,מנחם לוי +מנחם שוקרון,מנחם שוקרון +מני גל,מני גל +מענדי וואלד,מענדי וואלד +מענדל ראטה,מענדל ראטה +מקהלת ברודערס,מקהלת ברודערס +מקהלת זמרה,מקהלת זמרה +מקהלת ידידים,מקהלת ידידים +מקהלת יחד,מקהלת יחד +מקהלת כתר,מקהלת כתר +מקהלת לב,מקהלת לב +מקהלת לחיים,מקהלת לחיים +מקהלת מלכות,מקהלת מלכות +מקהלת משאלות,מקהלת משאלות +פרחי משאלות,מקהלת משאלות +להקת משאלות,מקהלת משאלות +מקהלת נריע,מקהלת נריע +מקהלת נרננה,מקהלת נרננה +מקהלת נשמחה,מקהלת נשמחה +מקהלת שירה,מקהלת שירה +מרדכי ארבל,מרדכי ארבל +מרדכי אשכנזי,מרדכי אשכנזי +מבד,מרדכי בן דוד +מרדכי בן דוד,מרדכי בן דוד +מרדכי גרנביץ,מרדכי גרנביץ +מרדכי הרשמן,מרדכי הרשמן +מרדכי כהן,מרדכי כהן +מרדכי סובול,מרדכי סובול +מרדכי רוט,מרדכי רוט +מרדכי שפירא,מרדכי שפירא +מריו חקשור,מריו חקשור +מרניג סמאק,מרניג סמאק +מרניק סמאק,מרניק סמאק +משה אברמוב,משה אברמוב +משה אדוריאן,משה אדוריאן +משה אוישר,משה אוישר +משה ביטון,משה ביטון +משה גרין,משה גרין +משה דאודי,משה דאודי +משה דדון,משה דדון +משה דוויק,משה דוויק +משה הומינר,משה הומינר +משה טבקולי,משה טבקולי +משה יעקב,משה יעקב +משה כורסיה,משה כורסיה +משה לאופר,משה לאופר +משה לוק,משה לוק +משה מנדלסון,משה מנדלסון +משה סקאלר,משה סקאלר +משה פלד,משה פלד +משה פלייב,משה פלייב +משה פפירוב,משה פפירוב +משה פרץ,משה פרץ +משה קוסביצקי,משה קוסביצקי +משה קליין,משה קליין +משה שולהוף,משה שולהוף +משה שטרן,משה שטרן +משולם גרינברגר,משולם גרינברגר +משפחת ברונר,משפחת ברונר +משפחת דיקמן,משפחת דיקמן +משפחת מלבסקי,משפחת מלבסקי +בן ציון קלצקו,משפחת קלצקו +אלישע קלצקו,משפחת קלצקו +אבי קלצקו,משפחת קלצקו +בנימין קלצקו,משפחת קלצקו +לוזי קלצקו,משפחת קלצקו +מתיבתא ווטורברי,מתיבתא ווטורברי +נאור אלחדד,נאור אלחדד +נאור כהן,נאור כהן +נדב ביטון,נדב ביטון +נדב גדליה,נדב גדליה +נדב מירנדה,נדב מירנדה +נהוראי אריאלי,נהוראי אריאלי +נועם רמתי,נועם רמתי +נותי ליברמן,נותי ליברמן +נח פלאי,נח פלאי +נח פלאי,נח פלאי +נחמן גולדברג,נחמן גולדברג +נחמן זלטא,נחמן זלטא +נחמן לייפר,נחמן לייפר +נחמן סלצר,נחמן סלצר +נחמן פילמר,נחמן פילמר +ניסים בלאק,ניסים בלאק +ניסים ברוך,ניסים ברוך +ניר ומשה,ניר ומשה +ניר קפטן,ניר קפטן +נמואל הרוש,נמואל הרוש +נפקא מינה,נפקא מינה +נפתלי הרשטיק,נפתלי הרשטיק +נפתלי קמפה,נפתלי קמפה +נריה אנג'ל,נריה אנג'ל +נתי אביבי,נתי אביבי +נתי חדד,נתי חדד +נתי לוי,נתי לוי +נתי לוין,נתי לוין +נתן מרדכי הרשטיק,נתן מרדכי הרשטיק +נתן שטיינברג,נתן שטיינברג +נתנאל אילוביצקי,נתנאל אילוביצקי +נתנאל גנץ,נתנאל גנץ +נתנאל הרשטיק,נתנאל הרשטיק +נתנאל ישראל,נתנאל ישראל +נתנאל מנת,נתנאל מנת +נתנאל מרשל,נתנאל מרשל +סהר אתירם,סהר אתירם +סטרומז באנד,סטרומז באנד +סנדי אופמן,סנדי אופמן +סנדי שמואלי,סנדי שמואלי +עדי גביסון,עדי גביסון +עדי רן,עדי רן +עובדיה חממה,עובדיה חממה +עודד מנשרי,עודד מנשרי +עוזי נעים,עוזי נעים +עוזיה צדוק,עוזיה צדוק +עומר ביטון,עומר ביטון +עומרי זליג,עומרי זליג +עופר שמיר,עופר שמיר +עזי שוורץ,עזי שוורץ +עידו פורטל,עידו פורטל +עידו קפטן,עידו קפטן +עידן יניב,עידן יניב +עלי מוהר,עלי מוהר +עמי אור,עמי אור +עמי הלר,עמי הלר +עמי שער,עמי שער +עמיחי סובר,עמיחי סובר +עמיחי פלסר,עמיחי פלסר +עמיחי שפיגלר,עמיחי שפיגלר +עמיר בניון,עמיר בניון +עמיר כהן,עמיר כהן +עמירן דביר,עמירן דביר +עמית ליסטונד,עמית ליסטוונד +עמית ליסטוונד,עמית ליסטוונד +עמית סופר,עמית סופר +עמנואל טוביאנה,עמנואל טוביאנה +עמנואל שולמן,עמנואל שולמן +עמרם ביטון,עמרם ביטון +עמרם גרין,עמרם גרין +עקיבא געלב,עקיבא געלב +עקיבא גרומן,עקיבא גרומן +עקיבא רוט,עקיבא רוט +עקיבא שכטר,עקיבא שכטר +ערן אברג'ל,ערן אברג'ל +ערן קליין,ערן קליין +פ. אספיס,פ. אספיס +פייבל גרינבערג,פייבל גרינבערג +פיני איינהורן,פיני אינהורן +פיני אינהורן,פיני אינהורן +פיני שכטר,פיני שכטר +פיניע שטיינווארצעל,פיניע שטיינווארצעל +פינקי וובער,פינקי וובער +פנחס בראון,פנחס בראון +פנחס ברייער,פנחס ברייער +פנחס דוליסקי,פנחס דוליסקי +פנחס הלוי,פנחס הלוי +פנחס כהן,פנחס כהן +פנחס פאמפ,פנחס פאמפ +פסח ג'וסף,פסח ג'וסף +פרוייקט קפיצת הדרך,פרויקט קפיצת הדרך +קפיצת הדרך,פרויקט קפיצת הדרך +פרויקט קפיצת הדרך,פרויקט קפיצת הדרך +פרחי אהרון,פרחי אהרון +פרחי אנטוורפן,פרחי אנטוורפן +פרחי גייטסהד,פרחי גייטסהד +פרחי השומרון,פרחי השומרון +פרחי טורונטו,פרחי טורונטו +פרחי ירושלים,פרחי ירושלים +פרחי ישורון,פרחי ישורון +פרחי מיאמי,פרחי מיאמי +פרחי נעם,פרחי נעם +פרחי ציון,פרחי ציון +פרחי רעים,פרחי רעים +פרחי שונות,פרחי שונות +פרחי שלהבת,פרחי שלהבת +צבי גרינהיים,צבי גרינהיים +צבי הורוביץ,צבי הורוביץ +צבי וייס,צבי וייס +צבי זילברשטיין,צבי זילברשטיין +צבי סילברשטיין,צבי סילברשטיין +צודיק גרינוולד,צודיק גרינוולד +צליל וזמר,צליל וזמר +צמד ילד,צמד ילד +צפריר יפרח,צפריר יפרח +קובי אפללו,קובי אפללו +קובי ברומר,קובי ברומר +קובי גרינבוים,קובי גרינבוים +קובי פרץ,קובי פרץ +קולין שחט,קולין שחט +קומזינג,קומזינג +קונצרט חזנות,קונצרט חזנות +ראובן גרבר,ראובן גרבר +ראובן יזדיאן,ראובן יזדיאן +רולי דיקמן,רולי דיקמן +רועי הרוש,רועי הרוש +רועי חתן,רועי חתן +רועי לביא,רועי לביא +רועי פיינמן,רועי פיינמן +רזיאל חי,רזיאל חי +ריצ'רד טאקר,ריצ'רד טאקר +רמי קלינשטיין,רמי קלינשטיין +רפאל אוזן,רפאל אוזן +רפאל בן,רפאל בן +רפאל דוד,רפאל דוד +רפאל זמיר,רפאל זמיר +רפאל מלול,רפאל מלול +רפאל סקורי,רפאל סקורי +רפאל פרידר,רפאל פרידר +שאול חיון,שאול חיון +שאולי וולדנר,שאולי וולדנר +שגיא שלום,שגיא שלום +שוכי גולדשטיין,שוכי גולדשטיין +שולי רנד,שולי רנד +שוקי סלומון,שוקי סלומון +שוקי סעדון,שוקי סעדון +שי ברק,שי ברק +שי גבסו,שי גבסו +שי דיבו,שי דיבו +שי לייכטמן,שי לייכטמן +שי עמר,שי עמר +שי צברי,שי צברי +שייע אילוביץ,שייע אילוביץ +שייע ברקו,שייע ברקו +שימי אפשטיין,שימי אפשטיין +שימי דיאי,שימי דיאי +שימי יונייב,שימי יונייב +שימי לוי,שימי לוי +שימי לפשיץ,שימי לפשיץ +שימי רבינוביץ,שימי רבינוביץ +שימי שטיינמעץ,שימי שטיינמעץ +שימי שפיץ,שימי שפיץ +פרחי שירה חדשה,שירה חדשה +שירה חדשה,שירה חדשה +שירת ההמונים,שירת המונים +קולולם,שירת המונים +שירת המונים,שירת המונים +קולעוילם,שירת המונים +ישיבשיר,שירת המונים +שלהבת,שלהבת +שלוימי בוקשפן,שלוימי בוקשפן +שלוימי גרטנר,שלוימי גרטנר +שלומי גרטנר,שלוימי גרטנר +שלוימי דסקל,שלוימי דסקל +שלוימי טויסיג,שלוימי טויסיג +שלוימי טויסיג,שלוימי טויסיג +שלוימי טויסיג,שלוימי טויסיג +שלוימי קצנלבוגן,שלוימי קצנלבוגן +שלום ברנהולץ,שלום ברנהולץ +שלום כץ,שלום כץ +שלום לעמער,שלום לעמער +שלום סאל,שלום סאל +שלום פרוינד,שלום פרוינד +שלום קליינלרר,שלום קליינלרר +שלומי ברנשטיין,שלומי ברנשטיין +שלומי וילמן,שלומי וילמן +שלומי ורצברג,שלומי ורצברג +שלומי יפרח,שלומי יפרח +שלומי סלמן,שלומי סלמן +שלומי שבת,שלומי שבת +שלומי שטויבר,שלומי שטויבר +שלמה אייזנבך,שלמה אייזנבך +שלמה ארצי,שלמה ארצי +שלמה גליק,שלמה גליק +שלמה גרוניך,שלמה גרוניך +שלמה יהודה רכניץ,שלמה יהודה רכניץ +שלמה כהן,שלמה כהן +שלמה כץ,שלמה כץ +שלמה קאליש,שלמה קאליש +שלמה קרליבך,שלמה קרליבך +שלמה רגה,שלמה רגה +שלמה שמחה,שלמה שמחה +שלשלת,שלשלת +שלשלת ג'וניור,שלשלת ג'וניור +שמואל אלהרר,שמואל אלהרר +שמואל ברונר,שמואל ברונר +שמואל ברזילי,שמואל ברזילי +שמואל גרינמן,שמואל גרינמן +שמואל הוניג,שמואל הוניג +שמואל הררי,שמואל הררי +שמואל ויגודה,שמואל ויגודה +שמואל יונה,שמואל יונה +שמואל יצחקי,שמואל יצחקי +שמואל פרדניק,שמואל פרדניק +שמואל רודענסקי,שמואל רודענסקי +שמואלי הורביץ,שמואלי הורביץ +שמוליק ישורון,שמוליק ישורון +שמוליק לוטרמן,שמוליק לוטרמן +שמוליק קלוסקי,שמוליק קלוסקי +שמוליק קליין,שמוליק קליין +שמחה ורדיגר,שמחה ורדיגר +שמחה יוסקוביץ ,שמחה יוסקוביץ +שמחה יעקובי,שמחה יעקובי +שמחה לוונשטיין,שמחה לוונשטיין +שמחה ליינר,שמחה ליינר +שמחה פרידמן,שמחה פרידמן +שמחת החיים,שמחת החיים +שמי מרציאנו,שמי מרציאנו +שמילי אונגר,שמילי אונגר +שמילי אונגר,שמילי אונגר +שמילי קליין,שמילי קליין +שמילי שטיינבערג,שמילי שטיינבערג +שמעון טובול,שמעון טובול +שמעון מלכובסקי,שמעון מלכובסקי +שמעי אנגל,שמעי אנגל +שמעיה סילברמן,שמעיה סילברמן +שמש מיוזיק,שמש מיוזיק +שמשון דלקוביץ,שמשון דלקוביץ +שניאור אוחיון,שניאור אוחיון +שעיה אליוביץ,שעיה אליוביץ +שעיה ברים,שעיה ברים +שעיה רובנשטיין,שעיה רובנשטיין +שערי יושר,שערי יושר +שרגי גרסטנר,שרגי גרסטנר +שרגי גשטטנר,שרגי גשטטנר +שרולי ברונכר,שרולי ברונכר +שרולי גינסברג,שרולי גינסברג +שרולי גרין,שרולי גרין +שרולי וייס,שרולי וייס +שרולי ליפשיץ,שרולי ליפשיץ +שרולי שטרייכר,שרולי שטרייכר +שרוליק הרשטיק,שרוליק הרשטיק +שרוליק רוזנטל,שרוליק רוזנטל +שרוליק רייזמן,שרוליק רייזמן +שרון אביחלק,שרון אביחלק +תומר חתוכה,תומר חתוכה +תיאודור ביקל,תיאודור ביקל diff --git a/src/core/app/whats-new.md b/src/core/app/whats-new.md new file mode 100644 index 00000000..f5ea0631 --- /dev/null +++ b/src/core/app/whats-new.md @@ -0,0 +1,11 @@ +- ממשק גרפי חדשני ומשודרג +- סרגל התקדמות גרפי +- בקרוב: גרסה מותאמת לאנדרואיד +- אייקון חדש ומודרני +- הוספת מידע מפורט על שגיאות +- הוספת הודעת אזהרה לפני הפעלה +- התקנה פשוטה ומתקדמת יותר +- אפשרות הסרת התקנה טובה יותר +- יצירת קובץ לוג מלא על הקבצים שהשתנו +- שדרוג ובנייה מחדש של כלי שורת הפקודה +- שמירת הגדרות מותאמות אישית להפעלה הבאה \ No newline at end of file diff --git a/src/core/assets/icon.ico b/src/core/assets/icon.ico new file mode 100644 index 00000000..1440a38a Binary files /dev/null and b/src/core/assets/icon.ico differ diff --git a/src/core/assets/icon.png b/src/core/assets/icon.png new file mode 100644 index 00000000..af6f32e6 Binary files /dev/null and b/src/core/assets/icon.png differ diff --git a/src/core/assets/icon1.jpg b/src/core/assets/icon1.jpg new file mode 100644 index 00000000..7bbd36eb Binary files /dev/null and b/src/core/assets/icon1.jpg differ diff --git a/python-project/check_name.py b/src/core/check_name.py similarity index 99% rename from python-project/check_name.py rename to src/core/check_name.py index a97d6763..24edf4cf 100644 --- a/python-project/check_name.py +++ b/src/core/check_name.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- import os import re import csv diff --git a/src/core/features/first_run b/src/core/features/first_run new file mode 100644 index 00000000..e69de29b diff --git a/src/core/features/switch_button.py b/src/core/features/switch_button.py new file mode 100644 index 00000000..3adc52ca --- /dev/null +++ b/src/core/features/switch_button.py @@ -0,0 +1,24 @@ +def copy_mode_changed(e): + user_config['general']['copy_mode'] = e.control.value + copy_mode.label = "העתק קבצים" if e.control.value else "העבר קבצים" + page.update() + +def main_folder_only_changed(e): + user_config['general']['main_folder_only'] = e.control.value + main_folder_only.label = "סרוק תיקיה ראשית בלבד" if e.control.value else "סרוק עץ תיקיות" + page.update() + +copy_mode = ft.Switch( + label="העבר קבצים" if user_config['general']['copy_mode'] is False else "העתק קבצים", + tooltip="סמן אם ברצונך לבצע העתקה של הקבצים כברירת מחדל תתבצע העברה", + value=user_config['general']['copy_mode'], + on_change=copy_mode_changed, + +) + +main_folder_only = ft.Switch( + label="סרוק עץ תיקיות" if user_config['general']['main_folder_only'] is False else "סרוק תיקיה ראשית בלבד", + tooltip="אם מסומן, התוכנה תסרוק רק את התיקייה הראשית ולא תתי תיקיות", + value=user_config['general']['main_folder_only'], + on_change=main_folder_only_changed +) \ No newline at end of file diff --git a/src/core/features/try_openlist.py b/src/core/features/try_openlist.py new file mode 100644 index 00000000..05a2ea29 --- /dev/null +++ b/src/core/features/try_openlist.py @@ -0,0 +1,120 @@ +import flet as ft +import json + +# הגדרות משתמש שמורות +global USER_CONFIG +try: + with open('app/config.json', 'r') as f: + USER_CONFIG = json.load(f) +except FileNotFoundError: + USER_CONFIG = { + "general": { + "copy_mode": False, + "main_folder_only": False, + "singles_folder": True, + "exist_only": False, + "abc_sort": False + }, + "folders": { + "source": [], + "target": [] + } + } + + +# פונקציה לשמירת נתיב שהוזן לאחרונה +def save_recent_path(path, path_type): + if path not in USER_CONFIG['folders'][path_type]: + USER_CONFIG['folders'][path_type].insert(0, path) + USER_CONFIG['folders'][path_type] = USER_CONFIG['folders'][path_type][:5] + with open('app/config.json', 'w') as file: + json.dump(USER_CONFIG, file, indent=4) + + +def main(page: ft.Page): + page.title = "דוגמה לנתיבים אחרונים" + + # Input fields - SearchBar + source_dir_input = ft.SearchBar( + #label="תיקית מקור", # השתמש ב- label במקום hint_text + on_submit=lambda e: print(f"Selected: {e.control.value}"), + ) + target_dir_input = ft.SearchBar( + #label="תיקית יעד", # השתמש ב- label במקום hint_text + on_submit=lambda e: print(f"Selected: {e.control.value}"), + ) + + # פונקציה לעדכון שדה קלט עם נתיב שנבחר + def update_input_with_path(path, input_field): + input_field.value = path + input_field.update() + + # פונקציה לטיפול בבחירת תיקיה + def update_path(e: ft.FilePickerResultEvent, target_input: ft.SearchBar, path_type): + if e.path: + target_input.value = e.path + save_recent_path(e.path, path_type) + + # עדכון suggestions לאחר שמירת הנתיב החדש + target_input.suggestions = create_search_bar_suggestions( + path_type, target_input + ) + + target_input.update() + + # FilePickers + source_picker = ft.FilePicker( + on_result=lambda e: update_path(e, source_dir_input, 'source') + ) + target_picker = ft.FilePicker( + on_result=lambda e: update_path(e, target_dir_input, 'target') + ) + page.overlay.extend([source_picker, target_picker]) + + # פונקציה ליצירת אפשרויות עבור SearchBar + def create_search_bar_suggestions(path_type, input_field): + return [ + ft.Control( + ft.ListTile( + leading=ft.Icon(ft.icons.FOLDER), + title=ft.Text(path), + on_click=lambda e, p=path: update_input_with_path(p, input_field), + ) + ) + for path in USER_CONFIG['folders'][path_type] + ] + + # הגדרת הצעות (suggestions) ל- SearchBar + source_dir_input.suggestions = create_search_bar_suggestions( + 'source', source_dir_input + ) + target_dir_input.suggestions = create_search_bar_suggestions( + 'target', target_dir_input + ) + + # UI + page.add( + ft.Column( + [ + source_dir_input, + ft.ElevatedButton( + "בחר תיקית מקור", + icon=ft.icons.FOLDER_OPEN, + on_click=lambda _: source_picker.get_directory_path(), + ), + ] + ), + ft.Column( + [ + target_dir_input, + ft.ElevatedButton( + "בחר תיקית יעד", + icon=ft.icons.FOLDER_OPEN, + on_click=lambda _: target_picker.get_directory_path(), + ), + ] + ), + ) + + +ft.app(target=main) \ No newline at end of file diff --git a/src/core/features/update2.py b/src/core/features/update2.py new file mode 100644 index 00000000..1358d2ac --- /dev/null +++ b/src/core/features/update2.py @@ -0,0 +1,35 @@ +import requests + +def check_for_update(repo_owner, repo_name, current_version): + url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/tags" + print(url) + response = requests.get(url) + if response.status_code == 200: + data = response.json() + print(data) + if data: + latest_version = data[0]['name'] + + if latest_version != current_version: + print(f"New version available: {latest_version}") + return latest_version + else: + print("You are using the latest version.") + return None + else: + print("No tags found in the repository.") + return None + else: + print("Failed to fetch tags information.") + return None + +# פרטים למאגר שלך +repo_owner = "NHLOCAL" # שם המשתמש בגיטהאב +repo_name = "Singles-Sorter" # שם המאגר +current_version = "v1.0.0" # הגרסה הנוכחית שלך + +latest_version = check_for_update(repo_owner, repo_name, current_version) +if latest_version: + print(f"New version tag: {latest_version}") +else: + print("No update needed.") diff --git a/src/core/general_configs.py b/src/core/general_configs.py new file mode 100644 index 00000000..9b8ae7d2 --- /dev/null +++ b/src/core/general_configs.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +import requests +import pickle + +# שמירת וטעינת הגדרות משתמש +def load_config(): + with open('app/config.pkl', 'rb') as f: + user_config = pickle.load(f) + return user_config + +# שמירת הגדרות משתמש לקובץ +def save_config(e, copy_mode, main_folder_only, singles_folder, exist_only, abc_sort): + + user_config = load_config() + + user_config['general']['copy_mode'] = copy_mode + user_config['general']['main_folder_only'] = main_folder_only + user_config['general']['singles_folder'] = singles_folder + user_config['general']['exist_only'] = exist_only + user_config['general']['abc_sort'] = abc_sort + + with open('app/config.pkl', 'wb') as f: + pickle.dump(user_config, f) + + + + +# ישום עדכון וזיהוי גרסה חדשה +def check_for_update(current_version): + # URL של GitHub API לקבלת הגרסה האחרונה + url = "https://api.github.com/repos/NHLOCAL/Singles-Sorter/releases/latest" + + try: + # בקשה ל-API לקבלת הגרסה האחרונה + response = requests.get(url) + response.raise_for_status() # לבדוק אם התקבלה תשובה תקינה + latest_release = response.json() # לקבל JSON + + # לבדוק אם מדובר בגרסת בטא + is_prerelease = latest_release['prerelease'] + + # לגרסה החדשה ביותר + latest_version = latest_release['tag_name'].strip() + + # להשוות בין גרסה נוכחית לגרסה באתר + if latest_version > f"v{current_version}" and not is_prerelease: + return latest_version + else: + return False + + except requests.RequestException as e: + #print(f"Error fetching version data: {e}") + return False + +if __name__ == '__main__': + + from singles_sorter_v3 import MusicSorter + + # גרסה נוכחית מהתוכנה שלך + current_version = MusicSorter.VERSION + + # קריאה לפונקציה + new_version = check_for_update(current_version) + if new_version: + print(f"גרסה חדשה זמינה: {new_version} 🚀") + else: + print(f"אין גרסה חדשה זמינה. 🙁") diff --git a/src/core/main.py b/src/core/main.py new file mode 100644 index 00000000..a857a234 --- /dev/null +++ b/src/core/main.py @@ -0,0 +1,696 @@ +# -*- coding: utf-8 -*- +import flet as ft +import os + +# קבצי התוכנה +from singles_sorter_v3 import MusicSorter, __VERSION__ +from general_configs import check_for_update, load_config, save_config + + +# גרסת התוכנה +global VERSION +VERSION = __VERSION__ + + + +def main(page: ft.Page): + + # הגדרת זיהוי הפעלה על אנדרואיד + global ANDROID_MODE + ANDROID_MODE = True if page.platform == ft.PagePlatform.ANDROID else False + + page.title = "מסדר הסינגלים" + page.vertical_alignment = ft.MainAxisAlignment.SPACE_BETWEEN + page.theme_mode = ft.ThemeMode.LIGHT + page.rtl = True + #page.bgcolor = "#f5f5f5" + page.theme = ft.Theme(color_scheme_seed="#2196f3") + + # הגדרה אוטומטית מותאמת למערכת ההפעלה + if ANDROID_MODE: + page.padding = ft.padding.only(20, 10, 20, 0) + page.scroll = ft.ScrollMode.AUTO + auto_focus=False + + else: + page.padding = ft.padding.only(60, 20, 60, 20) + page.window_height = 800 + page.window_width = 900 + auto_focus=True + + # Consistent button style definition + round_button = ft.ButtonStyle(shape=ft.RoundedRectangleBorder(radius=15)) + + # פונקצייה להצגת הודעה קופצת בתחתית המסך עם פרמטרים שונים + show_snackbar = lambda message_text, color, mseconds=3000, : ft.SnackBar(content=ft.Text(message_text), bgcolor=color, duration=mseconds) + + + # פונקציה לפתיחת הודעת מה חדש בהפעלה הראשונה של התוכנה + def first_run_menu(): + file_path = os.path.join('app', 'first_run') + if os.path.isfile(file_path): + # If the file exists, do something (e.g., show content) + show_content('whats-new', 'מה חדש', ft.icons.NEW_RELEASES) + os.remove(file_path) + + + + # App bar + page.appbar = ft.AppBar( + title=ft.Row( + [ + ft.Image(src="assets/icon.png", width=40), # Adjusted icon size + ft.Text( + f"מסדר הסינגלים {VERSION}", + size=24, # Adjusted title size + text_align=ft.TextAlign.CENTER, + color=ft.colors.ON_PRIMARY, # Assumed color for better contrast + weight=ft.FontWeight.BOLD, + ), + ], + alignment=ft.MainAxisAlignment.CENTER, + ), + center_title=True, + bgcolor=ft.colors.PRIMARY, + elevation=4, # Added elevation for visual depth + toolbar_height='60', + ) + + + # הגדרת סרגל תחתון + page.bottom_appbar = ft.BottomAppBar( + ft.Text( + "© כל הזכויות שמורות ל-nh.local11@gmail.com", + size=10, + text_align=ft.TextAlign.CENTER, + color=ft.colors.ON_SECONDARY, + ), + bgcolor=ft.colors.ON_PRIMARY_CONTAINER, + shape=ft.NotchShape.CIRCULAR, + padding=8, + height='35', + ) + + + + # תפריט אפשרויות נוספות + # Define menu items + def on_menu_selected(e): + if e.control.data == "upadte": + show_update() + elif e.control.data == "help": + show_content('help', 'עזרה', ft.icons.HELP) + elif e.control.data == "about": + show_content('about', 'אודות התוכנה', ft.icons.INFO) + elif e.control.data == "whats_new": + show_content('whats-new', 'מה חדש', ft.icons.NEW_RELEASES) + elif e.control.data == "settings": + show_settings() + + + try: + update_available = check_for_update(VERSION) + except: + update_available = False + + + # תפריט אפשרויות נוספות + menu_items = [ + ft.PopupMenuItem(text="עזרה", icon=ft.icons.HELP, data="help", on_click=on_menu_selected), + ft.PopupMenuItem(text="אודות התוכנה", icon=ft.icons.INFO, data="about", on_click=on_menu_selected), + ft.PopupMenuItem(text="מה חדש", icon=ft.icons.NEW_RELEASES, data="whats_new", on_click=on_menu_selected), + ft.PopupMenuItem(text="הגדרות מתקדמות", icon=ft.icons.SETTINGS, data="settings", on_click=on_menu_selected, disabled=ANDROID_MODE), + ] + + # הוספת פריט עדכון רק אם זמין + if update_available: + update_item = ft.PopupMenuItem(text="עדכן כעת", icon=ft.icons.UPDATE, data="upadte", on_click=on_menu_selected) + menu_items.insert(0, update_item) # הוספת פריט העדכון לתחילת הרשימה + + # כפתור אפשרויות נוספות בסרגל העליון + # כולל הצגת התראה אדומה אם קיים עדכון זמין + menu_button = ft.Badge( + content=ft.PopupMenuButton( + items=menu_items, + icon=ft.icons.MORE_VERT, + icon_color=ft.colors.ON_PRIMARY, + icon_size=28, + tooltip="אפשרויות נוספות", + ), + text='up', + label_visible=bool(update_available), + offset=ft.transform.Offset(0, -2), + + ) + + + page.appbar.actions.append(menu_button) + + # Define handlers for menu items + def show_content(type_content, header_content, icon_name=None): + # Open the help file + try: + with open(f"app/{type_content}.md", "r", encoding="utf-8") as file: + help_content = file.read() + except FileNotFoundError: + return + + # Create a BottomSheet to display the help content + help_sheet = ft.BottomSheet( + content=ft.Container( + content=ft.Column( + [ + # Adding a Row to include the icon and header + ft.Row( + [ + ft.Icon(icon_name, size=30, color=ft.colors.ON_PRIMARY_CONTAINER) if icon_name else None, + ft.Text( + header_content, + theme_style="headlineMedium", + weight=ft.FontWeight.BOLD, + rtl=True, + color=ft.colors.ON_PRIMARY_CONTAINER, + ), + ], + alignment=ft.MainAxisAlignment.CENTER, # Center the icon and header + rtl=True, + ), + ft.Markdown(help_content, auto_follow_links=True), + ], + tight=True, + rtl=True, + scroll=ft.ScrollMode.AUTO, + alignment=ft.MainAxisAlignment.CENTER, + horizontal_alignment=ft.CrossAxisAlignment.CENTER, + spacing="30", + ), + padding=40, + expand=True, + bgcolor=ft.colors.SURFACE_VARIANT, + ), + show_drag_handle=True, + elevation=300, + enable_drag=True, + is_scroll_controlled=True, + ) + + page.overlay.append(help_sheet) + help_sheet.open = True + page.update() + + + def show_update(): + def close_dialog(e): + page.dialog.open = False + page.update() + + def updating(e): + """ + פונקציה לפתיחת כתובת האתר להורדת גרסה חדשה בדפדפן + """ + page.dialog.open = False + + download_url = "https://nhlocal.github.io/Singles-Sorter/site/download?utm_source=singles_sorter_program&utm_medium=desktop" + + page.launch_url(download_url) + + + # יישום שיטת עדכון אוטומטי + page.update() + + page.dialog = ft.AlertDialog( + modal=True, + icon=ft.Icon(ft.icons.UPDATE, size=30, color=ft.colors.ON_SECONDARY_CONTAINER), + title=ft.Text("עדכון גרסה", text_align="center"), + content=ft.Text(f"גרסה {update_available} זמינה להורדה\n להוריד כעת?", text_align="center", rtl=True), + + actions=[ + ft.TextButton("אישור", on_click=updating), + ft.TextButton("ביטול", on_click=close_dialog), + ], + actions_alignment=ft.MainAxisAlignment.SPACE_AROUND, + ) + page.dialog.open = True + page.update() + + + def show_settings(): + # Open the help file + try: + with open(f"app/add_singers.md", "r", encoding="utf-8") as file: + add_singers_info = file.read() + except FileNotFoundError: + pass + + + def close_dialog(e): + page.dialog.open = False + page.update() + + def import_csv(e): + pass + + def export_csv(e): + pass + + def open_csv(e): + old_csv = os.path.abspath("app/disable-singer-list.csv") + personal_csv = os.path.abspath("app/personal-singer-list.csv") + + # שינוי שם קובץ csv לפני ביצוע שינויים + if os.path.exists(old_csv): + try: + os.rename(old_csv, personal_csv) + except PermissionError: + print(f"Permission denied for renaming the file '{old_csv}'.") + except Exception as e: + print(f"An error occurred while trying to rename the file: {e}") + + # פתיחת קובץ ה-CSV לצורך עריכה על ידי המשתמש + try: + os.startfile(personal_csv) + except AttributeError: + print("This feature is not supported on Windows.") + + + # הגדרת תצוגת מידע נוסף על הוספת זמרים + is_expanded = False + + def toggle_content(e): + nonlocal is_expanded + is_expanded = not is_expanded + info_add_singers.visible = is_expanded + icon_arrow.icon = "ARROW_DROP_DOWN" if is_expanded else "ARROW_RIGHT" + page.update() + + icon_arrow = ft.IconButton( + icon=ft.icons.ARROW_RIGHT, + on_click=toggle_content, + tooltip="למידע נוסף" # טקסט הסבר לחץ + ) + title_add_singers = ft.Text("הוספת זמרים", weight=ft.FontWeight.BOLD, size=16) + info_add_singers = ft.Markdown(add_singers_info, visible=False) + + page.dialog = ft.AlertDialog( + modal=True, + #bgcolor=ft.colors.SURFACE_VARIANT, + icon=ft.Icon(ft.icons.SETTINGS, size=30, color=ft.colors.ON_PRIMARY_CONTAINER), + title=ft.Text("הגדרות מתקדמות", text_align="center", color=ft.colors.ON_PRIMARY_CONTAINER, weight=ft.FontWeight.BOLD), + content=ft.Container( # הוספת Container לשליטה ברוחב + width=page.window_width * 0.7, # קביעת רוחב קבוע + content=ft.Column( + [ + ft.Column( + [ + ft.Text("מיון דואטים", weight=ft.FontWeight.BOLD, size=16), + ft.Text( + "תכונה זו לא זמינה עדיין, רוצים לזרז את הוספת התכונה? ", + spans=[ + ft.TextSpan( + "מלאו טופס כעת", + ft.TextStyle( + decoration=ft.TextDecoration.UNDERLINE, + color=ft.colors.BLUE + ), + url="https://docs.google.com/forms/d/e/1FAIpQLScOaX1wWW1YXXlX4cylMA6LWpO7yIb2fStmjzfSqmLc_V9CIw/viewform?usp=sf_link" + ), + ], + color='red' + ), + + ft.RadioGroup(content=ft.Column([ + ft.Radio(value="auto_singer", label="בחירה אוטומטית",), + ft.Radio(value="first_singer", label="העתק לזמר הראשון בשם השיר", disabled=True), + ft.Radio(value="all_singers", label="העתק לכל הזמרים המופיעים בשם השיר", disabled=True)], + rtl=True, + ), + value="auto_singer" + ), + ], + ), + + + ft.Column( + [ + ft.Row([icon_arrow, title_add_singers]), + info_add_singers, + + ft.Row( + [ + ft.TextButton("ערוך קובץ", on_click=open_csv), + ft.TextButton("ייבא קובץ", on_click=import_csv, disabled=True), + ft.TextButton("ייצא קובץ", on_click=export_csv, disabled=True), + ] + ), + ], + + ), + + + ], + + spacing='25', + scroll=ft.ScrollMode.AUTO, + alignment=ft.MainAxisAlignment.START, + horizontal_alignment=ft.CrossAxisAlignment.START, + rtl=True, + ), + ), + + actions=[ + ft.TextButton("סגור", on_click=close_dialog), + ], + actions_alignment=ft.MainAxisAlignment.SPACE_AROUND, + ) + page.dialog.open = True + page.update() + + + # Input fields + height_button = '50' + if ANDROID_MODE: + width_button = '100' + describe_button = 'בחר' + else: + width_button = '150' + describe_button = 'בחר תיקיה' + + round_text_field = ft.border_radius.only(15, 10, 15, 10) + + source_dir_input = ft.TextField(label="תיקית הסינגלים שלך", autofocus=auto_focus, rtl=True, expand=True, border_radius=round_text_field, border=ft.border.all(2, color=ft.colors.OUTLINE), height='50', hint_text=r"C:\Music\סינגלים", read_only=ANDROID_MODE) + + target_dir_input = ft.TextField(label="תיקית יעד", rtl=True, expand=True, border=ft.border.all(2, color=ft.colors.OUTLINE), border_radius=round_text_field, height='50', hint_text=r"C:\Music\המוזיקה שלך", read_only=ANDROID_MODE) + + source_picker = ft.FilePicker(on_result=lambda e: update_path(e, source_dir_input, "src")) + target_picker = ft.FilePicker(on_result=lambda e: update_path(e, target_dir_input, "tar")) + + page.overlay.extend([source_picker, target_picker]) + + + source_dir_button = ft.ElevatedButton(describe_button, icon=ft.icons.FOLDER_OPEN, on_click=lambda _: source_picker.get_directory_path(), height=height_button, width=width_button, tooltip='בחירת תיקיה המכילה את המוזיקה שברצונך לסדר', style=round_button,) + target_dir_button = ft.ElevatedButton(describe_button, icon=ft.icons.FOLDER_OPEN, on_click=lambda _: target_picker.get_directory_path(), height=height_button, width=width_button, tooltip='בחירת תיקית יעד אליה יוכנסו תיקיות המוזיקה שיווצרו', style=round_button) + + + # Checkboxes + global copy_mode, main_folder_only, singles_folder, exist_only, abc_sort + + + # import user config form file + global user_config + + try: + user_config = load_config() + except: + user_config = {'general': {'copy_mode': False, + 'main_folder_only': False, + 'singles_folder': True, + 'exist_only': False, + 'abc_sort': False}, + 'folders': {'source': [], 'target': []} + } + + copy_mode = ft.Checkbox( + label="העתק קבצים (העברה היא ברירת המחדל)", + tooltip="סמן אם ברצונך לבצע העתקה של הקבצים כברירת מחדל תתבצע העברה", + value=user_config['general']['copy_mode'] + ) + main_folder_only = ft.Checkbox( + label="סרוק תיקיה ראשית בלבד", + tooltip="אם מסומן, התוכנה תסרוק רק את התיקייה הראשית ולא תתי תיקיות", + value=user_config['general']['main_folder_only'] + ) + singles_folder = ft.Checkbox( + label='צור תיקיות סינגלים פנימיות', + tooltip="סמן אם ברצונך ליצור תיקיות פנימיות בתוך תיקיות הזמרים אליהם יועברו הסינגלים", + value=user_config['general']['singles_folder'] + ) + exist_only = ft.Checkbox( + label="השתמש בתיקיות קיימות בלבד", + tooltip="אם מסומן, התוכנה תעביר קבצים רק לתיקיות זמרים קיימות ולא תיצור חדשות", + value=user_config['general']['exist_only'] + ) + abc_sort = ft.Checkbox( + label="צור תיקיות ראשיות לפי ה-א' ב'", + tooltip="אם מסומן, התוכנה תיצור תיקיה ראשית לכל אות באלפבית", + value=user_config['general']['abc_sort'] + ) + + # יצירת פונקציה לשמירת הגדרות המשתמש + def open_save_config(e): + try: + save_config(e, copy_mode.value, main_folder_only.value, singles_folder.value, exist_only.value, abc_sort.value) + page.snack_bar = show_snackbar("ההגדרות נשמרו בהצלחה!", ft.colors.GREEN) + except Exception as error: + page.snack_bar = show_snackbar(f"התרחשה שגיאה בעת שמירת ההגדרות: {error}", ft.colors.ERROR) + finally: + page.snack_bar.open = True + page.update() + + + # כפתור שמירת הגדרות + save_config_button = ft.IconButton( + icon=ft.icons.SAVE, + on_click=open_save_config, + bgcolor=ft.colors.BACKGROUND, + tooltip='שמור הגדרות מותאמות אישית', + disabled=False, + ) + + + # Progress bar + page.window_progress_bar='0.0' + progress_bar = ft.ProgressBar(width=400, value=0) + + + # הצגת הודעת אזהרה לפני הפעלת הסריקה + def show_warning(e): + def close_dialog(e): + page.dialog.open = False + page.update() + + def continue_organization(e): + page.dialog.open = False + organize_files(e, page) + page.update() + + page.dialog = ft.AlertDialog( + modal=True, + title=ft.Text("אשר והתחל", text_align="center"), + content=ft.Text("התוכנה מיועדת לסינגלים בלבד\n מיון תיקיות אלבומים צפויה לשבש אותם!", text_align="center", rtl=True), + + actions=[ + ft.TextButton("אישור", on_click=continue_organization), + ft.TextButton("ביטול", on_click=close_dialog), + ], + actions_alignment=ft.MainAxisAlignment.SPACE_AROUND, + ) + page.dialog.open = True + page.update() + + organize_button = ft.ElevatedButton( + content=ft.Row( + [ + ft.Icon(ft.icons.AUTO_FIX_HIGH), # הוספת אייקון "אזהרה" + ft.Text("הפעל כעת", size=20), + ], + alignment=ft.MainAxisAlignment.CENTER, # מירכוז תוכן הכפתור + ), + on_click=show_warning, + style=round_button, + height='60', + width='180', + ) + + + + # הגדרות הממשק הגרפי של התוכנה + page.add( + + ft.Container( + content=ft.Column( + [ + ft.Row([source_dir_button, source_dir_input], alignment=ft.MainAxisAlignment.CENTER), + ft.Row([target_dir_button, target_dir_input], alignment=ft.MainAxisAlignment.CENTER), + ], + + spacing='20', + alignment=ft.MainAxisAlignment.CENTER, + horizontal_alignment=ft.CrossAxisAlignment.CENTER, + ), + + margin = ft.margin.only(0, 10, 0, 20) + + ), + + + ft.Container( + content=ft.Column( + [ + # התאמה אישית + ft.Row( + [ + ft.Icon(ft.icons.TUNE), # סמל כיוון + ft.Text("התאמה אישית", size=20, color=ft.colors.PRIMARY, weight=ft.FontWeight.BOLD), + ], + alignment=ft.MainAxisAlignment.CENTER, # יישור הסמל והכותרת לשמאל + ), + + # הגדרות בסיסיות + ft.Row( + [ + #ft.Icon(ft.icons.HOME), # סמל בית + ft.Text("הגדרות בסיסיות", weight=ft.FontWeight.BOLD), + ], + alignment=ft.MainAxisAlignment.START, + ), + copy_mode, + main_folder_only, + + # מתקדם + ft.Row( + [ + #ft.Icon(ft.icons.BUILD), # סמל בנייה + ft.Text("מתקדם", weight=ft.FontWeight.BOLD), + ], + alignment=ft.MainAxisAlignment.START, + ), + singles_folder, + exist_only, + + ft.Row( + [ + abc_sort, + save_config_button, + ], + alignment=ft.MainAxisAlignment.SPACE_BETWEEN, + ), + ], + alignment=ft.MainAxisAlignment.CENTER, + horizontal_alignment=ft.CrossAxisAlignment.CENTER, + ), + + margin = ft.margin.all(0), + border=ft.border.all(2, color=ft.colors.OUTLINE), + border_radius=15, + padding=10, + alignment=ft.alignment.center, + ), + + + ft.Container( + content=ft.Column( + [ + + ft.Row( + [ + progress_bar, + ], + + alignment=ft.MainAxisAlignment.CENTER, + ), + + ft.Row( + [ + organize_button, + ], + + alignment=ft.MainAxisAlignment.CENTER, + ), + + ], + + spacing='20', + ), + + margin = ft.margin.only(0, 10, 0, 10), + padding=10, + alignment=ft.alignment.center, + ) + ) + + + + + def update_path(e: ft.FilePickerResultEvent, target_input: ft.TextField, src_tar): + try: + target_input.value = e.path if e.path else None + target_input.update() + + if src_tar == "src": + global source_path + source_path = e.path + elif src_tar == "tar": + global target_path + target_path = e.path + + except Exception as error: + # Display an error message to the user or log the error + print(f"Error updating path: {error}") + # Consider using a Snackbar or AlertDialog to display the error to the user + + + # טיפול במיון הקבצים בפועל - בעת לחיצה על כפתור הפעל + def organize_files(e, page: ft.Page): + source_dir = source_path if ANDROID_MODE else source_dir_input.value + target_dir = target_path if ANDROID_MODE else target_dir_input.value + + if not source_dir or not target_dir: + page.snack_bar = show_snackbar("אנא בחר תיקיית מקור ותיקיית יעד!", ft.colors.ERROR) + page.snack_bar.open = True + page.update() + return + + + def progress_callback(progress): + progress_num = progress / 100 + progress_bar.value = progress_num + page.window_progress_bar = str(progress_num) + page.update() + + # Call the scan_dir function with arguments and progress callback + try: + # השבתת כפתור הפעל בעת הרצת הסריקה + organize_button.disabled = True + page.update() + + # הפעלת פונקציות חיצוניות ליישום המיון + sorter = MusicSorter( + source_dir, + target_dir, + copy_mode.value, + abc_sort.value, + exist_only.value, + singles_folder.value, + main_folder_only.value, + progress_callback + ) + + # ניקוי תוכן מיותר משמות הקבצים + sorter.clean_names() + # מיון הקבצים בפעול + sorter.scan_dir() + # יצירת קובץ לוג + sorter.log_to_file() + + + page.snack_bar = show_snackbar("מיון הקבצים הסתיים בהצלחה", ft.colors.GREEN, 10000) + + except FileNotFoundError as error: + page.snack_bar = show_snackbar(f"{error}", ft.colors.ERROR) + except PermissionError as error: + page.snack_bar = show_snackbar(f"{error}", ft.colors.ERROR) + except Exception as error: + page.snack_bar = show_snackbar(f"שגיאה במיון הקבצים: {error}", ft.colors.ERROR) + + finally: + page.window_progress_bar = '0.0' + page.snack_bar.open = True + organize_button.disabled = False + page.update() + + # הפעלת פונקצייה שפותחת הודעה "מה חדש" בהפעלה הראשונה + first_run_menu() + + + +ft.app(target=main) diff --git a/src/core/requirements.txt b/src/core/requirements.txt new file mode 100644 index 00000000..6aa46f63 --- /dev/null +++ b/src/core/requirements.txt @@ -0,0 +1,3 @@ +music_tag +jibrish_to_hebrew +requests \ No newline at end of file diff --git a/src/core/singles_sorter_v3.py b/src/core/singles_sorter_v3.py new file mode 100644 index 00000000..5cbea88f --- /dev/null +++ b/src/core/singles_sorter_v3.py @@ -0,0 +1,379 @@ +# -*- coding: utf-8 -*- +__VERSION__ = '13.0' + +import os +import sys +import argparse +from shutil import copy, move +from music_tag import load_file +from jibrish_to_hebrew import fix_jibrish +import csv +from check_name import check_exact_name +import json +import datetime + +class MusicSorter: + + def __init__(self, source_dir, target_dir, copy_mode=False, abc_sort=False, exist_only=False, singles_folder=True, main_folder_only=False, progress_callback=None): + self.unusual_list = ["סינגלים", "סינגל", "אבגדהוזחטיכלמנסעפצקרשתךםןץ", "אמן לא ידוע", "טוב", "לא ידוע", "תודה לך ה"] + self.substrings_to_remove = [" -מייל מיוזיק", " - ציצו במייל", "-חדשות המוזיקה", " - חדשות המוזיקה", " - ציצו", " מוזיקה מכל הלב", " - מייל מיוזיק"] + self.source_dir = source_dir + self.target_dir = target_dir + self.copy_mode = copy_mode + self.abc_sort = abc_sort + self.exist_only = exist_only + self.singles_folder = singles_folder + self.main_folder_only = main_folder_only + self.log_files = [] + self.operating_details = [source_dir, target_dir, copy_mode, abc_sort, exist_only, singles_folder, main_folder_only] + self.progress_callback = progress_callback + self.singer_list = self.list_from_csv() + + + def progress_display(self, len_amount): + for len_item in range(1, len_amount + 1): + show_len = len_item * 100 // len_amount + yield show_len + + + def check_errors(self): + """ + Checks for potential errors related to source and target directories. + + Args: + source_dir (str): The path to the source directory. + target_dir (str): The path to the target directory. + + Raises: + FileNotFoundError: If the source or target directory does not exist. + PermissionError: If the script does not have write access to the target directory. + ValueError: If the source and target directories are the same. + """ + if not os.path.exists(self.source_dir): + raise FileNotFoundError("תיקיית המקור לא נמצאה") + + if not os.path.exists(self.target_dir): + raise FileNotFoundError("תיקיית היעד לא נמצאה") + + if not os.access(self.target_dir, os.W_OK): + raise PermissionError("אין הרשאת כתיבה לתיקיית היעד") + + if os.path.samefile(self.source_dir, self.target_dir): + raise ValueError("תיקיית המקור ותיקיית היעד לא יכולות להיות זהות") + + if not os.listdir(self.source_dir): + raise ValueError("תיקיית המקור ריקה") + + + def clean_filename(self, filename): + + for substring in self.substrings_to_remove: + filename = filename.replace(substring, "") + + return filename + + def clean_names(self): + if self.main_folder_only is False: + for root, _, files in os.walk(self.source_dir): + for my_file in files: + if my_file.lower().endswith((".mp3", ".wma", ".wav")): + old_file_path = os.path.join(root, my_file) + new_file_name = self.clean_filename(my_file) + new_file_path = os.path.join(root, new_file_name) + os.rename(old_file_path, new_file_path) + + elif self.main_folder_only: + for my_file in os.listdir(self.source_dir): + file_path = os.path.join(self.source_dir, my_file) + if os.path.isfile(file_path) and my_file.lower().endswith((".mp3", ".wma", ".wav")): + new_file_name = self.clean_filename(my_file) + new_file_path = os.path.join(self.source_dir, new_file_name) + os.rename(file_path, new_file_path) + + + def scan_dir(self): + """ + Main function of the program. Scans the specified directory and creates a list of files for copying. + At the end of the process, it copies them if a target directory parameter is provided. + + Parameters: + source_dir = Directory path to scan + target_dir = Target directory path for transfer + copy_mode = Enable copy mode (default is move) + abc_sort = Sort folders alphabetically + exist_only = Transfer to existing folders only + singles_folder = Create an internal "singles" folder + main_folder_only = Sort only the main folder + Defined by True or False. + + Result: + Prints the list of artists that appear in the song metadata and copies them to the target. + """ + + # בדיקת שגיאות בארגומנטים של המשתמש + self.check_errors() + + # סריקת עץ התיקיות או התיקיה הראשית בהתאם לבחירת המשתמש והכנסת שם הקבצים ושם האמן שלהם לרשימה + info_list = [] + if self.main_folder_only is False: + for root, _, files in os.walk(self.source_dir): + for my_file in files: + file_path = os.path.join(root, my_file) + if my_file.lower().endswith((".mp3",".wma", ".wav")): + artist = self.artist_from_song(file_path) + if artist: info_list.append((file_path, artist)) + + # סריקת התיקיה הראשית בלבד ללא תיקיות פנימיות + elif self.main_folder_only: + for my_file in os.listdir(self.source_dir): + file_path = os.path.join(self.source_dir, my_file) + if os.path.isfile(file_path): + if my_file.lower().endswith((".mp3",".wma", ".wav")): + artist = self.artist_from_song(file_path) + if artist: info_list.append((file_path, artist)) + + len_dir = len(info_list) + progress_generator = self.progress_display(len_dir) + + # מעבר על תוצאות הסריקה והדפסתם בכפוף למספר תנאים + for file_path, artist in info_list: + show_len = next(progress_generator) + print(f"{show_len}% completed",end='\r') + if self.progress_callback: # Call the callback with progress + self.progress_callback(show_len) + + # הגדרת משתנה עבור תיקית יעד בהתאם להתאמות האישיות של המשתמש + if self.singles_folder and self.abc_sort: + main_target_path = os.path.join(self.target_dir, artist[0], artist) + target_path = os.path.join(self.target_dir, artist[0], artist, "סינגלים") + elif self.singles_folder: + main_target_path = os.path.join(self.target_dir, artist) + target_path = os.path.join(self.target_dir, artist, "סינגלים") + elif self.abc_sort: + main_target_path = os.path.join(self.target_dir, artist[0], artist) + target_path = os.path.join(self.target_dir, artist[0], artist) + else: + main_target_path = os.path.join(self.target_dir, artist) + target_path = os.path.join(self.target_dir, artist) + + # יצירת תיקית יעד בתנאים מסויימים + if self.exist_only is False: + if not os.path.isdir(target_path): + try: + os.makedirs(target_path) + except Exception as e: + print(f"Error creating directory {target_path}: {e}") + + elif self.exist_only and self.singles_folder: + if os.path.isdir(main_target_path) and not os.path.isdir(target_path): + try: + os.makedirs(target_path) + except Exception as e: + print(f"Error creating directory {target_path}: {e}") + else: + pass + + + # העברה או העתקה בהתאם להגדרות המשתמש + if self.copy_mode and os.path.isdir(target_path): + try: + copy(file_path, target_path) + self.log_files.append((file_path, target_path)) + print(f"Copied {file_path} to {target_path}") + except Exception as e: + print(f"Failed to copy {file_path} to {target_path}: {e}") + elif os.path.isdir(target_path): + try: + move(file_path, target_path) + self.log_files.append((file_path, target_path)) + print(f"Moved {file_path} to {target_path}") + except Exception as e: + print(f"Failed to move {file_path} to {target_path}: {e}") + + return + + + def list_from_csv(self): + # יבוא רשימת זמרים מקובץ csv + # Construct the path to the CSV file + + # אם הקוד רץ כקובץ מקומפל + if getattr(sys, 'frozen', False): + csv_path = os.path.join(sys._MEIPASS, 'app', 'singer-list.csv') + else: + # אם הקוד רץ כסקריפט רגיל + csv_path = os.path.abspath("app/singer-list.csv") + + + + with open(csv_path, 'r', encoding='utf-8') as file: + csv_reader = csv.reader(file) + singer_list = [tuple(row) for row in csv_reader] + + if os.path.isfile("app/personal-singer-list.csv"): + with open("app/personal-singer-list.csv", 'r') as file: + csv_reader = csv.reader(file) + personal_list = [tuple(row) for row in csv_reader] + singer_list.extend(personal_list) + + return singer_list + + + def artist_from_song(self, my_file): + """ + הפונקציה בודקת את שם אמן הקובץ בשם הקובץ לפי מסד נתונים ומכניסה את שם האמן למשתנה + אם השם לא קיים היא סורקת את המטאדאטה של השיר ומכניסה את שם האמן למשתנה + + תנאים: + my_file (str) - שם הקובץ שנסרק + + תוצאה: + ערך המכיל את שם אמן הקובץ + """ + + # מעבר על רשימת הזמרים בדאטה וחיפוש שלהם בשם הקובץ + + # קבלת שם הקובץ ללא נתיב מלא + split_file = os.path.split(my_file)[1] + + # הסרת תווים מטעים בשם הקובץ + split_file = split_file.replace('_', ' ') + split_file = split_file.replace('-', ' ') + + + # מעבר על רשימת השמות ובדיקה אם אחד מהם קיים בשם השיר + for source_name, target_name in self.singer_list: + if source_name in split_file: + + # בדיקת דיוק שם הקובץ + exact = check_exact_name(split_file, source_name) + + if exact: + artist = target_name + return artist + + # אם שם הקובץ לא נמצא יתבצע חיפוש במטאדאטה של הקובץ + try: + # טעינת מטאדאטה של השיר + metadata_file = load_file(my_file) + # קבלת אמן מטאדאטה של השיר + artist = metadata_file['artist'] + artist = artist.value + + if artist: + # המרת שם האמן אם הוא פגום + artist = fix_jibrish(artist, "heb") + + # מעבר על רשימת השמות ובדיקה אם אחד מהם קיים בתגית האמן + for source_name, target_name in self.singer_list: + if source_name in artist: + """ + # בדיקת דיוק שם הקובץ + exact = check_exact_name(artist, source_name) + """ + artist = target_name + return artist + + # הפעלת פונקציה המבצעת בדיקות על שם האמן + check_answer = self.check_artist(artist) + if check_answer == False: + return + + return artist + + # אם לא נמצא שם אמן תקין יתבצע חיפוש בכותרת הקובץ + else: + # קבלת כותרת השיר + title = metadata_file['title'] + title = title.value + + if title: + # המרת שם האמן אם הוא פגום + title = fix_jibrish(title, "heb") + + # מעבר על רשימת השמות ובדיקה אם אחד מהם קיים בתגית האמן + for source_name, target_name in self.singer_list: + if source_name in title: + # בדיקת דיוק שם הקובץ + exact = check_exact_name(title, source_name) + + if exact: + artist = target_name + return artist + except UnicodeDecodeError as e: + print(f"Error decoding metadata in file {my_file}: {e}") + return + except Exception as e: + print(f"An unexpected error occurred with file {my_file}: {e}") + return + + + def check_artist(self, artist): + # החזרת שקר אם שם האמן קיים ברשימת יוצאי הדופן + if artist in self.unusual_list: + return False + + # בדיקה אם המחרוזת אינה ארוכה מידי + if len(artist.split()) >= 4 or len(artist.split()) <= 0: + return False + + # בדיקה אם המחרוזת מכילה תוים תקינים בלבד + if all(c in "אבגדהוזחטיכלמנסעפצקרשתךםןףץ'׳ " for c in artist): + return True + else: + return False + + def log_to_file(self): + now = datetime.datetime.now() + log_filename = f"log_{now.strftime('%Y%m%d_%H%M%S')}.json" + log_directory = "log" + + log_data = { + "operation_time": now.strftime('%d/%m/%Y %H:%M:%S'), + "source_directory": self.operating_details[0], + "target_directory": self.operating_details[1], + "copy_mode": self.operating_details[2], + "abc_sort": self.operating_details[3], + "exist_only": self.operating_details[4], + "singles_folder": self.operating_details[5], + "main_folder_only": self.operating_details[6], + "files": [{"old_path": old_path, "new_path": new_path} for old_path, new_path in self.log_files] + } + + # יצירת התיקיה אם היא לא קיימת + if not os.path.exists(log_directory): + os.makedirs(log_directory) + + log_path = os.path.join(log_directory, log_filename) + with open(log_path, 'w', encoding='utf-8') as log_file: + json.dump(log_data, log_file, ensure_ascii=False, indent=4) + + def load_from_log(self, log_filename): + with open(log_filename, 'r', encoding='utf-8') as log_file: + log_data = json.load(log_file) + return log_data + + + +def main(): + parser = argparse.ArgumentParser(description=f"Singles Sorter {__VERSION__} - Scan and organize music files into folders by artist using advanced automation.") + parser.add_argument('source_dir', help="Path to the source directory") + parser.add_argument('target_dir', help="Path to the target directory", nargs='?') + parser.add_argument('-c', '--copy_mode', help="Enable copy mode (default is move mode)", action='store_true') + parser.add_argument('-a', '--abc_sort', help="Sort folders alphabetically (default: False)", action='store_true') + parser.add_argument('-e', '--exist_only', help="Transfer to existing folders only (default: False)", action='store_true') + parser.add_argument('-n', '--no_singles_folder', help="Do not create an internal 'singles' folder", action='store_false', dest='singles_folder', default=True) + parser.add_argument('-m', '--main_folder_only', help="Sort only the main folder (default: False)", action='store_true') + + args = parser.parse_args() + + try: + sorter = MusicSorter(args.source_dir, args.target_dir, args.copy_mode, args.abc_sort, args.exist_only, args.singles_folder, args.main_folder_only) + sorter.clean_names() + sorter.scan_dir() + sorter.log_to_file() + except Exception as e: + print("Error: {}".format(e)) + +if __name__ == '__main__': + main() diff --git a/src/core/try1.py b/src/core/try1.py new file mode 100644 index 00000000..8ae13f0f --- /dev/null +++ b/src/core/try1.py @@ -0,0 +1,22 @@ +import flet as ft + +def main(page: ft.Page): + def regular_action(e): + # קוד להפעלה רגילה + pass + + def clean_only_action(e): + # קוד להפעלת ניקוי בלבד + pass + + tabs = ft.Tabs( + selected_index=0, + tabs=[ + ft.Tab(text="הפעל", content=ft.Text("הפעל",)), + ft.Tab(text="הפעל ניקוי בלבד", content=ft.Text("הפעל ניקוי בלבד",)) + ] + ) + + page.add(tabs) + +ft.app(target=main) diff --git a/src/tasks/Work Plan.md b/src/tasks/Work Plan.md new file mode 100644 index 00000000..2dc72f2c --- /dev/null +++ b/src/tasks/Work Plan.md @@ -0,0 +1,25 @@ +# תוכנית עבודה +- [x] המרת פורמט הקוד לתכנות מונחה עצמים +- [x] שמירת העדפות המשתמש, כולל הגדרות באפשרויות נוספות ונתיבי תיקיות אחרונים -- יש לשנות את מיקום אחסון קבצי ההגדרה כדי לתת גישה למשתמש ללא הרשאות ניהול +- [x] חשיבה על מבנה העיצוב המתאים - בשביל שהחלון לא יהיה גדול מידי +- [x] עדכון אוטומטי - היישום לא מסובך בכלל! +- [x] הודעת עזרה בסיסית בתוך התוכנה +- [ ] הוספת קובץ עזרה מפורט +- [x] פונקציית הוספת זמרים - דורש עבודה מסויימת // אולי לשדרג לעריכה מתוך התוכנה במקום דרך תוכנת אקסל +- [x] הסרת תוכן מיותר משמות הקבצים - יש לבנות מחדש כקוד פייתון +- [ ] הפעלת האופציה הנ"ל גם ללא מיון הקבצים +- [x] הוספת כפתור מה חדש +- [ ] קישור לאתר שיר בוט בתחתית התוכנה במקום "כל הזכויות שמורות" +- [x] הוספת כפתור "אודות" +- [x] כל הכפתורים עם סמלילים ללא טקסט, תיאור בריחוף על הכפתור +- [x] הוספת סמלילי עזרה / טייטל עבור האלמנטים המרכזיים, כדי להפוך את התוכנה לפשוטה ומובנת יותר (בערך כמו בתוכנה VIBE) +- [x] הוספת הודעת אזהרה לפני המיון: "האם אתה בטוח וכו'" + הערה "שים לב כי התוכנה מיועדת למיון סינגלים בלבד! מיון תיקיות אלבומים עשוי לשבש אותם!" +- [ ] הוספת הודעה קופצת בסיום הפעולה / במגש המערכת / הוספת צליל? +- [x] בנייה מחדש של מבנה הכלי בשורת הפקודה +- [ ] שמירת ההגדרות באופן מקצועי באמצעות השיטה המובנית של flet +- [ ] הוספת גרסה ניידת! (פורטבל) +- [ ] עיבוד קבצים בדיסק און קי / מכשירי אנדרואיד דרך המחשב +- [ ] הגדרות מתקדמות עבור דואטים: הכפלה עבור כל תיקית זמר / העתקה לזמר הראשון בשם / ברירת מחדל +- [ ] שמירת רשימת השירים שהועברו והצעה למשתמש להציג אותם בסיום הפעולה (בהמשך ניתן להוסיף שחזור על בסיס הרשימה) + +מומלץ לעיין בתוצאות הסקר הראשון ולהתרשם מהפריטים השימושיים יותר או פחות בתוכנה \ No newline at end of file diff --git "a/base-files/inside/\327\236\327\251\327\231\327\236\327\225\327\252 \327\234\327\221\327\231\327\246\327\225\327\242.txt" "b/src/tasks/\327\236\327\251\327\231\327\236\327\225\327\252 \327\234\327\221\327\231\327\246\327\225\327\242.txt" similarity index 100% rename from "base-files/inside/\327\236\327\251\327\231\327\236\327\225\327\252 \327\234\327\221\327\231\327\246\327\225\327\242.txt" rename to "src/tasks/\327\236\327\251\327\231\327\236\327\225\327\252 \327\234\327\221\327\231\327\246\327\225\327\242.txt" diff --git "a/base-files/inside/\327\242\327\223\327\233\327\225\327\240\327\231\327\235 2.2.txt" "b/src/tasks/\327\242\327\223\327\233\327\225\327\240\327\231\327\235 2.2.txt" similarity index 100% rename from "base-files/inside/\327\242\327\223\327\233\327\225\327\240\327\231\327\235 2.2.txt" rename to "src/tasks/\327\242\327\223\327\233\327\225\327\240\327\231\327\235 2.2.txt" diff --git a/python-project/Folder_Merger.py b/src/tests/Folder_Merger.py similarity index 100% rename from python-project/Folder_Merger.py rename to src/tests/Folder_Merger.py diff --git a/python-project/data update/add_data.py b/src/tests/data update/add_data.py similarity index 100% rename from python-project/data update/add_data.py rename to src/tests/data update/add_data.py diff --git a/python-project/data update/clear_data.py b/src/tests/data update/clear_data.py similarity index 100% rename from python-project/data update/clear_data.py rename to src/tests/data update/clear_data.py diff --git a/python-project/data update/filtered_names.txt b/src/tests/data update/filtered_names.txt similarity index 100% rename from python-project/data update/filtered_names.txt rename to src/tests/data update/filtered_names.txt diff --git a/python-project/data update/names.txt b/src/tests/data update/names.txt similarity index 100% rename from python-project/data update/names.txt rename to src/tests/data update/names.txt diff --git a/python-project/data update/one_word_names.txt b/src/tests/data update/one_word_names.txt similarity index 100% rename from python-project/data update/one_word_names.txt rename to src/tests/data update/one_word_names.txt diff --git a/python-project/data update/removed_names.txt b/src/tests/data update/removed_names.txt similarity index 100% rename from python-project/data update/removed_names.txt rename to src/tests/data update/removed_names.txt diff --git a/source_code/singer-list.csv b/src/tests/data update/singer-list.csv similarity index 100% rename from source_code/singer-list.csv rename to src/tests/data update/singer-list.csv diff --git a/python-project/data update/sort_data.py b/src/tests/data update/sort_data.py similarity index 100% rename from python-project/data update/sort_data.py rename to src/tests/data update/sort_data.py diff --git a/python-project/data update/sorted_names.txt b/src/tests/data update/sorted_names.txt similarity index 100% rename from python-project/data update/sorted_names.txt rename to src/tests/data update/sorted_names.txt diff --git a/python-project/data update/three_or_more_words_names.txt b/src/tests/data update/three_or_more_words_names.txt similarity index 100% rename from python-project/data update/three_or_more_words_names.txt rename to src/tests/data update/three_or_more_words_names.txt diff --git a/python-project/find_singer_names.py b/src/tests/find_singer_names.py similarity index 100% rename from python-project/find_singer_names.py rename to src/tests/find_singer_names.py diff --git a/python-project/identify_similarities.py b/src/tests/identify_similarities.py similarity index 100% rename from python-project/identify_similarities.py rename to src/tests/identify_similarities.py diff --git a/python-project/assert_check_name.py b/src/tests/legacy/assert_check_name.py similarity index 100% rename from python-project/assert_check_name.py rename to src/tests/legacy/assert_check_name.py diff --git a/python-project/singles_sorter_gui_alfa.py b/src/tests/legacy/singles_sorter_gui_alfa.py similarity index 100% rename from python-project/singles_sorter_gui_alfa.py rename to src/tests/legacy/singles_sorter_gui_alfa.py diff --git a/versions.data/13.0+version b/versions.data/13.0+version new file mode 100644 index 00000000..a3bb90de --- /dev/null +++ b/versions.data/13.0+version @@ -0,0 +1 @@ + !רתויב תינכדעה הסרגה יהוז diff --git a/versions.data/7.0+version b/versions.data/7.0+version index 61900d7d..0bf699f7 100644 --- a/versions.data/7.0+version +++ b/versions.data/7.0+version @@ -1,4 +1,4 @@ - תעכ הדרוהל הנימז 12.8 הסרג + תעכ הדרוהל הנימז 13.0 הסרג ---------------------------------- ?וז הסרגב שדח המ diff --git a/versions.data/7.1+version b/versions.data/7.1+version index 61900d7d..0bf699f7 100644 --- a/versions.data/7.1+version +++ b/versions.data/7.1+version @@ -1,4 +1,4 @@ - תעכ הדרוהל הנימז 12.8 הסרג + תעכ הדרוהל הנימז 13.0 הסרג ---------------------------------- ?וז הסרגב שדח המ diff --git a/versions.data/7.3+version b/versions.data/7.3+version index 61900d7d..0bf699f7 100644 --- a/versions.data/7.3+version +++ b/versions.data/7.3+version @@ -1,4 +1,4 @@ - תעכ הדרוהל הנימז 12.8 הסרג + תעכ הדרוהל הנימז 13.0 הסרג ---------------------------------- ?וז הסרגב שדח המ diff --git a/versions.data/7.5+version b/versions.data/7.5+version index 61900d7d..0bf699f7 100644 --- a/versions.data/7.5+version +++ b/versions.data/7.5+version @@ -1,4 +1,4 @@ - תעכ הדרוהל הנימז 12.8 הסרג + תעכ הדרוהל הנימז 13.0 הסרג ---------------------------------- ?וז הסרגב שדח המ diff --git a/versions.data/8.0+version b/versions.data/8.0+version index 61900d7d..0bf699f7 100644 --- a/versions.data/8.0+version +++ b/versions.data/8.0+version @@ -1,4 +1,4 @@ - תעכ הדרוהל הנימז 12.8 הסרג + תעכ הדרוהל הנימז 13.0 הסרג ---------------------------------- ?וז הסרגב שדח המ diff --git a/versions.data/8.1+version b/versions.data/8.1+version index 61900d7d..0bf699f7 100644 --- a/versions.data/8.1+version +++ b/versions.data/8.1+version @@ -1,4 +1,4 @@ - תעכ הדרוהל הנימז 12.8 הסרג + תעכ הדרוהל הנימז 13.0 הסרג ---------------------------------- ?וז הסרגב שדח המ diff --git a/versions.data/8.2+version b/versions.data/8.2+version index 61900d7d..0bf699f7 100644 --- a/versions.data/8.2+version +++ b/versions.data/8.2+version @@ -1,4 +1,4 @@ - תעכ הדרוהל הנימז 12.8 הסרג + תעכ הדרוהל הנימז 13.0 הסרג ---------------------------------- ?וז הסרגב שדח המ diff --git a/versions.data/8.3+version b/versions.data/8.3+version index 61900d7d..0bf699f7 100644 --- a/versions.data/8.3+version +++ b/versions.data/8.3+version @@ -1,4 +1,4 @@ - תעכ הדרוהל הנימז 12.8 הסרג + תעכ הדרוהל הנימז 13.0 הסרג ---------------------------------- ?וז הסרגב שדח המ diff --git a/versions.data/8.9+version b/versions.data/8.9+version index 61900d7d..0bf699f7 100644 --- a/versions.data/8.9+version +++ b/versions.data/8.9+version @@ -1,4 +1,4 @@ - תעכ הדרוהל הנימז 12.8 הסרג + תעכ הדרוהל הנימז 13.0 הסרג ---------------------------------- ?וז הסרגב שדח המ diff --git a/versions.data/9.0+version b/versions.data/9.0+version index 61900d7d..0bf699f7 100644 --- a/versions.data/9.0+version +++ b/versions.data/9.0+version @@ -1,4 +1,4 @@ - תעכ הדרוהל הנימז 12.8 הסרג + תעכ הדרוהל הנימז 13.0 הסרג ---------------------------------- ?וז הסרגב שדח המ diff --git a/versions.data/9.1+version b/versions.data/9.1+version index 61900d7d..0bf699f7 100644 --- a/versions.data/9.1+version +++ b/versions.data/9.1+version @@ -1,4 +1,4 @@ - תעכ הדרוהל הנימז 12.8 הסרג + תעכ הדרוהל הנימז 13.0 הסרג ---------------------------------- ?וז הסרגב שדח המ diff --git a/versions.data/9.2+version b/versions.data/9.2+version index 61900d7d..0bf699f7 100644 --- a/versions.data/9.2+version +++ b/versions.data/9.2+version @@ -1,4 +1,4 @@ - תעכ הדרוהל הנימז 12.8 הסרג + תעכ הדרוהל הנימז 13.0 הסרג ---------------------------------- ?וז הסרגב שדח המ diff --git a/versions.data/SinglesSorter-up.bat b/versions.data/SinglesSorter-up.bat index 20f3509f..e0d19194 100644 --- a/versions.data/SinglesSorter-up.bat +++ b/versions.data/SinglesSorter-up.bat @@ -10,7 +10,7 @@ echo ! echo. timeout 3 -start https://nhlocal.github.io/Singles-Sorter/site/download.html +start https://nhlocal.github.io/Singles-Sorter/site/download?utm_source=singles_sorter_program&utm_medium=desktop del %0% diff --git a/versions.data/new-ver-exist b/versions.data/new-ver-exist index aef20ad8..f0750610 100644 --- a/versions.data/new-ver-exist +++ b/versions.data/new-ver-exist @@ -1 +1 @@ -12.8 \ No newline at end of file +13.0 diff --git a/versions.data/program-screen.jpg b/versions.data/program-screen.jpg index 3e8eeef0..03525550 100644 Binary files a/versions.data/program-screen.jpg and b/versions.data/program-screen.jpg differ diff --git a/versions.data/program-screen.png b/versions.data/program-screen.png index d6224c8f..b08750bc 100644 Binary files a/versions.data/program-screen.png and b/versions.data/program-screen.png differ diff --git a/versions.data/up_to_10.bat b/versions.data/up_to_10.bat index b63bcffa..de5c951d 100644 --- a/versions.data/up_to_10.bat +++ b/versions.data/up_to_10.bat @@ -10,7 +10,7 @@ echo ! echo. timeout 3 -start https://nhlocal.github.io/Singles-Sorter/site/download.html +start https://nhlocal.github.io/Singles-Sorter/site/download?utm_source=singles_sorter_program&utm_medium=desktop del %0% diff --git "a/versions.data/\327\224\327\227\327\234\327\244\327\224 \327\220\327\225\327\230\327\225\327\236\327\230\327\231\327\252.bat" "b/versions.data/\327\224\327\227\327\234\327\244\327\224 \327\220\327\225\327\230\327\225\327\236\327\230\327\231\327\252.bat" index 1eac3c0f..5a77a623 100644 --- "a/versions.data/\327\224\327\227\327\234\327\244\327\224 \327\220\327\225\327\230\327\225\327\236\327\230\327\231\327\252.bat" +++ "b/versions.data/\327\224\327\227\327\234\327\244\327\224 \327\220\327\225\327\230\327\225\327\236\327\230\327\231\327\252.bat" @@ -1,5 +1,5 @@ md "folder" -set old=12.0 -set new=12.8 +set old=12.8 +set new=13.0 copy "%old%+version" "%new%+version" for %%i in (*ver*) do (powershell -Command "(gc %%i) -replace '%old%', '%new%' | Out-File -encoding default folder\%%i") diff --git "a/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 12.8 - \327\224\327\252\327\247\327\240\327\224.exe" "b/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 12.8 - \327\224\327\252\327\247\327\240\327\224.exe" deleted file mode 100644 index 15f105a1..00000000 Binary files "a/\327\236\327\241\327\223\327\250 \327\224\327\241\327\231\327\240\327\222\327\234\327\231\327\235 12.8 - \327\224\327\252\327\247\327\240\327\224.exe" and /dev/null differ