Any interest in a macOS version?

Hi there, I’m not actually a real user of RPD yet, but I’m trying to decide whether to do my photo management on Linux or on macOS (I use macOS for 99% of my daily work). I do my RAW development with Darktable.

I was kind of bored today and started looking into getting RPD to run on macOS. After a few hours I can gladly say that I now have it running on macOS Mojave, with lots of dependencies installed through Homebrew (https://brew.sh/). Functionality that requires UDisks2 and GUdev libraries is not supported as those have not been ported to macOS yet.

I have not tested with camera support yet, but local operations seem to work well, including all the thumbnail creation, timeline, caching etc. See log below.

So two questions:

  1. Is anyone interested in running RPD on macOS?
  2. Would @damonlynch accept patches to support macOS? (Current diff is about 800 lines and fairly trivial)

Thanks!


Logfile:
2020-01-05 23:21:53 INFO rapid.py 6250: Rapid Photo Downloader is starting
2020-01-05 23:21:53 INFO rapid.py 497: Rapid Photo Downloader: 0.9.17
2020-01-05 23:21:53 INFO rapid.py 497: Platform: Darwin-18.7.0-x86_64-i386-64bit
2020-01-05 23:21:53 INFO rapid.py 497: Memory: 9.55 GB used of 17.18 GB
2020-01-05 23:21:53 INFO rapid.py 497: Python: 3.7.6
2020-01-05 23:21:53 INFO rapid.py 497: Python executable: /usr/local/opt/python/bin/python3.7
2020-01-05 23:21:53 INFO rapid.py 497: Qt: 5.14.0
2020-01-05 23:21:53 INFO rapid.py 497: PyQt: 5.14.0
2020-01-05 23:21:53 INFO rapid.py 497: SIP: 4.19.20
2020-01-05 23:21:53 INFO rapid.py 497: ZeroMQ: 4.3.2
2020-01-05 23:21:53 INFO rapid.py 497: Python ZeroMQ: 18.1.1 (cython backend)
2020-01-05 23:21:53 INFO rapid.py 497: gPhoto2: 2.5.23
2020-01-05 23:21:53 INFO rapid.py 497: Python gPhoto2: 2.0.0
2020-01-05 23:21:53 INFO rapid.py 497: ExifTool: 11.80
2020-01-05 23:21:53 INFO rapid.py 497: pymediainfo: 4.1
2020-01-05 23:21:53 INFO rapid.py 497: GExiv2: 0.12.0
2020-01-05 23:21:53 INFO rapid.py 497: Gstreamer: 1.16.2
2020-01-05 23:21:53 INFO rapid.py 497: PyGObject: 3.34.0
2020-01-05 23:21:53 INFO rapid.py 497: libraw: 0.18.12-Release
2020-01-05 23:21:53 INFO rapid.py 497: rawkit: 0.6.0
2020-01-05 23:21:53 INFO rapid.py 497: psutil: 5.6.7
2020-01-05 23:21:53 INFO rapid.py 497: Exiv2: 0.27.2
2020-01-05 23:21:53 INFO rapid.py 497: Arrow: 0.15.5
2020-01-05 23:21:53 INFO rapid.py 497: Tornado: 6.0.3
2020-01-05 23:21:53 DEBUG rapid.py 1302: Avaiable screen geometry: 1280x777 on 1280x800 display
2020-01-05 23:21:54 INFO rapid.py 547: Device autodetection: True
2020-01-05 23:21:54 INFO rapid.py 555: For automatically detected devices, only the contents the following folders will be scanned: DCIM, PRIVATE, MP_ROOT
2020-01-05 23:21:54 INFO rapid.py 568: This Computer is set to be used as a download source, using: /Users//Movies/
2020-01-05 23:21:54 INFO rapid.py 580: Photo download location: /Users//Pictures
2020-01-05 23:21:54 INFO rapid.py 583: Video download location: /Users//Movies
2020-01-05 23:21:54 INFO rapid.py 588: Backing up files: False
2020-01-05 23:21:54 DEBUG rapid.py 636: Starting main ExifTool process
2020-01-05 23:21:54 DEBUG preferences.py 1008: Validating CPU core count for thumbnail generation…
2020-01-05 23:21:54 DEBUG preferences.py 1010: …2 physical cores detected
2020-01-05 23:21:54 DEBUG rapid.py 749: Starting logging subscription manager…
2020-01-05 23:21:54 DEBUG rapid.py 754: …logging subscription manager started
2020-01-05 23:21:54 DEBUG rapid.py 759: Stage 2 initialization
2020-01-05 23:21:54 DEBUG rapid.py 791: Starting thumbnail daemon model
2020-01-05 23:21:54 DEBUG interprocess.py 295: Running sink for Thumbnail Daemon Manager
2020-01-05 23:21:54 DEBUG rapid.py 804: Stage 3 initialization
2020-01-05 23:21:54 DEBUG rapid.py 809: …thumbnail daemon model started
2020-01-05 23:21:54 DEBUG interprocess.py 738: Starting worker for Thumbnail Daemon Manager
2020-01-05 23:21:54 DEBUG interprocess.py 194: Started ‘/usr/local/opt/python/bin/python3.7 /Users//Library/Python/3.7/lib/python/site-packages/raphodo/thumbnaildaemon.py --receive 64898 --send 64897 --logging 64896’ with pid 49099
2020-01-05 23:21:54 DEBUG thumbnailer.py 198: Starting thumbnail model…
2020-01-05 23:21:54 DEBUG thumbnaildisplay.py 169: Setting arrow locale to en_US
2020-01-05 23:21:54 DEBUG interprocess.py 295: Running sink for Thumbnail Manager
2020-01-05 23:21:54 DEBUG thumbnailer.py 217: …thumbnail model started
2020-01-05 23:21:54 DEBUG thumbnailer.py 222: Starting thumbnail load balancer…
2020-01-05 23:21:54 DEBUG interprocess.py 194: Started ‘/usr/local/opt/python/bin/python3.7 /Users//Library/Python/3.7/lib/python/site-packages/raphodo/thumbloadbalancer.py --receive 64906 --send 64900 --controller 64905 --logging 64896’ with pid 49100
2020-01-05 23:21:55 DEBUG interprocess.py 1215: Subscribing to logging on port 64907
2020-01-05 23:21:55 DEBUG interprocess.py 1215: Subscribing to logging on port 64914
2020-01-05 23:21:55 DEBUG thumbnailer.py 235: …thumbnail load balancer started
2020-01-05 23:21:55 DEBUG rapid.py 821: Stage 4 initialization
2020-01-05 23:21:55 DEBUG interprocess.py 194: Started ‘/usr/local/opt/python/bin/python3.7 /Users//Library/Python/3.7/lib/python/site-packages/raphodo/thumbnailextractor.py --request 64913 --send 64900 --identity 0 --logging 64896’ with pid 49107
2020-01-05 23:21:55 DEBUG interprocess.py 194: Started ‘/usr/local/opt/python/bin/python3.7 /Users//Library/Python/3.7/lib/python/site-packages/raphodo/thumbnailextractor.py --request 64913 --send 64900 --identity 1 --logging 64896’ with pid 49108
2020-01-05 23:21:55 DEBUG selector_events.py 58: Using selector: KqueueSelector
2020-01-05 23:21:55 DEBUG storage.py 640: Error determining default file manager
2020-01-05 23:21:55 WARNING rapid.py 849: Default file manager could not be determined
2020-01-05 23:21:55 DEBUG rapid.py 860: Locale directory: None
2020-01-05 23:21:55 DEBUG rapid.py 863: Getting gphoto2 context
2020-01-05 23:21:55 DEBUG rapid.py 870: Probing for valid mounts
2020-01-05 23:21:55 DEBUG storage.py 351: To be recognized, partitions must be mounted under /Volumes
2020-01-05 23:21:55 DEBUG rapid.py 874: Freedesktop.org thumbnails location: /Users//.cache/thumbnails
2020-01-05 23:21:55 DEBUG rapid.py 877: Probing desktop environment
2020-01-05 23:21:55 DEBUG rapid.py 882: Desktop environment variable not set
2020-01-05 23:21:55 DEBUG rapid.py 1966: Checking path validity
2020-01-05 23:21:55 DEBUG storage.py 912: Updating watched paths
2020-01-05 23:21:55 DEBUG storage.py 926: Adding to watched paths: /Users/
2020-01-05 23:21:55 DEBUG rapid.py 918: Laying out main window
2020-01-05 23:21:55 DEBUG renamepanel.py 148: Setting photo combobox chosen value to Original Filename
2020-01-05 23:21:55 DEBUG renamepanel.py 238: Updating example photo name in rename panel
2020-01-05 23:21:55 DEBUG renamepanel.py 148: Setting video combobox chosen value to Original Filename
2020-01-05 23:21:55 DEBUG renamepanel.py 241: Updating example video name in rename panel
2020-01-05 23:21:55 DEBUG jobcodepanel.py 312: Inserting 2 job codes into job code widget
2020-01-05 23:21:55 DEBUG storage.py 351: To be recognized, partitions must be mounted under /Volumes
2020-01-05 23:21:55 DEBUG foldercombo.py 74: Rebuilding photo combobox entries…
2020-01-05 23:21:55 DEBUG foldercombo.py 158: …7 combobox entries added
2020-01-05 23:21:55 INFO foldercombo.py 211: photo path /Users/ is a default value or path to an external volume
2020-01-05 23:21:55 DEBUG foldercombo.py 74: Rebuilding video combobox entries…
2020-01-05 23:21:55 DEBUG foldercombo.py 158: …7 combobox entries added
2020-01-05 23:21:55 INFO foldercombo.py 211: video path /Users/ is a default value or path to an external volume
2020-01-05 23:21:55 DEBUG rapid.py 922: Have GIO module: True
2020-01-05 23:21:55 DEBUG rapid.py 925: GVFS (GIO) controls mounts: False
2020-01-05 23:21:55 DEBUG rapid.py 936: Starting camera hotplug monitor…
2020-01-05 23:21:55 DEBUG rapid.py 969: Starting version check
2020-01-05 23:21:55 DEBUG rapid.py 999: Starting download tracker
2020-01-05 23:21:55 DEBUG rapid.py 1006: Setting up download update timer
2020-01-05 23:21:55 DEBUG rapid.py 1013: Starting offload manager…
2020-01-05 23:21:55 DEBUG interprocess.py 295: Running sink for Offload Manager
2020-01-05 23:21:55 DEBUG rapid.py 1027: …offload manager started
2020-01-05 23:21:55 DEBUG interprocess.py 738: Starting worker for Offload Manager
2020-01-05 23:21:55 DEBUG interprocess.py 194: Started ‘/usr/local/opt/python/bin/python3.7 /Users//Library/Python/3.7/lib/python/site-packages/raphodo/offload.py --receive 64921 --send 64920 --logging 64896’ with pid 49110
2020-01-05 23:21:55 DEBUG rapid.py 1052: Starting rename manager…
2020-01-05 23:21:55 DEBUG interprocess.py 295: Running sink for Rename and Move File Manager
2020-01-05 23:21:55 DEBUG rapid.py 1057: …rename manager started
2020-01-05 23:21:55 DEBUG rapid.py 1078: Starting scan manager…
2020-01-05 23:21:55 DEBUG interprocess.py 738: Starting worker for Rename and Move File Manager
2020-01-05 23:21:55 DEBUG interprocess.py 295: Running sink for Scan Manager
2020-01-05 23:21:55 DEBUG interprocess.py 194: Started ‘/usr/local/opt/python/bin/python3.7 /Users//Library/Python/3.7/lib/python/site-packages/raphodo/renameandmovefile.py --receive 64924 --send 64923 --logging 64896’ with pid 49111
2020-01-05 23:21:55 DEBUG rapid.py 1083: …scan manager started
2020-01-05 23:21:55 DEBUG rapid.py 1102: Starting copy files manager…
2020-01-05 23:21:55 DEBUG interprocess.py 295: Running sink for Copy Files Manager
2020-01-05 23:21:55 DEBUG rapid.py 1107: …copy files manager started
2020-01-05 23:21:55 DEBUG rapid.py 1122: Starting backup manager …
2020-01-05 23:21:55 DEBUG interprocess.py 295: Running sink for Backup Manager
2020-01-05 23:21:55 DEBUG rapid.py 1127: …backup manager started
2020-01-05 23:21:55 DEBUG rpdsql.py 354: SELECT uid FROM files WHERE marked=? AND file_type=? [True, <FileType.photo: 1>]
2020-01-05 23:21:55 DEBUG rpdsql.py 354: SELECT uid FROM files WHERE marked=? AND file_type=? [True, <FileType.video: 2>]
2020-01-05 23:21:56 DEBUG rapid.py 1350: Window position quirk delta: PyQt5.QtCore.QPoint(0, 22)
2020-01-05 23:21:56 DEBUG interprocess.py 1215: Subscribing to logging on port 64941
2020-01-05 23:21:56 DEBUG rapid.py 5462: Using This Computer path /Users//Movies/
2020-01-05 23:21:56 DEBUG interprocess.py 1215: Subscribing to logging on port 64945
2020-01-05 23:21:56 DEBUG rapid.py 4939: Assigning scan id 0 to /Users//Movies/
2020-01-05 23:21:56 DEBUG rpdsql.py 135: INSERT OR REPLACE INTO devices (scan_id, device_name) VALUES (?,?) (0, )
2020-01-05 23:21:56 DEBUG devicedisplay.py 164: Adding /Users//Movies/ to This Computer display with scan id 0 at row 0
2020-01-05 23:21:56 DEBUG devices.py 568: Setting device state for to scanning
2020-01-05 23:21:56 DEBUG rpdsql.py 354: SELECT uid FROM files WHERE marked=? AND file_type=? [True, <FileType.photo: 1>]
2020-01-05 23:21:56 DEBUG rpdsql.py 354: SELECT uid FROM files WHERE marked=? AND file_type=? [True, <FileType.video: 2>]
2020-01-05 23:21:56 DEBUG rapid.py 1624: Setting progress bar to show scanning activity
2020-01-05 23:21:56 DEBUG interprocess.py 194: Started ‘/usr/local/opt/python/bin/python3.7 /Users//Library/Python/3.7/lib/python/site-packages/raphodo/scan.py --receive 64927 --send 64926 --controller 64929 --syncclient 64928 --filter 0 --logging 64896’ with pid 49128
2020-01-05 23:21:56 DEBUG rapid.py 1222: Completed stage 9 initializing main window
2020-01-05 23:21:56 DEBUG interprocess.py 1215: Subscribing to logging on port 64951
2020-01-05 23:21:56 DEBUG renameandmovefile.py 257: Start of day is set to 03:00
2020-01-05 23:21:56 DEBUG connectionpool.py 959: Starting new HTTPS connection (1): www.damonlynch.net:443
2020-01-05 23:21:56 DEBUG interprocess.py 1215: Subscribing to logging on port 64957
2020-01-05 23:21:57 DEBUG interprocess.py 1215: Subscribing to logging on port 64962
2020-01-05 23:21:57 DEBUG scan.py 194: Scan 0 worker started
2020-01-05 23:21:57 INFO scan.py 247: Scanning This Computer path
2020-01-05 23:21:57 DEBUG storage.py 640: Error determining default file manager
2020-01-05 23:21:57 DEBUG scan.py 1275: Distinguishing approach to timestamp time zones on
2020-01-05 23:21:57 DEBUG scan.py 1242: Examining sample /Users//Movies//GOPR0038.MP4
2020-01-05 23:21:57 DEBUG metadatavideo.py 155: Using pymediainfo datetime (2016-02-17T10:42:47+01:00), because ExifTool did not detect a time zone in /Users//Movies//GOPR0038.MP4
2020-01-05 23:21:57 INFO scan.py 1353: Device timezone setting for is unknown, because the file modification time and file’s time as recorded in metadata differ for sample file video
2020-01-05 23:21:57 INFO scan.py 907: Successfully extracted sample video metadata from
2020-01-05 23:21:57 DEBUG scan.py 885: Sending 15 scanned files from to sink
2020-01-05 23:21:57 INFO scan.py 405: 43 total files scanned on
2020-01-05 23:21:57 INFO rapid.py 4290: Updating example file name using sample video from
2020-01-05 23:21:57 DEBUG interprocess.py 1224: Unsubscribing to logging on port 64962
2020-01-05 23:21:57 DEBUG interprocess.py 338: Scan Manager currently has no workers
2020-01-05 23:21:58 DEBUG renamepanel.py 241: Updating example video name in rename panel
2020-01-05 23:21:58 DEBUG rapid.py 4536: No files are marked for download for
2020-01-05 23:21:58 DEBUG rpdsql.py 150: Adding 15 rows to db
2020-01-05 23:21:58 DEBUG rpdsql.py 288: SELECT uid, marked FROM files ORDER BY mtime ASC
2020-01-05 23:21:58 DEBUG rpdsql.py 354: SELECT uid FROM files WHERE marked=? AND file_type=? [True, <FileType.photo: 1>]
2020-01-05 23:21:58 DEBUG rpdsql.py 354: SELECT uid FROM files WHERE marked=? AND file_type=? [True, <FileType.video: 2>]
2020-01-05 23:21:58 DEBUG devices.py 568: Setting device state for to idle
2020-01-05 23:21:58 DEBUG rapid.py 1627: Resetting progress bar
2020-01-05 23:21:58 DEBUG devicedisplay.py 348: Setting checkbox to checked
2020-01-05 23:21:58 DEBUG devicedisplay.py 329: – Device Model for This Computer –
2020-01-05 23:21:58 DEBUG devicedisplay.py 331: Known devices:
2020-01-05 23:21:58 DEBUG devicedisplay.py 336: Row 0:
2020-01-05 23:21:58 DEBUG devicedisplay.py 336: Row 1:
2020-01-05 23:21:58 DEBUG devicedisplay.py 339: Spinner states: : scanning
2020-01-05 23:21:58 DEBUG devicedisplay.py 341: : checked
2020-01-05 23:21:58 DEBUG rpdsql.py 354: SELECT uid FROM files WHERE marked=? AND file_type=? [True, <FileType.photo: 1>]
2020-01-05 23:21:58 DEBUG rpdsql.py 354: SELECT uid FROM files WHERE marked=? AND file_type=? [True, <FileType.video: 2>]
2020-01-05 23:21:58 DEBUG devices.py 510: – Device Collection –
2020-01-05 23:21:58 DEBUG devices.py 514: 1 devices: 0 volumes/cameras (0 cameras), 1 this computer
2020-01-05 23:21:58 DEBUG devices.py 518: Device states: : idle
2020-01-05 23:21:58 DEBUG devices.py 523: No devices scanning
2020-01-05 23:21:58 DEBUG devices.py 530: No devices downloading
2020-01-05 23:21:58 DEBUG devices.py 537: No devices thumbnailing
2020-01-05 23:21:58 DEBUG thumbnaildisplay.py 240: – Thumbnail Model –
2020-01-05 23:21:58 DEBUG thumbnaildisplay.py 250: 15 thumbnails (15 marked)
2020-01-05 23:21:58 DEBUG thumbnaildisplay.py 255: 15 not downloaded; 0 downloaded; 0 previously downloaded
2020-01-05 23:21:58 DEBUG thumbnaildisplay.py 259: 15 to be generated; 0 generated
2020-01-05 23:21:58 DEBUG thumbnaildisplay.py 269: Active devices:
2020-01-05 23:21:58 DEBUG devicedisplay.py 329: – Device Model for This Computer –
2020-01-05 23:21:58 DEBUG devicedisplay.py 331: Known devices:
2020-01-05 23:21:58 DEBUG devicedisplay.py 336: Row 0:
2020-01-05 23:21:58 DEBUG devicedisplay.py 336: Row 1:
2020-01-05 23:21:58 DEBUG devicedisplay.py 339: Spinner states: : scanning
2020-01-05 23:21:58 DEBUG devicedisplay.py 341: : checked
2020-01-05 23:21:58 INFO rapid.py 4569: Generating Timeline because a download source has finished being scanned
2020-01-05 23:21:58 DEBUG proximity.py 1989: Updating Timeline state from empty to generating
2020-01-05 23:21:58 DEBUG devices.py 568: Setting device state for to thumbnailing
2020-01-05 23:21:58 DEBUG rapid.py 1618: Setting progress bar maximum to 15
2020-01-05 23:21:58 DEBUG rpdsql.py 484: SELECT uid FROM files WHERE scan_id=? (0, )
2020-01-05 23:21:58 DEBUG connectionpool.py 437: https://www.damonlynch.net:443 “GET /rapid/version.json HTTP/1.1” 200 778
2020-01-05 23:21:58 DEBUG interprocess.py 194: Started ‘/usr/local/opt/python/bin/python3.7 /Users//Library/Python/3.7/lib/python/site-packages/raphodo/thumbnailpara.py --receive 64901 --send 64900 --controller 64903 --syncclient 64902 --filter 0 --logging 64896’ with pid 49137
2020-01-05 23:21:58 DEBUG newversion.py 107: Installed using pip: True
2020-01-05 23:21:58 DEBUG rapid.py 322: Provisional download folders received
2020-01-05 23:21:58 DEBUG rapid.py 329: Provisional download folders change detected
2020-01-05 23:21:58 DEBUG rapid.py 364: Updating file system model and views
2020-01-05 23:21:58 INFO proximity.py 954: Timeline validation passed
2020-01-05 23:21:58 DEBUG proximity.py 1989: Updating Timeline state from generating to generated
2020-01-05 23:21:58 DEBUG rpdsql.py 478: UPDATE files SET proximity_col1=?, proximity_col2=? WHERE uid=? (15 operations)
2020-01-05 23:21:58 DEBUG interprocess.py 1215: Subscribing to logging on port 64969
2020-01-05 23:21:58 INFO thumbnailpara.py 458: Generating 15 thumbnails for /Users//Movies/
2020-01-05 23:21:58 DEBUG thumbnailpara.py 783: Finished phase 1 of thumbnail generation for /Users//Movies/
2020-01-05 23:21:58 DEBUG interprocess.py 1224: Unsubscribing to logging on port 64969
2020-01-05 23:21:58 DEBUG interprocess.py 338: Thumbnail Manager currently has no workers
2020-01-05 23:21:58 DEBUG thumbnaildisplay.py 746: Thumbnail was null: GP010049.MP4
2020-01-05 23:21:58 DEBUG thumbnaildisplay.py 746: Thumbnail was null: GP010044.MP4
2020-01-05 23:21:58 DEBUG thumbnaildisplay.py 746: Thumbnail was null: GOPR0050.MP4
2020-01-05 23:21:58 DEBUG devices.py 568: Setting device state for to idle
2020-01-05 23:21:58 INFO thumbnaildisplay.py 756: Finished thumbnail generation for /Users//Movies/
2020-01-05 23:21:58 DEBUG rapid.py 1627: Resetting progress bar
2020-01-05 23:21:58 DEBUG thumbnaildisplay.py 240: – Thumbnail Model –
2020-01-05 23:21:58 DEBUG thumbnaildisplay.py 250: 15 thumbnails (15 marked)
2020-01-05 23:21:58 DEBUG thumbnaildisplay.py 255: 15 not downloaded; 0 downloaded; 0 previously downloaded
2020-01-05 23:21:58 DEBUG thumbnaildisplay.py 269: Active devices:
2020-01-05 23:22:02 DEBUG rapid.py 4589: Close event activated
2020-01-05 23:22:02 DEBUG interprocess.py 775: Scan Manager halting
2020-01-05 23:22:02 DEBUG interprocess.py 775: Thumbnail Manager halting
2020-01-05 23:22:02 DEBUG interprocess.py 324: Thumbnail Manager is terminating
2020-01-05 23:22:02 DEBUG interprocess.py 324: Scan Manager is terminating
2020-01-05 23:22:02 DEBUG interprocess.py 513: Thumbnail load balancer sending stop cmd to worker Thumbnail-Extractor-0
2020-01-05 23:22:02 DEBUG interprocess.py 513: Thumbnail load balancer sending stop cmd to worker Thumbnail-Extractor-1
2020-01-05 23:22:02 DEBUG interprocess.py 775: Copy Files Manager halting
2020-01-05 23:22:02 DEBUG rapid.py 1306: Writing window settings
2020-01-05 23:22:02 DEBUG rapid.py 4622: Cleaning up provisional download folders
2020-01-05 23:22:02 DEBUG thumbnailextractor.py 811: Terminating thumbnail extractor ExifTool process for Thumbnail-Extractor-0
2020-01-05 23:22:02 DEBUG thumbnailextractor.py 811: Terminating thumbnail extractor ExifTool process for Thumbnail-Extractor-1
2020-01-05 23:22:02 DEBUG rapid.py 4628: Terminating main ExifTool process
2020-01-05 23:22:02 DEBUG interprocess.py 324: Copy Files Manager is terminating
2020-01-05 23:22:02 DEBUG interprocess.py 1224: Unsubscribing to logging on port 64945
2020-01-05 23:22:02 DEBUG interprocess.py 1224: Unsubscribing to logging on port 64941
2020-01-05 23:22:02 DEBUG interprocess.py 545: Waiting on running process 49107…
2020-01-05 23:22:02 DEBUG interprocess.py 707: Offload Manager halting
2020-01-05 23:22:02 DEBUG interprocess.py 330: Offload Manager worker 0 has stopped
2020-01-05 23:22:02 DEBUG interprocess.py 338: Offload Manager currently has no workers
2020-01-05 23:22:02 DEBUG interprocess.py 340: Offload Manager is exiting
2020-01-05 23:22:02 DEBUG interprocess.py 707: Rename and Move File Manager halting
2020-01-05 23:22:02 DEBUG interprocess.py 330: Rename and Move File Manager worker 0 has stopped
2020-01-05 23:22:02 DEBUG interprocess.py 338: Rename and Move File Manager currently has no workers
2020-01-05 23:22:02 DEBUG interprocess.py 340: Rename and Move File Manager is exiting
2020-01-05 23:22:02 DEBUG interprocess.py 775: Backup Manager halting
2020-01-05 23:22:02 DEBUG interprocess.py 324: Backup Manager is terminating
2020-01-05 23:22:02 DEBUG interprocess.py 707: Thumbnail Daemon Manager halting
2020-01-05 23:22:02 DEBUG interprocess.py 330: Thumbnail Daemon Manager worker 0 has stopped
2020-01-05 23:22:02 DEBUG interprocess.py 338: Thumbnail Daemon Manager currently has no workers
2020-01-05 23:22:02 DEBUG interprocess.py 340: Thumbnail Daemon Manager is exiting
2020-01-05 23:22:02 DEBUG rapid.py 4684: Cleaning any device cache dirs and sample video
2020-01-05 23:22:02 DEBUG rapid.py 4687: Cleaning up Thumbnail cache
2020-01-05 23:22:02 DEBUG rapid.py 4694: Accepting close event
2020-01-05 23:22:02 DEBUG rapid.py 6483: Exiting

1 Like

As an aside, RPD is in nixpkg, and nixpkg runs on macOS… Not sure if RPD would work, but perhaps worth a try.

Haven’t tried that as I don’t use nixpkg, but I highly doubt that RPD would work that way.

People do want to run it on macOS because they write to me asking if I want to port it. I tell them I do not own a Mac and I don’t have time right now to do the port. The prospect of supporting Mac users is also daunting because there are so many of them compared to Linux photographers!

For sure if there is to be a port it absolutely must work flawlessly with cameras & phones. Or else people will angrily rate the application 1 star because it doesn’t download from their camera (or more likely, their phone). I’m not impressed by that, but that’s a topic for another time (if at all).

As for the code, if you want to continue your work to port it, please do. But it will take me time to review the code and right now due to serious academic commitments I do not have that time. At all. So patience is a requirement.

Thanks in advance for your understanding.

1 Like

Damon, your points make a lot of sense to me. First of all, I don’t know if I can make the commitment to release and maintain an application that will potentially get a large new user base on a platform you, as the main author, do not use. I really don’t have any experience maintaining public software, but I know many people who do, and they tell me it’s not exactly a walk in the park. The last thing I want is for RPD to be badly reviewed in the future because of my potential lack of commitment.

I have already noticed that it is not trivial to test all functionality properly, e.g. I own two digital cameras, both of which are not well supported by libgphoto2 (same on Linux), even though they are quite common and not brand new (Lumix DMC-FZ1000 and Sony Alpha a6500).

All that said, I will probably continue hacking on RPD on the mac while I figure out if I prefer macOS, Linux or Windows for my photo management. That doesn’t just depend on RPD, but mostly on my experience with Darktable, Gimp and other tools as RPD is only a small part of the workflow. If I have anything further worth sharing, I will reach out again.

In the meantime, good luck with your academic commitments!

1 Like

Hi,

It seems that RPD is the solution for what I am seeking in a photo ingestion Software but I would need it on macOS.
I just wanted to start and try to port just for myself, but maybe you @frumble could share your existing code for macOS with me?

Greetinx, Udo

1 Like

What about a Windows version? I am (mostly) not a Windows user but I just discovered the program and I think it’s ingenious.

I had a bit of a look into making RPD work on OSX, and ran into some difficulties at that point with the way OSX handles devices. In the end I decided it wasn’t worth it, and just used some scripts inspired by Keifer Hunniford to bring the raw files off my SD card into my work area. Now that I’ve moved my editing mostly to linux, I might take another look at RPD, or maybe I’ll just continue with my current workflow, which is very simple but it works.

I have no idea how macOS enumerates devices and handles things like hotplugging, but I assume that it’s not the same as the Linux kernel. Under Gnome this is abstracted by GIO, which has Python bindings. Under KDE, it’s a different story. There are no KDE bindings for Python so the Python application developer is on their own.

So the main question is: are there nice Python bindings for hotplugging and device enumeration under macOS?

I imagine you would need to use the IOKit framework from macOS:
https://developer.apple.com/library/archive/documentation/DeviceDrivers/Conceptual/IOKitFundamentals/Introduction/Introduction.html

You should be able to access this framework using PyObjC:
https://pyobjc.readthedocs.io/en/latest/

Seems like a job for someone interested in Mac development…

At first glance that’s really low level. Something higher level than that is needed.

I think an important comment was made at the bottom of the IOKit page:

POSIX Device Files
BSD, a central component of the OS X kernel environment, exports a number of programmatic interfaces that are consistent with the POSIX standard. These interfaces enable communication with serial, storage, and network devices through device files. In any UNIX-based system such as BSD, a device file is a special file located in /dev that represents a block or character device such as a terminal, disk drive, or printer. If you know the name of a device file (for example, disk0s2 or mt0 ) your application can use POSIX functions such as open , read , write , and close to access and control the associated device.

The I/O Kit dynamically creates the device files in /dev as it discovers devices. Consequently, the set of device files is constantly changing; different devices might be attached to the device files in /dev at any one time, and the same devices might have different device-file names at different times. Because of this, your application cannot hard-code device file names. For a particular device, you must obtain from the I/O Kit the path to its device file through a procedure involving device matching. Once you have the path, you can use POSIX APIs to access the device.

This is Gnome’s way of monitoring volumes (devices):

https://lazka.github.io/pgi-docs/#Gio-2.0/classes/VolumeMonitor.html#Gio.VolumeMonitor

This approach abstracts away from things in /dev, as it should. This is what I mean by higher level. I would be surprised of macOS does not offer something similar.

Looks similar to Apple’s DiskArbitration API:
https://developer.apple.com/library/archive/documentation/DriversKernelHardware/Conceptual/DiskArbitrationProgGuide/Introduction/Introduction.html

As you say, Apple will have equivalents for all these things, it just requires some with the knowledge and/or interest to work through it.

I’m not a developer but I’m a photographer. I’ve been using rapid photo downloader a couple of years now and it’s a necessity for me in any of my distros. Of course I’m missing it since I switched my photo editing on iPad and Mac OS for editing purposes. Now I maintain a secondary laptop for doing that thing. I might try it on a virtually machine too. Otherwise I have to transfer pictures manually which is time consuming.
I don’t know if I can help somehow porting this application to Mac or even windows but I would be glad if I did.

1 Like

Would also be glad to help building (at least testing) a MacOS version :+1:t3: