The best way is probably to create an udev rule.
I don’t think it’s a good idea to assume that all USB drives will contain playable media, so I’d advise you to choose one or two devices that you’ll use for this task. If they are all from different manufacturers, so much the better.
In directory /etc/udev/rules.d
create a file 10-usb-play.rules
and add this line:
ACTION=="add", KERNEL=="usb", SUBSYSTEM=="usb", ATTRS{idVendor}=="0951", ATTRS{idProduct}=="168e", RUN+="/home/osmc/playit.sh"
NB it must all be on one line.
You will need to change the vendor and product IDs, plus the name of the script that you want to run. The IDs here are for a Kingston 32 GB USB drive. To see the correct vendor and product ID for your drive, use the lsusb
command. (If not present, install the usbutils package using apt-get.) Example:
osmc@osmc:/etc/udev/rules.d$ lsusb
Bus 001 Device 019: ID 0951:168e Kingston Technology
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
It might also be possible to use ATTRS{serial}==“000000000000000000000” using the real serial number of the device to narrow it down to a single device, if necessary. (Though I’ve not tested it with this rule.)
BUT be aware that udev RUN should only be used for short-running jobs. If you search on google for “udev long running job” you will see ways to get around this limitation.
Edit: Forgot to add that if udev doesn’t see the changes you might need to run either sudo systemctl restart udev
or just reload the rules using:
sudo udevadm control --reload-rules
sudo udevadm trigger --action=change
Or just reboot. 