ipodsync 0.1.8__tar.gz → 0.1.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. {ipodsync-0.1.8 → ipodsync-0.1.9}/PKG-INFO +3 -2
  2. {ipodsync-0.1.8 → ipodsync-0.1.9}/README.md +2 -1
  3. {ipodsync-0.1.8 → ipodsync-0.1.9}/pyproject.toml +1 -1
  4. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/__init__.py +1 -1
  5. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/cli.py +11 -5
  6. {ipodsync-0.1.8 → ipodsync-0.1.9}/.github/workflows/ci.yml +0 -0
  7. {ipodsync-0.1.8 → ipodsync-0.1.9}/.github/workflows/publish.yml +0 -0
  8. {ipodsync-0.1.8 → ipodsync-0.1.9}/.gitignore +0 -0
  9. {ipodsync-0.1.8 → ipodsync-0.1.9}/LICENSE +0 -0
  10. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/__main__.py +0 -0
  11. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/_art_templates.py +0 -0
  12. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/_hashab_gen.py +0 -0
  13. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/_hashab_gen2.py +0 -0
  14. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/_hashab_gen_rt.py +0 -0
  15. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/_hashab_py.py +0 -0
  16. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/_hashab_tables.bin +0 -0
  17. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/_hashab_tables.py +0 -0
  18. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/_lib_templates.py +0 -0
  19. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/artwork_writer.py +0 -0
  20. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/cbk.py +0 -0
  21. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/export.py +0 -0
  22. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/hashab.py +0 -0
  23. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/importer.py +0 -0
  24. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/library.py +0 -0
  25. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/models.py +0 -0
  26. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/sysinfo.py +0 -0
  27. {ipodsync-0.1.8 → ipodsync-0.1.9}/src/ipodsync/transport.py +0 -0
  28. {ipodsync-0.1.8 → ipodsync-0.1.9}/tests/data/ArtworkDB +0 -0
  29. {ipodsync-0.1.8 → ipodsync-0.1.9}/tests/data/Locations.itdb +0 -0
  30. {ipodsync-0.1.8 → ipodsync-0.1.9}/tests/data/Locations.itdb.cbk +0 -0
  31. {ipodsync-0.1.8 → ipodsync-0.1.9}/tests/data/hashab-traces.json +0 -0
  32. {ipodsync-0.1.8 → ipodsync-0.1.9}/tests/data/hashab-vectors.json +0 -0
  33. {ipodsync-0.1.8 → ipodsync-0.1.9}/tests/test_artwork_compact.py +0 -0
  34. {ipodsync-0.1.8 → ipodsync-0.1.9}/tests/test_artwork_writer.py +0 -0
  35. {ipodsync-0.1.8 → ipodsync-0.1.9}/tests/test_cbk.py +0 -0
  36. {ipodsync-0.1.8 → ipodsync-0.1.9}/tests/test_gc_orphans.py +0 -0
  37. {ipodsync-0.1.8 → ipodsync-0.1.9}/tests/test_hashab.py +0 -0
  38. {ipodsync-0.1.8 → ipodsync-0.1.9}/tests/test_hashab_port.py +0 -0
  39. {ipodsync-0.1.8 → ipodsync-0.1.9}/tools/build_gen2.py +0 -0
  40. {ipodsync-0.1.8 → ipodsync-0.1.9}/tools/gen_art_templates.py +0 -0
  41. {ipodsync-0.1.8 → ipodsync-0.1.9}/tools/gen_hashab_tables.py +0 -0
  42. {ipodsync-0.1.8 → ipodsync-0.1.9}/tools/gen_lib_templates.py +0 -0
  43. {ipodsync-0.1.8 → ipodsync-0.1.9}/tools/transpile_hashab.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ipodsync
3
- Version: 0.1.8
3
+ Version: 0.1.9
4
4
  Summary: Upload music to an iPod nano 6G/7G without iTunes: SQLite library, hashAB signing, cover art (pure-Python).
5
5
  Project-URL: Homepage, https://github.com/buldiei/ipodsync
6
6
  Project-URL: Repository, https://github.com/buldiei/ipodsync
@@ -99,7 +99,8 @@ ipodsync add -f ~/Music/album # a whole folder (recursively)
99
99
  ipodsync add "Song.mp3" --no-cover
100
100
  ipodsync export ~/Music/ipod --by-album
101
101
  ipodsync cover 123456789 --image cover.jpg
102
- ipodsync rm 123456789 --delete-file
102
+ ipodsync rm 123456789 # removes the track and its audio file
103
+ ipodsync rm 123456789 --keep-file # …but leave the audio file on the iPod
103
104
  ipodsync -b add "Song.mp3" # -b: back up the library first (off by default)
104
105
  ```
105
106
 
@@ -67,7 +67,8 @@ ipodsync add -f ~/Music/album # a whole folder (recursively)
67
67
  ipodsync add "Song.mp3" --no-cover
68
68
  ipodsync export ~/Music/ipod --by-album
69
69
  ipodsync cover 123456789 --image cover.jpg
70
- ipodsync rm 123456789 --delete-file
70
+ ipodsync rm 123456789 # removes the track and its audio file
71
+ ipodsync rm 123456789 --keep-file # …but leave the audio file on the iPod
71
72
  ipodsync -b add "Song.mp3" # -b: back up the library first (off by default)
72
73
  ```
73
74
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ipodsync"
7
- version = "0.1.8"
7
+ version = "0.1.9"
8
8
  description = "Upload music to an iPod nano 6G/7G without iTunes: SQLite library, hashAB signing, cover art (pure-Python)."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -13,7 +13,7 @@ from .library import ItlpLibrary
13
13
  from .models import Track
14
14
  from .transport import IPod, IPodNotFound, find_ipod
15
15
 
16
- __version__ = "0.1.8"
16
+ __version__ = "0.1.9"
17
17
 
18
18
  __all__ = [
19
19
  "find_ipod",
@@ -4,7 +4,7 @@
4
4
  ipodsync export DEST [--by-album] [--no-tag] # download everything from the iPod
5
5
  ipodsync export DEST --pid PID # download a single track
6
6
  ipodsync add FILE [--no-cover] # upload a track (+cover auto)
7
- ipodsync rm PID [--delete-file] # remove a track (+resign)
7
+ ipodsync rm PID [--keep-file] # remove a track + its file (+resign)
8
8
  ipodsync cover PID [--image IMG] # attach a cover to a track
9
9
 
10
10
  Export is read-only. add/rm/cover write to the database; pass -b to back the library
@@ -79,9 +79,12 @@ def cmd_rm(ipod, args):
79
79
  if args.backup:
80
80
  _backup_artwork(ipod, stamp)
81
81
 
82
+ if args.delete_file: # deprecated: deleting the file is the default now
83
+ print(" note: --delete-file is now the default; drop it, or use --keep-file to keep the file.")
84
+
82
85
  guid = read_firewire_guid(ipod.sysinfo_extended, ipod.sysinfo, mount=ipod.root)
83
86
  lib = ItlpLibrary(itlp)
84
- music = ipod.music_dir if args.delete_file else None
87
+ music = None if args.keep_file else ipod.music_dir # delete the file unless --keep-file
85
88
  lib.remove_track(args.pid, music_dir=music)
86
89
  lib.resign(guid)
87
90
  live = {t["pid"] for t in lib.list_tracks()} # remaining tracks, after removal
@@ -90,8 +93,8 @@ def cmd_rm(ipod, args):
90
93
  # drop the removed track's thumbnails from ArtworkDB + repack the .ithmb files
91
94
  stats = compact(ipod.control / "Artwork", live)
92
95
 
93
- print(f" Removed track pid {args.pid}"
94
- f"{' (+ deleted the file)' if args.delete_file else ''}. Eject the iPod.")
96
+ tail = " (kept the audio file)" if args.keep_file else " (+ deleted the file)"
97
+ print(f" Removed track pid {args.pid}{tail}. Eject the iPod.")
95
98
  if stats["removed"]:
96
99
  print(f" Reclaimed cover art for {stats['removed']} track"
97
100
  f"{'s' if stats['removed'] != 1 else ''}.")
@@ -335,7 +338,10 @@ def main() -> int:
335
338
 
336
339
  pr = sub.add_parser("rm", help="remove a track from the iPod")
337
340
  pr.add_argument("pid", type=int, help="track pid (see `list`)")
338
- pr.add_argument("--delete-file", action="store_true", help="also delete the audio file")
341
+ pr.add_argument("--keep-file", action="store_true",
342
+ help="keep the audio file on the iPod (default: delete it too)")
343
+ pr.add_argument("--delete-file", action="store_true",
344
+ help=argparse.SUPPRESS) # deprecated: deletion is the default now
339
345
 
340
346
  pa = sub.add_parser("add", help="upload a track (or a whole folder); cover attached automatically")
341
347
  pa.add_argument("file", nargs="*", help="path(s) to the audio file(s) to upload")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes