module Musicapp::Script

Constants

DEFAULT_PROPERTIES
FILE_TRACK_PROPERTIES
FULL_PROPERTIES
ITEM_PROPERTIES
READONLY_PROPERTIES
TRACK_PROPERTIES
WRITABLE_PROPERTIES

Public Instance Methods

get_metadata(properties) click to toggle source
# File lib/musicapp/script.rb, line 122
    def get_metadata(properties)
      properties = case properties
      when :all
        FULL_PROPERTIES
      when :default
        DEFAULT_PROPERTIES
      else
        invalid = properties - FULL_PROPERTIES
        unless invalid.empty?
          raise ::Musicapp::Error, "Unknown properties: #{invalid.inspect}"
        end

        properties
      end

      script = <<~JS
        function run(argv) {
          var itunes = Application("Music");
          var selection = itunes.browserWindows[0].selection();
          var trackProperties = JSON.parse(argv[0]);
          var tracks = [];

          for (var i in selection) {
            var props = {};
            var track = selection[i];

            for (var j in trackProperties) {
              var prop = trackProperties[j];
              switch(prop) {
                case "location":
                  if (track.class() != "fileTrack") continue;
                  props.location = track.location().toString();
                  break;
                default:
                  props[prop] = track[prop]();
              }
            }

            tracks.push(props);
          }

          return JSON.stringify(tracks);
        }
      JS

      out, _err, _status = osascript(script, properties.to_json)
      JSON.parse(out)
    end
next_track() click to toggle source
# File lib/musicapp/script.rb, line 227
    def next_track
      script = <<~JS
        function run(argv) {
          var itunes = Application("Music");
          itunes.nextTrack();
        }
      JS

      out, _err, _status = osascript(script)
      out
    end
osascript(script, *args) click to toggle source
# File lib/musicapp/script.rb, line 113
def osascript(script, *args)
  out, err, status = Open3.capture3("osascript", "-l", "JavaScript", "-e", script, *args)
  unless status.success?
    raise ScriptError, err
  end

  [out, err, status]
end
pause() click to toggle source
# File lib/musicapp/script.rb, line 215
    def pause
      script = <<~JS
        function run(argv) {
          var itunes = Application("Music");
          itunes.pause();
        }
      JS

      out, _err, _status = osascript(script)
      out
    end
play() click to toggle source
# File lib/musicapp/script.rb, line 203
    def play
      script = <<~JS
        function run(argv) {
          var itunes = Application("Music");
          itunes.play();
        }
      JS

      out, _err, _status = osascript(script)
      out
    end
set_metadata(metadata) click to toggle source
# File lib/musicapp/script.rb, line 171
    def set_metadata(metadata)
      script = <<~JS
        function run(argv) {
          var itunes = Application("Music");
          var selection = itunes.browserWindows[0].selection();
          var metadata = JSON.parse(argv[0]);
          var track = null;

          for (var i in selection) {
            track = metadata[i]
            if (!track) continue;

            for (var j in track) {
              var prop = track[j];
              selection[i][j] = prop;
            }
          }
        }
      JS

      invalid = metadata.flat_map do |track|
        track.keys - WRITABLE_PROPERTIES
      end

      unless invalid.empty?
        raise ::Musicapp::Error, "Unknown or readonly properties: #{invalid.inspect}"
      end

      out, _err, _status = osascript(script, metadata.to_json)
      out
    end