diff --git a/app/services/print/octoprint_service.rb b/app/services/print/octoprint_service.rb new file mode 100644 index 000000000..a0d78a1a4 --- /dev/null +++ b/app/services/print/octoprint_service.rb @@ -0,0 +1,59 @@ +require "faraday" +require "faraday/multipart" + +class Print::OctoprintService + # i18n-tasks-use t("print_hosts.protocols.octoprint") + PROTOCOL = "octoprint".freeze + + INPUT_TYPES = [Mime[:gcode]].freeze + + def initialize(print_host:) + @print_host = print_host + end + + def ok? + response = connection.get(info_uri, {}, headers) + response.success? + rescue => ex + Rails.logger.warn(ex.message) + false + end + + def upload(file:, start_print: true) + raise ArgumentError unless file.mime_type.to_sym == :gcode + connection.post(upload_uri, payload(file: file, start_print: start_print), headers) + end + + private + + def connection + Faraday.new do + it.request :multipart + end + end + + def payload(file:, start_print: true) + { + print: start_print ? "true" : "false", + file: Faraday::Multipart::FilePart.new( + file.attachment.open, + file.mime_type.to_s, + file.filename + ) + } + end + + def info_uri + "#{@print_host.endpoint}/api/server" + end + + def upload_uri + "#{@print_host.endpoint}/api/files/local" + end + + def headers + { + "X-Api-Key" => @print_host.credentials + }.compact_blank + end +end diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 45712dcd7..0da389c49 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -1001,6 +1001,7 @@ cs: sent: protocols: moonraker: + octoprint: update: success: renderer: diff --git a/config/locales/de.yml b/config/locales/de.yml index 22a85d015..fd70d10e4 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1005,6 +1005,7 @@ de: sent: protocols: moonraker: + octoprint: update: success: renderer: diff --git a/config/locales/en.yml b/config/locales/en.yml index 3cb3a9e5f..f0021334b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1001,6 +1001,7 @@ en: sent: File sent to printer protocols: moonraker: Moonraker / Klipper + octoprint: Octoprint update: success: Printer created successfully renderer: diff --git a/config/locales/es.yml b/config/locales/es.yml index 5fa45e9e3..88ce5281b 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1001,6 +1001,7 @@ es: sent: protocols: moonraker: + octoprint: update: success: renderer: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index a7b4299e4..84a7781dc 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1003,6 +1003,7 @@ fr: sent: protocols: moonraker: + octoprint: update: success: renderer: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index b3b9c9822..97822b600 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1001,6 +1001,7 @@ ja: sent: protocols: moonraker: + octoprint: update: success: renderer: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 43c1691a5..8f3c5e13b 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1001,6 +1001,7 @@ nl: sent: protocols: moonraker: + octoprint: update: success: renderer: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index e7896c830..7bda1cc86 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1001,6 +1001,7 @@ pl: sent: protocols: moonraker: + octoprint: update: success: renderer: diff --git a/config/locales/pt.yml b/config/locales/pt.yml index f8f187f51..57d11412b 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -1001,6 +1001,7 @@ pt: sent: protocols: moonraker: + octoprint: update: success: renderer: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index e6168c3f7..89fefa357 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1001,6 +1001,7 @@ ru: sent: protocols: moonraker: + octoprint: update: success: renderer: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index dd08e9ff7..63c5b76fa 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1001,6 +1001,7 @@ zh-CN: sent: protocols: moonraker: + octoprint: update: success: renderer: