commit bb2f8dbea1df9f3b6991d49042221eccb3158bec Author: alex Date: Thu May 9 22:40:37 2024 +0200 init diff --git a/builder/Dockerfile b/builder/Dockerfile new file mode 100644 index 0000000..2c2dc0b --- /dev/null +++ b/builder/Dockerfile @@ -0,0 +1,3 @@ +FROM octoprint/octoprint + +COPY octoprint /octoprint diff --git a/builder/docker-compose.yml b/builder/docker-compose.yml new file mode 100644 index 0000000..dd8406a --- /dev/null +++ b/builder/docker-compose.yml @@ -0,0 +1,16 @@ +version: '2.4' + +services: + octoprint_server_test2: + container_name: octoprint-server-test2 + build: + context: . + dockerfile: Dockerfile + restart: unless-stopped + ports: + - 127.0.0.1:50138:80 + volumes: + - octoprint-server-test2:/octoprint + +volumes: + octoprint-server-test2: diff --git a/builder/octoprint/octoprint/config.backup b/builder/octoprint/octoprint/config.backup new file mode 100644 index 0000000..eb07d93 --- /dev/null +++ b/builder/octoprint/octoprint/config.backup @@ -0,0 +1,74 @@ +accessControl: + userfile: /octoprint/octoprint/users.yaml +api: + key: 91EEB0475E5844059C3CBC0C18E37B63 +appearance: + color: white + name: My Template +plugins: + announcements: + _config_version: 1 + channels: + _blog: + read_until: 1711358100 + _important: + read_until: 1698310200 + _octopi: + read_until: 1684929600 + _plugins: + read_until: 1714176000 + _releases: + read_until: 1713957300 + bambu_printer: + access_code: '1234' + device_type: P1P + host: 127.0.0.1 + serial: '1234' + classicwebcam: + _config_version: 1 + snapshot: http://localhost:8080/?action=snapshot + stream: /webcam/?action=stream + discovery: + upnpUuid: f208a345-7fab-4b7b-8922-a12766395145 + errortracking: + unique_id: 2074483d-5218-452c-992f-07225b0f7efd + gcodeviewer: + _config_version: 1 + softwareupdate: + _config_version: 9 + tracking: + enabled: false + unique_id: 2aa3b43d-6962-431d-a80b-818b7230d03e + virtual_printer: + _config_version: 1 +printerProfiles: + default: _default +serial: + autoconnect: true +server: + commands: + serverRestartCommand: s6-svc -r /var/run/s6/services/octoprint + firstRun: false + onlineCheck: + enabled: false + pluginBlacklist: + enabled: true + secretKey: xZHLyQYSTO24lFaEE7yHGoMKiYcJWE46 + seenWizards: + backup: null + classicwebcam: 1 + corewizard: 4 + file_check: 1 + tracking: null +temperature: + profiles: + - bed: 100 + chamber: null + extruder: 210 + name: ABS + - bed: 60 + chamber: null + extruder: 180 + name: PLA +webcam: + ffmpeg: /usr/bin/ffmpeg diff --git a/builder/octoprint/octoprint/config.yaml b/builder/octoprint/octoprint/config.yaml new file mode 100644 index 0000000..6c3ed02 --- /dev/null +++ b/builder/octoprint/octoprint/config.yaml @@ -0,0 +1,74 @@ +accessControl: + userfile: /octoprint/octoprint/users.yaml +api: + key: 91EEB0475E5844059C3CBC0C18E37B63 +appearance: + color: white + name: My A2 +plugins: + announcements: + _config_version: 1 + channels: + _blog: + read_until: 1711358100 + _important: + read_until: 1698310200 + _octopi: + read_until: 1684929600 + _plugins: + read_until: 1714176000 + _releases: + read_until: 1713957300 + bambu_printer: + access_code: '1234' + device_type: P1P + host: 127.0.0.1 + serial: '1234' + classicwebcam: + _config_version: 1 + snapshot: http://localhost:8080/?action=snapshot + stream: /webcam/?action=stream + discovery: + upnpUuid: f208a345-7fab-4b7b-8922-a12766395145 + errortracking: + unique_id: 2074483d-5218-452c-992f-07225b0f7efd + gcodeviewer: + _config_version: 1 + softwareupdate: + _config_version: 9 + tracking: + enabled: false + unique_id: 2aa3b43d-6962-431d-a80b-818b7230d03e + virtual_printer: + _config_version: 1 +printerProfiles: + default: _default +serial: + autoconnect: true +server: + commands: + serverRestartCommand: s6-svc -r /var/run/s6/services/octoprint + firstRun: false + onlineCheck: + enabled: false + pluginBlacklist: + enabled: true + secretKey: xZHLyQYSTO24lFaEE7yHGoMKiYcJWE46 + seenWizards: + backup: null + classicwebcam: 1 + corewizard: 4 + file_check: 1 + tracking: null +temperature: + profiles: + - bed: 100 + chamber: null + extruder: 210 + name: ABS + - bed: 60 + chamber: null + extruder: 180 + name: PLA +webcam: + ffmpeg: /usr/bin/ffmpeg diff --git a/builder/octoprint/octoprint/data/achievements/2024.json b/builder/octoprint/octoprint/data/achievements/2024.json new file mode 100644 index 0000000..afbdccc --- /dev/null +++ b/builder/octoprint/octoprint/data/achievements/2024.json @@ -0,0 +1,22 @@ +{ + "last_version": "1.10.0", + "seen_versions": 1, + "server_starts": 8, + "prints_started": 0, + "prints_cancelled": 0, + "prints_errored": 0, + "prints_finished": 0, + "prints_started_per_weekday": {}, + "print_duration_total": 0.0, + "print_duration_cancelled": 0.0, + "print_duration_errored": 0.0, + "print_duration_finished": 0.0, + "longest_print_duration": 0.0, + "longest_print_date": 0, + "files_uploaded": 0, + "files_deleted": 0, + "plugins_installed": 0, + "plugins_uninstalled": 0, + "most_plugins": 20, + "achievements": 1 +} \ No newline at end of file diff --git a/builder/octoprint/octoprint/data/achievements/data.json b/builder/octoprint/octoprint/data/achievements/data.json new file mode 100644 index 0000000..d604fe0 --- /dev/null +++ b/builder/octoprint/octoprint/data/achievements/data.json @@ -0,0 +1,39 @@ +{ + "stats": { + "last_version": "1.10.0", + "seen_versions": 1, + "server_starts": 8, + "prints_started": 0, + "prints_cancelled": 0, + "prints_errored": 0, + "prints_finished": 0, + "prints_started_per_weekday": {}, + "print_duration_total": 0.0, + "print_duration_cancelled": 0.0, + "print_duration_errored": 0.0, + "print_duration_finished": 0.0, + "longest_print_duration": 0.0, + "longest_print_date": 0, + "files_uploaded": 0, + "files_deleted": 0, + "plugins_installed": 0, + "plugins_uninstalled": 0, + "most_plugins": 20, + "created": 1715245186, + "created_version": "1.10.0" + }, + "achievements": { + "the_wizard": 1715245188 + }, + "state": { + "date_last_print": "", + "prints_today": 0, + "date_last_cancelled_print": "", + "prints_cancelled_today": 0, + "consecutive_prints_cancelled_today": 0, + "file_last_print": "", + "consecutive_prints_of_same_file": 0, + "date_last_weekend_print": "", + "consecutive_weekend_prints": 0 + } +} \ No newline at end of file diff --git a/builder/octoprint/octoprint/data/announcements/_blog.cache b/builder/octoprint/octoprint/data/announcements/_blog.cache new file mode 100644 index 0000000..c1186f0 Binary files /dev/null and b/builder/octoprint/octoprint/data/announcements/_blog.cache differ diff --git a/builder/octoprint/octoprint/data/announcements/_important.cache b/builder/octoprint/octoprint/data/announcements/_important.cache new file mode 100644 index 0000000..12f0440 Binary files /dev/null and b/builder/octoprint/octoprint/data/announcements/_important.cache differ diff --git a/builder/octoprint/octoprint/data/announcements/_octopi.cache b/builder/octoprint/octoprint/data/announcements/_octopi.cache new file mode 100644 index 0000000..75987cc Binary files /dev/null and b/builder/octoprint/octoprint/data/announcements/_octopi.cache differ diff --git a/builder/octoprint/octoprint/data/announcements/_plugins.cache b/builder/octoprint/octoprint/data/announcements/_plugins.cache new file mode 100644 index 0000000..97b7c9e Binary files /dev/null and b/builder/octoprint/octoprint/data/announcements/_plugins.cache differ diff --git a/builder/octoprint/octoprint/data/announcements/_releases.cache b/builder/octoprint/octoprint/data/announcements/_releases.cache new file mode 100644 index 0000000..27a39bf Binary files /dev/null and b/builder/octoprint/octoprint/data/announcements/_releases.cache differ diff --git a/builder/octoprint/octoprint/data/file_check/last_check_info.json b/builder/octoprint/octoprint/data/file_check/last_check_info.json new file mode 100644 index 0000000..244f31f --- /dev/null +++ b/builder/octoprint/octoprint/data/file_check/last_check_info.json @@ -0,0 +1 @@ +{"version": 1, "timestamp": 1715248737} \ No newline at end of file diff --git a/builder/octoprint/octoprint/data/plugin_blacklist.yaml b/builder/octoprint/octoprint/data/plugin_blacklist.yaml new file mode 100644 index 0000000..69fb118 --- /dev/null +++ b/builder/octoprint/octoprint/data/plugin_blacklist.yaml @@ -0,0 +1,5 @@ +- roomtemp +- - GcodeEditor + - '>=0.1.1,<=0.2.8' +- - gcodeleveling + - '>=0.1.0,<=0.1.1' diff --git a/builder/octoprint/octoprint/data/pluginmanager/notices.json b/builder/octoprint/octoprint/data/pluginmanager/notices.json new file mode 100644 index 0000000..f314dcf --- /dev/null +++ b/builder/octoprint/octoprint/data/pluginmanager/notices.json @@ -0,0 +1 @@ +[{"date": "2017-05-16 10:30:00 +0000", "link": "https://github.com/OctoPrint/OctoPrint-Autoselect/releases/tag/0.2.0", "plugin": "autoselect", "text": "Version 0.2.0 of this plugin is available, but your version 0.1.0 does not yet support updating automatically. Please re-install the plugin from the repository to update. More details can be found at the \"Read more...\" link below.", "versions": ["0.1.0"]}, {"date": "2020-04-21 08:30:00 +0000", "link": "https://github.com/OllisGit/OctoPrint-DisplayLayerProgress/issues/124", "plugin": "DisplayLayerProgress", "text": "Some users are experiencing layer shifts that seem to be caused by this plugin. If this affects you, please disable it for now and follow the discussion found at the \"Read more...\" link below.", "versions": ["1.17.0", "1.18.0", "1.19.0", "1.19.1", "1.20.0"]}, {"date": "2020-05-04 13:00:00 +0000", "link": "https://github.com/tpmullan/OctoPrint-DetailedProgress/releases/tag/0.2.3", "plugin": "detailedprogress", "text": "Version 0.2.3 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please re-install the plugin from the repository to update. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.1.0", "0.1.1", "0.1.2", "0.1.3", "0.1.4"]}, {"date": "2020-05-18 14:50:00 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/466", "plugin": "octoprint_eta", "text": "This plugin seems to have been abandoned by its original author, but a new maintainer has stepped up to maintain a fork which you might want to manually install. If so, please uninstall \"OctoPrint-Display-ETA\" and then install \"OctoPrint-Display-ETA\" from the repository."}, {"date": "2020-06-15 09:45:00 +0000", "link": "https://github.com/OctoPrint/OctoPrint-CommandSplitter/releases/tag/0.2.2", "plugin": "commandsplitter", "text": "Version 0.2.2 of this plugin is available, but your version does not yet support updating automatically. Please re-install the plugin from the repository to update. More details can be found at the \"Read more...\" link below.", "versions": ["0.1.0", "0.2.0", "0.2.1"]}, {"date": "2020-09-14 08:45:00 +0000", "link": "https://github.com/OllisGit/OctoPrint-FilamentManager/releases/tag/1.6.0", "plugin": "filamentmanager", "pluginversions": ["<1.6.0"], "text": "Version 1.6.0 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please re-install the plugin from the repository to update, keeping your settings. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.1.0", "0.1.1", "0.2.0", "0.2.1", "0.2.2", "0.3.0", "0.4.0", "0.4.1", "0.5.0", "0.5.1", "0.5.2", "0.5.3"]}, {"date": "2020-09-15 04:00:00 +0000", "link": "https://github.com/AliceGrey/OctoprintKlipperPlugin/releases/tag/0.3.1", "plugin": "klipper", "pluginversions": ["<0.3.1"], "text": "Version 0.3.1 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please re-install the plugin from the repository to update, keeping your settings. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.1.5", "0.2.0", "0.2.1", "0.2.2", "0.2.3", "0.2.4", "0.2.5"]}, {"date": "2020-09-22 08:45:00 +0000", "link": "https://github.com/OllisGit/OctoPrint-CostEstimation/releases/tag/3.0.0", "plugin": "costestimation", "pluginversions": ["<3.0.0"], "text": "Version 3.0.0 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please re-install the plugin from the repository to update, keeping your settings. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.3.0", "0.4.0", "1.0.0", "1.1.0", "2.0.0", "2.0.1", "2.1.0", "2.1.1", "2.1.2", "2.1.3"]}, {"date": "2020-09-23 15:15:00 +0000", "plugin": "ender3v2tempfix", "text": "Version 0.0.4 of this plugin is available, but due to a name change the automatic update needs a bit of extra help. Please uninstall the plugin and then just reinstall it from the plugin repository.", "versions": ["0.0.1", "0.0.2", "0.0.3"]}, {"date": "2020-09-27 18:00:00 +0000", "link": "https://github.com/ssorgatem/Octoprint-Filament-Reloaded/releases/tag/1.3.0", "plugin": "filamentreload", "pluginversions": ["<1.3.0"], "text": "Version 1.3.0 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please re-install the plugin from the repository to update, keeping your settings. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["1.0.0", "1.1.0", "1.1.1", "1.2.0"]}, {"date": "2020-10-07 12:00:00 +0000", "link": "https://github.com/cp2004/OctoPrint-EEPROM-Marlin/releases/tag/2.0.0", "plugin": "eeprom_marlin", "pluginversions": ["<2.0.0"], "text": "Version 2.0.0 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.1.0", "1.0.0", "1.0.1", "1.0.2", "1.0.3", "1.0.4", "1.2", "1.2.1", "1.2.2"]}, {"date": "2020-10-19 12:00:00 +0000", "link": "https://github.com/AlexVerrico/octoprint-stats/releases/tag/3.0.0", "plugin": "stats", "pluginversions": ["<3.0.0"], "text": "Version 3.0.0 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["1.0.0", "2.0.0", "2.0.2"]}, {"date": "2020-10-31 12:00:00 +0000", "link": "https://github.com/Zinc-OS/continuousprint/releases/tag/1.0.4", "plugin": "continuousprint", "pluginversions": ["<1.0.4"], "text": "Version 1.0.4 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["1.0.0", "1.0.1", "1.0.2", "1.0.3"]}, {"date": "2020-12-02 15:00:00 +0000", "link": "https://github.com/Willmac16/OctoPrint-GcodeLeveling/issues/5", "octoversions": [">=1.5.0"], "plugin": "gcodeleveling", "pluginversions": ["<=0.1.1"], "text": "There are reports of this plugin somehow breaking extrusion on OctoPrint 1.5.0. It has since been blacklisted until the author can look into this. If it is still active on your instance, please disable it and restart to avoid this problem.", "versions": ["0.1.0", "0.1.1"]}, {"date": "2020-12-08 12:00:00 +0000", "link": "https://github.com/gdombiak/OctoPrint-M73ETAOverride/releases/tag/1.0.4", "plugin": "m73etaoverride", "pluginversions": ["<1.0.2"], "text": "Version 1.0.4 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["1.0.0", "1.0.1"]}, {"date": "2020-12-09 12:00:00 +0000", "link": "https://github.com/gruvin/OctoPrint-WebcamTab/releases/tag/0.2.0", "plugin": "webcamtab", "pluginversions": ["<0.2.0"], "text": "Version 0.2.0 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.1.0", "0.1.1", "0.1.2"]}, {"date": "2021-02-10 12:00:00 +0000", "link": "https://github.com/tkoecker/OctoPrint-Mmu2filamentselect/releases/tag/1.0.3", "plugin": "mmu2filamentselect", "pluginversions": ["<1.0.3"], "text": "Version 1.0.3 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["1.0.0", "1.0.1", "1.0.2"]}, {"date": "2021-02-27 17:00:00 +0000", "link": "https://github.com/mkevenaar/OctoPrint-Slack/releases/tag/0.2.4", "plugin": "slack", "pluginversions": ["<0.2.4"], "text": "Version 0.2.4 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.1", "0.2", "0.2.1", "0.2.2", "0.2.3"]}, {"date": "2021-08-19 22:30:00 +0000", "link": "https://www.thespaghettidetective.com/blog/2021/08/19/what-happened-last-night/", "plugin": "thespaghettidetective", "pluginversions": ["<1.7.3"], "text": "On August 19th 2021 a vulnerability was discovered with The Spaghetti Detective that allowed unauthorized access to OctoPrint instances. The issue was resolved shortly after being discovered, more information is available at the \"Read more...\" link below.", "versions": ["0.2.0", "0.2.1", "0.3.0", "0.5.0", "0.5.1", "0.5.2", "0.5.3", "0.5.4", "0.6.0", "0.6.1", "0.7.0", "0.7.1", "0.8.0", "0.8.1", "0.8.2", "0.8.3", "0.9.0", "0.9.1", "0.9.2", "0.9.3", "1.0.1", "1.0.2", "1.0.3", "1.0.4", "1.0.5", "1.0.6", "1.0.7", "1.0.8", "1.1.0", "1.1.1", "1.1.2", "1.1.3", "1.1.4", "1.1.5", "1.1.6", "1.2.0", "1.2.1", "1.2.2", "1.2.3", "1.2.4", "1.2.5", "1.3.0", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.4.0", "1.4.1", "1.4.2", "1.4.3", "1.4.4", "1.4.5", "1.4.6", "1.4.7", "1.5.0", "1.5.1", "1.5.2", "1.5.3", "1.6.0", "1.6.1", "1.6.2", "1.6.3", "1.6.4", "1.6.5", "1.6.6", "1.6.7", "1.7.0", "1.7.1", "1.7.2"]}, {"date": "2021-08-25 12:00:00 +0000", "link": "https://github.com/awenelo/OctoPrint-MetadataPreprocessor/releases/tag/0.2.1", "plugin": "metadatapreprocessor", "pluginversions": ["<0.2.1"], "text": "Version 0.2.1 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.1.0", "0.2.0"]}, {"date": "2021-10-12 16:00:00 +0000", "link": "https://github.com/vitormhenrique/OctoPrint-Enclosure/issues/435", "plugin": "enclosure", "text": "The maintainer of this plugin is looking for some help with maintaining it from the community. If this sounds like something you'd like to lend a hand in, please click on the \"Read more...\" link below."}, {"date": "2021-10-20 12:00:00 +0000", "link": "https://github.com/Andy-ch/OctoPrint-HeaterTimeout/releases/tag/0.0.4", "plugin": "HeaterTimeout", "pluginversions": ["<0.0.4"], "text": "Version 0.0.4 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.0.1", "0.0.2", "0.0.3"]}, {"date": "2022-01-27 12:00:00 +0000", "link": "https://github.com/Royrdan/Octoprint-Smart-Filament-Sensor/releases/tag/1.1.6", "plugin": "smartfilamentsensor", "pluginversions": ["<1.1.6"], "text": "Version 1.1.6 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2022-03-12 12:00:00 +0000", "link": "https://github.com/smartin015/continuousprint/releases/tag/1.4.1", "plugin": "continuousprint", "pluginversions": ["<1.4.1"], "text": "Version 1.4.1 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2022-03-24 12:00:00 +0000", "link": "https://github.com/egguy/OctoPrint-Prusa-Mini-ETA/releases/tag/0.1.4", "plugin": "prusa_mini_eta", "pluginversions": ["<0.1.4"], "text": "Version 0.1.4 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2022-05-09 12:00:00 +0000", "link": "https://www.obico.io/docs/user-guides/move-from-tsd-to-obico-in-octoprint/", "plugin": "thespaghettidetective", "text": "This plugin is now succeeded by \"Obico for OctoPrint\". Please uninstall this plugin (keep data) in the plugin manager. Then install the \"Obico for OctoPrint\" plugin. Your settings in this plugin will be automatically migrated to the new plugin. To find out more, click the \"Read more...\" link below."}, {"date": "2022-10-01 12:00:00 +0000", "link": "https://github.com/gbonesso/OctoPrint-LEDStripControl/releases/tag/v0.3.8", "plugin": "ledstripcontrol", "pluginversions": ["<0.3.8"], "text": "Version 0.3.8 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2022-12-11 18:00:00 +0000", "link": "https://github.com/larsjuhw/OctoPrint-SlicerSettingsParser/releases/tag/v3.0.1", "plugin": "SlicerSettingsParser", "pluginversions": ["<3.0.0"], "text": "Version 3.0.0 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2022-12-25 12:00:00 +0000", "link": "https://github.com/synman/OctoPrint-SystemCommandEditor/releases/tag/1.0.0", "plugin": "systemcommandeditor", "pluginversions": ["<1.0.0"], "text": "Version 1.0.0+ of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2023-02-02 12:00:00 +0000", "link": "https://github.com/derekantrican/OctoPrint-Webhooks/releases/tag/3.1.3", "plugin": "webhooks", "pluginversions": ["<3.1.3"], "text": "Version 3.1.3+ of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please uninstall the old plugin from the plugin manager, then reinstall from the plugin repository to update it. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2023-09-16 12:00:00 +0000", "link": "https://github.com/thomst08/OctoLight/releases/tag/v0.1.5", "plugin": "octolight", "pluginversions": ["<0.1.5"], "text": "Version 0.1.5 of this plugin is available from a new maintainer, but your version still looks for updates at the repository of the old maintainer. Please re-install the plugin from the repository to update and keeping your settings. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": ["0.1.0", "0.1.1", "0.1.2", "0.1.3", "0.1.4"]}, {"date": "2023-11-27 12:00:00 +0000", "link": "https://github.com/dojohnso/OctoPrint-PrintJobHistory/releases/tag/1.17.1", "plugin": "PrintJobHistory", "pluginversions": ["<1.17.1"], "text": "Version 1.17.1 of this plugin is available from a new maintainer. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2023-12-06 12:00:00 +0000", "link": "https://github.com/dojohnso/OctoPrint-SpoolManager/releases/tag/1.7.1", "plugin": "SpoolManager", "pluginversions": ["<1.7.1"], "text": "Version 1.7.1 of this plugin is available from a new maintainer. The release notes of the version by the new maintainer can be found at the \"Read more...\" link below.", "versions": []}, {"date": "2021-07-25 23:34:43 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/914", "plugin": "TemperatureFailsafe", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2021-11-14 14:36:01 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/961", "plugin": "gslc", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2022-01-25 07:48:19 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/995", "plugin": "filamentrevolutions", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2021-02-25 14:24:57 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/800", "plugin": "autocalibration", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2020-09-07 20:42:41 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/608", "plugin": "cost", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2022-06-28 08:04:28 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/1082", "plugin": "Thingiverse", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2021-02-24 19:39:28 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/796", "plugin": "filetypes", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2020-09-21 10:13:51 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/624", "plugin": "growl", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2022-12-01 23:42:04 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/1126", "plugin": "touchui", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2022-07-01 08:23:04 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/1085", "plugin": "flashforge", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2020-12-15 19:28:43 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/711", "plugin": "active_filters", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}, {"date": "2021-07-20 08:10:10 +0000", "link": "https://github.com/OctoPrint/plugins.octoprint.org/issues/911", "plugin": "slicer", "text": "This plugin has been abandoned by its maintainer and is looking for someone to adopt it. If you want to step in as the new maintainer please get in touch at the \"Read more...\" link below."}] \ No newline at end of file diff --git a/builder/octoprint/octoprint/data/pluginmanager/plugins.json b/builder/octoprint/octoprint/data/pluginmanager/plugins.json new file mode 100644 index 0000000..b2dffa2 --- /dev/null +++ b/builder/octoprint/octoprint/data/pluginmanager/plugins.json @@ -0,0 +1 @@ +[{"id": "mqtt", "published": "2015-04-11 00:00:00 +0000", "title": "MQTT", "description": "Adds support for subscribing and publishing to MQTT topics.", "archive": "https://github.com/OctoPrint/OctoPrint-MQTT/archive/master.zip", "author": "Franziska Kunsmann, Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-MQTT", "page": "https://plugins.octoprint.org/plugins/mqtt/", "compatibility": {"octoprint": ["1.3.5"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.8.15", "date": "2024-02-10 18:26:17 +0000", "tag": "0.8.15"}, "releases": 23, "last_push": "2024-02-10 18:25:23 +0000", "stars": 152, "issues": {"open": 34, "closed": 77}}, "stats": {"instances_month": 3222, "install_events_month": 172, "instances_week": 2467, "install_events_week": 36}}, {"id": "growl", "published": "2015-04-14 00:00:00 +0000", "title": "Growl", "description": "Get Growl notifications from your OctoPrint installation.", "archive": "https://github.com/OctoPrint/OctoPrint-Growl/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-Growl", "page": "https://plugins.octoprint.org/plugins/growl/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/growl/notification.png", "abandoned": true, "github": {"latest_release": {"name": "0.1.1", "date": "2017-11-24 16:37:26 +0000", "tag": "0.1.1"}, "releases": 2, "last_push": "2020-07-01 13:36:07 +0000", "stars": 5, "issues": {"open": 1, "closed": 6}}, "stats": {"instances_month": 7, "install_events_month": 1, "instances_week": 6, "install_events_week": 0}}, {"id": "actiontrigger", "published": "2015-04-17 00:00:00 +0000", "title": "Action Trigger Plugin", "description": "Plugin for OctoPrint that handles serial commands sent out by the printer.", "archive": "https://github.com/Booli/OctoPrint-ActionTriggerPlugin/archive/master.zip", "author": "Pim Rutgers", "homepage": "https://github.com/Booli/OctoPrint-ActionTriggerPlugin", "page": "https://plugins.octoprint.org/plugins/actiontrigger/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Python 3 compatibility release ", "date": "2020-06-28 09:19:33 +0000", "tag": "v1.1"}, "releases": 2, "last_push": "2020-09-14 09:38:22 +0000", "stars": 4, "issues": {"open": 0, "closed": 4}}, "stats": {"instances_month": 98, "install_events_month": 8, "instances_week": 75, "install_events_week": 1}}, {"id": "navbartemp", "published": "2015-04-17 00:00:00 +0000", "title": "Navbar Temp", "description": "Display temperatures on navbar", "archive": "https://github.com/imrahil/OctoPrint-NavbarTemp/archive/master.zip", "author": "Cosik, Jarek Szczepanski", "homepage": "https://github.com/imrahil/OctoPrint-NavbarTemp", "page": "https://plugins.octoprint.org/plugins/navbartemp/", "compatibility": {"octoprint": [], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://github.com/imrahil/OctoPrint-NavbarTemp/blob/master/images/navbar.png?raw=true", "abandoned": false, "github": {"latest_release": {"name": "v 0.15", "date": "2022-08-15 14:21:53 +0000", "tag": "0.15"}, "releases": 11, "last_push": "2022-08-15 14:16:11 +0000", "stars": 43, "issues": {"open": 14, "closed": 57}}, "stats": {"instances_month": 11785, "install_events_month": 568, "instances_week": 8507, "install_events_week": 124}}, {"id": "gpx", "published": "2015-04-23 00:00:00 +0000", "title": "GPX", "description": "Use OctoPrint with s3g/x3g printers (like FlashForge and older MakerBot)", "archive": "https://markwal.github.io/octoprint-download/OctoPrint-GPX.tgz", "author": "Mark Walker", "homepage": "https://github.com/markwal/OctoPrint-GPX", "page": "https://plugins.octoprint.org/plugins/gpx/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://markwal.github.io/octoprint-download/gpx.png", "abandoned": false, "github": {"latest_release": {"name": "2.6.8", "date": "2020-12-05 23:42:05 +0000", "tag": "2.6.8"}, "releases": 30, "last_push": "2020-12-01 05:58:38 +0000", "stars": 103, "issues": {"open": 35, "closed": 59}}, "stats": {"instances_month": 387, "install_events_month": 5, "instances_week": 276, "install_events_week": 1}}, {"id": "customControl", "published": "2015-04-26 00:00:00 +0000", "title": "Custom Control Editor", "description": "Makes custom controls editable via the settings dialog", "archive": "https://github.com/Salandora/octoprint-customControl/archive/master.zip", "author": "Marc Hannappel (Salandora)", "homepage": "https://github.com/Salandora/octoprint-customControl", "page": "https://plugins.octoprint.org/plugins/customControl/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/customControl/img4.png", "abandoned": false, "github": {"latest_release": {"name": "Version 0.2.2", "date": "2020-05-07 13:14:45 +0000", "tag": "0.2.2"}, "releases": 4, "last_push": "2020-05-03 22:33:36 +0000", "stars": 25, "issues": {"open": 24, "closed": 17}}, "stats": {"instances_month": 1657, "install_events_month": 78, "instances_week": 1236, "install_events_week": 17}}, {"id": "octoglow", "published": "2015-05-12 00:00:00 +0000", "title": "OctoGlow", "description": "Display OctoPrint status on a PiGlow board.", "archive": "https://github.com/dmalec/OctoPrint-OctoGlow/archive/master.zip", "author": "Dan Malec", "homepage": "https://github.com/dmalec/OctoPrint-OctoGlow", "page": "https://plugins.octoprint.org/plugins/octoglow/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "CC BY-NC-SA 4.0", "image": "https://plugins.octoprint.org/assets/img/plugins/octoglow/progress.png", "abandoned": false, "github": {"last_push": "2015-03-08 15:12:11 +0000", "stars": 6, "issues": {"open": 5, "closed": 0}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "snapstream", "published": "2015-05-22 00:00:00 +0000", "title": "SnapStream", "description": "Emulate webcam streaming by showing a sequence of snapshots", "archive": "https://github.com/markwal/OctoPrint-SnapStream/archive/master.zip", "author": "Mark Walker", "homepage": "https://github.com/markwal/OctoPrint-SnapStream", "page": "https://plugins.octoprint.org/plugins/snapstream/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.3", "date": "2021-02-17 05:43:59 +0000", "tag": "0.3"}, "releases": 2, "last_push": "2021-02-17 05:39:43 +0000", "stars": 6, "issues": {"open": 5, "closed": 3}}, "stats": {"instances_month": 134, "install_events_month": 22, "instances_week": 86, "install_events_week": 3}}, {"id": "systemcommandeditor", "published": "2015-06-03 00:00:00 +0000", "title": "System Command Editor", "description": "This plugin makes System Commands editable through the OctoPrint WebUI", "archive": "https://github.com/synman/OctoPrint-SystemCommandEditor/archive/master.zip", "author": "Shell M. Shrader, Marc Hannappel", "homepage": "https://github.com/synman/OctoPrint-SystemCommandEditor", "page": "https://plugins.octoprint.org/plugins/systemcommandeditor/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/systemCommandEditor/img1.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.0", "date": "2022-12-26 02:54:09 +0000", "tag": "1.0.0"}, "releases": 1, "last_push": "2022-12-26 20:05:32 +0000", "stars": 5, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 929, "install_events_month": 50, "instances_week": 713, "install_events_week": 10}}, {"id": "editorcollection", "published": "2015-06-04 00:00:00 +0000", "title": "Editor Collection", "description": "This plugin is for putting Salandora's editor plugins onto one page", "archive": "https://github.com/Salandora/OctoPrint-EditorCollection/archive/master.zip", "author": "Marc Hannappel (Salandora)", "homepage": "https://github.com/Salandora/OctoPrint-EditorCollection", "page": "https://plugins.octoprint.org/plugins/editorcollection/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/editorCollection/img1.png", "abandoned": false, "github": {"latest_release": {"name": "Editor Collection Version 0.1.2", "date": "2015-07-24 22:01:17 +0000", "tag": "0.1.2"}, "releases": 2, "last_push": "2020-05-22 17:19:11 +0000", "stars": 1, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 47, "install_events_month": 3, "instances_week": 41, "install_events_week": 1}}, {"id": "screensquish", "published": "2015-06-17 00:00:00 +0000", "title": "ScreenSquish", "description": "Scalable UI that does some old fashioned (v2) bootstrap responsive and some collapse etc.", "archive": "https://github.com/markwal/OctoPrint-ScreenSquish/archive/master.zip", "author": "Mark Walker", "homepage": "https://github.com/markwal/OctoPrint-ScreenSquish", "page": "https://plugins.octoprint.org/plugins/screensquish/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/screensquish/squishsample.png", "abandoned": false, "github": {"latest_release": {"name": "0.4", "date": "2020-05-10 04:17:01 +0000", "tag": "0.4"}, "releases": 1, "last_push": "2020-05-10 04:14:50 +0000", "stars": 5, "issues": {"open": 2, "closed": 0}}, "stats": {"instances_month": 44, "install_events_month": 4, "instances_week": 30, "install_events_week": 2}}, {"id": "stlviewer", "published": "2015-06-20 00:00:00 +0000", "title": "STL Viewer", "description": "Simple stl viewer tab from uploaded files.", "archive": "https://github.com/jneilliii/Octoprint-STLViewer/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/Octoprint-STLViewer", "page": "https://plugins.octoprint.org/plugins/stlviewer/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/stlviewer/screenshot.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.4.2", "date": "2019-10-22 02:50:02 +0000", "tag": "0.4.2"}, "releases": 5, "last_push": "2024-01-14 15:59:05 +0000", "stars": 21, "issues": {"open": 1, "closed": 22}}, "stats": {"instances_month": 1833, "install_events_month": 187, "instances_week": 1208, "install_events_week": 32}}, {"id": "commandsplitter", "published": "2015-06-21 00:00:00 +0000", "title": "CommandSplitter", "description": "Splits multiple commands on one line in GCODE files into multiple lines", "archive": "https://github.com/OctoPrint/OctoPrint-CommandSplitter/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-CommandSplitter", "page": "https://plugins.octoprint.org/plugins/commandsplitter/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.2.3 (stable)", "date": "2020-07-28 18:24:14 +0000", "tag": "0.2.3"}, "releases": 5, "last_push": "2022-06-23 08:52:19 +0000", "stars": 2, "issues": {"open": 1, "closed": 3}}, "stats": {"instances_month": 45, "install_events_month": 13, "instances_week": 27, "install_events_week": 0}}, {"id": "requestspinner", "published": "2015-06-21 00:00:00 +0000", "title": "RequestSpinner", "description": "Shows a little spinner in the web frontend when background requests are active", "archive": "https://github.com/OctoPrint/OctoPrint-RequestSpinner/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-RequestSpinner", "page": "https://plugins.octoprint.org/plugins/requestspinner/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/requestspinner/requestspinner.png", "abandoned": false, "github": {"latest_release": {"name": "0.2.0 (stable)", "date": "2020-04-24 17:19:24 +0000", "tag": "0.2.0"}, "releases": 3, "last_push": "2020-04-24 17:17:58 +0000", "stars": 2, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 147, "install_events_month": 3, "instances_week": 124, "install_events_week": 1}}, {"id": "autoselect", "published": "2015-06-27 00:00:00 +0000", "title": "Autoselect", "description": "Automatically selects freshly uploaded files for printing if no print job is currently active.", "archive": "https://github.com/OctoPrint/OctoPrint-Autoselect/archive/master.zip", "author": "Jubaleth, Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-Autoselect", "page": "https://plugins.octoprint.org/plugins/autoselect/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.3.0 (stable)", "date": "2020-05-02 22:37:45 +0000", "tag": "0.3.0"}, "releases": 3, "last_push": "2020-05-02 22:35:41 +0000", "stars": 9, "issues": {"open": 4, "closed": 6}}, "stats": {"instances_month": 927, "install_events_month": 27, "instances_week": 717, "install_events_week": 1}}, {"id": "status_line", "published": "2015-07-04 00:00:00 +0000", "title": "StatusLine", "description": "Display M117 (Display Message) in the SideBar", "archive": "https://github.com/AmedeeBulle/StatusLine/archive/master.zip", "author": "Philippe Vanhaesendonck", "homepage": "https://github.com/AmedeeBulle/StatusLine", "page": "https://plugins.octoprint.org/plugins/status_line/", "compatibility": {"octoprint": ["1.2.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://raw.githubusercontent.com/AmedeeBulle/StatusLine/master/status_line.png", "abandoned": false, "github": {"last_push": "2020-06-17 09:19:09 +0000", "stars": 6, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 175, "install_events_month": 9, "instances_week": 124, "install_events_week": 1}}, {"id": "yamlpatcher", "published": "2015-07-07 00:00:00 +0000", "title": "Yamlpatcher", "description": "Allows patching up config.yaml through the web interface", "archive": "https://github.com/OctoPrint/OctoPrint-Yamlpatcher/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-Yamlpatcher", "page": "https://plugins.octoprint.org/plugins/yamlpatcher/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "http://i.imgur.com/Xs1xGHu.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.1 (stable)", "date": "2016-01-19 09:09:11 +0000", "tag": "0.1.1"}, "releases": 2, "last_push": "2019-08-01 12:32:55 +0000", "stars": 1, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 23, "install_events_month": 3, "instances_week": 17, "install_events_week": 0}}, {"id": "octobullet", "published": "2015-07-23 00:00:00 +0000", "title": "Pushbullet", "description": "Pushes notifications about finished print jobs via Pushbullet", "archive": "https://github.com/OctoPrint/OctoPrint-Pushbullet/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-Pushbullet", "page": "https://plugins.octoprint.org/plugins/octobullet/", "compatibility": {"octoprint": ["1.2.4"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/octobullet/example_push.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.14", "date": "2020-10-17 13:53:25 +0000", "tag": "0.1.14"}, "releases": 13, "last_push": "2020-10-17 13:50:18 +0000", "stars": 13, "issues": {"open": 8, "closed": 20}}, "stats": {"instances_month": 227, "install_events_month": 9, "instances_week": 174, "install_events_week": 0}}, {"id": "eeprom_repetier", "published": "2015-07-28 00:00:00 +0000", "title": "EEPROM Repetier Editor", "description": "Makes it possible to change the EEPROM values of Repetier Firmware through OctoPrint", "archive": "https://github.com/Salandora/OctoPrint-EEprom-Repetier/archive/master.zip", "author": "Marc Hannappel (Salandora)", "homepage": "https://github.com/Salandora/OctoPrint-EEprom-Repetier", "page": "https://plugins.octoprint.org/plugins/eeprom_repetier/", "compatibility": {"octoprint": ["1.5.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/eeprom_repetier/eeprom_values.png", "abandoned": false, "github": {"latest_release": {"name": "Version 0.1.6", "date": "2021-04-08 06:12:14 +0000", "tag": "0.1.6"}, "releases": 5, "last_push": "2021-05-02 05:53:13 +0000", "stars": 9, "issues": {"open": 2, "closed": 8}}, "stats": {"instances_month": 159, "install_events_month": 10, "instances_week": 110, "install_events_week": 1}}, {"id": "displayprogress", "published": "2015-08-03 00:00:00 +0000", "title": "DisplayProgress", "description": "Displays the print progress on the printer's display", "archive": "https://github.com/OctoPrint/OctoPrint-DisplayProgress/archive/master.zip", "author": "jneilliii, Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-DisplayProgress", "page": "https://plugins.octoprint.org/plugins/displayprogress/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/displayprogress/example.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.1.3", "date": "2020-05-20 07:15:51 +0000", "tag": "0.1.3"}, "releases": 4, "last_push": "2020-05-20 07:13:26 +0000", "stars": 18, "issues": {"open": 0, "closed": 8}}, "stats": {"instances_month": 1449, "install_events_month": 115, "instances_week": 1016, "install_events_week": 23}}, {"id": "eeprom_marlin", "published": "2015-08-30 00:00:00 +0000", "title": "Marlin EEPROM Editor", "description": "Makes it possible to change the EEPROM values of Marlin Firmware through OctoPrint", "archive": "https://github.com/cp2004/OctoPrint-EEPROM-Marlin/releases/latest/download/release.zip", "author": "Charlie Powell, Anderson Silva", "homepage": "https://github.com/cp2004/OctoPrint-EEPROM-Marlin", "page": "https://plugins.octoprint.org/plugins/eeprom_marlin/", "compatibility": {"octoprint": ["1.4.0"], "os": [], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/eeprom_marlin/firmware_info.png", "abandoned": false, "github": {"latest_release": {"name": "3.3.0 Stable Release", "date": "2023-01-03 15:29:43 +0000", "tag": "3.3.0"}, "releases": 16, "last_push": "2023-12-27 13:00:34 +0000", "stars": 31, "issues": {"open": 7, "closed": 61}}, "stats": {"instances_month": 4596, "install_events_month": 394, "instances_week": 3274, "install_events_week": 94}}, {"id": "stats", "published": "2015-09-13 00:00:00 +0000", "title": "Printer Statistics", "description": "Statistics of your 3D Printer", "archive": "https://github.com/AlexVerrico/octoprint-stats/archive/master.zip", "author": "Alex Verrico, Anderson Silva", "homepage": "https://github.com/AlexVerrico/octoprint-stats", "page": "https://plugins.octoprint.org/plugins/stats/", "compatibility": {"octoprint": [], "os": [], "python": ">=3.5,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/stats/img1.png", "abandoned": false, "github": {"latest_release": {"name": "Version 3.1.4 - bugfix, courtesy of @jneilliii", "date": "2023-07-30 22:22:07 +0000", "tag": "v3.1.4"}, "releases": 5, "last_push": "2024-02-05 02:45:09 +0000", "stars": 14, "issues": {"open": 7, "closed": 15}}, "stats": {"instances_month": 998, "install_events_month": 36, "instances_week": 684, "install_events_week": 14}}, {"id": "automaticshutdown", "published": "2015-09-22 00:00:00 +0000", "title": "AutomaticShutdown", "description": "Plugin to enable automatic system shutdown after finishing a print job", "archive": "https://github.com/OctoPrint/OctoPrint-AutomaticShutdown/archive/master.zip", "author": "Nicanor Romero Venier", "homepage": "https://github.com/OctoPrint/OctoPrint-AutomaticShutdown", "page": "https://plugins.octoprint.org/plugins/automaticshutdown/", "compatibility": {"octoprint": ["1.2.5"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/automaticshutdown/sidebar.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.5", "date": "2022-01-18 18:18:22 +0000", "tag": "0.1.5"}, "releases": 4, "last_push": "2022-01-18 18:15:32 +0000", "stars": 18, "issues": {"open": 11, "closed": 22}}, "stats": {"instances_month": 574, "install_events_month": 47, "instances_week": 338, "install_events_week": 12}}, {"id": "displayz", "published": "2015-09-22 00:00:00 +0000", "title": "DisplayZ", "description": "Brings back the current Z display in the state sidebar panel", "archive": "https://github.com/foosel/OctoPrint-DisplayZ/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/foosel/OctoPrint-DisplayZ", "page": "https://plugins.octoprint.org/plugins/displayz/", "compatibility": {"octoprint": ["1.2.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/displayz/displayz.png", "abandoned": false, "github": {"latest_release": {"name": "0.2.0", "date": "2020-07-01 08:01:36 +0000", "tag": "0.2.0"}, "releases": 1, "last_push": "2020-07-04 20:01:44 +0000", "stars": 6, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 1563, "install_events_month": 86, "instances_week": 1146, "install_events_week": 16}}, {"id": "portlister", "published": "2015-10-08 00:00:00 +0000", "title": "PortLister", "description": "Refreshes the port list in the browser when a printer shows up", "archive": "https://github.com/markwal/OctoPrint-PortLister/archive/master.zip", "author": "Mark Walker", "homepage": "https://github.com/markwal/OctoPrint-PortLister", "page": "https://plugins.octoprint.org/plugins/portlister/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.10", "date": "2020-05-09 22:30:40 +0000", "tag": "0.1.10"}, "releases": 10, "last_push": "2020-05-09 21:54:53 +0000", "stars": 25, "issues": {"open": 3, "closed": 9}}, "stats": {"instances_month": 934, "install_events_month": 72, "instances_week": 717, "install_events_week": 22}}, {"id": "touchui", "published": "2015-10-10 00:00:00 +0000", "title": "TouchUI", "description": "A touch friendly interface for Mobile and TFT touch modules", "archive": "https://github.com/BillyBlaze/OctoPrint-TouchUI/archive/master.zip", "author": "Paul de Vries", "homepage": "https://billyblaze.github.io/OctoPrint-TouchUI", "page": "https://plugins.octoprint.org/plugins/touchui/", "compatibility": {"octoprint": ["1.2.6"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://billyblaze.github.io/OctoPrint-TouchUI/images/touchuisample.png", "abandoned": true, "github": {"latest_release": {"name": "0.3.18", "date": "2021-07-05 18:20:53 +0000", "tag": "0.3.18"}, "releases": 22, "last_push": "2021-07-05 18:17:46 +0000", "stars": 275, "issues": {"open": 0, "closed": 524}}, "stats": {"instances_month": 5476, "install_events_month": 455, "instances_week": 3706, "install_events_week": 104}}, {"id": "slack", "published": "2015-10-28 00:00:00 +0000", "title": "Slack", "description": "Send message to Slack chat when printing events happen", "archive": "https://github.com/mkevenaar/OctoPrint-Slack/releases/latest/download/release.zip", "author": "Maurice Kevenaar, Richard Joyce", "homepage": "https://github.com/mkevenaar/OctoPrint-Slack", "page": "https://plugins.octoprint.org/plugins/slack/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/slack/slack.png", "abandoned": false, "github": {"latest_release": {"name": "Release 0.2.5", "date": "2021-02-28 18:12:00 +0000", "tag": "0.2.5"}, "releases": 2, "last_push": "2024-05-09 00:41:33 +0000", "stars": 6, "issues": {"open": 18, "closed": 18}}, "stats": {"instances_month": 45, "install_events_month": 5, "instances_week": 41, "install_events_week": 2}}, {"id": "autocalibration", "published": "2015-11-09 00:00:00 +0000", "title": "Autocalibration", "description": "Calibrates your printers backlash for the X, Y or Z-axis.", "archive": "https://github.com/platsch/OctoPrint-Autocalibration/archive/master.zip", "author": "Florens Wasserfall (Platsch)", "homepage": "https://github.com/platsch/OctoPrint-Autocalibration", "page": "https://plugins.octoprint.org/plugins/autocalibration/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/autocalibration/screenshot.png", "abandoned": true, "github": {"last_push": "2015-11-10 13:37:58 +0000", "stars": 2, "issues": {"open": 3, "closed": 5}}, "stats": {"instances_month": 36, "install_events_month": 2, "instances_week": 19, "install_events_week": 1}}, {"id": "updatefix127", "published": "2015-12-07 00:00:00 +0000", "title": "Updatefix 1.2.7", "description": "Fixes an issue in OctoPrint 1.2.7 that prevents updating", "archive": "https://github.com/OctoPrint/OctoPrint-Updatefix-1.2.7/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-Updatefix-1.2.7", "page": "https://plugins.octoprint.org/plugins/updatefix127/", "compatibility": {"octoprint": [">=1.2.7,<1.2.8"], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.0 (stable)", "date": "2015-12-07 11:57:36 +0000", "tag": "0.1.0"}, "releases": 1, "last_push": "2015-12-07 11:47:13 +0000", "stars": 0, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "eeprom_marlin_printrbot", "published": "2015-12-26 00:00:00 +0000", "title": "EEPROM Printrbot variant of Marlin Editor", "description": "Makes it possible to change the EEPROM values of Printrbot variant of Marlin Firmware through OctoPrint", "archive": "https://github.com/ryanneufeld/OctoPrint-EEPROM-Marlin-Printrbot/archive/master.zip", "author": "Ryan Neufeld", "homepage": "https://github.com/ryanneufeld/OctoPrint-EEPROM-Marlin-Printrbot", "page": "https://plugins.octoprint.org/plugins/eeprom_marlin_printrbot/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": false, "github": {"last_push": "2015-12-26 21:30:56 +0000", "stars": 1, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 15, "install_events_month": 1, "instances_week": 10, "install_events_week": 0}}, {"id": "active_filters", "published": "2016-01-01 00:00:00 +0000", "title": "Active Filters", "description": "Save terminal filters status", "archive": "https://github.com/MoonshineSG/OctoPrint-ActiveFilters/archive/master.zip", "author": "ovidiu", "homepage": "https://github.com/MoonshineSG/OctoPrint-ActiveFilters", "page": "https://plugins.octoprint.org/plugins/active_filters/", "compatibility": {"octoprint": ["1.2.6"], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": true, "github": {"latest_release": {"name": "0.0.1", "date": "2016-01-04 08:23:19 +0000", "tag": "0.0.1"}, "releases": 1, "last_push": "2017-05-12 02:51:56 +0000", "stars": 1, "issues": {"open": 4, "closed": 0}}, "stats": {"instances_month": 14, "install_events_month": 1, "instances_week": 10, "install_events_week": 0}}, {"id": "title_status", "published": "2016-01-18 00:00:00 +0000", "title": "Title Status", "description": "Show printers status in window title", "archive": "https://github.com/MoonshineSG/OctoPrint-TitleStatus/archive/master.zip", "author": "ovidiu", "homepage": "https://github.com/MoonshineSG/OctoPrint-TitleStatus", "page": "https://plugins.octoprint.org/plugins/title_status/", "compatibility": {"octoprint": ["1.2.6"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.0.5", "date": "2020-06-24 09:08:42 +0000", "tag": "0.0.5"}, "releases": 5, "last_push": "2020-12-09 02:46:05 +0000", "stars": 2, "issues": {"open": 3, "closed": 3}}, "stats": {"instances_month": 233, "install_events_month": 13, "instances_week": 195, "install_events_week": 5}}, {"id": "telegram", "published": "2016-02-25 00:00:00 +0000", "title": "OctoPrint-Telegram", "description": "A plugin to send and react on messages before, during and after a print via Telegram Messenger.", "archive": "https://github.com/fabianonline/OctoPrint-Telegram/archive/master.zip", "author": "Fabian Schlenz", "homepage": "https://github.com/fabianonline/OctoPrint-Telegram", "page": "https://plugins.octoprint.org/plugins/telegram/", "compatibility": {"octoprint": ["1.2.9"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/telegram/features3.png", "abandoned": false, "github": {"latest_release": {"name": "1.6.7", "date": "2024-05-08 10:15:52 +0000", "tag": "1.6.7"}, "releases": 25, "last_push": "2024-05-08 10:14:50 +0000", "stars": 305, "issues": {"open": 137, "closed": 207}}, "stats": {"instances_month": 3684, "install_events_month": 228, "instances_week": 2617, "install_events_week": 55}}, {"id": "pushover", "published": "2016-04-13 00:00:00 +0000", "title": "Pushover", "description": "A plugin that send a notification with Pushover when the job is done or is failed", "archive": "https://github.com/thijsbekke/OctoPrint-Pushover/archive/master.zip", "author": "Thijs Bekke", "homepage": "https://github.com/thijsbekke/OctoPrint-Pushover/", "page": "https://plugins.octoprint.org/plugins/pushover/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/pushover/pushover.png", "abandoned": false, "github": {"latest_release": {"name": "Tweaked the log messages ", "date": "2020-07-16 21:25:46 +0000", "tag": "0.3.8"}, "releases": 23, "last_push": "2020-07-21 18:55:41 +0000", "stars": 32, "issues": {"open": 17, "closed": 41}}, "stats": {"instances_month": 647, "install_events_month": 23, "instances_week": 522, "install_events_week": 1}}, {"id": "redeem", "published": "2016-04-26 00:00:00 +0000", "title": "OctoPrint Redeem", "description": "Control Redeems configuration", "archive": "https://github.com/eliasbakken/octoprint_redeem/archive/master.zip", "author": "Elias Bakken", "homepage": "http://wiki.thing-printer.com/index.php?title=Main_Page", "page": "https://plugins.octoprint.org/plugins/redeem/", "compatibility": {"octoprint": ["1.2.8"], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "http://www.thing-printer.com/wp-content/uploads/2016/04/octoprint-redeem.png", "abandoned": false, "github": {"last_push": "2017-08-28 06:07:26 +0000", "stars": 0, "issues": {"open": 1, "closed": 0}}, "stats": {"instances_month": 1, "install_events_month": 1, "instances_week": 1, "install_events_week": 0}}, {"id": "cost", "published": "2016-06-11 00:00:00 +0000", "title": "Cost estimator", "description": "When a file is loaded to be printed, it will display the estimated cost of printing.", "archive": "https://github.com/jasiek/OctoPrint-Cost/archive/master.zip", "author": "Jan Szumiec", "homepage": "https://github.com/jasiek/OctoPrint-Cost", "page": "https://plugins.octoprint.org/plugins/cost/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "MIT", "abandoned": true, "github": {"latest_release": {"name": "0.1.3: The Missing Release", "date": "2017-07-13 10:32:48 +0000", "tag": "0.1.3"}, "releases": 1, "last_push": "2019-12-14 13:07:40 +0000", "stars": 10, "issues": {"open": 16, "closed": 5}}, "stats": {"instances_month": 115, "install_events_month": 1, "instances_week": 76, "install_events_week": 0}}, {"id": "autoscroll", "published": "2016-06-27 00:00:00 +0000", "title": "Autoscroll", "description": "Turn on/off terminal autoscroll when scrolling up/down", "archive": "https://github.com/MoonshineSG/OctoPrint-Autoscroll/archive/master.zip", "author": "ovidiu", "homepage": "https://github.com/MoonshineSG/OctoPrint-Autoscroll", "page": "https://plugins.octoprint.org/plugins/autoscroll/", "compatibility": {"octoprint": ["1.2.6"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.0.3", "date": "2020-05-08 01:24:30 +0000", "tag": "0.0.3"}, "releases": 3, "last_push": "2020-05-08 01:23:26 +0000", "stars": 6, "issues": {"open": 3, "closed": 1}}, "stats": {"instances_month": 1694, "install_events_month": 51, "instances_week": 1243, "install_events_week": 15}}, {"id": "filament_sensor", "published": "2016-06-29 00:00:00 +0000", "title": "Filament Sensor", "description": "Use a filament sensor to pause printing when filament runs out.", "archive": "https://github.com/MoonshineSG/OctoPrint-Filament/archive/master.zip", "author": "ovidiu", "homepage": "https://github.com/MoonshineSG/OctoPrint-Filament", "page": "https://plugins.octoprint.org/plugins/filament_sensor/", "compatibility": {"octoprint": ["1.2.6"], "os": ["linux", "freebsd"], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.1", "date": "2016-06-29 02:42:55 +0000", "tag": "1.0.1"}, "releases": 1, "last_push": "2018-04-17 08:28:41 +0000", "stars": 26, "issues": {"open": 16, "closed": 10}}, "stats": {"instances_month": 36, "install_events_month": 3, "instances_week": 22, "install_events_week": 1}}, {"id": "multi_colors", "published": "2016-06-29 00:00:00 +0000", "title": "Multi Colors", "description": "Inject GCODE at specified layers to allow multi color printing", "archive": "https://github.com/MoonshineSG/OctoPrint-MultiColors/archive/master.zip", "author": "ovidiu", "homepage": "https://github.com/MoonshineSG/OctoPrint-MultiColors", "page": "https://plugins.octoprint.org/plugins/multi_colors/", "compatibility": {"octoprint": ["1.2.6"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.17", "date": "2020-05-08 01:21:01 +0000", "tag": "1.0.17"}, "releases": 20, "last_push": "2020-05-08 01:19:23 +0000", "stars": 21, "issues": {"open": 11, "closed": 31}}, "stats": {"instances_month": 694, "install_events_month": 40, "instances_week": 506, "install_events_week": 8}}, {"id": "gcodebar", "published": "2016-09-01 00:00:00 +0000", "title": "GCodeBar", "description": "Send GCode from the sidebar", "archive": "https://github.com/mtowara/OctoPrint-Gcodebar/archive/master.zip", "author": "Markus Towara", "homepage": "https://github.com/mtowara/OctoPrint-Gcodebar", "page": "https://plugins.octoprint.org/plugins/gcodebar/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/gcodebar/gcodebar.png", "abandoned": false, "github": {"latest_release": {"name": "Python3 compability", "date": "2019-12-12 10:06:48 +0000", "tag": "0.1.5"}, "releases": 2, "last_push": "2019-12-12 09:59:06 +0000", "stars": 4, "issues": {"open": 1, "closed": 2}}, "stats": {"instances_month": 406, "install_events_month": 18, "instances_week": 292, "install_events_week": 3}}, {"id": "detailedprogress", "published": "2016-09-02 00:00:00 +0000", "title": "Detailed Progress", "description": "Displays detailed progress on the LCD screen", "archive": "https://github.com/tpmullan/OctoPrint-DetailedProgress/archive/master.zip", "author": "tpmullan", "homepage": "https://github.com/tpmullan/OctoPrint-DetailedProgress", "page": "https://plugins.octoprint.org/plugins/detailedprogress/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/detailedprogress/example-eta.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.2.7", "date": "2021-01-31 18:42:04 +0000", "tag": "0.2.7"}, "releases": 5, "last_push": "2022-04-21 01:59:32 +0000", "stars": 28, "issues": {"open": 13, "closed": 26}}, "stats": {"instances_month": 5047, "install_events_month": 397, "instances_week": 3547, "install_events_week": 90}}, {"id": "slicer", "published": "2016-09-22 00:00:00 +0000", "title": "Full-featured Slicer", "description": "A full-blown GUI-based slicer. Rotate and scale model; slice multiple STL files at a time; set layer height and other slicing settings.", "archive": "https://github.com/kennethjiang/OctoPrint-Slicer/archive/master.zip", "author": "eyal0, Kenneth Jiang", "homepage": "https://github.com/kennethjiang/OctoPrint-Slicer", "page": "https://plugins.octoprint.org/plugins/slicer/", "compatibility": {"octoprint": ["1.2.14"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/slicer/screenshot1.png", "abandoned": true, "github": {"latest_release": {"name": "Support for OctoPrint 1.6.0 (teacher's edition)", "date": "2021-05-07 15:41:20 +0000", "tag": "2.0.0"}, "releases": 40, "last_push": "2021-05-07 15:39:39 +0000", "stars": 98, "issues": {"open": 22, "closed": 118}}, "stats": {"instances_month": 1019, "install_events_month": 131, "instances_week": 616, "install_events_week": 30}}, {"id": "M117NavBar", "published": "2016-10-27 00:00:00 +0000", "title": "OctoPrint-M117NavBar", "description": "Plugin to send M117 gcode messages to the top navbar of OctoPrint.", "archive": "https://github.com/jneilliii/OctoPrint-M117NavBar/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-M117NavBar", "page": "https://plugins.octoprint.org/plugins/M117NavBar/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/M117NavBar/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.1", "date": "2019-10-22 02:42:28 +0000", "tag": "0.1.1"}, "releases": 2, "last_push": "2024-01-14 15:58:54 +0000", "stars": 2, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 362, "install_events_month": 32, "instances_week": 265, "install_events_week": 5}}, {"id": "M117PopUp", "published": "2016-10-27 00:00:00 +0000", "title": "OctoPrint-M117PopUp", "description": "Plugin to send M117 gcode messages to the web interface.", "archive": "https://github.com/jneilliii/OctoPrint-M117PopUp/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-M117PopUp", "page": "https://plugins.octoprint.org/plugins/M117PopUp/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/M117PopUp/screenshot_1.png", "abandoned": false, "github": {"latest_release": {"name": "0.6.2", "date": "2019-11-25 04:53:34 +0000", "tag": "0.6.2"}, "releases": 8, "last_push": "2024-01-14 15:58:52 +0000", "stars": 6, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 91, "install_events_month": 11, "instances_week": 53, "install_events_week": 1}}, {"id": "filemanager", "published": "2016-12-09 00:00:00 +0000", "title": "FileManager", "description": "A simple filemanager for OctoPrint", "archive": "https://github.com/Salandora/OctoPrint-FileManager/archive/master.zip", "author": "Marc Hannappel (Salandora)", "homepage": "https://github.com/Salandora/OctoPrint-FileManager", "page": "https://plugins.octoprint.org/plugins/filemanager/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/filemanager/img1.png", "abandoned": false, "github": {"latest_release": {"name": "Version 0.1.6", "date": "2021-02-28 18:48:54 +0000", "tag": "0.1.6"}, "releases": 7, "last_push": "2021-02-28 18:04:17 +0000", "stars": 27, "issues": {"open": 16, "closed": 21}}, "stats": {"instances_month": 6449, "install_events_month": 545, "instances_week": 4671, "install_events_week": 94}}, {"id": "filament_sensor_reloaded", "published": "2017-01-06 00:00:00 +0000", "title": "Filament Sensor Reloaded", "description": "Use a filament sensor to pause printing when filament runs out.", "archive": "https://github.com/nickmitchko/Octoprint-Filament-Reloaded/archive/master.zip", "author": "kontakt, ssorgatem, nickmitchko", "homepage": "https://github.com/nickmitchko/Octoprint-Filament-Reloaded", "page": "https://plugins.octoprint.org/plugins/filament_sensor_reloaded/", "compatibility": {"octoprint": ["1.2.6"], "os": ["linux", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.4.3", "date": "2023-03-06 17:28:18 +0000", "tag": "1.4.3"}, "releases": 11, "last_push": "2023-03-06 17:26:06 +0000", "stars": 9, "issues": {"open": 2, "closed": 13}}, "stats": {"instances_month": 479, "install_events_month": 35, "instances_week": 326, "install_events_week": 5}}, {"id": "smsnotifier", "published": "2017-01-10 00:00:00 +0000", "title": "SMS Notifier (with Twilio)", "description": "Recieve SMS notifications when OctoPrint jobs are complete.", "archive": "https://github.com/taxilian/OctoPrint-Twilio/archive/master.zip", "author": "Richard Bteman", "homepage": "https://github.com/taxilian/OctoPrint-Twilio", "page": "https://plugins.octoprint.org/plugins/smsnotifier/", "compatibility": {"octoprint": ["1.2.4"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/smsnotifier/smsnotifier.png", "abandoned": false, "github": {"last_push": "2020-12-08 10:14:56 +0000", "stars": 5, "issues": {"open": 2, "closed": 12}}, "stats": {"instances_month": 190, "install_events_month": 11, "instances_week": 134, "install_events_week": 1}}, {"id": "fullscreen", "published": "2017-01-16 00:00:00 +0000", "title": "Fullscreen Webcam", "description": "Open the webcam feed in fullscreen mode with extra details about the printjob", "archive": "https://github.com/BillyBlaze/OctoPrint-FullScreen/archive/master.zip", "author": "Paul de Vries", "homepage": "https://github.com/BillyBlaze/OctoPrint-FullScreen", "page": "https://plugins.octoprint.org/plugins/fullscreen/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/fullscreen_webcam/main.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.0.6", "date": "2020-11-22 14:35:43 +0000", "tag": "0.0.6"}, "releases": 6, "last_push": "2020-11-22 14:29:52 +0000", "stars": 24, "issues": {"open": 14, "closed": 23}}, "stats": {"instances_month": 8494, "install_events_month": 563, "instances_week": 6165, "install_events_week": 132}}, {"id": "freemobilenotifier", "published": "2017-01-25 00:00:00 +0000", "title": "OctoPrint_FreeMobile-Notifier", "description": "Octoprint plugin for print completion notifications using Free (Free is a French telecommunications company)", "archive": "https://github.com/Pinaute/OctoPrint_FreeMobile-Notifier/archive/master.zip", "author": "Antoine CAVARD", "homepage": "https://github.com/Pinaute/OctoPrint_FreeMobile-Notifier", "page": "https://plugins.octoprint.org/plugins/freemobilenotifier/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/freemobilenotifier/freemobilenotifier.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.6", "date": "2020-12-02 22:03:47 +0000", "tag": "0.1.6"}, "releases": 7, "last_push": "2020-12-02 21:56:26 +0000", "stars": 1, "issues": {"open": 1, "closed": 4}}, "stats": {"instances_month": 72, "install_events_month": 5, "instances_week": 48, "install_events_week": 1}}, {"id": "psucontrol", "published": "2017-01-25 00:00:00 +0000", "title": "PSU Control", "description": "Smart control of your power supply via GPIO, GCODE Command, System Command, or variety of sub-plugins.", "archive": "https://github.com/kantlivelong/OctoPrint-PSUControl/archive/master.zip", "author": "Shawn Bruce", "homepage": "https://github.com/kantlivelong/OctoPrint-PSUControl", "page": "https://plugins.octoprint.org/plugins/psucontrol/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://raw.githubusercontent.com/kantlivelong/OctoPrint-PSUControl/master/psucontrol_navbar_settings.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.6", "date": "2021-05-12 14:08:04 +0000", "tag": "1.0.6"}, "releases": 19, "last_push": "2021-08-18 02:08:27 +0000", "stars": 202, "issues": {"open": 59, "closed": 180}}, "stats": {"instances_month": 6575, "install_events_month": 505, "instances_week": 4865, "install_events_week": 114}}, {"id": "slic3r", "published": "2017-02-07 00:00:00 +0000", "title": "OctoPrint-Slic3r", "description": "Adds support for slicing via Slic3r from within OctoPrint", "archive": "https://github.com/OctoPrint/OctoPrint-Slic3r/archive/master.zip", "author": "Javier Mart\u00ednez Arrieta, Eyal Soha", "homepage": "https://github.com/OctoPrint/OctoPrint-Slic3r", "page": "https://plugins.octoprint.org/plugins/slic3r/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/slic3r/logo.png", "abandoned": false, "github": {"latest_release": {"name": "Update to work with PrusaSlicer 2.4", "date": "2022-08-29 17:06:02 +0000", "tag": "1.3.1"}, "releases": 9, "last_push": "2022-08-29 17:05:28 +0000", "stars": 88, "issues": {"open": 10, "closed": 41}}, "stats": {"instances_month": 402, "install_events_month": 42, "instances_week": 272, "install_events_week": 10}}, {"id": "tobecaplugin", "published": "2017-02-16 00:00:00 +0000", "title": "Tobeca Plugin", "description": "Plugin for OctoPrint that adds a special tab with commands for the Tobeca 3d printer.", "archive": "https://github.com/tobeca/OctoPrint-TobecaPlugin/archive/master.zip", "author": "Saymtech", "homepage": "https://github.com/tobeca/OctoPrint-TobecaPlugin/", "page": "https://plugins.octoprint.org/plugins/tobecaplugin/", "compatibility": {"octoprint": ["1.2.16"], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.3", "date": "2017-03-08 14:38:22 +0000", "tag": "0.1.3"}, "releases": 3, "last_push": "2017-03-08 14:36:23 +0000", "stars": 0, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "roomtemp", "published": "2017-03-02 00:00:00 +0000", "title": "Room Temperature", "description": "Display room temperature on navbar", "archive": "https://github.com/l00ma/OctoPrint-roomTemp/archive/master.zip", "author": "Frederic Moutin", "homepage": "https://github.com/l00ma/OctoPrint-roomTemp", "page": "https://plugins.octoprint.org/plugins/roomtemp/", "compatibility": {"octoprint": ["1.3.1"], "os": ["disabled"], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://raw.githubusercontent.com/l00ma/OctoPrint-roomTemp/master/RoomTemp.png", "disabled": "

This plugin can cause severe server issues in its current form.

\n", "abandoned": false, "github": {"last_push": "2022-11-24 09:02:02 +0000", "stars": 8, "issues": {"open": 14, "closed": 3}}, "stats": {"instances_month": 4, "install_events_month": 1, "instances_week": 3, "install_events_week": 0}}, {"id": "touchtest", "published": "2017-03-05 00:00:00 +0000", "title": "Touchtest Bed Leveling", "description": "A simple tool to move the extruder to different touch points around the perimeter of the print bed. Useful for bed leveling.", "archive": "https://github.com/Peaches491/OctoPrint-Touchtest/archive/master.zip", "author": "Daniel Miller", "homepage": "https://github.com/Peaches491/OctoPrint-Touchtest", "page": "https://plugins.octoprint.org/plugins/touchtest/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/touchtest/example.png", "abandoned": false, "github": {"latest_release": {"name": "Style fixes", "date": "2020-11-06 17:03:32 +0000", "tag": "0.4.1"}, "releases": 3, "last_push": "2020-11-06 17:02:06 +0000", "stars": 6, "issues": {"open": 12, "closed": 13}}, "stats": {"instances_month": 759, "install_events_month": 68, "instances_week": 532, "install_events_week": 20}}, {"id": "ledstripcontrol", "published": "2017-03-10 00:00:00 +0000", "title": "LEDStripControl", "description": "Control RGB LED Strips via your Raspberry Pi and GCode.", "archive": "https://github.com/gbonesso/OctoPrint-LEDStripControl/archive/master.zip", "author": "Gustavo Bonesso, Uriah Welcome", "homepage": "https://github.com/gbonesso/OctoPrint-LEDStripControl", "page": "https://plugins.octoprint.org/plugins/ledstripcontrol/", "compatibility": {"octoprint": ["1.3.1"], "os": [], "python": ">=2.7,<4"}, "license": "Apache 2", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2022-09-27 15:42:33 +0000", "tag": "v0.3.8"}, "releases": 1, "last_push": "2022-09-27 21:06:22 +0000", "stars": 2, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 168, "install_events_month": 2, "instances_week": 117, "install_events_week": 1}}, {"id": "gcodesystemcommands", "published": "2017-03-14 00:00:00 +0000", "title": "GCODE System Commands", "description": "Define G-Code commands that execute local system commands", "archive": "https://github.com/kantlivelong/OctoPrint-GCodeSystemCommands/archive/master.zip", "author": "Shawn Bruce", "homepage": "https://github.com/kantlivelong/OctoPrint-GCodeSystemCommands", "page": "https://plugins.octoprint.org/plugins/gcodesystemcommands/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/gcodesystemcommands/gcodesystemcommands_settings.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.1", "date": "2020-04-27 20:44:10 +0000", "tag": "1.0.1"}, "releases": 3, "last_push": "2020-04-28 20:46:34 +0000", "stars": 37, "issues": {"open": 2, "closed": 18}}, "stats": {"instances_month": 641, "install_events_month": 24, "instances_week": 469, "install_events_week": 5}}, {"id": "enclosure", "published": "2017-03-15 00:00:00 +0000", "title": "OctoPrint-Enclosure", "description": "Control printer environment (Temperature control / Lights / Fans and Filament Sensor) using Raspberry Pi GPIO", "archive": "https://github.com/vitormhenrique/OctoPrint-Enclosure/archive/master.zip", "author": "Vitor Henrique", "homepage": "https://github.com/vitormhenrique/OctoPrint-Enclosure", "page": "https://plugins.octoprint.org/plugins/enclosure/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd"], "python": ">=2.7,<4"}, "license": "GPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/enclosure/Plugin_Temperature_Control.png", "abandoned": false, "github": {"latest_release": {"name": "Fixed missing library", "date": "2021-10-18 14:01:27 +0000", "tag": "4.13.2"}, "releases": 28, "last_push": "2022-03-12 19:00:46 +0000", "stars": 391, "issues": {"open": 152, "closed": 269}}, "stats": {"instances_month": 3052, "install_events_month": 158, "instances_week": 2215, "install_events_week": 47}}, {"id": "OctoRemote", "published": "2017-03-29 00:00:00 +0000", "title": "OctoPrint-Octoremote", "description": "Control your 3D-Printer with an Arduino and a Keypad or a custom remote", "archive": "https://github.com/pkElectronics/OctoPrint-Octoremote/archive/master.zip", "author": "Pascal Krumme", "homepage": "https://github.com/pkElectronics/OctoPrint-Octoremote", "page": "https://plugins.octoprint.org/plugins/OctoRemote/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/OctoRemote/Hardware1.JPG", "abandoned": false, "github": {"latest_release": {"name": "Release 0.1.2", "date": "2018-02-03 18:34:53 +0000", "tag": "0.1.2"}, "releases": 1, "last_push": "2018-02-03 18:48:19 +0000", "stars": 23, "issues": {"open": 1, "closed": 10}}, "stats": {"instances_month": 6, "install_events_month": 2, "instances_week": 2, "install_events_week": 1}}, {"id": "tempsgraph", "published": "2017-03-29 00:00:00 +0000", "title": "OctoPrint-Tempsgraph", "description": "Replaces the temperature graph with an interactive and zoomable one", "archive": "https://github.com/1r0b1n0/OctoPrint-Tempsgraph/archive/master.zip", "author": "Robin Vanhove", "homepage": "https://github.com/1r0b1n0/OctoPrint-Tempsgraph", "page": "https://plugins.octoprint.org/plugins/tempsgraph/", "compatibility": {"octoprint": ["1.3.2"], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/tempsgraph/zoom.png", "abandoned": false, "github": {"latest_release": {"name": "Fixes for more responsive design", "date": "2021-03-11 10:29:27 +0000", "tag": "0.3.7"}, "releases": 10, "last_push": "2021-03-11 09:43:10 +0000", "stars": 18, "issues": {"open": 21, "closed": 9}}, "stats": {"instances_month": 963, "install_events_month": 45, "instances_week": 702, "install_events_week": 9}}, {"id": "temperaturefailesafe", "published": "2017-04-14 00:00:00 +0000", "title": "TemperatureFailsafe", "description": "Execute shell commands when temperatures violate thresholds", "archive": "https://github.com/google/OctoPrint-TemperatureFailsafe/archive/master.zip", "author": "Uriah Welcome", "homepage": "https://github.com/google/OctoPrint-TemperatureFailsafe", "page": "https://plugins.octoprint.org/plugins/temperaturefailesafe/", "compatibility": {"octoprint": ["1.3.1"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "Apache 2", "abandoned": true, "github": {"last_push": "2020-01-27 21:41:25 +0000", "stars": 26, "issues": {"open": 3, "closed": 8}}, "stats": {"instances_month": 297, "install_events_month": 13, "instances_week": 199, "install_events_week": 4}}, {"id": "finetunerptr", "published": "2017-04-23 00:00:00 +0000", "title": "OctoPrint-Finetunerptr", "description": "Control important maintenance and calibration settings easy accessible from a dropdown-button in the navbar.", "archive": "https://github.com/xyzaxyz/OctoPrint-Finetunerptr/archive/master.zip", "author": "Andreas Bruckmann", "homepage": "https://github.com/xyzaxyz/OctoPrint-Finetunerptr", "page": "https://plugins.octoprint.org/plugins/finetunerptr/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/finetunerptr/OctoPrint-FineTuneRptr.png", "abandoned": false, "github": {"latest_release": {"name": "V1.3.6.3", "date": "2018-03-17 15:44:14 +0000", "tag": "1.3.6.3"}, "releases": 4, "last_push": "2018-03-17 15:41:53 +0000", "stars": 8, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "octoprint-grbl-plugin", "published": "2017-05-11 00:00:00 +0000", "title": "Grbl support for OctoPrint", "description": "Support Grbl style GCODE for using CNCs and Laser engravers with OctoPrint.", "archive": "https://github.com/mic159/octoprint-grbl-plugin/archive/master.zip", "author": "mic159", "homepage": "https://github.com/mic159/octoprint-grbl-plugin", "page": "https://plugins.octoprint.org/plugins/octoprint-grbl-plugin/", "compatibility": {"octoprint": ["1.3.0"], "os": [], "python": ">=2.7,<3"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/grbl/Grbl_logo.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.2", "date": "2018-04-19 13:45:43 +0000", "tag": "1.0.2"}, "releases": 3, "last_push": "2018-04-19 13:46:50 +0000", "stars": 36, "issues": {"open": 8, "closed": 2}}, "stats": {"instances_month": 3, "install_events_month": 1, "instances_week": 3, "install_events_week": 0}}, {"id": "OctoPNP", "published": "2017-05-19 00:00:00 +0000", "title": "OctoPNP", "description": "OctoPrint plugin for camera based pick 'n place operations", "archive": "https://github.com/platsch/OctoPNP/archive/master.zip", "author": "Florens Wasserfall", "homepage": "https://github.com/platsch/OctoPNP", "page": "https://plugins.octoprint.org/plugins/OctoPNP/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/OctoPNP/screenshot.png", "abandoned": false, "github": {"last_push": "2021-11-01 10:13:03 +0000", "stars": 39, "issues": {"open": 5, "closed": 1}}, "stats": {"instances_month": 17, "install_events_month": 3, "instances_week": 15, "install_events_week": 0}}, {"id": "Octoslack", "published": "2017-05-20 00:00:00 +0000", "title": "Octoslack", "description": "An OctoPrint plugin for monitoring your printer and prints via Slack, Mattermost, Pushbullet, Pushover, Rocket.Chat, Discord, Riot/Matrix, or Microsoft Teams", "archive": "https://github.com/fraschetti/Octoslack/archive/master.zip", "author": "Chris Fraschetti", "homepage": "https://github.com/fraschetti/Octoslack", "page": "https://plugins.octoprint.org/plugins/Octoslack/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/Octoslack/Octoslack-PrintProgress_SlackOnly.png", "abandoned": false, "github": {"latest_release": {"name": "2.2.0 - Migration to native Slack libraries", "date": "2021-05-15 05:46:12 +0000", "tag": "2.2.0"}, "releases": 27, "last_push": "2022-11-05 07:55:19 +0000", "stars": 74, "issues": {"open": 40, "closed": 75}}, "stats": {"instances_month": 457, "install_events_month": 29, "instances_week": 367, "install_events_week": 9}}, {"id": "actioncommands", "published": "2017-06-30 00:00:00 +0000", "title": "Action Commands", "description": "Adds handling for user-definable action commands.", "archive": "https://github.com/benlye/OctoPrint-ActionCommandsPlugin/archive/master.zip", "author": "Ben Lye", "homepage": "https://github.com/benlye/OctoPrint-ActionCommandsPlugin", "page": "https://plugins.octoprint.org/plugins/actioncommands/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/actioncommands/settings.png", "abandoned": false, "github": {"latest_release": {"name": "0.5", "date": "2022-02-04 08:39:29 +0000", "tag": "0.5"}, "releases": 5, "last_push": "2022-02-04 08:35:15 +0000", "stars": 16, "issues": {"open": 1, "closed": 6}}, "stats": {"instances_month": 627, "install_events_month": 33, "instances_week": 470, "install_events_week": 6}}, {"id": "BLTouch", "published": "2017-07-14 00:00:00 +0000", "title": "OctoPrint-BLTouch", "description": "Simple plugin to add BLTouch controls to the Control tab.", "archive": "https://github.com/jneilliii/OctoPrint-BLTouch/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-BLTouch", "page": "https://plugins.octoprint.org/plugins/BLTouch/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/BLTouch/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.4", "date": "2020-10-08 20:04:11 +0000", "tag": "0.3.4"}, "releases": 9, "last_push": "2024-01-14 15:58:39 +0000", "stars": 19, "issues": {"open": 2, "closed": 18}}, "stats": {"instances_month": 8777, "install_events_month": 730, "instances_week": 5973, "install_events_week": 156}}, {"id": "polarcloud", "published": "2017-07-14 00:00:00 +0000", "title": "Polar Cloud", "description": "Connects OctoPrint to the Polar Cloud so you can easily monitor and control OctoPrint outside of your local network", "archive": "https://github.com/markwal/OctoPrint-PolarCloud/archive/master.zip", "author": "Mark Walker", "homepage": "https://github.com/markwal/OctoPrint-PolarCloud/blob/master/README.md", "page": "https://plugins.octoprint.org/plugins/polarcloud/", "compatibility": {"octoprint": ["1.3.4"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/polarcloud/polarcloud.png", "abandoned": false, "github": {"latest_release": {"name": "1.17", "date": "2023-01-21 03:21:06 +0000", "tag": "1.17"}, "releases": 20, "last_push": "2023-01-21 03:14:33 +0000", "stars": 15, "issues": {"open": 8, "closed": 55}}, "stats": {"instances_month": 206, "install_events_month": 14, "instances_week": 130, "install_events_week": 2}}, {"id": "costestimation", "published": "2017-07-16 00:00:00 +0000", "title": "CostEstimation", "description": "Displays the estimated print cost for the loaded model", "archive": "https://github.com/OllisGit/OctoPrint-CostEstimation/releases/latest/download/master.zip", "author": "Sven Lohrmann, Olli", "homepage": "https://github.com/OllisGit/OctoPrint-CostEstimation", "page": "https://plugins.octoprint.org/plugins/costestimation/", "compatibility": {"octoprint": ["1.2.14", "1.3.6", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "V3.5.0", "date": "2022-02-14 18:33:44 +0000", "tag": "3.5.0"}, "releases": 6, "last_push": "2022-02-14 18:29:15 +0000", "stars": 21, "issues": {"open": 7, "closed": 14}}, "stats": {"instances_month": 4258, "install_events_month": 313, "instances_week": 3132, "install_events_week": 60}}, {"id": "simpleemergencystop", "published": "2017-07-23 00:00:00 +0000", "title": "Simple Emergency Stop", "description": "Add an emergency stop buton on NavBar!", "archive": "https://github.com/Sebclem/OctoPrint-SimpleEmergencyStop/archive/master.zip", "author": "Sebastien Clement (SebClem)", "homepage": "https://github.com/Sebclem/OctoPrint-SimpleEmergencyStop", "page": "https://plugins.octoprint.org/plugins/simpleemergencystop/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/simpleemergencystop/emergencystopsign.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.6", "date": "2024-04-10 12:31:58 +0000", "tag": "1.0.6"}, "releases": 18, "last_push": "2024-04-10 12:31:01 +0000", "stars": 20, "issues": {"open": 6, "closed": 14}}, "stats": {"instances_month": 9350, "install_events_month": 695, "instances_week": 6587, "install_events_week": 151}}, {"id": "youtubelive", "published": "2017-07-23 00:00:00 +0000", "title": "YouTube Live", "description": "Simple plugin to add a YouTube Live tab to OctoPrint.", "archive": "https://github.com/jneilliii/OctoPrint-YouTubeLive/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-YouTubeLive", "page": "https://plugins.octoprint.org/plugins/youtubelive/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/youtubelive/tab_screenshot.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.5.3", "date": "2024-04-27 00:23:01 +0000", "tag": "0.5.3"}, "releases": 8, "last_push": "2024-04-27 00:21:17 +0000", "stars": 43, "issues": {"open": 4, "closed": 60}}, "stats": {"instances_month": 230, "install_events_month": 30, "instances_week": 145, "install_events_week": 7}}, {"id": "eeprom_MPSelectMini", "published": "2017-08-13 00:00:00 +0000", "title": "EEPROM Editor for Monoprice Select Mini", "description": "Makes it possible to change the EEPROM values of the Monoprice Select Mini or Malyan M200 Firmware through OctoPrint", "archive": "https://github.com/bruhmann/OctoPrint-EEprom-MPSelectMini/archive/master.zip", "author": "Brian Ruhmann", "homepage": "https://github.com/bruhmann/OctoPrint-EEprom-MPSelectMini", "page": "https://plugins.octoprint.org/plugins/eeprom_MPSelectMini/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/eeprom_mpselectmini/screen.png", "abandoned": false, "github": {"last_push": "2020-07-18 18:24:56 +0000", "stars": 3, "issues": {"open": 1, "closed": 2}}, "stats": {"instances_month": 73, "install_events_month": 7, "instances_week": 48, "install_events_week": 1}}, {"id": "Hangprinter", "published": "2017-08-20 00:00:00 +0000", "title": "OctoPrint-Hangprinter", "description": "This plugin provides some useful hangprinter control elements. It can be used for setting up and calibration of a Hangprinter.", "archive": "https://github.com/mariolukas/OctoPrint-Hangprinter/archive/master.zip", "author": "Mario Lukas", "homepage": "https://github.com/mariolukas/OctoPrint-Hangprinter", "page": "https://plugins.octoprint.org/plugins/Hangprinter/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/Hangprinter/screenshot.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.1.5", "date": "2017-08-24 21:20:06 +0000", "tag": "0.1.5"}, "releases": 5, "last_push": "2017-08-24 21:18:39 +0000", "stars": 2, "issues": {"open": 3, "closed": 0}}, "stats": {"instances_month": 1, "install_events_month": 1, "instances_week": 1, "install_events_week": 0}}, {"id": "filamentmanager", "published": "2017-08-22 00:00:00 +0000", "title": "FilamentManager", "description": "Filament Manager for OctoPrint", "archive": "https://github.com/OllisGit/OctoPrint-FilamentManager/releases/latest/download/master.zip", "author": "Sven Lohrmann, Olli", "homepage": "https://github.com/OllisGit/OctoPrint-FilamentManager", "page": "https://plugins.octoprint.org/plugins/filamentmanager/", "compatibility": {"octoprint": ["1.3.6", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "V1.9.1", "date": "2021-11-15 21:39:39 +0000", "tag": "1.9.1"}, "releases": 11, "last_push": "2021-11-15 21:35:32 +0000", "stars": 52, "issues": {"open": 52, "closed": 64}}, "stats": {"instances_month": 5472, "install_events_month": 313, "instances_week": 3832, "install_events_week": 65}}, {"id": "filetypes", "published": "2017-08-23 00:00:00 +0000", "title": "Filetypes", "description": "Let you select file types visible in upload dialog", "archive": "https://github.com/TheLongRunSmoke/OctoPrint-Filetypes/archive/master.zip", "author": "thelongrunsmoke", "homepage": "https://github.com/TheLongRunSmoke/OctoPrint-Filetypes", "page": "https://plugins.octoprint.org/plugins/filetypes/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/filetypes/screen.jpg", "abandoned": true, "github": {"latest_release": {"name": "Initial release", "date": "2017-08-23 04:56:50 +0000", "tag": "v0.1.0"}, "releases": 1, "last_push": "2017-08-23 04:08:46 +0000", "stars": 0, "issues": {"open": 2, "closed": 1}}, "stats": {"instances_month": 13, "install_events_month": 1, "instances_week": 9, "install_events_week": 0}}, {"id": "custombackground", "published": "2017-08-27 00:00:00 +0000", "title": "OctoPrint-CustomBackground", "description": "Plugin to change the background image on the temperature graph.", "archive": "https://github.com/jneilliii/OctoPrint-CustomBackground/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-CustomBackground", "page": "https://plugins.octoprint.org/plugins/custombackground/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/CustomBackground/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.0", "date": "2020-12-25 07:07:36 +0000", "tag": "1.0.0"}, "releases": 14, "last_push": "2024-01-14 15:58:39 +0000", "stars": 11, "issues": {"open": 2, "closed": 30}}, "stats": {"instances_month": 907, "install_events_month": 54, "instances_week": 696, "install_events_week": 12}}, {"id": "tplinksmartplug", "published": "2017-09-03 00:00:00 +0000", "title": "OctoPrint-TPLinkSmartplug", "description": "Plugin to control TP-Link Smartplug devices from OctoPrint web interface.", "archive": "https://github.com/jneilliii/OctoPrint-TPLinkSmartplug/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-TPLinkSmartplug", "page": "https://plugins.octoprint.org/plugins/tplinksmartplug/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/TPLinkSmartplug/screenshot_on.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.3", "date": "2023-03-18 14:35:08 +0000", "tag": "1.0.3"}, "releases": 61, "last_push": "2024-01-14 15:59:11 +0000", "stars": 107, "issues": {"open": 29, "closed": 277}}, "stats": {"instances_month": 2951, "install_events_month": 205, "instances_week": 2300, "install_events_week": 53}}, {"id": "RepetierInformer", "published": "2017-09-18 00:00:00 +0000", "title": "OctoPrint-RepetierInformer", "description": "Send notices to the Repetier-Informer app.", "archive": "https://github.com/drdelaney/OctoPrint-RepetierInformer/archive/master.zip", "author": "Dan Delaney", "homepage": "https://github.com/drdelaney/OctoPrint-RepetierInformer", "page": "https://plugins.octoprint.org/plugins/RepetierInformer/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/RepetierInformer/RepetierInformer-appNotification.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.6", "date": "2018-11-24 18:25:23 +0000", "tag": "0.1.6"}, "releases": 4, "last_push": "2018-11-24 18:24:16 +0000", "stars": 0, "issues": {"open": 3, "closed": 3}}, "stats": {"instances_month": 2, "install_events_month": 1, "instances_week": 0, "install_events_week": 0}}, {"id": "HeaterTimeout", "published": "2017-09-25 00:00:00 +0000", "title": "HeaterTimeout", "description": "Automatically shut off heaters if no print has been started.", "archive": "https://github.com/Andy-ch/OctoPrint-HeaterTimeout/archive/master.zip", "author": "Andrew Cherevatkin, Uriah Welcome", "homepage": "https://github.com/Andy-ch/OctoPrint-HeaterTimeout", "page": "https://plugins.octoprint.org/plugins/HeaterTimeout/", "compatibility": {"octoprint": ["1.3.1"], "os": [], "python": ">=2.7,<4"}, "license": "Apache 2", "abandoned": false, "github": {"latest_release": {"name": "Octoprint HeaterTimeout 0.0.4", "date": "2021-10-19 19:15:21 +0000", "tag": "0.0.4"}, "releases": 1, "last_push": "2023-05-28 14:04:56 +0000", "stars": 4, "issues": {"open": 7, "closed": 0}}, "stats": {"instances_month": 4491, "install_events_month": 272, "instances_week": 3216, "install_events_week": 56}}, {"id": "GcodeEditor", "published": "2017-11-01 00:00:00 +0000", "title": "GcodeEditor", "description": "Edit gcode that's been uploaded to OctoPrint", "archive": "https://github.com/ieatacid/OctoPrint-GcodeEditor/archive/master.zip", "author": "ieatacid", "homepage": "https://github.com/ieatacid/OctoPrint-GcodeEditor", "page": "https://plugins.octoprint.org/plugins/GcodeEditor/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/GcodeEditor/edit_gcode.png", "abandoned": false, "github": {"latest_release": {"name": "0.2.14", "date": "2023-04-17 23:05:49 +0000", "tag": "0.2.14"}, "releases": 13, "last_push": "2023-05-18 01:17:17 +0000", "stars": 21, "issues": {"open": 0, "closed": 29}}, "stats": {"instances_month": 3465, "install_events_month": 176, "instances_week": 2480, "install_events_week": 33}}, {"id": "themeify", "published": "2017-11-11 00:00:00 +0000", "title": "Themeify", "description": "Beautiful themes for octoprint", "archive": "https://github.com/birkbjo/OctoPrint-Themeify/archive/master.zip", "author": "Birk Johansson", "homepage": "https://github.com/birkbjo/OctoPrint-Themeify", "page": "https://plugins.octoprint.org/plugins/themeify/", "compatibility": {"octoprint": ["1.3.5"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/themeify/discorded_ss.png", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2020-04-02 09:03:04 +0000", "tag": "v1.2.2"}, "releases": 10, "last_push": "2020-09-04 00:25:50 +0000", "stars": 93, "issues": {"open": 64, "closed": 43}}, "stats": {"instances_month": 15949, "install_events_month": 1116, "instances_week": 11744, "install_events_week": 241}}, {"id": "preheat", "published": "2017-11-21 00:00:00 +0000", "title": "Preheat Button", "description": "Automatically heat nozzle and bed to the printing temperature of the current gcode file", "archive": "https://github.com/marian42/octoprint-preheat/archive/master.zip", "author": "Marian Kleineberg", "homepage": "https://github.com/marian42/octoprint-preheat", "page": "https://plugins.octoprint.org/plugins/preheat/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/preheat/preheat.png", "abandoned": false, "github": {"latest_release": {"name": "Add preheat on file select feature and fix a UI bug with UI Customizer", "date": "2021-05-31 22:55:57 +0000", "tag": "0.8.0"}, "releases": 13, "last_push": "2021-05-31 22:41:35 +0000", "stars": 37, "issues": {"open": 8, "closed": 46}}, "stats": {"instances_month": 10833, "install_events_month": 798, "instances_week": 7863, "install_events_week": 171}}, {"id": "tasmota", "published": "2017-11-24 00:00:00 +0000", "title": "OctoPrint-Tasmota", "description": "Simple plugin to control sonoff devices that have been flashed with Tasmota.", "archive": "https://github.com/jneilliii/OctoPrint-Tasmota/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-Tasmota", "page": "https://plugins.octoprint.org/plugins/tasmota/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/tasmota/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "1.1.3", "date": "2022-10-15 20:46:19 +0000", "tag": "1.1.3"}, "releases": 66, "last_push": "2024-01-14 15:59:09 +0000", "stars": 61, "issues": {"open": 12, "closed": 148}}, "stats": {"instances_month": 1304, "install_events_month": 56, "instances_week": 966, "install_events_week": 14}}, {"id": "astroprint", "published": "2017-12-15 00:00:00 +0000", "title": "AstroPrint Cloud", "description": "Wirelessly manage and monitor your OctoPi powered printer from the AstroPrint Platform (AP Mobile Apps, AP Desktop Software, & AP Web Portal).", "archive": "https://github.com/AstroPrint/OctoPrint-AstroPrint/archive/master.zip", "author": "AstroPrint", "homepage": "https://github.com/AstroPrint/OctoPrint-AstroPrint/blob/master/README.md", "page": "https://plugins.octoprint.org/plugins/astroprint/", "compatibility": {"octoprint": ["1.3.4"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/astroprint/astroprint-hero.jpg", "abandoned": false, "github": {"latest_release": {"name": "1.6.5", "date": "2021-05-19 19:25:14 +0000", "tag": "1.6.5"}, "releases": 41, "last_push": "2021-05-19 19:24:28 +0000", "stars": 31, "issues": {"open": 15, "closed": 46}}, "stats": {"instances_month": 1077, "install_events_month": 59, "instances_week": 707, "install_events_week": 13}}, {"id": "display_eta", "published": "2017-12-19 00:00:00 +0000", "title": "OctoPrint-Display-ETA", "description": "Show finish time (ETA) for current print.", "archive": "https://github.com/AlexVerrico/Octoprint-Display-ETA/archive/master.zip", "author": "AlexVerrico, Pablo Ventura", "homepage": "https://github.com/AlexVerrico/Octoprint-Display-ETA", "page": "https://plugins.octoprint.org/plugins/display_eta/", "compatibility": {"octoprint": ["1.3.6"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/display_eta/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "Version 2.2.0 - Feature update", "date": "2022-04-13 11:05:35 +0000", "tag": "2.2.0"}, "releases": 12, "last_push": "2022-04-13 11:03:27 +0000", "stars": 10, "issues": {"open": 8, "closed": 19}}, "stats": {"instances_month": 1965, "install_events_month": 187, "instances_week": 1359, "install_events_week": 42}}, {"id": "TerminalCommands", "published": "2017-12-31 00:00:00 +0000", "title": "OctoPrint-TerminalCommands", "description": "Lets you add custom G-code command buttons to OctoPrint's Terminal view tab", "archive": "https://github.com/ieatacid/OctoPrint-TerminalCommands/archive/master.zip", "author": "ieatacid", "homepage": "https://github.com/ieatacid/OctoPrint-TerminalCommands", "page": "https://plugins.octoprint.org/plugins/TerminalCommands/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/TerminalCommands/terminal_tab.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.8", "date": "2022-06-04 23:05:02 +0000", "tag": "0.1.8"}, "releases": 8, "last_push": "2022-06-04 23:03:04 +0000", "stars": 12, "issues": {"open": 12, "closed": 8}}, "stats": {"instances_month": 342, "install_events_month": 24, "instances_week": 239, "install_events_week": 5}}, {"id": "firmwareupdater", "published": "2018-01-15 00:00:00 +0000", "title": "Firmware Updater", "description": "Update your printer's firmware from OctoPrint", "archive": "https://github.com/OctoPrint/OctoPrint-FirmwareUpdater/archive/master.zip", "author": "Ben Lye, Gina H\u00e4u\u00dfge, Nicanor Romero Venier", "homepage": "https://github.com/OctoPrint/OctoPrint-FirmwareUpdater", "page": "https://plugins.octoprint.org/plugins/firmwareupdater/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/firmwareupdater/firmware-updater.png", "abandoned": false, "github": {"latest_release": {"name": "1.14.0", "date": "2023-03-20 11:37:33 +0000", "tag": "1.14.0"}, "releases": 76, "last_push": "2023-07-10 07:35:47 +0000", "stars": 347, "issues": {"open": 4, "closed": 255}}, "stats": {"instances_month": 25808, "install_events_month": 1392, "instances_week": 20008, "install_events_week": 314}}, {"id": "m73progress", "published": "2018-01-16 00:00:00 +0000", "title": "M73 Progress", "description": "A plugin to update the built-in progress bar on your printer's LCD.", "archive": "https://github.com/cesarvandevelde/OctoPrint-M73Progress/archive/master.zip", "author": "Cesar Vandevelde", "homepage": "https://github.com/cesarvandevelde/OctoPrint-M73Progress", "page": "https://plugins.octoprint.org/plugins/m73progress/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/m73progress/m73progress.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.2.1", "date": "2020-06-24 06:49:15 +0000", "tag": "v0.2.1"}, "releases": 3, "last_push": "2020-06-24 06:42:12 +0000", "stars": 22, "issues": {"open": 6, "closed": 9}}, "stats": {"instances_month": 2860, "install_events_month": 193, "instances_week": 2061, "install_events_week": 35}}, {"id": "webcamtab", "published": "2018-01-16 00:00:00 +0000", "title": "WebcamTab", "description": "Moves the webcam stream from Control tab to its own Webcam tab.", "archive": "https://github.com/gruvin/OctoPrint-WebcamTab/archive/master.zip", "author": "Sven Lohrmann (original), Bryan J. Rentoul", "homepage": "https://github.com/gruvin/OctoPrint-WebcamTab", "page": "https://plugins.octoprint.org/plugins/webcamtab/", "compatibility": {"octoprint": ["1.3.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Support for OctoPrint 1.9.0 RELEASE by alex1platon", "date": "2023-06-20 01:10:34 +0000", "tag": "0.3.1"}, "releases": 8, "last_push": "2023-06-20 00:52:56 +0000", "stars": 6, "issues": {"open": 1, "closed": 12}}, "stats": {"instances_month": 1400, "install_events_month": 116, "instances_week": 955, "install_events_week": 26}}, {"id": "floatingnavbar", "published": "2018-01-17 00:00:00 +0000", "title": "OctoPrint-FloatingNavbar", "description": "Make the navbar float/stick to the top of the page.", "archive": "https://github.com/jneilliii/OctoPrint-FloatingNavbar/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-FloatingNavbar", "page": "https://plugins.octoprint.org/plugins/floatingnavbar/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/floatingnavbar/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.7", "date": "2021-05-02 00:51:38 +0000", "tag": "0.3.7"}, "releases": 9, "last_push": "2024-01-14 15:58:39 +0000", "stars": 10, "issues": {"open": 3, "closed": 5}}, "stats": {"instances_month": 3630, "install_events_month": 129, "instances_week": 2632, "install_events_week": 31}}, {"id": "mqttpublish", "published": "2018-01-17 00:00:00 +0000", "title": "OctoPrint-MQTTPublish", "description": "Add buttons to navbar to publish messages to MQTT server.", "archive": "https://github.com/jneilliii/OctoPrint-MQTTPublish/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-MQTTPublish", "page": "https://plugins.octoprint.org/plugins/mqttpublish/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/mqttpublish/navbar.png", "abandoned": false, "github": {"latest_release": {"name": "0.6.0", "date": "2019-10-22 02:57:43 +0000", "tag": "0.6.0"}, "releases": 7, "last_push": "2024-01-14 15:58:56 +0000", "stars": 4, "issues": {"open": 4, "closed": 9}}, "stats": {"instances_month": 277, "install_events_month": 19, "instances_week": 214, "install_events_week": 5}}, {"id": "tasmota_mqtt", "published": "2018-01-17 00:00:00 +0000", "title": "OctoPrint-TasmotaMQTT", "description": "Plugin to control Tasmota devices via MQTT protocol.", "archive": "https://github.com/jneilliii/OctoPrint-TasmotaMQTT/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-TasmotaMQTT", "page": "https://plugins.octoprint.org/plugins/tasmota_mqtt/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/tasmota_mqtt/navbar.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.9", "date": "2021-10-23 03:30:53 +0000", "tag": "0.3.9"}, "releases": 23, "last_push": "2024-01-14 15:59:12 +0000", "stars": 18, "issues": {"open": 4, "closed": 41}}, "stats": {"instances_month": 360, "install_events_month": 13, "instances_week": 251, "install_events_week": 3}}, {"id": "M117SpeechSynthesis", "published": "2018-01-18 00:00:00 +0000", "title": "OctoPrint-M117SpeechSynthesis", "description": "Plugin to speak aloud M117 gcode messages via the web ui.", "archive": "https://github.com/jneilliii/OctoPrint-M117SpeechSynthesis/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-M117SpeechSynthesis", "page": "https://plugins.octoprint.org/plugins/M117SpeechSynthesis/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/M117SpeechSynthesis/settings.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.0", "date": "2022-04-16 23:50:38 +0000", "tag": "1.0.0"}, "releases": 14, "last_push": "2024-01-14 15:58:56 +0000", "stars": 6, "issues": {"open": 1, "closed": 12}}, "stats": {"instances_month": 95, "install_events_month": 14, "instances_week": 58, "install_events_week": 2}}, {"id": "taborder", "published": "2018-01-22 00:00:00 +0000", "title": "OctoPrint-TabOrder", "description": "Simple plugin to allow the ordering of tabs within OctoPrint.", "archive": "https://github.com/jneilliii/OctoPrint-TabOrder/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-TabOrder", "page": "https://plugins.octoprint.org/plugins/taborder/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/taborder/settings.png", "abandoned": false, "github": {"latest_release": {"name": "0.5.12", "date": "2020-11-22 18:30:55 +0000", "tag": "0.5.12"}, "releases": 23, "last_push": "2024-01-14 15:59:09 +0000", "stars": 22, "issues": {"open": 3, "closed": 38}}, "stats": {"instances_month": 2995, "install_events_month": 147, "instances_week": 2162, "install_events_week": 35}}, {"id": "atxpihat", "published": "2018-01-25 00:00:00 +0000", "title": "ATXPiHat", "description": "Software support for the ATXPiHat", "archive": "https://github.com/banichow/OctoPrint-Atxpihat/archive/master.zip", "follow_dependency_links": true, "author": "Brian Anichowski", "homepage": "https://www.baprojectworkshop.com", "page": "https://plugins.octoprint.org/plugins/atxpihat/", "compatibility": {"octoprint": ["1.3.6"], "os": ["linux"], "python": ">=2.7,<3"}, "license": "Creative Commons", "image": "https://plugins.octoprint.org/assets/img/plugins/atxpihat/screenshot2.png", "abandoned": false, "github": {"latest_release": {"name": "General update", "date": "2018-06-17 21:13:24 +0000", "tag": "1.1.5"}, "releases": 7, "last_push": "2018-07-09 00:56:31 +0000", "stars": 5, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 1, "install_events_month": 1, "instances_week": 1, "install_events_week": 0}}, {"id": "ESPurna_RGB", "published": "2018-01-30 00:00:00 +0000", "title": "ESPurna RGB", "description": "Control ESPurna RGB LED device wirelessly", "archive": "https://github.com/pokeimon/OctoPrint-ESPurnaRGB/archive/master.zip", "author": "Imon Daneshmand", "homepage": "https://github.com/pokeimon/OctoPrint-ESPurnaRGB", "page": "https://plugins.octoprint.org/plugins/ESPurna_RGB/", "compatibility": {"octoprint": ["1.3.1"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ESPurna_RGB/screenshot1.png", "abandoned": false, "github": {"latest_release": {"name": "v1.1.0", "date": "2021-02-19 21:08:41 +0000", "tag": "1.1.0"}, "releases": 2, "last_push": "2021-02-19 21:05:13 +0000", "stars": 2, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 5, "install_events_month": 2, "instances_week": 4, "install_events_week": 0}}, {"id": "malyan_connection_fix", "published": "2018-02-07 00:00:00 +0000", "title": "Malyan/Monoprice Connection Fix", "description": "Fixes connection issues with Malyan/Monoprice printers", "archive": "https://github.com/OctoPrint/OctoPrint-MalyanConnectionFix/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-MalyanConnectionFix", "page": "https://plugins.octoprint.org/plugins/malyan_connection_fix/", "compatibility": {"octoprint": ["1.3.6"], "os": ["linux", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.3 (stable release)", "date": "2019-12-13 16:44:11 +0000", "tag": "0.1.3"}, "releases": 4, "last_push": "2022-06-23 08:52:03 +0000", "stars": 37, "issues": {"open": 0, "closed": 8}}, "stats": {"instances_month": 427, "install_events_month": 29, "instances_week": 327, "install_events_week": 6}}, {"id": "CR10_Leveling", "published": "2018-02-26 00:00:00 +0000", "title": "Bed Leveling", "description": "Adds bed leveling buttons to the controls tab", "archive": "https://github.com/lsellens/OctoPrint-Cr10_leveling/archive/master.zip", "author": "lsellens, AvanOsch, electr0sheep", "homepage": "https://github.com/lsellens/OctoPrint-Cr10_leveling", "page": "https://plugins.octoprint.org/plugins/CR10_Leveling/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7, <4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/CR10_Leveling/control.png", "abandoned": false, "github": {"latest_release": {"name": "Version 2.1.3", "date": "2021-12-11 00:30:22 +0000", "tag": "v2.1.3"}, "releases": 17, "last_push": "2021-12-11 00:21:56 +0000", "stars": 10, "issues": {"open": 2, "closed": 28}}, "stats": {"instances_month": 2053, "install_events_month": 231, "instances_week": 1358, "install_events_week": 46}}, {"id": "octorant", "published": "2018-03-11 00:00:00 +0000", "title": "OctoPrint-Octorant", "description": "Discord plugin for OctoPrint", "archive": "https://github.com/bchanudet/OctoPrint-Octorant/archive/master.zip", "author": "Benjamin Chanudet", "homepage": "https://github.com/bchanudet/OctoPrint-Octorant", "page": "https://plugins.octoprint.org/plugins/octorant/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/octorant/featured.jpg", "abandoned": false, "github": {"latest_release": {"name": "v1.3.4 (stable)", "date": "2023-11-05 17:56:22 +0000", "tag": "1.3.4"}, "releases": 11, "last_push": "2023-11-05 17:54:00 +0000", "stars": 25, "issues": {"open": 11, "closed": 49}}, "stats": {"instances_month": 312, "install_events_month": 21, "instances_week": 231, "install_events_week": 5}}, {"id": "octolapse", "published": "2018-03-24 00:00:00 +0000", "title": "Octolapse", "description": "Create a stabilized timelapse of your 3D prints. Highly customizable, loads of presets, lots of fun. Requires OctoPrint 1.3.9 or higher. Python 3 users MUST install the Python 3 Development package before installation.", "archive": "https://github.com/FormerLurker/Octolapse/archive/master.zip", "author": "Brad Hochgesang", "homepage": "https://formerlurker.github.io/Octolapse/", "page": "https://plugins.octoprint.org/plugins/octolapse/", "compatibility": {"octoprint": ["1.3.9"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPL-3.0", "image": "https://plugins.octoprint.org/assets/img/plugins/octolapse/tab_mini.png", "abandoned": false, "github": {"latest_release": {"name": "V0.4.5", "date": "2023-11-08 19:12:35 +0000", "tag": "v0.4.5"}, "releases": 34, "last_push": "2023-11-08 18:51:13 +0000", "stars": 624, "issues": {"open": 280, "closed": 567}}, "stats": {"instances_month": 26993, "install_events_month": 1870, "instances_week": 21680, "install_events_week": 450}}, {"id": "DisplayLayerProgress", "published": "2018-04-09 00:00:00 +0000", "title": "DisplayLayerProgress", "description": "Displays the Layer, Progress and other data on \"Printer-Display\", \"NavBar\", \"BrowserTab-Title\" and in the Browser as a simulated \"Printer-Display\"", "archive": "https://github.com/OllisGit/OctoPrint-DisplayLayerProgress/releases/latest/download/master.zip", "author": "Olli", "homepage": "https://github.com/OllisGit/OctoPrint-DisplayLayerProgress", "page": "https://plugins.octoprint.org/plugins/DisplayLayerProgress/", "compatibility": {"octoprint": ["1.3.10", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://github.com/OllisGit/OctoPrint-DisplayLayerProgress/raw/master/screenshots/navbar.jpg", "abandoned": false, "github": {"latest_release": {"name": "V1.28.0", "date": "2022-01-26 23:12:44 +0000", "tag": "1.28.0"}, "releases": 68, "last_push": "2022-07-09 16:41:16 +0000", "stars": 123, "issues": {"open": 26, "closed": 243}}, "stats": {"instances_month": 16688, "install_events_month": 1018, "instances_week": 12056, "install_events_week": 221}}, {"id": "bedlevelvisualizer", "published": "2018-04-14 00:00:00 +0000", "title": "Bed Level Visualizer", "description": "Displays 3D mesh of bed topography report.", "archive": "https://github.com/jneilliii/OctoPrint-BedLevelVisualizer/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-BedLevelVisualizer/", "page": "https://plugins.octoprint.org/plugins/bedlevelvisualizer/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT License", "image": "https://plugins.octoprint.org/assets/img/plugins/bedlevelvisualizer/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "1.1.1", "date": "2022-01-01 19:53:39 +0000", "tag": "1.1.1"}, "releases": 60, "last_push": "2024-03-25 22:18:59 +0000", "stars": 362, "issues": {"open": 42, "closed": 477}}, "stats": {"instances_month": 34400, "install_events_month": 2454, "instances_week": 24372, "install_events_week": 560}}, {"id": "DeleteAfterPrint", "published": "2018-04-20 00:00:00 +0000", "title": "DeleteMoveAfterPrint", "description": "Deletes/Move automaticaly the Print-Model", "archive": "https://github.com/OllisGit/OctoPrint-DeleteAfterPrint/releases/latest/download/master.zip", "author": "Olli", "homepage": "https://github.com/OllisGit/OctoPrint-DeleteAfterPrint", "page": "https://plugins.octoprint.org/plugins/DeleteAfterPrint/", "compatibility": {"octoprint": ["1.3.10", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://raw.githubusercontent.com/OllisGit/OctoPrint-DeleteAfterPrint/master/screenshots/sidebar.jpg", "abandoned": false, "github": {"latest_release": {"name": "V1.10.0", "date": "2022-01-09 20:50:31 +0000", "tag": "1.10.0"}, "releases": 16, "last_push": "2022-01-09 20:45:53 +0000", "stars": 9, "issues": {"open": 10, "closed": 21}}, "stats": {"instances_month": 516, "install_events_month": 22, "instances_week": 404, "install_events_week": 5}}, {"id": "opitemp", "published": "2018-04-23 00:00:00 +0000", "title": "OpiTemp", "description": "Orange Pi temperature in the navbar.", "archive": "https://github.com/hashashin/OctoPrint-OpiTemp/archive/master.zip", "author": "hashashin", "homepage": "https://github.com/hashashin/OctoPrint-OpiTemp", "page": "https://plugins.octoprint.org/plugins/opitemp/", "compatibility": {"octoprint": ["1.3.8"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/opitemp/opitemp.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.8", "date": "2020-04-30 01:46:21 +0000", "tag": "1.0.8"}, "releases": 9, "last_push": "2020-04-30 01:45:18 +0000", "stars": 1, "issues": {"open": 2, "closed": 9}}, "stats": {"instances_month": 143, "install_events_month": 10, "instances_week": 89, "install_events_week": 3}}, {"id": "ipOnConnect", "published": "2018-05-04 00:00:00 +0000", "title": "OctoPrint-ipOnConnect", "description": "Simple plugin to display the ip address of connected OctoPrint instance on the control panel using M117 command.", "archive": "https://github.com/jneilliii/OctoPrint-ipOnConnect/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-ipOnConnect", "page": "https://plugins.octoprint.org/plugins/ipOnConnect/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ipOnConnect/screenshot.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.2.4", "date": "2020-07-29 03:06:46 +0000", "tag": "0.2.4"}, "releases": 6, "last_push": "2024-01-14 15:58:56 +0000", "stars": 14, "issues": {"open": 0, "closed": 9}}, "stats": {"instances_month": 3965, "install_events_month": 258, "instances_week": 2804, "install_events_week": 51}}, {"id": "multicam", "published": "2018-05-09 00:00:00 +0000", "title": "MultiCam", "description": "Extends the Control tab of OctoPrint, allowing the ability to switch between multiple webcam feeds.", "archive": "https://github.com/mikedmor/OctoPrint_MultiCam/archive/master.zip", "author": "Michael Morris", "homepage": "https://github.com/mikedmor/OctoPrint_MultiCam", "page": "https://plugins.octoprint.org/plugins/multicam/", "compatibility": {"octoprint": ["1.9.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.4.2", "date": "2023-09-03 18:40:37 +0000", "tag": "0.4.2"}, "releases": 18, "last_push": "2023-09-03 18:39:06 +0000", "stars": 45, "issues": {"open": 8, "closed": 47}}, "stats": {"instances_month": 2887, "install_events_month": 306, "instances_week": 1973, "install_events_week": 54}}, {"id": "dropbox_timelapse", "published": "2018-05-10 00:00:00 +0000", "title": "OctoPrint-Dropbox-Timelapse", "description": "Automatically upload rendered timelapses to Dropbox. Can also delete after upload to save space on the Raspberry Pi SD Card.", "archive": "https://github.com/jslay88/OctoPrint-Dropbox-Timelapse/archive/master.zip", "author": "Justin Slay, Sam Kemp, Brad Hochgesang", "homepage": "https://github.com/jslay88/OctoPrint-Dropbox-Timelapse", "page": "https://plugins.octoprint.org/plugins/dropbox_timelapse/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.4", "date": "2020-04-17 05:26:32 +0000", "tag": "0.1.4"}, "releases": 5, "last_push": "2020-04-17 05:25:36 +0000", "stars": 9, "issues": {"open": 6, "closed": 6}}, "stats": {"instances_month": 163, "install_events_month": 6, "instances_week": 130, "install_events_week": 1}}, {"id": "discordremote", "published": "2018-06-04 00:00:00 +0000", "title": "OctoPrint-DiscordRemote", "description": "Discord bot for OctoPrint", "archive": "https://github.com/cameroncros/OctoPrint-DiscordRemote/archive/master.zip", "author": "Cameron Cross, Benjamin Chanudet", "homepage": "https://github.com/cameroncros/OctoPrint-DiscordRemote", "page": "https://plugins.octoprint.org/plugins/discordremote/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/discordremote/featured.jpg", "abandoned": false, "github": {"latest_release": {"name": "Release v5.10.0", "date": "2023-10-16 23:31:38 +0000", "tag": "v5.10.0"}, "releases": 94, "last_push": "2023-10-16 23:25:54 +0000", "stars": 66, "issues": {"open": 8, "closed": 186}}, "stats": {"instances_month": 440, "install_events_month": 38, "instances_week": 316, "install_events_week": 6}}, {"id": "auth_bookedscheduler", "published": "2018-06-05 00:00:00 +0000", "title": "Auth Booked Scheduler", "description": "Authentication via Booked Scheduler", "archive": "https://github.com/soundstorm/OctoPrint-BookedScheduler/archive/master.zip", "author": "Luca Zimmermann", "homepage": "https://github.com/soundstorm/OctoPrint-BookedScheduler", "page": "https://plugins.octoprint.org/plugins/auth_bookedscheduler/", "compatibility": {"octoprint": ["1.3.0"], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "V1.3", "date": "2018-12-25 13:43:45 +0000", "tag": "1.3"}, "releases": 5, "last_push": "2018-12-25 13:43:01 +0000", "stars": 2, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "sidebartempgraph", "published": "2018-06-05 00:00:00 +0000", "title": "OctoPrint-SideBarTempGraph", "description": "Plugin to display temperature graph in the side bar.", "archive": "https://github.com/jneilliii/OctoPrint-SideBarTempGraph/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-SideBarTempGraph", "page": "https://plugins.octoprint.org/plugins/sidebartempgraph/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/sidebartempgraph/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.6", "date": "2020-08-04 15:12:51 +0000", "tag": "0.1.6"}, "releases": 7, "last_push": "2024-01-14 15:59:04 +0000", "stars": 3, "issues": {"open": 1, "closed": 8}}, "stats": {"instances_month": 384, "install_events_month": 22, "instances_week": 288, "install_events_week": 1}}, {"id": "cancelobject", "published": "2018-06-08 00:00:00 +0000", "title": "OctoPrint-Cancelobject", "description": "Cancel single objects during a print based on gcode comment lines", "archive": "https://github.com/paukstelis/OctoPrint-Cancelobject/archive/master.zip", "author": "Paul Paukstelis", "homepage": "https://github.com/paukstelis/OctoPrint-Cancelobject", "page": "https://plugins.octoprint.org/plugins/cancelobject/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/cancelobject/cancelobject.png", "abandoned": false, "github": {"latest_release": {"name": "0.5.0", "date": "2024-02-05 01:23:30 +0000", "tag": "0.5.0"}, "releases": 13, "last_push": "2024-02-05 01:21:51 +0000", "stars": 105, "issues": {"open": 20, "closed": 54}}, "stats": {"instances_month": 10868, "install_events_month": 770, "instances_week": 7926, "install_events_week": 180}}, {"id": "shutdownprinter", "published": "2018-06-18 00:00:00 +0000", "title": "ShutdownPrinter", "description": "Plugin for shutdown printer after finishing a print job", "archive": "https://github.com/devildant/OctoPrint-ShutdownPrinter/archive/master.zip", "author": "devildant", "homepage": "https://github.com/devildant/OctoPrint-ShutdownPrinter", "page": "https://plugins.octoprint.org/plugins/shutdownprinter/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/shutdownprinter/sidebar.JPG", "abandoned": false, "github": {"latest_release": {"name": "1.0.8", "date": "2019-11-22 15:55:17 +0000", "tag": "1.0.8"}, "releases": 21, "last_push": "2022-05-22 01:56:55 +0000", "stars": 17, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 697, "install_events_month": 33, "instances_week": 443, "install_events_week": 6}}, {"id": "excluderegion", "published": "2018-07-05 00:00:00 +0000", "title": "Exclude Region", "description": "Adds the ability to prevent printing within rectangular or circular regions of the currently active gcode file", "archive": "https://github.com/bradcfisher/OctoPrint-ExcludeRegionPlugin/archive/master.zip", "author": "Brad Fisher", "homepage": "https://github.com/bradcfisher/OctoPrint-ExcludeRegionPlugin", "page": "https://plugins.octoprint.org/plugins/excluderegion/", "compatibility": {"octoprint": ["1.3.8"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/excluderegion/excluderegion-gcode-viewer.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.2", "date": "2022-12-08 00:56:34 +0000", "tag": "0.3.2"}, "releases": 8, "last_push": "2022-12-08 00:55:45 +0000", "stars": 55, "issues": {"open": 20, "closed": 46}}, "stats": {"instances_month": 9602, "install_events_month": 630, "instances_week": 6930, "install_events_week": 130}}, {"id": "gcodestatEstimator", "published": "2018-07-05 00:00:00 +0000", "title": "GcodeStat Estimator", "description": "uses data put in to g-code by gcodestat to estimate time to finish print", "archive": "https://github.com/arhi/OctoPrint-gcodestatEstimator/archive/master.zip", "author": "Bogdan Kecman", "homepage": "https://github.com/arhi/OctoPrint-gcodestatEstimator", "page": "https://plugins.octoprint.org/plugins/gcodestatEstimator/", "compatibility": {"octoprint": ["1.3.9"], "os": [], "python": ">=2.7,<3"}, "license": "unlicence", "abandoned": false, "github": {"latest_release": {"name": "0.3", "date": "2018-06-23 00:41:24 +0000", "tag": "0.3"}, "releases": 3, "last_push": "2021-02-21 11:35:32 +0000", "stars": 5, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 13, "install_events_month": 1, "instances_week": 6, "install_events_week": 0}}, {"id": "domoticz", "published": "2018-07-07 00:00:00 +0000", "title": "OctoPrint-Domoticz", "description": "Simple plugin to control light switches via Domoticz server.", "archive": "https://github.com/jneilliii/OctoPrint-Domoticz/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-Domoticz", "page": "https://plugins.octoprint.org/plugins/domoticz/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/domoticz/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.3", "date": "2020-10-16 17:44:11 +0000", "tag": "0.1.3"}, "releases": 9, "last_push": "2024-01-14 15:58:38 +0000", "stars": 3, "issues": {"open": 6, "closed": 14}}, "stats": {"instances_month": 50, "install_events_month": 3, "instances_week": 45, "install_events_week": 0}}, {"id": "PrintTimeGenius", "published": "2018-07-12 00:00:00 +0000", "title": "OctoPrint-PrintTimeGenius", "description": "Use a gcode pre-analysis to provide better print time estimation", "archive": "https://github.com/eyal0/OctoPrint-PrintTimeGenius/archive/master.zip", "author": "Eyal", "homepage": "https://github.com/eyal0/OctoPrint-PrintTimeGenius", "page": "https://plugins.octoprint.org/plugins/PrintTimeGenius/", "compatibility": {"octoprint": ["1.3.9rc1"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/PrintTimeGenius/precise.png", "abandoned": false, "github": {"latest_release": {"name": "2.3.3 Use collections.abc for analyze_gcode_comments", "date": "2024-04-16 20:26:35 +0000", "tag": "2.3.3"}, "releases": 42, "last_push": "2024-04-16 20:24:52 +0000", "stars": 189, "issues": {"open": 58, "closed": 189}}, "stats": {"instances_month": 39895, "install_events_month": 2307, "instances_week": 31638, "install_events_week": 534}}, {"id": "layerdisplay", "published": "2018-07-15 00:00:00 +0000", "title": "LayerDisplay", "description": "Displays the current layer and total layers for a print job.", "archive": "https://github.com/chatrat12/layerdisplay/archive/master.zip", "author": "Matt Thompson", "homepage": "https://github.com/chatrat12/layerdisplay", "page": "https://plugins.octoprint.org/plugins/layerdisplay/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/layerdisplay/layerdisplay.png", "abandoned": false, "github": {"latest_release": {"name": "0.4.3", "date": "2020-03-30 20:23:28 +0000", "tag": "0.4.3"}, "releases": 9, "last_push": "2021-08-04 11:07:26 +0000", "stars": 17, "issues": {"open": 9, "closed": 7}}, "stats": {"instances_month": 106, "install_events_month": 1, "instances_week": 78, "install_events_week": 0}}, {"id": "bedlevelingwizard", "published": "2018-07-16 00:00:00 +0000", "title": "OctoPrint-BedLevelingWizard", "description": "Plugin to aid in the process of manually leveling your bed.", "archive": "https://github.com/jneilliii/OctoPrint-BedLevelingWizard/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-BedLevelingWizard", "page": "https://plugins.octoprint.org/plugins/bedlevelingwizard/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.2.5", "date": "2022-10-15 18:50:31 +0000", "tag": "0.2.5"}, "releases": 14, "last_push": "2024-01-14 15:58:39 +0000", "stars": 26, "issues": {"open": 6, "closed": 26}}, "stats": {"instances_month": 2741, "install_events_month": 284, "instances_week": 1809, "install_events_week": 69}}, {"id": "statefulsidebar", "published": "2018-07-16 00:00:00 +0000", "title": "Stateful Sidebar", "description": "Plugin that monitors and stores the state of sidebar collapsed panels and restores that state upon next visit to OctoPrint.", "archive": "https://github.com/jneilliii/OctoPrint-StatefulSidebar/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-StatefulSidebar", "page": "https://plugins.octoprint.org/plugins/statefulsidebar/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.2", "date": "2019-10-22 02:48:08 +0000", "tag": "0.1.2"}, "releases": 4, "last_push": "2024-01-14 15:59:07 +0000", "stars": 3, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 147, "install_events_month": 5, "instances_week": 113, "install_events_week": 3}}, {"id": "MultipleUpload", "published": "2018-07-17 00:00:00 +0000", "title": "OctoPrint-MultipleUpload", "description": "Allow uploading multiple files at once", "archive": "https://github.com/eyal0/OctoPrint-MultipleUpload/archive/master.zip", "author": "Eyal", "homepage": "https://github.com/eyal0/OctoPrint-MultipleUpload", "page": "https://plugins.octoprint.org/plugins/MultipleUpload/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/MultipleUpload/open_files.png", "abandoned": false, "github": {"latest_release": {"name": "Python3 support", "date": "2020-04-01 01:15:54 +0000", "tag": "1.1.0"}, "releases": 2, "last_push": "2020-04-01 01:15:10 +0000", "stars": 3, "issues": {"open": 1, "closed": 2}}, "stats": {"instances_month": 549, "install_events_month": 29, "instances_week": 422, "install_events_week": 4}}, {"id": "rtmpstreamer", "published": "2018-08-13 00:00:00 +0000", "title": "OctoPrint-RTMPStreamer", "description": "Plugin that reencodes the mjpg stream provided by octopi/mjpgstreamer/yawcam and posts to any RTMP stream server (ie Twitch) and adds a tab that will allow for wathing configured stream assuming there is a webpage url that allows that type of connection.", "archive": "https://github.com/jneilliii/OctoPrint-RTMPStreamer/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-RTMPStreamer", "page": "https://plugins.octoprint.org/plugins/rtmpstreamer/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/rtmpstreamer/tab_screenshot.jpg", "abandoned": false, "github": {"latest_release": {"name": "1.0.5", "date": "2023-10-11 15:01:40 +0000", "tag": "1.0.5"}, "releases": 23, "last_push": "2024-01-14 15:58:58 +0000", "stars": 21, "issues": {"open": 7, "closed": 35}}, "stats": {"instances_month": 330, "install_events_month": 32, "instances_week": 216, "install_events_week": 8}}, {"id": "klipper", "published": "2018-08-21 00:00:00 +0000", "title": "OctoKlipper", "description": "A plugin for a better integration of Klipper into OctoPrint.", "archive": "https://github.com/thelastWallE/OctoprintKlipperPlugin/archive/master.zip", "author": "thelastWallE, Alice Weigt", "homepage": "https://github.com/thelastWallE/OctoprintKlipperPlugin", "page": "https://plugins.octoprint.org/plugins/klipper/", "compatibility": {"octoprint": ["1.3.8"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/klipper/message-log.png", "abandoned": false, "github": {"latest_release": {"name": "OctoKlipper 0.3.9.5", "date": "2023-02-27 17:01:12 +0000", "tag": "0.3.9.5"}, "releases": 41, "last_push": "2023-02-27 16:52:54 +0000", "stars": 65, "issues": {"open": 17, "closed": 56}}, "stats": {"instances_month": 4218, "install_events_month": 585, "instances_week": 2237, "install_events_week": 121}}, {"id": "filament_sensor_ng", "published": "2018-09-17 00:00:00 +0000", "title": "Filament Sensor NG", "description": "A filament monitor that pauses the print when your filament runs out and lets you restart it.", "archive": "https://github.com/Red-M/Octoprint-Filament-Reloaded/archive/master.zip", "author": "Red_M", "homepage": "https://github.com/Red-M/Octoprint-Filament-Reloaded", "page": "https://plugins.octoprint.org/plugins/filament_sensor_ng/", "compatibility": {"octoprint": ["1.3.9"], "os": ["linux", "freebsd"], "python": ">=2.7,<3"}, "license": "GPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.2", "date": "2018-09-18 21:31:27 +0000", "tag": "1.0.2"}, "releases": 3, "last_push": "2018-09-18 21:30:10 +0000", "stars": 11, "issues": {"open": 2, "closed": 1}}, "stats": {"instances_month": 16, "install_events_month": 2, "instances_week": 12, "install_events_week": 0}}, {"id": "ProgressBasedOnTime", "published": "2018-09-18 00:00:00 +0000", "title": "OctoPrint-ProgressBasedOnTime", "description": "Replace file based progression by time based progression", "archive": "https://github.com/celogeek/OctoPrint-ProgressBasedOnTime/archive/master.zip", "author": "Celogeek", "homepage": "https://github.com/celogeek/OctoPrint-ProgressBasedOnTime", "page": "https://plugins.octoprint.org/plugins/ProgressBasedOnTime/", "compatibility": {"octoprint": ["1.3.9"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "fix missing print time", "date": "2020-09-20 13:32:57 +0000", "tag": "0.1.6"}, "releases": 4, "last_push": "2020-09-20 13:31:11 +0000", "stars": 3, "issues": {"open": 1, "closed": 2}}, "stats": {"instances_month": 209, "install_events_month": 10, "instances_week": 153, "install_events_week": 2}}, {"id": "m73etaoverride", "published": "2018-09-18 00:00:00 +0000", "title": "M73 ETA Override", "description": "Plugin that overrides OctoPrint ETA to values from last M73 gcode sent to the printer", "archive": "https://github.com/gdombiak/OctoPrint-M73ETAOverride/archive/master.zip", "author": "Jakub Furman, Gaston Dombiak", "homepage": "https://github.com/gdombiak/OctoPrint-M73ETAOverride", "page": "https://plugins.octoprint.org/plugins/m73etaoverride/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.4", "date": "2020-12-05 20:49:59 +0000", "tag": "1.0.4"}, "releases": 3, "last_push": "2020-12-05 20:49:31 +0000", "stars": 12, "issues": {"open": 2, "closed": 0}}, "stats": {"instances_month": 308, "install_events_month": 10, "instances_week": 263, "install_events_week": 4}}, {"id": "wemoswitch", "published": "2018-09-18 00:00:00 +0000", "title": "OctoPrint-WemoSwitch", "description": "Plugin to control Belkin Wemo devices from OctoPrint web interface.", "archive": "https://github.com/jneilliii/OctoPrint-WemoSwitch/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-WemoSwitch", "page": "https://plugins.octoprint.org/plugins/wemoswitch/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/wemoswitch/screenshot_on.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.14", "date": "2023-07-05 00:46:11 +0000", "tag": "0.1.14"}, "releases": 22, "last_push": "2024-01-14 15:59:18 +0000", "stars": 12, "issues": {"open": 4, "closed": 57}}, "stats": {"instances_month": 229, "install_events_month": 14, "instances_week": 184, "install_events_week": 1}}, {"id": "kronos_data_collector", "published": "2018-09-26 00:00:00 +0000", "title": "Project Kronos Data Collector", "description": "Help build the Project Kronos print-failure autodetection neural network", "archive": "https://github.com/MrBreadWater/project-kronos-data-collector/archive/master.zip", "author": "Jacob Paniagua", "homepage": "https://github.com/MrBreadWater/project-kronos-data-collector", "page": "https://plugins.octoprint.org/plugins/kronos_data_collector/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Bug Fixes & Style Update", "date": "2020-04-27 04:37:00 +0000", "tag": "1.3.5"}, "releases": 13, "last_push": "2020-04-27 21:43:23 +0000", "stars": 15, "issues": {"open": 2, "closed": 8}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "OctoAutoremote", "published": "2018-09-28 00:00:00 +0000", "title": "OctoPrint_AutoRemote", "description": "A quick Autoremote/Tasker plugin for OctoPrint", "archive": "https://github.com/trunzoc/Octoprint_Autoremote/archive/master.zip", "author": "Craig Trunzo", "homepage": "https://github.com/trunzoc/Octoprint_AutoRemote", "page": "https://plugins.octoprint.org/plugins/OctoAutoremote/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/OctoAutoremote/settings.png", "abandoned": false, "github": {"latest_release": {"name": "JSON rework", "date": "2018-10-03 02:21:51 +0000", "tag": "1.5.0"}, "releases": 6, "last_push": "2021-07-16 13:14:48 +0000", "stars": 0, "issues": {"open": 1, "closed": 0}}, "stats": {"instances_month": 2, "install_events_month": 1, "instances_week": 2, "install_events_week": 0}}, {"id": "gitfiles", "published": "2018-09-29 00:00:00 +0000", "title": "OctoPrint-GitFiles", "description": "Use a github repository for keeping your OctoPrint Files collection up-to-date.", "archive": "https://github.com/OutsourcedGuru/OctoPrint-GitFiles/archive/master.zip", "author": "OutsourcedGuru", "homepage": "https://github.com/OutsourcedGuru/OctoPrint-GitFiles", "page": "https://plugins.octoprint.org/plugins/gitfiles/", "compatibility": {"octoprint": ["1.3.9"], "os": ["linux", "macos", "freebsd"], "python": ">=2.7,<3"}, "license": "MIT", "image": "https://user-images.githubusercontent.com/15971213/45835939-45777700-bcc0-11e8-80c6-2bc31e08f3ec.png", "abandoned": false, "github": {"last_push": "2019-02-27 04:27:52 +0000", "stars": 29, "issues": {"open": 3, "closed": 6}}, "stats": {"instances_month": 4, "install_events_month": 1, "instances_week": 2, "install_events_week": 0}}, {"id": "nexmonotifier", "published": "2018-10-02 00:00:00 +0000", "title": "OctoPrint-Nexmonotifier", "description": "Octoprint plugin for print completion notifications using Nexmo SMS gateway", "archive": "https://github.com/gfk76/OctoPrint-Nexmonotifier/archive/master.zip", "author": "Gert Kjerslev", "homepage": "https://github.com/gfk76/OctoPrint-Nexmonotifier", "page": "https://plugins.octoprint.org/plugins/nexmonotifier/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.1", "date": "2019-02-19 08:34:39 +0000", "tag": "1.1"}, "releases": 2, "last_push": "2019-02-19 08:10:01 +0000", "stars": 1, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "ABL_Expert", "published": "2018-10-04 00:00:00 +0000", "title": "Auto bed leveling expert", "description": "Marlin auto bed leveling control, mesh correction, and z probe handling. This plugin needs some features enabled in your firmware to work. Please read https://framagit.org/razer/Octoprint_ABL_Expert/-/blob/master/README.md for more information", "archive": "https://framagit.org/razer/Octoprint_ABL_Expert/-/archive/0.6/Octoprint_ABL_Expert-0.6.zip", "author": "razer", "homepage": "https://framagit.org/razer/Octoprint_ABL_Expert", "page": "https://plugins.octoprint.org/plugins/ABL_Expert/", "compatibility": {"octoprint": ["1.3.9"], "os": ["linux", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "stats": {"instances_month": 3514, "install_events_month": 363, "instances_week": 2314, "install_events_week": 82}}, {"id": "tuyasmartplug", "published": "2018-11-12 00:00:00 +0000", "title": "OctoPrint-TuyaSmartplug", "description": "Plugin to control Tuya based Smartplug devices from OctoPrint web interface.", "archive": "https://github.com/ziirish/OctoPrint-TuyaSmartplug/archive/master.zip", "author": "ziirish", "homepage": "https://github.com/ziirish/OctoPrint-TuyaSmartplug", "page": "https://plugins.octoprint.org/plugins/tuyasmartplug/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/TuyaSmartplug/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "Fixes on Issues #51 and #52", "date": "2023-05-01 20:40:23 +0000", "tag": "0.3.2"}, "releases": 7, "last_push": "2023-05-01 20:36:05 +0000", "stars": 19, "issues": {"open": 30, "closed": 27}}, "stats": {"instances_month": 481, "install_events_month": 60, "instances_week": 321, "install_events_week": 11}}, {"id": "active_filters_extended", "published": "2018-11-17 00:00:00 +0000", "title": "Active Filters Extended", "description": "Makes the enabled terminal filters persistent between browser reloads and from different connecting clients.", "archive": "https://github.com/jneilliii/OctoPrint-ActiveFiltersExtended/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-ActiveFiltersExtended", "page": "https://plugins.octoprint.org/plugins/active_filters_extended/", "compatibility": {"octoprint": ["1.2.6"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.0", "date": "2019-10-22 02:37:41 +0000", "tag": "0.1.0"}, "releases": 2, "last_push": "2024-01-14 15:58:38 +0000", "stars": 3, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 3403, "install_events_month": 36, "instances_week": 2498, "install_events_week": 7}}, {"id": "dragon_order", "published": "2018-11-18 00:00:00 +0000", "title": "OctoPrint-DragonOrder", "description": "Plugin that allows the re-ordering of navbar, sidebar, and tabs by dragging them into desired location within the UI.", "archive": "https://github.com/jneilliii/OctoPrint-DragonOrder/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-DragonOrder", "page": "https://plugins.octoprint.org/plugins/dragon_order/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.7", "date": "2020-11-06 19:50:57 +0000", "tag": "0.1.7"}, "releases": 8, "last_push": "2024-01-14 15:58:38 +0000", "stars": 8, "issues": {"open": 2, "closed": 17}}, "stats": {"instances_month": 842, "install_events_month": 35, "instances_week": 631, "install_events_week": 9}}, {"id": "signalnotifier", "published": "2018-12-04 00:00:00 +0000", "title": "OctoPrint_Signal-Notifier", "description": "Print completion notifications using Signal. Requires signal-cli.", "archive": "https://github.com/aerickson/OctoPrint_Signal-Notifier/archive/master.zip", "author": "Andrew Erickson", "homepage": "https://github.com/aerickson/OctoPrint_Signal-Notifier", "page": "https://plugins.octoprint.org/plugins/signalnotifier/", "compatibility": {"octoprint": ["1.2.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/signalnotifier/signalnotifier.png", "abandoned": false, "github": {"last_push": "2020-05-12 03:40:31 +0000", "stars": 9, "issues": {"open": 8, "closed": 8}}, "stats": {"instances_month": 29, "install_events_month": 2, "instances_week": 15, "install_events_week": 0}}, {"id": "SlicerSettingsParser", "published": "2018-12-22 00:00:00 +0000", "title": "SlicerSettingsParser", "description": "Plugin to analyze gcode for slicer settings comments and add additional metadata of such settings.", "archive": "https://github.com/larsjuhw/OctoPrint-SlicerSettingsParser/archive/master.zip", "author": "Larsjuhw, T6", "homepage": "https://github.com/larsjuhw/OctoPrint-SlicerSettingsParser", "page": "https://plugins.octoprint.org/plugins/SlicerSettingsParser/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "3.3.0", "date": "2023-11-20 16:56:32 +0000", "tag": "v3.3.0"}, "releases": 5, "last_push": "2023-11-20 16:54:48 +0000", "stars": 3, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 838, "install_events_month": 56, "instances_week": 600, "install_events_week": 9}}, {"id": "SlicerSettingsTab", "published": "2018-12-22 00:00:00 +0000", "title": "OctoPrint-SlicerSettingsTab", "description": "Adds tab which displays slicer settings of selected gcode file.", "archive": "https://github.com/larsjuhw/OctoPrint-SlicerSettingsTab/archive/master.zip", "author": "Larsjuhw, T6", "homepage": "https://github.com/larsjuhw/OctoPrint-SlicerSettingsTab", "page": "https://plugins.octoprint.org/plugins/SlicerSettingsTab/", "compatibility": {"octoprint": ["1.3.10"], "os": ["linux", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/SlicerSettingsTab/main.png", "abandoned": false, "github": {"latest_release": {"name": "1.1.0", "date": "2022-12-14 01:13:18 +0000", "tag": "v1.1.0"}, "releases": 6, "last_push": "2022-12-14 01:12:17 +0000", "stars": 8, "issues": {"open": 2, "closed": 4}}, "stats": {"instances_month": 293, "install_events_month": 24, "instances_week": 211, "install_events_week": 5}}, {"id": "IFTTT", "published": "2018-12-29 00:00:00 +0000", "title": "OctoPrint-IFTTT", "description": "Connects OctoPrint events to IFTTT", "archive": "https://github.com/tjjfvi/OctoPrint-IFTTT/archive/master.zip", "author": "T6", "homepage": "https://github.com/tjjfvi/OctoPrint-IFTTT", "page": "https://plugins.octoprint.org/plugins/IFTTT/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "v1.4.1", "date": "2022-12-30 13:20:38 +0000", "tag": "v1.4.1"}, "releases": 10, "last_push": "2022-12-28 15:05:26 +0000", "stars": 34, "issues": {"open": 9, "closed": 28}}, "stats": {"instances_month": 647, "install_events_month": 27, "instances_week": 481, "install_events_week": 6}}, {"id": "BetterHeaterTimeout", "published": "2019-01-02 00:00:00 +0000", "title": "OctoPrint-BetterHeaterTimeout", "description": "Turns off heaters after specified time being on and unused", "archive": "https://github.com/tjjfvi/OctoPrint-BetterHeaterTimeout/archive/master.zip", "author": "T6", "homepage": "https://github.com/tjjfvi/OctoPrint-BetterHeaterTimeout", "page": "https://plugins.octoprint.org/plugins/BetterHeaterTimeout/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/BetterHeaterTimeout/timedout.png", "abandoned": false, "github": {"latest_release": {"name": "1.3.0", "date": "2020-10-25 20:55:24 +0000", "tag": "v1.3.0"}, "releases": 5, "last_push": "2020-10-25 20:53:27 +0000", "stars": 12, "issues": {"open": 10, "closed": 8}}, "stats": {"instances_month": 2288, "install_events_month": 71, "instances_week": 1728, "install_events_week": 15}}, {"id": "LCD1602_I2cdisplay", "published": "2019-01-28 00:00:00 +0000", "title": "octoprint-LCD1602", "description": "This plug-in allows you to control a 16X2 lcd display (hd44780 connected to port I2C) to display the octoprint status. It is useful for people like me who have a printer without a display. It indicates on which port the printer is connected, the progress of printing. It also displays the remaining print time (thanks to a simple method). See https://github.com/n3bojs4/octoprint-LCD1602/blob/master/CHANGELOG.md for more details.", "archive": "https://github.com/n3bojs4/OctoPrint-Lcd1602/archive/master.zip", "author": "n3bojs4", "homepage": "https://github.com/n3bojs4/octoprint-LCD1602", "page": "https://plugins.octoprint.org/plugins/LCD1602_I2cdisplay/", "compatibility": {"octoprint": ["1.3.10"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/LCD1602_I2cdisplay/progress.jpg", "abandoned": false, "github": {"latest_release": {"name": "initial version", "date": "2019-02-08 13:37:39 +0000", "tag": "0.1"}, "releases": 1, "last_push": "2022-03-19 19:31:40 +0000", "stars": 15, "issues": {"open": 14, "closed": 13}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "hardwarepwm", "published": "2019-02-08 00:00:00 +0000", "title": "OctoPrint-Hardwarepwm", "description": "Plugin for true hardware PWM on the Raspberry Pi", "archive": "https://github.com/farfalleflickan/OctoPrint-Hardwarepwm/archive/master.zip", "author": "Daria Rostirolla", "homepage": "https://github.com/farfalleflickan/OctoPrint-Hardwarepwm", "page": "https://plugins.octoprint.org/plugins/hardwarepwm/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/hardwarepwm/settingsPage.png", "abandoned": false, "github": {"latest_release": {"name": "Hotfix for duty cycle not getting saved", "date": "2021-08-17 20:37:30 +0000", "tag": "v0.2.1"}, "releases": 7, "last_push": "2021-08-17 20:36:54 +0000", "stars": 9, "issues": {"open": 0, "closed": 5}}, "stats": {"instances_month": 28, "install_events_month": 6, "instances_week": 17, "install_events_week": 2}}, {"id": "filament_sensor_ng_orangepi", "published": "2019-02-18 00:00:00 +0000", "title": "FilamentSensor OrangePi", "description": "A filament monitor that pauses the print when your filament runs out and lets you restart it.", "archive": "https://github.com/deadly667/Octoprint-Filament-Sensor-ng-OrangePi/archive/master.zip", "author": "Deadly667", "homepage": "https://github.com/deadly667/Octoprint-Filament-Sensor-ng-OrangePi", "page": "https://plugins.octoprint.org/plugins/filament_sensor_ng_orangepi/", "compatibility": {"octoprint": ["1.3.9"], "os": ["linux", "freebsd"], "python": ">=2.7,<3"}, "license": "GPLv3", "abandoned": false, "github": {"last_push": "2019-02-16 18:55:37 +0000", "stars": 2, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 3, "install_events_month": 1, "instances_week": 2, "install_events_week": 0}}, {"id": "printtrack", "published": "2019-02-25 00:00:00 +0000", "title": "OctoPrint-PrintTrack", "description": "Keep track of your printer and prints with some simple additions & customizability.", "archive": "https://github.com/ElectricSquid/OctoPrint-PrintTrack/archive/master.zip", "author": "ElectricSquid", "homepage": "https://github.com/ElectricSquid/OctoPrint-PrintTrack", "page": "https://plugins.octoprint.org/plugins/printtrack/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/printtrack/printtrack_title.png", "abandoned": false, "github": {"last_push": "2020-09-25 22:54:18 +0000", "stars": 3, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 95, "install_events_month": 3, "instances_week": 68, "install_events_week": 1}}, {"id": "rgb_status", "published": "2019-02-27 00:00:00 +0000", "title": "RGB Status", "description": "Adds RGB LED support to OctoPrint with the ability to choose colors and effects based on the current status of your printer", "archive": "https://github.com/EricHigdon/OctoPrint-RGB_status/archive/master.zip", "author": "Eric Higdon", "homepage": "https://github.com/EricHigdon/OctoPrint-RGB_status", "page": "https://plugins.octoprint.org/plugins/rgb_status/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/rgb_status/featured.png", "abandoned": false, "github": {"latest_release": {"name": "V1.7.2", "date": "2020-06-20 16:01:08 +0000", "tag": "V1.7.2"}, "releases": 12, "last_push": "2021-02-04 20:48:34 +0000", "stars": 33, "issues": {"open": 31, "closed": 58}}, "stats": {"instances_month": 28, "install_events_month": 1, "instances_week": 20, "install_events_week": 0}}, {"id": "xMattersIntegration", "published": "2019-03-04 00:00:00 +0000", "title": "xMatters Integration", "description": "Event notifications using xMatters", "archive": "https://github.com/svv2014/OctoPrint-Xmatters-integration/archive/master.zip", "author": "svv2014", "homepage": "https://github.com/svv2014/OctoPrint-xMatters-integration", "page": "https://plugins.octoprint.org/plugins/xMattersIntegration/", "compatibility": {"octoprint": ["1.2.0"], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/xMattersIntegration/settings.png", "abandoned": false, "github": {"latest_release": {"name": "Custom Slack Message", "date": "2019-07-20 16:02:58 +0000", "tag": "0.1.8"}, "releases": 4, "last_push": "2019-07-20 16:01:34 +0000", "stars": 3, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "curalegacy", "published": "2019-03-28 00:00:00 +0000", "title": "CuraEngine Legacy", "description": "Plugin for slicing via the legacy version of CuraEngine from within OctoPrint, unbundled from OctoPrint starting with version 1.3.11", "archive": "https://github.com/OctoPrint/OctoPrint-CuraLegacy/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-CuraLegacy", "page": "https://plugins.octoprint.org/plugins/curalegacy/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.1.2", "date": "2021-03-02 07:08:26 +0000", "tag": "1.1.2"}, "releases": 6, "last_push": "2021-03-02 07:05:58 +0000", "stars": 18, "issues": {"open": 1, "closed": 10}}, "stats": {"instances_month": 913, "install_events_month": 74, "instances_week": 604, "install_events_week": 12}}, {"id": "bettergrblsupport", "published": "2019-04-01 00:00:00 +0000", "title": "Better Grbl Support", "description": "Provides core functionality and UI integration for GRBL based engravers and CNC machines", "archive": "https://github.com/synman/OctoPrint-Bettergrblsupport/archive/master.zip", "author": "Shell M. Shrader", "homepage": "https://github.com/synman/OctoPrint-Bettergrblsupport", "page": "https://plugins.octoprint.org/plugins/bettergrblsupport/", "compatibility": {"octoprint": ["1.3.10"], "os": [], "python": ">=2.7,<4"}, "license": "Apache 2.0", "image": "https://plugins.octoprint.org/assets/img/plugins/bettergrblsupport/Grbl_logo.png", "abandoned": false, "github": {"latest_release": {"name": "2.3.1", "date": "2023-11-12 06:25:13 +0000", "tag": "2.3.1"}, "releases": 63, "last_push": "2024-01-12 04:06:15 +0000", "stars": 61, "issues": {"open": 13, "closed": 79}}, "stats": {"instances_month": 254, "install_events_month": 69, "instances_week": 107, "install_events_week": 21}}, {"id": "DryRun", "published": "2019-04-02 00:00:00 +0000", "title": "DryRun", "description": "Print without heating/extruding.", "archive": "https://github.com/OllisGit/OctoPrint-DryRun/releases/latest/download/master.zip", "author": "Olli", "homepage": "https://github.com/OllisGit/OctoPrint-DryRun", "page": "https://plugins.octoprint.org/plugins/DryRun/", "compatibility": {"octoprint": ["1.3.10", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://github.com/OllisGit/OctoPrint-DryRun/raw/master/screenshots/StateAndNavBar.jpg", "abandoned": false, "github": {"latest_release": {"name": "V1.2.0", "date": "2020-05-25 21:42:08 +0000", "tag": "1.2.0"}, "releases": 8, "last_push": "2020-05-25 21:39:32 +0000", "stars": 12, "issues": {"open": 4, "closed": 7}}, "stats": {"instances_month": 331, "install_events_month": 9, "instances_week": 252, "install_events_week": 2}}, {"id": "marlin_flasher", "published": "2019-04-02 00:00:00 +0000", "title": "Marlin Flasher", "description": "Plugin that allows you to flash your printer to the latest Marlin version", "archive": "https://github.com/Renaud11232/OctoPrint-Marlin-Flasher/archive/master.zip", "author": "Renaud Gaspard", "homepage": "https://github.com/Renaud11232/OctoPrint-Marlin-Flasher", "page": "https://plugins.octoprint.org/plugins/marlin_flasher/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/marlin_flasher/arduino_flash.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.7", "date": "2023-04-12 20:59:47 +0000", "tag": "1.0.7"}, "releases": 57, "last_push": "2023-04-12 20:57:40 +0000", "stars": 37, "issues": {"open": 4, "closed": 88}}, "stats": {"instances_month": 904, "install_events_month": 110, "instances_week": 569, "install_events_week": 22}}, {"id": "FanSpeedMirror", "published": "2019-04-13 00:00:00 +0000", "title": "OctoPrint-FanSpeedMirror", "description": "Mirror the parameter(s) of GCode commands M106, M107 to scripts on the OctoPrint host", "archive": "https://github.com/b-morgan/OctoPrint-FanSpeedMirror/archive/master.zip", "author": "Brad Morgan", "homepage": "https://github.com/b-morgan/OctoPrint-FanSpeedMirror", "page": "https://plugins.octoprint.org/plugins/FanSpeedMirror/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2020-04-03 19:35:37 +0000", "tag": "1.3.1"}, "releases": 4, "last_push": "2020-04-03 19:33:29 +0000", "stars": 5, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 256, "install_events_month": 24, "instances_week": 169, "install_events_week": 9}}, {"id": "repeatingcommand", "published": "2019-04-16 00:00:00 +0000", "title": "OctoPrint_RepeatingCommand", "description": "Octoprint plugin for running a command at an interval during prints.", "archive": "https://github.com/aerickson/OctoPrint_RepeatingCommand/archive/master.zip", "author": "Andrew Erickson", "homepage": "https://github.com/aerickson/OctoPrint_RepeatingCommand", "page": "https://plugins.octoprint.org/plugins/repeatingcommand/", "compatibility": {"octoprint": ["1.2.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/repeatingcommand/settings.png", "abandoned": false, "github": {"last_push": "2020-06-11 07:38:28 +0000", "stars": 0, "issues": {"open": 3, "closed": 0}}, "stats": {"instances_month": 13, "install_events_month": 1, "instances_week": 12, "install_events_week": 0}}, {"id": "octoprint_complicated", "published": "2019-04-23 00:00:00 +0000", "title": "OctoPrint-Complicated", "description": "Display Print Progress on your Apple Watch using the Complicated iOS App", "archive": "https://github.com/frenchie4111/complicated-octoprint/archive/master.zip", "author": "Mike Lyons", "homepage": "https://github.com/frenchie4111/complicated-octoprint", "page": "https://plugins.octoprint.org/plugins/octoprint_complicated/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/octoprint_complicated/demo.png", "abandoned": false, "github": {"latest_release": {"name": "Added push notifications for print progress", "date": "2019-08-10 20:49:10 +0000", "tag": "v1.1.3"}, "releases": 3, "last_push": "2019-08-10 20:48:42 +0000", "stars": 9, "issues": {"open": 8, "closed": 1}}, "stats": {"instances_month": 11, "install_events_month": 1, "instances_week": 10, "install_events_week": 0}}, {"id": "PCA9685LEDStripControl", "published": "2019-05-07 00:00:00 +0000", "title": "PCA9685 LED Strip Control", "description": "OctoPrint plugin for controling RGB LED Strips via PCA9685 over I2C", "archive": "https://github.com/ozgunawesome/OctoPrint-PCA9685LEDStripControl/archive/master.zip", "author": "Ozgun Ayaz", "homepage": "https://github.com/ozgunawesome/OctoPrint-PCA9685LEDStripControl", "page": "https://plugins.octoprint.org/plugins/PCA9685LEDStripControl/", "compatibility": {"octoprint": ["1.3.1"], "os": ["linux", "freebsd"], "python": ">=2.7,<3"}, "license": "Apache", "image": "https://plugins.octoprint.org/assets/img/plugins/PCA9685LEDStripControl/PCA9685_dev_board.jpg", "abandoned": false, "github": {"latest_release": {"name": "Fixed some potential conflict", "date": "2019-05-07 17:53:11 +0000", "tag": "0.3.9"}, "releases": 2, "last_push": "2019-05-07 17:52:29 +0000", "stars": 2, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 2, "install_events_month": 1, "instances_week": 2, "install_events_week": 0}}, {"id": "preprintservice", "published": "2019-05-12 00:00:00 +0000", "title": "OctoPrint-PrePrintService", "description": "This service supports your 3D printing workflow by providing auto-rotation and slicing functionality.", "archive": "https://github.com/christophschranz/OctoPrint-PrePrintService/archive/master.zip", "author": "Christoph Schranz", "homepage": "https://github.com/christophschranz/OctoPrint-PrePrintService", "page": "https://plugins.octoprint.org/plugins/preprintservice/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/preprintservice/workflow.png", "abandoned": false, "github": {"last_push": "2023-09-01 10:53:03 +0000", "stars": 11, "issues": {"open": 1, "closed": 8}}, "stats": {"instances_month": 47, "install_events_month": 9, "instances_week": 28, "install_events_week": 1}}, {"id": "octopod", "published": "2019-05-28 00:00:00 +0000", "title": "OctoPrint-OctoPod", "description": "OctoPrint plugin for OctoPod", "archive": "https://github.com/gdombiak/OctoPrint-OctoPod/archive/master.zip", "author": "Gaston Dombiak", "homepage": "https://github.com/gdombiak/OctoPrint-OctoPod", "page": "https://plugins.octoprint.org/plugins/octopod/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "Apache-2.0", "image": "https://plugins.octoprint.org/assets/img/plugins/octopod/print_finished.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.3.16", "date": "2023-11-26 22:30:18 +0000", "tag": "0.3.16"}, "releases": 29, "last_push": "2023-11-26 22:38:37 +0000", "stars": 72, "issues": {"open": 35, "closed": 95}}, "stats": {"instances_month": 6629, "install_events_month": 417, "instances_week": 4794, "install_events_week": 91}}, {"id": "uploadanything", "published": "2019-05-28 00:00:00 +0000", "title": "Upload Anything", "description": "Allows custom file types to be uploaded via the web interface", "archive": "https://github.com/rlogiacco/UploadAnything/archive/master.zip", "author": "Roberto Lo Giacco", "homepage": "https://github.com/rlogiacco/UploadAnything", "page": "https://plugins.octoprint.org/plugins/uploadanything/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "Apache License 2.0", "image": "https://plugins.octoprint.org/assets/img/plugins/uploadanything/settings.png", "abandoned": false, "github": {"last_push": "2020-11-29 22:29:46 +0000", "stars": 3, "issues": {"open": 1, "closed": 3}}, "stats": {"instances_month": 280, "install_events_month": 25, "instances_week": 196, "install_events_week": 3}}, {"id": "Change_Filament", "published": "2019-05-29 00:00:00 +0000", "title": "Change_Filament", "description": "Facilitates changing filament (backs out old, loads new)", "archive": "https://github.com/jim-p/Change_Filament/archive/master.zip", "author": "Jim Pingle", "homepage": "https://github.com/jim-p/Change_Filament", "page": "https://plugins.octoprint.org/plugins/Change_Filament/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "bsd-3-clause", "image": "https://plugins.octoprint.org/assets/img/plugins/Change_Filament/cf_buttons.png", "abandoned": false, "github": {"last_push": "2021-01-03 23:21:43 +0000", "stars": 16, "issues": {"open": 19, "closed": 20}}, "stats": {"instances_month": 4273, "install_events_month": 290, "instances_week": 3040, "install_events_week": 60}}, {"id": "OctoFlat", "published": "2019-06-03 00:00:00 +0000", "title": "OctoPrint-OctoFlat", "description": "A flat theme for OctoPrint.", "archive": "https://github.com/juniorRubyist/OctoPrint-OctoFlat/archive/master.zip", "author": "Joseph Geis", "homepage": "https://github.com/juniorRubyist/OctoPrint-OctoFlat", "page": "https://plugins.octoprint.org/plugins/OctoFlat/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://raw.githubusercontent.com/juniorRubyist/OctoPrint-OctoFlat/master/assets/octoprint_1.png", "abandoned": false, "github": {"latest_release": {"name": "OctoFlat Reaction", "date": "2019-06-02 03:05:19 +0000", "tag": "0.2.0"}, "releases": 1, "last_push": "2020-06-27 19:21:22 +0000", "stars": 5, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 47, "install_events_month": 1, "instances_week": 33, "install_events_week": 0}}, {"id": "filamentencore", "published": "2019-06-03 00:00:00 +0000", "title": "Filament Sensor Encore", "description": "OctoPrint plug-in that detects when printer is out of filament", "archive": "https://github.com/draagc/OctoPrint-FilamentEncore/archive/master.zip", "author": "Dragos Costache", "homepage": "https://github.com/draagc/OctoPrint-FilamentEncore", "page": "https://plugins.octoprint.org/plugins/filamentencore/", "compatibility": {"octoprint": ["1.2.6"], "os": ["disabled"], "python": ">=2.7,<3"}, "license": "AGPLv3", "disabled": "

There has been a report of OctoPrint crashing on resume. Disabled until this issue has been clarified. See foosel/OctoPrint#3213 and draagc/OctoPrint-FilamentEncore#3.

\n", "abandoned": false, "github": {"last_push": "2019-05-31 16:01:01 +0000", "stars": 5, "issues": {"open": 4, "closed": 0}}, "stats": {"instances_month": 4, "install_events_month": 1, "instances_week": 4, "install_events_week": 0}}, {"id": "PrinterAlerts", "published": "2019-06-08 00:00:00 +0000", "title": "OctoPrint-PrinterAlerts", "description": "Alert the user when their printer is waiting for interaction.", "archive": "https://github.com/Patronics/OctoPrint-PrinterAlerts/archive/master.zip", "author": "Patrick Leiser", "homepage": "https://github.com/Patronics/OctoPrint-PrinterAlerts", "page": "https://plugins.octoprint.org/plugins/PrinterAlerts/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "aGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/PrinterAlerts/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.7.5: add Python 3 Support", "date": "2020-10-22 18:50:14 +0000", "tag": "0.7.5"}, "releases": 2, "last_push": "2020-10-22 18:48:27 +0000", "stars": 5, "issues": {"open": 3, "closed": 5}}, "stats": {"instances_month": 263, "install_events_month": 13, "instances_week": 204, "install_events_week": 4}}, {"id": "PauseForUserEvent", "published": "2019-06-11 00:00:00 +0000", "title": "PauseForUser Event", "description": "Adds a new event 'paused_for_user' when the printer needs manual intervention", "archive": "https://github.com/zeroflow/OctoPrint-PauseForUserEvent/archive/master.zip", "author": "Thomas Arthofer", "homepage": "https://github.com/zeroflow/OctoPrint-PauseForUserEvent", "page": "https://plugins.octoprint.org/plugins/PauseForUserEvent/", "compatibility": {"octoprint": ["1.3.11"], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": false, "github": {"last_push": "2019-06-05 17:21:20 +0000", "stars": 5, "issues": {"open": 3, "closed": 0}}, "stats": {"instances_month": 26, "install_events_month": 1, "instances_week": 18, "install_events_week": 0}}, {"id": "prusaetaoverride", "published": "2019-08-25 00:00:00 +0000", "title": "Slicer M73 ETA override Plugin (Prusa; Marlin 2)", "description": "Plugin that overrides OctoPrint ETA/progress to values from last M73 gcode response received from printer", "archive": "https://github.com/arekm/octopi_eta_override/archive/master.zip", "author": "Anton Skorochod", "homepage": "https://github.com/arekm/octopi_eta_override", "page": "https://plugins.octoprint.org/plugins/prusaetaoverride/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.4.0", "date": "2022-12-08 07:54:01 +0000", "tag": "0.4.0"}, "releases": 5, "last_push": "2022-12-08 08:45:28 +0000", "stars": 9, "issues": {"open": 0, "closed": 13}}, "stats": {"instances_month": 627, "install_events_month": 24, "instances_week": 507, "install_events_week": 5}}, {"id": "webcamSB", "published": "2019-09-04 00:00:00 +0000", "title": "OctoPrint-Webcamsb", "description": "Sidebar webcam viewer", "archive": "https://github.com/quanticchaos/OctoPrint-Webcamsb/archive/master.zip", "author": "Luis Magar Brunner", "homepage": "https://github.com/quanticchaos/OctoPrint-Webcamsb", "page": "https://plugins.octoprint.org/plugins/webcamSB/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/webcamSB/featured.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.8", "date": "2020-06-02 02:37:12 +0000", "tag": "0.1.8"}, "releases": 8, "last_push": "2020-06-02 02:33:52 +0000", "stars": 9, "issues": {"open": 15, "closed": 7}}, "stats": {"instances_month": 1876, "install_events_month": 122, "instances_week": 1325, "install_events_week": 33}}, {"id": "gslc", "published": "2019-09-05 00:00:00 +0000", "title": "GcodeSuperLaserController", "description": "A plugin for Laser engraving add", "archive": "https://github.com/jneilliii/GCodeSuperLaserController/archive/master.zip", "author": "Skiepp", "homepage": "https://github.com/jneilliii/GCodeSuperLaserController", "page": "https://plugins.octoprint.org/plugins/gslc/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=2.7,<3"}, "license": "Apache License 2.0", "abandoned": true, "github": {"latest_release": {"name": "1.1", "date": "2021-11-14 21:37:31 +0000", "tag": "1.1"}, "releases": 1, "last_push": "2021-11-14 21:39:13 +0000", "stars": 0, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 1, "install_events_month": 1, "instances_week": 1, "install_events_week": 0}}, {"id": "dashboard", "published": "2019-09-10 00:00:00 +0000", "title": "OctoPrint-Dashboard", "description": "A dashboard tab for Octoprint", "archive": "https://github.com/j7126/OctoPrint-Dashboard/archive/master.zip", "author": "Stefan Cohen, j7126, Willmac16", "homepage": "https://github.com/j7126/OctoPrint-Dashboard", "page": "https://plugins.octoprint.org/plugins/dashboard/", "compatibility": {"octoprint": [], "os": [], "python": ">=3.6,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/dashboard/screenshot-2.png", "abandoned": false, "github": {"latest_release": {"name": "1.19.11", "date": "2024-04-09 02:37:46 +0000", "tag": "1.19.11"}, "releases": 49, "last_push": "2024-04-09 02:32:53 +0000", "stars": 286, "issues": {"open": 48, "closed": 282}}, "stats": {"instances_month": 26832, "install_events_month": 1897, "instances_week": 20758, "install_events_week": 433}}, {"id": "octovox", "published": "2019-09-11 00:00:00 +0000", "title": "OctoPrint-OctoVox", "description": "OctoPrint plugin for OctoVox Amazon Alexa Integration", "archive": "https://github.com/johnnyruz/OctoPrint-OctoVox/archive/master.zip", "author": "John Ruzick", "homepage": "https://github.com/johnnyruz/OctoPrint-OctoVox", "page": "https://plugins.octoprint.org/plugins/octovox/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/octovox/alexa_response.png", "abandoned": false, "github": {"latest_release": {"name": "Update for Python3/OctoPrint 1.4 Compatibility", "date": "2019-10-24 13:09:47 +0000", "tag": "0.1.6"}, "releases": 4, "last_push": "2019-10-20 22:41:59 +0000", "stars": 31, "issues": {"open": 24, "closed": 8}}, "stats": {"instances_month": 372, "install_events_month": 26, "instances_week": 270, "install_events_week": 3}}, {"id": "AutostartPrint", "published": "2019-09-23 00:00:00 +0000", "title": "AutostartPrint", "description": "Autostart a print job after conneting.", "archive": "https://github.com/OllisGit/OctoPrint-AutostartPrint/releases/latest/download/master.zip", "author": "Olli", "homepage": "https://github.com/OllisGit/OctoPrint-AutostartPrint", "page": "https://plugins.octoprint.org/plugins/AutostartPrint/", "compatibility": {"octoprint": ["1.3.10", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://github.com/OllisGit/Octoprint-AutostartPrint/raw/master/screenshots/plugin-settings.png", "abandoned": false, "github": {"latest_release": {"name": "V1.3.0", "date": "2020-08-02 09:58:20 +0000", "tag": "1.3.0"}, "releases": 7, "last_push": "2020-08-02 09:55:03 +0000", "stars": 4, "issues": {"open": 2, "closed": 7}}, "stats": {"instances_month": 58, "install_events_month": 4, "instances_week": 48, "install_events_week": 1}}, {"id": "AutoLogout", "published": "2019-10-03 00:00:00 +0000", "title": "AutoLogout", "description": "Plugin logs out the user if there is some time of inactvity or after a print job is finished.", "archive": "https://github.com/OllisGit/OctoPrint-AutoLogout/releases/latest/download/master.zip", "author": "Olli", "homepage": "https://github.com/OllisGit/OctoPrint-AutoLogout", "page": "https://plugins.octoprint.org/plugins/AutoLogout/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://github.com/OllisGit/Octoprint-AutoLogout/raw/master/screenshots/plugin-settings.png", "abandoned": false, "github": {"latest_release": {"name": "V1.2.0", "date": "2021-05-15 14:01:41 +0000", "tag": "1.2.0"}, "releases": 6, "last_push": "2021-05-15 14:03:58 +0000", "stars": 4, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 43, "install_events_month": 2, "instances_week": 34, "install_events_week": 0}}, {"id": "metadatapreprocessor", "published": "2019-10-03 00:00:00 +0000", "title": "MetadataPreprocessor", "description": "Plugin to speed up the gcode analysis in OctoPrint", "archive": "https://github.com/awenelo/OctoPrint-MetadataPreprocessor/releases/latest/download/release.zip", "author": "awenelo, Sven Lohrmann", "homepage": "https://github.com/awenelo/OctoPrint-MetadataPreprocessor", "page": "https://plugins.octoprint.org/plugins/metadatapreprocessor/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.2.1 - Python 3 compatability", "date": "2021-08-27 12:11:47 +0000", "tag": "0.2.1"}, "releases": 1, "last_push": "2021-08-23 19:34:11 +0000", "stars": 0, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 81, "install_events_month": 7, "instances_week": 56, "install_events_week": 2}}, {"id": "orvibos20", "published": "2019-10-03 00:00:00 +0000", "title": "OctoPrint-OrviboS20", "description": "Plugin to control Orvibo S20 Smart Plug from the OctoPrint web interface.", "archive": "https://github.com/cprasmu/OctoPrint-OrviboS20/archive/master.zip", "author": "cprasmu", "homepage": "https://github.com/cprasmu/OctoPrint-OrviboS20", "page": "https://plugins.octoprint.org/plugins/orvibos20/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/orvibos20/power_on_dark.png", "abandoned": false, "github": {"latest_release": {"name": "Python 3 Compatibility", "date": "2020-06-14 12:15:09 +0000", "tag": "0.2.3"}, "releases": 2, "last_push": "2020-06-14 12:12:03 +0000", "stars": 2, "issues": {"open": 1, "closed": 7}}, "stats": {"instances_month": 9, "install_events_month": 1, "instances_week": 8, "install_events_week": 0}}, {"id": "mmu2filamentselect", "published": "2019-10-04 00:00:00 +0000", "title": "OctoPrint-Mmu2filamentselect", "description": "Select the filament for Prusa MMU2 when printing in single mode.", "archive": "https://github.com/tkoecker/OctoPrint-Mmu2filamentselect/archive/master.zip", "author": "Thomas K\u00f6ckerbauer, Florian Sch\u00fctte", "homepage": "https://github.com/tkoecker/OctoPrint-Mmu2filamentselect", "page": "https://plugins.octoprint.org/plugins/mmu2filamentselect/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/mmu2filamentselect/octoprusa.png", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2021-08-12 20:07:57 +0000", "tag": "1.0.7"}, "releases": 5, "last_push": "2021-08-12 20:04:49 +0000", "stars": 7, "issues": {"open": 8, "closed": 8}}, "stats": {"instances_month": 575, "install_events_month": 25, "instances_week": 445, "install_events_week": 4}}, {"id": "filamentstorage", "published": "2019-10-25 00:00:00 +0000", "title": "OctoPrint-Filamentstorage", "description": "Plugin for OpenSource Filament Storage Containers that report Temp, Humidity, and scale values over USB.", "archive": "https://github.com/waltmoorhouse/OctoPrint-Filamentstorage/archive/master.zip", "author": "Walt Moorhouse", "homepage": "https://github.com/waltmoorhouse/OctoPrint-Filamentstorage", "page": "https://plugins.octoprint.org/plugins/filamentstorage/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/filamentstorage/main.png", "abandoned": false, "github": {"last_push": "2019-12-04 09:00:58 +0000", "stars": 21, "issues": {"open": 3, "closed": 2}}, "stats": {"instances_month": 2, "install_events_month": 1, "instances_week": 2, "install_events_week": 0}}, {"id": "CrealityTemperature", "published": "2019-10-28 00:00:00 +0000", "title": "Creality Temperature Fix", "description": "Fix to parse correctly temperatures from Creality printer", "archive": "https://github.com/RomainOdeval/OctoPrint-CrealityTemperature/releases/latest/download/master.zip", "author": "Romain Odeval, Jean-Christophe Heger", "homepage": "https://github.com/RomainOdeval/OctoPrint-CrealityTemperature/", "page": "https://plugins.octoprint.org/plugins/CrealityTemperature/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "v1.2.4", "date": "2020-07-20 17:46:40 +0000", "tag": "v1.2.4"}, "releases": 5, "last_push": "2022-01-02 18:16:57 +0000", "stars": 3, "issues": {"open": 1, "closed": 3}}, "stats": {"instances_month": 4318, "install_events_month": 417, "instances_week": 2979, "install_events_week": 102}}, {"id": "thingiverse", "published": "2019-10-28 00:00:00 +0000", "title": "OctoPrint-Thingiverse", "description": "This plugin creates a new tab where Thingiverse website is embedded.", "archive": "https://github.com/stefancandrea/OctoPrint-Thingiverse/archive/master.zip", "author": "stefancandrea", "homepage": "https://github.com/stefancandrea/OctoPrint-Thingiverse/", "page": "https://plugins.octoprint.org/plugins/thingiverse/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": true, "github": {"latest_release": {"name": "1.1.0", "date": "2020-08-13 06:25:26 +0000", "tag": "1.1.0"}, "releases": 2, "last_push": "2020-08-13 07:02:45 +0000", "stars": 5, "issues": {"open": 0, "closed": 10}}, "stats": {"instances_month": 847, "install_events_month": 100, "instances_week": 555, "install_events_week": 23}}, {"id": "influxdb", "published": "2019-11-02 00:00:00 +0000", "title": "OctoPrint-InfluxDB", "description": "Writes temperatures and events to an Influx database.", "archive": "https://github.com/agrif/OctoPrint-InfluxDB/archive/master.zip", "author": "Aaron Griffith", "homepage": "https://github.com/agrif/OctoPrint-InfluxDB", "page": "https://plugins.octoprint.org/plugins/influxdb/", "compatibility": {"octoprint": ["1.3.11"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/influxdb/settings.png", "abandoned": false, "github": {"latest_release": {"name": "1.4.1", "date": "2024-05-03 22:02:12 +0000", "tag": "1.4.1"}, "releases": 9, "last_push": "2024-05-03 21:56:27 +0000", "stars": 23, "issues": {"open": 6, "closed": 18}}, "stats": {"instances_month": 101, "install_events_month": 4, "instances_week": 82, "install_events_week": 1}}, {"id": "obico", "published": "2019-11-07 00:00:00 +0000", "title": "Obico for OctoPrint: Full Remote Access - AI Failure Detection & Smart 3D Printing", "description": "Securely access OctoPrint remotely from anywhere for free with Obico. Get unlimited live webcam streaming, secure remote access, 3D printer status notifications, and a free companion mobile app for iOS and Android. Obico is the easiest plugin to access OctoPi remotely! The best part? Advanced AI-powered failure detection watches your prints so you don\u2019t have to.", "archive": "https://github.com/TheSpaghettiDetective/OctoPrint-Obico/archive/master.zip", "author": "The Obico team", "homepage": "https://www.obico.io", "page": "https://plugins.octoprint.org/plugins/obico/", "compatibility": {"octoprint": ["1.3.8"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/obico/featured.png", "abandoned": false, "github": {"latest_release": {"name": "Fix the compatibility issues in OctoPrint 1.10.0", "date": "2024-05-06 19:23:19 +0000", "tag": "2.4.13"}, "releases": 113, "last_push": "2024-05-06 19:21:58 +0000", "stars": 135, "issues": {"open": 48, "closed": 83}}, "stats": {"instances_month": 15868, "install_events_month": 2633, "instances_week": 7484, "install_events_week": 603}}, {"id": "thespaghettidetective", "published": "2019-11-07 00:00:00 +0000", "title": "Access Anywhere - The Spaghetti Detective", "description": "The Spaghetti Detective is now Obico! Please install \"Obico for OctoPrint\" instead.", "archive": "https://github.com/TheSpaghettiDetective/OctoPrint-TheSpaghettiDetective/archive/master.zip", "author": "The Obico team", "homepage": "https://www.obico.io", "page": "https://plugins.octoprint.org/plugins/thespaghettidetective/", "compatibility": {"octoprint": ["1.3.8"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Last TSD version update", "date": "2022-05-10 00:56:52 +0000", "tag": "1.8.12"}, "releases": 1, "last_push": "2022-05-07 22:16:43 +0000", "stars": 7, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 1526, "install_events_month": 108, "instances_week": 993, "install_events_week": 26}}, {"id": "UltimakerFormatPackage", "published": "2019-11-16 00:00:00 +0000", "title": "Cura Thumbnails", "description": "This plugin adds support for Ultimaker Format Package (.ufp) files.", "archive": "https://github.com/jneilliii/OctoPrint-UltimakerFormatPackage/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-UltimakerFormatPackage", "page": "https://plugins.octoprint.org/plugins/UltimakerFormatPackage/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/UltimakerFormatPackage/screenshot_thumbnail.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.2", "date": "2022-04-16 23:46:10 +0000", "tag": "1.0.2"}, "releases": 29, "last_push": "2024-01-14 15:59:16 +0000", "stars": 29, "issues": {"open": 1, "closed": 45}}, "stats": {"instances_month": 6186, "install_events_month": 526, "instances_week": 4408, "install_events_week": 128}}, {"id": "filamentrevolutions", "published": "2019-11-29 00:00:00 +0000", "title": "Filament Sensor Revolutions", "description": "Use 1 or 2 filament sensors to pause printing or send GCode commands when filament runs out or is jammed.", "archive": "https://github.com/RomRider/Octoprint-Filament-Revolutions/archive/master.zip", "author": "RomRider", "homepage": "https://github.com/RomRider/Octoprint-Filament-Revolutions", "page": "https://plugins.octoprint.org/plugins/filamentrevolutions/", "compatibility": {"octoprint": ["1.2.6"], "os": ["linux", "freebsd"], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": true, "github": {"last_push": "2019-11-25 18:03:40 +0000", "stars": 12, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 16, "install_events_month": 1, "instances_week": 12, "install_events_week": 0}}, {"id": "mystromswitch", "published": "2019-12-03 00:00:00 +0000", "title": "OctoPrint-MyStromSwitch", "description": "Plugin to integrate myStrom Switch into your OctoPrint installation", "archive": "https://github.com/da4id/OctoPrint-MyStromSwitch/archive/master.zip", "author": "David Zingg", "homepage": "https://github.com/da4id/OctoPrint-MyStromSwitch", "page": "https://plugins.octoprint.org/plugins/mystromswitch/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/mystromswitch/sidebar_on_button.png", "abandoned": false, "github": {"latest_release": {"name": "1.2.0", "date": "2020-07-25 14:50:05 +0000", "tag": "1.2.0"}, "releases": 10, "last_push": "2020-07-25 14:49:36 +0000", "stars": 4, "issues": {"open": 5, "closed": 22}}, "stats": {"instances_month": 34, "install_events_month": 0, "instances_week": 27, "install_events_week": 0}}, {"id": "resource_monitor", "published": "2019-12-03 00:00:00 +0000", "title": "Resource Monitor", "description": "A plugin to view the current CPU, RAM, disk and network usage on your system", "archive": "https://github.com/Renaud11232/OctoPrint-Resource-Monitor/archive/master.zip", "author": "Renaud Gaspard", "homepage": "https://github.com/Renaud11232/OctoPrint-Resource-Monitor", "page": "https://plugins.octoprint.org/plugins/resource_monitor/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/resource_monitor/cpu.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.16", "date": "2024-05-08 21:38:39 +0000", "tag": "0.3.16"}, "releases": 57, "last_push": "2024-05-08 21:35:38 +0000", "stars": 39, "issues": {"open": 5, "closed": 39}}, "stats": {"instances_month": 7461, "install_events_month": 638, "instances_week": 5334, "install_events_week": 147}}, {"id": "prometheus_exporter", "published": "2019-12-09 00:00:00 +0000", "title": "Prometheus Exporter", "description": "A plugin for prometheus compatible metrics endpoint", "archive": "https://github.com/tg44/OctoPrint-Prometheus-Exporter/archive/master.zip", "author": "Gergo Torcsvari", "homepage": "https://github.com/tg44/OctoPrint-Prometheus-Exporter", "page": "https://plugins.octoprint.org/plugins/prometheus_exporter/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "abandoned": false, "github": {"latest_release": {"name": "0.2.3", "date": "2024-02-01 10:12:22 +0000", "tag": "0.2.3"}, "releases": 5, "last_push": "2024-02-01 09:55:13 +0000", "stars": 43, "issues": {"open": 4, "closed": 21}}, "stats": {"instances_month": 164, "install_events_month": 19, "instances_week": 134, "install_events_week": 4}}, {"id": "PrusaLevelingGuide", "published": "2019-12-18 00:00:00 +0000", "title": "Prusa Leveling Guide", "description": "Plugin that helps walk you through adjusting the Prusa MK3 heatbed using the nylock mod", "archive": "https://github.com/scottrini/OctoPrint-PrusaLevelingGuide/archive/master.zip", "author": "Scott Rini", "homepage": "https://github.com/scottrini/OctoPrint-PrusaLevelingGuide", "page": "https://plugins.octoprint.org/plugins/PrusaLevelingGuide/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/PrusaLevelingGuide/bed.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.18 Updated variance calculation", "date": "2022-11-28 19:06:56 +0000", "tag": "1.0.18"}, "releases": 21, "last_push": "2022-11-28 19:02:57 +0000", "stars": 43, "issues": {"open": 4, "closed": 46}}, "stats": {"instances_month": 2634, "install_events_month": 139, "instances_week": 1916, "install_events_week": 33}}, {"id": "octohue", "published": "2020-01-31 00:00:00 +0000", "title": "OctoHue", "description": "Hue lighting control for Octoprint - Illuminate your printer and signal its status using Phillips Hue lights", "archive": "https://github.com/entrippy/OctoPrint-OctoHue/archive/master.zip", "author": "Simon Beckett", "homepage": "https://github.com/entrippy/OctoPrint-OctoHue", "page": "https://plugins.octoprint.org/plugins/octohue/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/octohue/Featured-Image.png", "abandoned": false, "github": {"latest_release": {"name": "OctoHue 0.6.0 : Lets play with friends", "date": "2023-11-26 07:09:07 +0000", "tag": "0.6.0"}, "releases": 10, "last_push": "2023-11-26 07:07:23 +0000", "stars": 18, "issues": {"open": 9, "closed": 22}}, "stats": {"instances_month": 220, "install_events_month": 9, "instances_week": 171, "install_events_week": 4}}, {"id": "progress_title", "published": "2020-01-31 00:00:00 +0000", "title": "Progress Title", "description": "Show progress percentage in document title", "archive": "https://github.com/pwnbus/OctoPrint-Progress-Title/archive/master.zip", "author": "pwnbus", "homepage": "https://github.com/pwnbus/OctoPrint-Progress-Title", "page": "https://plugins.octoprint.org/plugins/progress_title/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/progress_title/title.png", "abandoned": false, "github": {"latest_release": {"name": "Add settings for position in title", "date": "2021-11-04 06:02:49 +0000", "tag": "v0.1.2"}, "releases": 3, "last_push": "2021-11-04 05:57:19 +0000", "stars": 3, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 495, "install_events_month": 23, "instances_week": 376, "install_events_week": 8}}, {"id": "terminalcommandsextended", "published": "2020-02-07 00:00:00 +0000", "title": "Terminal Commands Extended", "description": "Plugin that adds custom gcode command buttons to the Terminal tab.", "archive": "https://github.com/jneilliii/OctoPrint-TerminalCommandsExtended/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-TerminalCommandsExtended", "page": "https://plugins.octoprint.org/plugins/terminalcommandsextended/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/terminalcommandsextended/screenshot_tab.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.7", "date": "2022-05-28 22:11:09 +0000", "tag": "0.1.7"}, "releases": 14, "last_push": "2024-01-14 15:59:12 +0000", "stars": 9, "issues": {"open": 10, "closed": 21}}, "stats": {"instances_month": 4159, "install_events_month": 87, "instances_week": 3070, "install_events_week": 19}}, {"id": "OctoPrint-hueCommands", "published": "2020-03-18 00:00:00 +0000", "title": "Add GCODE like HUE commands to OctoPrint", "description": "Illuminate your print job and signal its status using a Philips Hue light. Enter a GCODE equivalent anywhere you want.", "archive": "https://github.com/LMS0815/OctoPrint-hueCommands/archive/master/OctoPrint-hueCommands.zip", "author": "LMS0815", "homepage": "https://github.com/LMS0815/OctoPrint-hueCommands", "page": "https://plugins.octoprint.org/plugins/OctoPrint-hueCommands/", "compatibility": {"octoprint": ["1.3.9"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://raw.githubusercontent.com/LMS0815/OctoPrint-hueCommands/master/screenshots/huecommands_settings.png", "abandoned": false, "github": {"last_push": "2020-12-18 09:28:21 +0000", "stars": 4, "issues": {"open": 3, "closed": 2}}, "stats": {"instances_month": 38, "install_events_month": 5, "instances_week": 24, "install_events_week": 2}}, {"id": "remove_ttys_ports", "published": "2020-03-23 00:00:00 +0000", "title": "Remove /dev/ttyS* Ports (port auto detection fix)", "description": "Removes any matched /dev/ttyS* ports from the serial port list again and thus works around autodetection issues with 1.4.0 on systems with such ports", "archive": "https://github.com/OctoPrint/OctoPrint-Remove-ttyS-Ports/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-Remove-ttyS-Ports", "page": "https://plugins.octoprint.org/plugins/remove_ttys_ports/", "compatibility": {"octoprint": [">=1.4.0,<1.4.1"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.0", "date": "2020-03-23 17:51:09 +0000", "tag": "0.1.0"}, "releases": 1, "last_push": "2020-03-25 17:23:38 +0000", "stars": 1, "issues": {"open": 3, "closed": 0}}, "stats": {"instances_month": 3, "install_events_month": 0, "instances_week": 1, "install_events_week": 0}}, {"id": "fixcbdfirmware", "published": "2020-03-25 00:00:00 +0000", "title": "Fix CBD Firmware", "description": "Fixes communication with a broken firmware making its rounds that identifies as \"CBD make it\"", "archive": "https://github.com/OctoPrint/OctoPrint-FixCBDFirmware/archive/master.zip", "author": "Gina H\u00e4u\u00dfge", "homepage": "https://github.com/OctoPrint/OctoPrint-FixCBDFirmware", "page": "https://plugins.octoprint.org/plugins/fixcbdfirmware/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.4.0", "date": "2021-02-23 14:46:34 +0000", "tag": "0.4.0"}, "releases": 5, "last_push": "2023-10-02 09:58:40 +0000", "stars": 6, "issues": {"open": 0, "closed": 4}}, "stats": {"instances_month": 411, "install_events_month": 40, "instances_week": 304, "install_events_week": 5}}, {"id": "Python3PluginCompatibilityCheck", "published": "2020-03-31 00:00:00 +0000", "title": "Python 3 Check", "description": "Checks installed plugins for Python 3 compatibility based on their entry in Plugin Repository.", "archive": "https://github.com/jneilliii/OctoPrint-Python3PluginCompatibilityCheck/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-Python3PluginCompatibilityCheck", "page": "https://plugins.octoprint.org/plugins/Python3PluginCompatibilityCheck/", "compatibility": {"octoprint": ["1.3.11"], "os": [], "python": ">=2.7,<3"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.5", "date": "2020-09-22 20:57:42 +0000", "tag": "0.1.5"}, "releases": 7, "last_push": "2024-01-14 15:58:55 +0000", "stars": 7, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 29, "install_events_month": 3, "instances_week": 16, "install_events_week": 0}}, {"id": "AutoTerminalInput", "published": "2020-04-01 00:00:00 +0000", "title": "Auto Terminal Input", "description": "Automatically focuses the command input when switching to the Terminal tab in OctoPrint.", "archive": "https://github.com/jneilliii/OctoPrint-AutoTerminalInput/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-AutoTerminalInput", "page": "https://plugins.octoprint.org/plugins/AutoTerminalInput/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"last_push": "2024-01-14 15:58:38 +0000", "stars": 3, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 206, "install_events_month": 19, "instances_week": 149, "install_events_week": 3}}, {"id": "prusaslicerthumbnails", "published": "2020-04-22 00:00:00 +0000", "title": "Slicer Thumbnails", "description": "Extracts various slicer's embedded thumbnails from gcode files.", "archive": "https://github.com/jneilliii/OctoPrint-PrusaSlicerThumbnails/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-PrusaSlicerThumbnails", "page": "https://plugins.octoprint.org/plugins/prusaslicerthumbnails/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/prusaslicerthumbnails/screenshot_thumbnail.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.7", "date": "2024-02-09 16:22:55 +0000", "tag": "1.0.7"}, "releases": 45, "last_push": "2024-02-09 16:22:27 +0000", "stars": 93, "issues": {"open": 0, "closed": 94}}, "stats": {"instances_month": 16135, "install_events_month": 1439, "instances_week": 11826, "install_events_week": 315}}, {"id": "filamentsensorsimplified", "published": "2020-04-23 00:00:00 +0000", "title": "Filament Sensor Simplified", "description": "This plugin reacts to filament sensor output. If triggered it issues desired gcode to printer.", "archive": "https://github.com/LuckyX182/Filament_sensor_simplified/archive/master.zip", "author": "Luk\u00e1\u0161 Malatinsk\u00fd", "homepage": "https://github.com/LuckyX182/Filament_sensor_simplified", "page": "https://plugins.octoprint.org/plugins/filamentsensorsimplified/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://github.com/LuckyX182/Filament_sensor_simplified/raw/master/screenshots/settings.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.3", "date": "2022-07-11 22:49:20 +0000", "tag": "0.3.3"}, "releases": 9, "last_push": "2022-07-11 22:48:16 +0000", "stars": 30, "issues": {"open": 15, "closed": 42}}, "stats": {"instances_month": 776, "install_events_month": 71, "instances_week": 541, "install_events_week": 16}}, {"id": "continuousprint", "published": "2020-04-24 00:00:00 +0000", "title": "Continuous Print", "description": "This plugin automates your printer! Queue your prints, push the button, and walk away - now with auto bed clearing and failure recovery.", "archive": "https://github.com/smartin015/continuousprint/archive/master.zip", "author": "Scott Martin (Current), Louis Sarwal, Paul Goddard", "homepage": "https://github.com/smartin015/continuousprint", "page": "https://plugins.octoprint.org/plugins/continuousprint/", "compatibility": {"octoprint": [], "os": [], "python": ">=3.6,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/continuousprint/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "2.4.1", "date": "2024-04-27 17:05:33 +0000", "tag": "2.4.1"}, "releases": 33, "last_push": "2024-04-27 17:05:09 +0000", "stars": 39, "issues": {"open": 42, "closed": 88}}, "stats": {"instances_month": 1012, "install_events_month": 129, "instances_week": 695, "install_events_week": 18}}, {"id": "FriendlyNeighborhoodBeeper", "published": "2020-04-25 00:00:00 +0000", "title": "Friendly Neighborhood Beeper", "description": "Beeps after completion/failure of a print, but only during the specified hours", "archive": "https://github.com/techfreek/OctoPrint-Friendlybeeper/archive/master.zip", "author": "Alex Bahm", "homepage": "https://github.com/techfreek/OctoPrint-Friendlybeeper", "page": "https://plugins.octoprint.org/plugins/FriendlyNeighborhoodBeeper/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/FriendlyBeeper/settings.png", "abandoned": false, "github": {"latest_release": {"name": "Settings validation and improvements to beep preview", "date": "2021-01-13 01:48:33 +0000", "tag": "v0.4.1"}, "releases": 8, "last_push": "2021-01-13 01:38:30 +0000", "stars": 1, "issues": {"open": 4, "closed": 8}}, "stats": {"instances_month": 165, "install_events_month": 10, "instances_week": 122, "install_events_week": 2}}, {"id": "TemperatureLegendMover", "published": "2020-04-26 00:00:00 +0000", "title": "TemperatureLegendMover", "description": "Move the Temperature-Legend into a specific corner", "archive": "https://github.com/OllisGit/OctoPrint-TemperatureLegendMover/releases/latest/download/master.zip", "author": "Olli", "homepage": "https://github.com/OllisGit/OctoPrint-TemperatureLegendMover", "page": "https://plugins.octoprint.org/plugins/TemperatureLegendMover/", "compatibility": {"octoprint": ["1.3.10", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://github.com/OllisGit/OctoPrint-TemperatureLegendMover/raw/master/screenshots/temperature-legend.png", "abandoned": false, "github": {"latest_release": {"name": "V1.0.0", "date": "2020-04-25 14:34:37 +0000", "tag": "1.0.0"}, "releases": 1, "last_push": "2020-04-25 15:07:25 +0000", "stars": 4, "issues": {"open": 2, "closed": 0}}, "stats": {"instances_month": 114, "install_events_month": 22, "instances_week": 82, "install_events_week": 7}}, {"id": "emergencystopsimplified", "published": "2020-04-26 00:00:00 +0000", "title": "Emergency Stop Simplified", "description": "This plugin reacts to a switch or button, if triggered (switch open) it issues M112 command to printer.", "archive": "https://github.com/Mechazawa/Emergency_stop_simplified/archive/master.zip", "author": "Mechazawa", "homepage": "https://github.com/Mechazawa/Emergency_stop_simplified", "page": "https://plugins.octoprint.org/plugins/emergencystopsimplified/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"last_push": "2020-04-26 00:25:01 +0000", "stars": 6, "issues": {"open": 4, "closed": 1}}, "stats": {"instances_month": 215, "install_events_month": 18, "instances_week": 147, "install_events_week": 5}}, {"id": "webhooks", "published": "2020-04-29 00:00:00 +0000", "title": "OctoPrint-Webhooks", "description": "This allows you to send a webhook to any URL when events happen on OctoPrint.", "archive": "https://github.com/derekantrican/OctoPrint-Webhooks/archive/master.zip", "author": "Derek Antrican, Blane Townsend", "homepage": "https://github.com/derekantrican/OctoPrint-Webhooks", "page": "https://plugins.octoprint.org/plugins/webhooks/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/webhooks/Featured.png", "abandoned": false, "github": {"latest_release": {"name": "Added @appearance variable to list of supported variables", "date": "2023-10-08 01:09:33 +0000", "tag": "4.2.1"}, "releases": 6, "last_push": "2023-10-08 01:08:08 +0000", "stars": 7, "issues": {"open": 6, "closed": 7}}, "stats": {"instances_month": 400, "install_events_month": 32, "instances_week": 290, "install_events_week": 7}}, {"id": "printoid", "published": "2020-04-30 00:00:00 +0000", "title": "OctoPrint-Printoid", "description": "Notifications plugin for Printoid (Android app for OctoPrint)", "archive": "https://github.com/anthonyst91/OctoPrint-Printoid/archive/master.zip", "author": "Anthony St\u00e9phan", "homepage": "https://github.com/anthonyst91/OctoPrint-Printoid", "page": "https://plugins.octoprint.org/plugins/printoid/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "Apache-2.0", "abandoned": false, "github": {"latest_release": {"name": "Version v1.2.0", "date": "2022-02-07 09:49:53 +0000", "tag": "v1.2.0"}, "releases": 6, "last_push": "2022-02-10 08:31:17 +0000", "stars": 13, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 1213, "install_events_month": 61, "instances_week": 880, "install_events_week": 8}}, {"id": "smartpreheat", "published": "2020-05-02 00:00:00 +0000", "title": "Smart Preheat", "description": "Parses GCode files and provides variables that can be accessed in GCode scripts. Reduces heatup time and allows for preheating before bed leveling.", "archive": "https://github.com/kantlivelong/OctoPrint-SmartPreheat/archive/master.zip", "author": "Shawn Bruce", "homepage": "https://github.com/kantlivelong/OctoPrint-SmartPreheat", "page": "https://plugins.octoprint.org/plugins/smartpreheat/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://raw.githubusercontent.com/kantlivelong/OctoPrint-SmartPreheat/master/extra/screenshots/beforePrintStarted.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.6", "date": "2021-02-02 17:31:42 +0000", "tag": "0.0.6"}, "releases": 6, "last_push": "2021-02-01 19:24:56 +0000", "stars": 24, "issues": {"open": 3, "closed": 10}}, "stats": {"instances_month": 1061, "install_events_month": 81, "instances_week": 727, "install_events_week": 16}}, {"id": "terminalresponse", "published": "2020-05-07 00:00:00 +0000", "title": "Terminal Response", "description": "Monitors terminal for a regular expression and allows you to respond with your own commands.", "archive": "https://github.com/xia0/OctoPrint-TerminalResponse/archive/master.zip", "author": "Xiao Jin", "homepage": "https://github.com/xia0/OctoPrint-TerminalResponse", "page": "https://plugins.octoprint.org/plugins/terminalresponse/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/terminalresponse/01.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.4", "date": "2021-05-03 08:37:49 +0000", "tag": "0.1.4"}, "releases": 1, "last_push": "2021-05-03 08:32:30 +0000", "stars": 4, "issues": {"open": 1, "closed": 4}}, "stats": {"instances_month": 28, "install_events_month": 2, "instances_week": 18, "install_events_week": 1}}, {"id": "FlashForge", "published": "2020-05-18 00:00:00 +0000", "title": "Flashforge/Dremel/PowerSpec Printer Support", "description": "Enable OctoPrint to connect to certain FlashForge, Dremel and PowerSpec printers.", "archive": "https://github.com/Mrnt/OctoPrint-FlashForge/archive/master.zip", "author": "Mrnt", "homepage": "https://github.com/Mrnt/OctoPrint-FlashForge", "page": "https://plugins.octoprint.org/plugins/FlashForge/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": true, "github": {"latest_release": {"name": "0.2.6", "date": "2020-10-15 16:25:51 +0000", "tag": "0.2.6"}, "releases": 23, "last_push": "2024-03-29 20:54:09 +0000", "stars": 87, "issues": {"open": 30, "closed": 31}}, "stats": {"instances_month": 113, "install_events_month": 1, "instances_week": 68, "install_events_week": 1}}, {"id": "EasyServo", "published": "2020-05-21 00:00:00 +0000", "title": "Easy Servo", "description": "Plugin to control two servos attached to a camera gimbal to control motion.", "archive": "https://github.com/mledan/OctoPrint-EasyServo/archive/master.zip", "author": "mledan, iFrostizz, jneilliii", "homepage": "https://github.com/mledan/OctoPrint-EasyServo", "page": "https://plugins.octoprint.org/plugins/EasyServo/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Release for issue #22 ", "date": "2023-01-12 05:10:46 +0000", "tag": "v0.2.4"}, "releases": 7, "last_push": "2024-04-02 17:24:45 +0000", "stars": 21, "issues": {"open": 3, "closed": 13}}, "stats": {"instances_month": 114, "install_events_month": 7, "instances_week": 88, "install_events_week": 0}}, {"id": "multilineterminal", "published": "2020-05-21 00:00:00 +0000", "title": "Multi Line Terminal", "description": "Makes the terminal input a multi line text area.", "archive": "https://github.com/jneilliii/OctoPrint-MultiLineTerminal/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-MultiLineTerminal", "page": "https://plugins.octoprint.org/plugins/multilineterminal/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/multilineterminal/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.5", "date": "2020-10-17 05:00:49 +0000", "tag": "0.1.5"}, "releases": 6, "last_push": "2024-01-14 15:58:52 +0000", "stars": 5, "issues": {"open": 2, "closed": 7}}, "stats": {"instances_month": 268, "install_events_month": 11, "instances_week": 209, "install_events_week": 2}}, {"id": "ikea_tradfri", "published": "2020-05-24 00:00:00 +0000", "title": "Ikea Tradfri", "description": "Control Ikea Tradfri outlet", "archive": "https://github.com/ralmn/OctoPrint-Ikea-tradfri/archive/master.zip", "author": "Mathieu \"ralmn\" HIREL", "homepage": "https://github.com/ralmn/OctoPrint-Ikea-tradfri", "page": "https://plugins.octoprint.org/plugins/ikea_tradfri/", "compatibility": {"octoprint": ["1.4.0", "1.5.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ikea_tradfri/navbar.png", "abandoned": false, "github": {"latest_release": {"name": "v1.7.5", "date": "2021-11-04 23:07:05 +0000", "tag": "1.7.5"}, "releases": 26, "last_push": "2021-11-04 23:05:17 +0000", "stars": 10, "issues": {"open": 5, "closed": 42}}, "stats": {"instances_month": 45, "install_events_month": 3, "instances_week": 33, "install_events_week": 1}}, {"id": "CooldownNotification", "published": "2020-05-26 00:00:00 +0000", "title": "CooldownNotification", "description": "A plugin to execute gcode commands when the print bed cools to a certain temperature", "archive": "https://github.com/gmccauley/OctoPrint-CooldownNotification/archive/master.zip", "author": "George McCauley", "homepage": "https://github.com/gmccauley/OctoPrint-CooldownNotification", "page": "https://plugins.octoprint.org/plugins/CooldownNotification/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/CooldownNotification/settings.png", "abandoned": false, "github": {"latest_release": {"name": "v0.1.2 - 29 May 2020", "date": "2020-05-30 03:40:25 +0000", "tag": "v0.1.2"}, "releases": 3, "last_push": "2020-05-30 03:46:45 +0000", "stars": 6, "issues": {"open": 8, "closed": 5}}, "stats": {"instances_month": 150, "install_events_month": 4, "instances_week": 111, "install_events_week": 3}}, {"id": "PrintJobHistory", "published": "2020-05-28 00:00:00 +0000", "title": "PrintJobHistory", "description": "The OctoPrint-Plugin stores all print-job information of a print in a database.", "archive": "https://github.com/dojohnso/OctoPrint-PrintJobHistory/releases/latest/download/main.zip", "author": "dojohnso, Olli", "homepage": "https://github.com/dojohnso/OctoPrint-PrintJobHistory", "page": "https://plugins.octoprint.org/plugins/PrintJobHistory/", "compatibility": {"octoprint": ["1.3.10", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/PrintJobHistory/editPrintJob-dialog.png", "abandoned": false, "github": {"latest_release": {"name": "V1.17.2", "date": "2023-12-01 15:57:59 +0000", "tag": "1.17.2"}, "releases": 4, "last_push": "2023-12-01 15:59:53 +0000", "stars": 16, "issues": {"open": 8, "closed": 5}}, "stats": {"instances_month": 2700, "install_events_month": 207, "instances_week": 2009, "install_events_week": 45}}, {"id": "mqttsubscribe", "published": "2020-05-29 00:00:00 +0000", "title": "MQTT Subscribe", "description": "This plugin allows controlling OctoPrint via MQTT messages.", "archive": "https://github.com/jneilliii/OctoPrint-MQTTSubscribe/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-MQTTSubscribe", "page": "https://plugins.octoprint.org/plugins/mqttsubscribe/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.1.8", "date": "2022-11-05 19:14:33 +0000", "tag": "0.1.8"}, "releases": 9, "last_push": "2024-01-14 15:58:55 +0000", "stars": 12, "issues": {"open": 0, "closed": 27}}, "stats": {"instances_month": 253, "install_events_month": 21, "instances_week": 196, "install_events_week": 6}}, {"id": "lametric", "published": "2020-06-01 00:00:00 +0000", "title": "Lametric", "description": "Display progress of your Octoprint instance on your LaMetric smart clock.", "archive": "https://github.com/thijsbekke/Octoprint-LaMetric/archive/master.zip", "author": "Thijs Bekke", "homepage": "https://github.com/thijsbekke/Octoprint-LaMetric/", "page": "https://plugins.octoprint.org/plugins/lametric/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/lametric/screenshot_1.png", "abandoned": false, "github": {"latest_release": {"name": "Add a test button to the settings", "date": "2020-06-12 06:28:24 +0000", "tag": "0.1.3"}, "releases": 2, "last_push": "2020-06-12 06:00:04 +0000", "stars": 7, "issues": {"open": 1, "closed": 7}}, "stats": {"instances_month": 22, "install_events_month": 1, "instances_week": 15, "install_events_week": 0}}, {"id": "M300Player", "published": "2020-06-02 00:00:00 +0000", "title": "M300 Player", "description": "Plugin that will play M300 beeps in the web interface.", "archive": "https://github.com/jneilliii/OctoPrint-M300Player/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-M300Player", "page": "https://plugins.octoprint.org/plugins/M300Player/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/M300Player/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.1", "date": "2019-10-22 02:44:11 +0000", "tag": "0.1.1"}, "releases": 2, "last_push": "2024-01-14 15:58:54 +0000", "stars": 5, "issues": {"open": 2, "closed": 3}}, "stats": {"instances_month": 127, "install_events_month": 21, "instances_week": 83, "install_events_week": 2}}, {"id": "setandwait", "published": "2020-06-02 00:00:00 +0000", "title": "Set And Wait", "description": "This OctoPrint plugin implements Set And Wait commands M109 & M190 into OctoPrint and sends their non-blocking counterparts to the controller.", "archive": "https://github.com/kantlivelong/OctoPrint-SetAndWait/archive/master.zip", "author": "Shawn Bruce", "homepage": "https://github.com/kantlivelong/OctoPrint-SetAndWait", "page": "https://plugins.octoprint.org/plugins/setandwait/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.0.1", "date": "2020-06-02 04:14:18 +0000", "tag": "0.0.1"}, "releases": 1, "last_push": "2020-06-02 04:09:02 +0000", "stars": 3, "issues": {"open": 6, "closed": 1}}, "stats": {"instances_month": 119, "install_events_month": 8, "instances_week": 97, "install_events_week": 0}}, {"id": "stickypad", "published": "2020-06-02 00:00:00 +0000", "title": "Sticky Pad", "description": "This plugin adds a persistent sticky pad to the web interface for keeping random notes.", "archive": "https://github.com/jneilliii/OctoPrint-StickyPad/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-StickyPad", "page": "https://plugins.octoprint.org/plugins/stickypad/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/stickypad/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.4", "date": "2020-09-17 16:39:06 +0000", "tag": "0.1.4"}, "releases": 4, "last_push": "2024-01-14 15:59:05 +0000", "stars": 2, "issues": {"open": 2, "closed": 8}}, "stats": {"instances_month": 222, "install_events_month": 9, "instances_week": 166, "install_events_week": 0}}, {"id": "webcam_iframe", "published": "2020-06-02 00:00:00 +0000", "title": "Webcam Iframe", "description": "Simple plugin that replaces the webcam image on the control tab with an iframe that loads the webcam url from the default settings.", "archive": "https://github.com/jneilliii/OctoPrint-WebcamIframe/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-WebcamIframe", "page": "https://plugins.octoprint.org/plugins/webcam_iframe/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/webcam_iframe/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.7", "date": "2024-02-19 08:04:38 +0000", "tag": "0.0.7"}, "releases": 6, "last_push": "2024-02-19 08:03:37 +0000", "stars": 18, "issues": {"open": 1, "closed": 15}}, "stats": {"instances_month": 222, "install_events_month": 47, "instances_week": 123, "install_events_week": 12}}, {"id": "restorelevelingafterg28", "published": "2020-06-03 00:00:00 +0000", "title": "Restore Leveling After G28", "description": "Automatically keeps bed leveling on after G28 (Auto Home).", "archive": "https://github.com/Xennis/OctoPrint-RestoreLevelingAfterG28/archive/master.zip", "author": "Xennis", "homepage": "https://github.com/Xennis/OctoPrint-RestoreLevelingAfterG28", "page": "https://plugins.octoprint.org/plugins/restorelevelingafterg28/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "abandoned": false, "github": {"latest_release": {"name": "1.1.0", "date": "2020-07-29 20:17:07 +0000", "tag": "1.1.0"}, "releases": 2, "last_push": "2023-07-13 14:35:20 +0000", "stars": 4, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 343, "install_events_month": 31, "instances_week": 230, "install_events_week": 9}}, {"id": "widescreen", "published": "2020-06-03 00:00:00 +0000", "title": "OctoPrint-WideScreen", "description": "Plugin that adds a right sidebar panel and moves configured panels from left sidebar to the right sidebar.", "archive": "https://github.com/jneilliii/OctoPrint-WideScreen/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-WideScreen", "page": "https://plugins.octoprint.org/plugins/widescreen/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/widescreen/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.4", "date": "2020-11-21 03:46:58 +0000", "tag": "0.1.4"}, "releases": 8, "last_push": "2024-01-14 15:59:19 +0000", "stars": 20, "issues": {"open": 3, "closed": 17}}, "stats": {"instances_month": 1923, "install_events_month": 150, "instances_week": 1323, "install_events_week": 35}}, {"id": "prusa_mini_eta", "published": "2020-06-04 00:00:00 +0000", "title": "OctoPrint-Prusa-Mini-ETA", "description": "Prusa ETA detection from the gcode files prepared by the Prusa Slicer.", "archive": "https://github.com/egguy/OctoPrint-Prusa-Mini-ETA/archive/master.zip", "author": "Etienne G. (current), Michal Duda", "homepage": "https://github.com/egguy/OctoPrint-Prusa-Mini-ETA", "page": "https://plugins.octoprint.org/plugins/prusa_mini_eta/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://github.com/egguy/OctoPrint-Prusa-Mini-ETA/raw/master/assets/img/Print-Time-Left.png", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2022-03-30 21:06:31 +0000", "tag": "0.1.4"}, "releases": 1, "last_push": "2022-03-22 22:55:44 +0000", "stars": 4, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 546, "install_events_month": 36, "instances_week": 416, "install_events_week": 4}}, {"id": "signalclirestapi", "published": "2020-06-06 00:00:00 +0000", "title": "Signalclirestapi", "description": "Another Signal Messenger Integration based on the signal-cli-rest-api docker image. Supports Signal Messenger groups and print progress.", "archive": "https://github.com/bbernhard/OctoPrint-Signalclirestapi/archive/master.zip", "author": "Bernhard B.", "homepage": "https://github.com/bbernhard/OctoPrint-Signalclirestapi", "page": "https://plugins.octoprint.org/plugins/signalclirestapi/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/signalclirestapi/config1.png", "abandoned": false, "github": {"latest_release": {"name": "Version 0.2.1", "date": "2023-02-02 17:05:52 +0000", "tag": "0.2.1"}, "releases": 3, "last_push": "2023-02-02 17:05:12 +0000", "stars": 5, "issues": {"open": 1, "closed": 5}}, "stats": {"instances_month": 11, "install_events_month": 3, "instances_week": 6, "install_events_week": 1}}, {"id": "SMuFF", "published": "2020-06-11 00:00:00 +0000", "title": "OctoPrint-Smuff", "description": "A plugin for controlling tool changes on the SMuFF from OctoPrint as published on Thingiverse https://www.thingiverse.com/thing:3431438", "archive": "https://github.com/technik-gegg/OctoPrint-Smuff/archive/master.zip", "author": "Technik Gegg", "homepage": "https://github.com/technik-gegg/OctoPrint-Smuff", "page": "https://plugins.octoprint.org/plugins/SMuFF/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/SMuFF/SMuFF-V5.png", "abandoned": false, "github": {"latest_release": {"name": "V1.2.4", "date": "2023-12-22 05:04:33 +0000", "tag": "V1.2.4"}, "releases": 3, "last_push": "2023-05-06 07:05:06 +0000", "stars": 18, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 10, "install_events_month": 4, "instances_week": 7, "install_events_week": 0}}, {"id": "consolidate_temp_control", "published": "2020-06-12 00:00:00 +0000", "title": "Consolidate Temp Control", "description": "This plugin consolidates the temperature and control tabs into one.", "archive": "https://github.com/jneilliii/OctoPrint-ConsolidateTempControl/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-ConsolidateTempControl", "page": "https://plugins.octoprint.org/plugins/consolidate_temp_control/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/consolidate_temp_control/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.10", "date": "2023-05-24 20:41:26 +0000", "tag": "0.1.10"}, "releases": 13, "last_push": "2024-01-14 15:58:42 +0000", "stars": 15, "issues": {"open": 0, "closed": 20}}, "stats": {"instances_month": 1194, "install_events_month": 68, "instances_week": 874, "install_events_week": 14}}, {"id": "simple_filament_change_buttons", "published": "2020-06-12 00:00:00 +0000", "title": "Simple Filament Change Buttons", "description": "Simply adds some buttons to send the filament load/unload/change commands for Marlin, so you don't have to use the LCD menu", "archive": "https://github.com/TheThief/Octoprint_Simple_Filament_Change_Buttons/archive/master.zip", "author": "Gareth Martin", "homepage": "https://github.com/TheThief/Octoprint_Simple_Filament_Change_Buttons/", "page": "https://plugins.octoprint.org/plugins/simple_filament_change_buttons/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "mit", "image": "https://plugins.octoprint.org/assets/img/plugins/simple_filament_change_buttons/sfc_buttons.png", "abandoned": false, "github": {"latest_release": {"name": "v1.1", "date": "2021-01-26 11:55:48 +0000", "tag": "v1.1"}, "releases": 2, "last_push": "2023-04-05 07:01:05 +0000", "stars": 5, "issues": {"open": 0, "closed": 4}}, "stats": {"instances_month": 1937, "install_events_month": 136, "instances_week": 1391, "install_events_week": 30}}, {"id": "homeassistant", "published": "2020-06-14 00:00:00 +0000", "title": "HomeAssistant Discovery", "description": "Automatically add your OctoPrint server to Home Assistant with MQTT", "archive": "https://github.com/cmroche/OctoPrint-HomeAssistant/archive/master.zip", "author": "Clifford Roche", "homepage": "https://github.com/cmroche/OctoPrint-HomeAssistant", "page": "https://plugins.octoprint.org/plugins/homeassistant/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/homeassistant/hassio.png", "abandoned": false, "github": {"latest_release": {"name": "3.7.0", "date": "2023-08-06 20:28:39 +0000", "tag": "3.7.0"}, "releases": 37, "last_push": "2023-08-06 20:27:46 +0000", "stars": 109, "issues": {"open": 12, "closed": 62}}, "stats": {"instances_month": 3210, "install_events_month": 241, "instances_week": 2398, "install_events_week": 54}}, {"id": "z_probe_offset", "published": "2020-06-14 00:00:00 +0000", "title": "Z Probe Offset Control", "description": "Add input to the control view for editing the z probe offset on marlin based printers", "archive": "https://framagit.org/razer/octoprint_z_probe_offset/-/archive/latest/octoprint_z_probe_offset-latest.zip", "author": "razer", "homepage": "https://framagit.org/razer/octoprint_z_probe_offset", "page": "https://plugins.octoprint.org/plugins/z_probe_offset/", "compatibility": {"octoprint": ["1.3.9"], "os": ["linux", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/z_probe_offset/z_probe_offset_control.png", "abandoned": false, "stats": {"instances_month": 3401, "install_events_month": 320, "instances_week": 2318, "install_events_week": 67}}, {"id": "geeks3d", "published": "2020-06-22 00:00:00 +0000", "title": "OctoPrint-3DGeeks", "description": "Companion plugin for 3D Geeks (Android & iOS App)", "archive": "https://github.com/2BWorks/OctoPrint-3DGeeks/archive/master.zip", "author": "Toby from 3D Geeks", "homepage": "https://www.3dgeeks.app", "page": "https://plugins.octoprint.org/plugins/geeks3d/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "Apache-2.0", "image": "https://plugins.octoprint.org/assets/img/plugins/geeks3d/featured.png", "abandoned": false, "github": {"last_push": "2020-06-26 08:22:37 +0000", "stars": 3, "issues": {"open": 5, "closed": 1}}, "stats": {"instances_month": 182, "install_events_month": 10, "instances_week": 131, "install_events_week": 1}}, {"id": "RewriteM600", "published": "2020-06-23 00:00:00 +0000", "title": "Rewrite M600 - For M600 Unsupported", "description": "Implement M600 for pinters that can't support M600 by default (TFT with out marlin mode support, like Artilelry X1 and Genius)", "archive": "https://github.com/wgcv/RewriteM600/archive/master.zip", "author": "Gustavo Cevallos", "homepage": "https://github.com/wgcv/RewriteM600", "page": "https://plugins.octoprint.org/plugins/RewriteM600/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/RewriteM600/M600-in-action.png", "abandoned": false, "github": {"latest_release": {"name": "v1.0.5", "date": "2020-07-05 18:58:36 +0000", "tag": "v1.0.5"}, "releases": 4, "last_push": "2021-10-02 18:41:15 +0000", "stars": 12, "issues": {"open": 9, "closed": 2}}, "stats": {"instances_month": 237, "install_events_month": 17, "instances_week": 162, "install_events_week": 3}}, {"id": "ngrok", "published": "2020-06-23 00:00:00 +0000", "title": "Ngrok Tunnel", "description": "A plugin to securely access your OctoPrint instance remotely through ngrok", "archive": "https://github.com/fieldOfView/OctoPrint-ngrok/archive/master.zip", "author": "fieldOfView", "homepage": "https://github.com/fieldOfView/OctoPrint-ngrok", "page": "https://plugins.octoprint.org/plugins/ngrok/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ngrok/ngrok_navbar.png", "abandoned": false, "github": {"latest_release": {"name": "0.4.0", "date": "2021-05-18 10:29:25 +0000", "tag": "0.4.0"}, "releases": 10, "last_push": "2021-05-18 10:27:23 +0000", "stars": 15, "issues": {"open": 9, "closed": 23}}, "stats": {"instances_month": 393, "install_events_month": 40, "instances_week": 285, "install_events_week": 12}}, {"id": "DuCalibrator", "published": "2020-06-24 00:00:00 +0000", "title": "Delta Micro Calibrator", "description": "An OctoPrint Plugin for performing micro calibration in linear delta machines.", "archive": "https://github.com/Fabi0San/DuCalibrator/archive/master.zip", "author": "Fabio Santos", "homepage": "https://github.com/Fabi0San/DuCalibrator", "page": "https://plugins.octoprint.org/plugins/DuCalibrator/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/DuCalibrator/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "v1.0.4", "date": "2020-06-28 22:45:15 +0000", "tag": "1.0.4"}, "releases": 4, "last_push": "2020-06-28 22:43:15 +0000", "stars": 13, "issues": {"open": 6, "closed": 15}}, "stats": {"instances_month": 57, "install_events_month": 7, "instances_week": 43, "install_events_week": 3}}, {"id": "ThermalRunaway", "published": "2020-06-28 00:00:00 +0000", "title": "Thermal Runaway", "description": "An Octoprint Plugin to provide some basic Thermal Runaway protection", "archive": "https://github.com/AlexVerrico/Octoprint-ThermalRunaway/archive/master.zip", "author": "Alex Verrico", "homepage": "https://github.com/AlexVerrico/Octoprint-ThermalRunaway", "page": "https://plugins.octoprint.org/plugins/ThermalRunaway/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ThermalRunaway/ThermalRunaway-config.png", "abandoned": false, "github": {"latest_release": {"name": "Version 3.1.0 - Rewrite of thermal runaway detection logic", "date": "2022-01-14 01:05:03 +0000", "tag": "3.1.0"}, "releases": 10, "last_push": "2022-01-14 01:01:53 +0000", "stars": 5, "issues": {"open": 4, "closed": 11}}, "stats": {"instances_month": 278, "install_events_month": 24, "instances_week": 202, "install_events_week": 6}}, {"id": "macro", "published": "2020-06-28 00:00:00 +0000", "title": "Sidebar Macros", "description": "Plugin for Octoprint to add macros list in sidebar", "archive": "https://github.com/mike1pol/octoprint_macro/archive/master.zip", "author": "Mikhail Poluboyarinov", "homepage": "https://github.com/mike1pol/octoprint_macro", "page": "https://plugins.octoprint.org/plugins/macro/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/macro/main.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.2", "date": "2022-01-14 08:26:47 +0000", "tag": "0.3.2"}, "releases": 6, "last_push": "2022-01-14 08:25:55 +0000", "stars": 4, "issues": {"open": 10, "closed": 17}}, "stats": {"instances_month": 439, "install_events_month": 32, "instances_week": 320, "install_events_week": 8}}, {"id": "swapxy", "published": "2020-07-02 00:00:00 +0000", "title": "SwapXY", "description": "Swap the X and Y axes used by the jog controls", "archive": "https://gitlab.com/wolframmfg/octoprint-swapxy/-/archive/main/octoprint-swapxy-main.zip", "author": "Andy Castille ", "homepage": "https://gitlab.com/wolframmfg/octoprint-swapxy", "page": "https://plugins.octoprint.org/plugins/swapxy/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "GPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/swapxy/swapxy_controls.png", "abandoned": false, "stats": {"instances_month": 21, "install_events_month": 1, "instances_week": 17, "install_events_week": 0}}, {"id": "GPIOShutdown", "published": "2020-07-03 00:00:00 +0000", "title": "GPIO Shutdown", "description": "A plugin that shutdown the Rasperry Pi if you connect ground to one of the selected GPIO ports.", "archive": "https://github.com/fmalekpour/OctoPrint-Gpioshutdown/archive/master.zip", "author": "Farhad Malekpour", "homepage": "https://github.com/fmalekpour/OctoPrint-Gpioshutdown", "page": "https://plugins.octoprint.org/plugins/GPIOShutdown/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://raw.githubusercontent.com/fmalekpour/OctoPrint-Gpioshutdown/master/screenshots/screen01.jpg", "abandoned": false, "github": {"latest_release": {"name": "1.0.4", "date": "2021-04-01 05:52:15 +0000", "tag": "1.0.4"}, "releases": 4, "last_push": "2021-04-01 05:49:36 +0000", "stars": 12, "issues": {"open": 14, "closed": 5}}, "stats": {"instances_month": 196, "install_events_month": 9, "instances_week": 120, "install_events_week": 1}}, {"id": "M150Control", "published": "2020-07-03 00:00:00 +0000", "title": "OctoPrint-M150control", "description": "Send M150 control through the UI", "archive": "https://github.com/horfee/OctoPrint-M150control/archive/master.zip", "author": "Jean-Philippe Alexandre", "homepage": "https://github.com/horfee/OctoPrint-M150control", "page": "https://plugins.octoprint.org/plugins/M150Control/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/M150Control/screenshot.jpg", "abandoned": false, "github": {"last_push": "2020-07-16 14:18:51 +0000", "stars": 1, "issues": {"open": 3, "closed": 2}}, "stats": {"instances_month": 73, "install_events_month": 6, "instances_week": 54, "install_events_week": 0}}, {"id": "gridspace", "published": "2020-07-04 00:00:00 +0000", "title": "OctoPrint-GridSpace", "description": "Allows for direct printing from GridSpace's Kiri:Moto slicer", "archive": "https://github.com/GridSpace/OctoPrint-GridSpace/archive/master.zip", "author": "Stewart Allen", "homepage": "https://github.com/GridSpace/OctoPrint-GridSpace", "page": "https://plugins.octoprint.org/plugins/gridspace/", "compatibility": {"octoprint": ["1.3.1"], "os": [], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/gridspace/Kiri-In-OctoPrint.png", "abandoned": false, "github": {"last_push": "2022-10-22 20:19:54 +0000", "stars": 6, "issues": {"open": 4, "closed": 2}}, "stats": {"instances_month": 60, "install_events_month": 5, "instances_week": 38, "install_events_week": 0}}, {"id": "ArduCamFocus", "published": "2020-07-11 00:00:00 +0000", "title": "ArduCamFocus", "description": "Plugin to control ArduCam with motorized focus control on octopi", "archive": "https://github.com/moof-src/ArduCamFocus/archive/master.zip", "author": "moof, jneilliii", "homepage": "https://github.com/moof-src/ArduCamFocus", "page": "https://plugins.octoprint.org/plugins/ArduCamFocus/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ArduCamFocus/ControlScreenShot.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.6 - Improved Error Handling", "date": "2021-04-24 13:03:22 +0000", "tag": "0.0.6"}, "releases": 2, "last_push": "2021-04-24 12:38:06 +0000", "stars": 16, "issues": {"open": 7, "closed": 6}}, "stats": {"instances_month": 280, "install_events_month": 27, "instances_week": 188, "install_events_week": 8}}, {"id": "GPIOCoolDownFan", "published": "2020-07-16 00:00:00 +0000", "title": "OctoPrint-Cooldownfan", "description": "Turn on the cooldown fan after printing finished", "archive": "https://github.com/fmalekpour/OctoPrint-Cooldownfan/archive/master.zip", "author": "Farhad Malekpour", "homepage": "https://github.com/fmalekpour/OctoPrint-Cooldownfan", "page": "https://plugins.octoprint.org/plugins/GPIOCoolDownFan/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/cooldownfan/cool-down-fan-config-screen.jpg", "abandoned": false, "github": {"latest_release": {"name": "1.0.0", "date": "2020-07-16 07:40:04 +0000", "tag": "1.0.0"}, "releases": 1, "last_push": "2020-07-17 03:05:44 +0000", "stars": 6, "issues": {"open": 4, "closed": 1}}, "stats": {"instances_month": 66, "install_events_month": 3, "instances_week": 45, "install_events_week": 2}}, {"id": "marlinbft", "published": "2020-07-26 00:00:00 +0000", "title": "OctoPrint-MarlinBft", "description": "Upload files using Marlin Binary File Transfer Mark II", "archive": "https://github.com/charleswillis3/OctoPrint-MarlinBft/archive/master.zip", "author": "Charles Willis", "homepage": "https://github.com/charleswillis3/OctoPrint-MarlinBft", "page": "https://plugins.octoprint.org/plugins/marlinbft/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/marlinbft/marlinbft-feature.png", "abandoned": false, "github": {"last_push": "2020-07-29 10:34:40 +0000", "stars": 11, "issues": {"open": 10, "closed": 5}}, "stats": {"instances_month": 121, "install_events_month": 14, "instances_week": 77, "install_events_week": 1}}, {"id": "printhistory", "published": "2020-07-27 00:00:00 +0000", "title": "Print History", "description": "Saves filename, print time and filament usage for each print", "archive": "https://github.com/imrahil/OctoPrint-PrintHistory/archive/master.zip", "author": "Jarek Szczepanski, Guy Sheffer", "homepage": "https://github.com/imrahil/OctoPrint-PrintHistory", "page": "https://plugins.octoprint.org/plugins/printhistory/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/printhistory/printhistory.png", "abandoned": false, "github": {"latest_release": {"name": "OctoPrint PrintHistory Plugin 1.4.1", "date": "2023-05-21 16:52:30 +0000", "tag": "1.4.1"}, "releases": 16, "last_push": "2023-06-29 02:51:06 +0000", "stars": 63, "issues": {"open": 29, "closed": 52}}, "stats": {"instances_month": 1493, "install_events_month": 119, "instances_week": 1125, "install_events_week": 27}}, {"id": "ws281x_led_status", "published": "2020-07-28 00:00:00 +0000", "title": "WS281x LED Status", "description": "Add some WS281x type RGB LEDs to your printer for a quick status update!", "archive": "https://github.com/cp2004/OctoPrint-WS281x_LED_Status/releases/latest/download/release.zip", "author": "Charlie Powell", "homepage": "https://github.com/cp2004/OctoPrint-WS281x_LED_Status", "page": "https://plugins.octoprint.org/plugins/ws281x_led_status/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux"], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ws281x_led_status/ws281x_settings.png", "abandoned": false, "github": {"latest_release": {"name": "0.8.1 (Stable Release)", "date": "2022-03-13 20:57:54 +0000", "tag": "0.8.1"}, "releases": 26, "last_push": "2023-12-27 13:00:31 +0000", "stars": 111, "issues": {"open": 19, "closed": 173}}, "stats": {"instances_month": 780, "install_events_month": 57, "instances_week": 537, "install_events_week": 18}}, {"id": "virtual_printerconfig", "published": "2020-08-04 00:00:00 +0000", "title": "Virtual Printer Settings", "description": "Add configurable settings to the Virtual Printer plugin under OctoPrint's settings", "archive": "https://github.com/cp2004/OctoPrint-VirtualPrinterSettings/releases/latest/download/release.zip", "author": "Charlie Powell", "homepage": "https://github.com/cp2004/OctoPrint-VirtualPrinterSettings", "page": "https://plugins.octoprint.org/plugins/virtual_printerconfig/", "compatibility": {"octoprint": ["1.8.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/virtual_printerconfig/settings.png", "abandoned": false, "github": {"latest_release": {"name": "2022.07.04", "date": "2022-07-04 21:16:42 +0000", "tag": "2022.07.04"}, "releases": 8, "last_push": "2023-12-27 13:00:32 +0000", "stars": 5, "issues": {"open": 0, "closed": 9}}, "stats": {"instances_month": 229, "install_events_month": 29, "instances_week": 145, "install_events_week": 4}}, {"id": "consolidatedtabs", "published": "2020-08-06 00:00:00 +0000", "title": "Consolidated Tabs", "description": "Combines configured tabs into a single tab as draggable and resizable panels.", "archive": "https://github.com/jneilliii/OctoPrint-ConsolidatedTabs/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-ConsolidatedTabs", "page": "https://plugins.octoprint.org/plugins/consolidatedtabs/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/consolidatedtabs/screenshot_tab.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.2", "date": "2023-05-25 00:33:21 +0000", "tag": "1.0.2"}, "releases": 21, "last_push": "2024-01-14 15:58:43 +0000", "stars": 22, "issues": {"open": 3, "closed": 47}}, "stats": {"instances_month": 805, "install_events_month": 54, "instances_week": 589, "install_events_week": 9}}, {"id": "octotweet", "published": "2020-08-08 00:00:00 +0000", "title": "OctoPrint-Octotweet", "description": "Twitter plugin for OctoPrint", "archive": "https://github.com/jpg32/OctoPrint-Octotweet/archive/master.zip", "author": "Jean Pierre GARCIA", "homepage": "https://github.com/jpg32/OctoPrint-Octotweet", "page": "https://plugins.octoprint.org/plugins/octotweet/", "compatibility": {"octoprint": ["1.4.2"], "os": [], "python": ">2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/octotweet/twitter.jpg", "abandoned": false, "github": {"latest_release": {"name": "v1.0.5", "date": "2020-11-07 16:39:00 +0000", "tag": "v1.0.5"}, "releases": 4, "last_push": "2020-11-07 16:37:07 +0000", "stars": 3, "issues": {"open": 3, "closed": 0}}, "stats": {"instances_month": 15, "install_events_month": 1, "instances_week": 13, "install_events_week": 0}}, {"id": "heatbedsavety", "published": "2020-08-14 00:00:00 +0000", "title": "OctoPrint-HeatBedSavety", "description": "HighPower HeatBedSavety Plugin", "archive": "https://github.com/linux-paul/OctoPrint-Heatbedsavety/archive/master.zip", "author": "linux-paul", "homepage": "https://github.com/linux-paul/OctoPrint-Heatbedsavety", "page": "https://plugins.octoprint.org/plugins/heatbedsavety/", "compatibility": {"octoprint": ["1.3.6"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"last_push": "2020-08-17 06:01:47 +0000", "stars": 1, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 11, "install_events_month": 2, "instances_week": 7, "install_events_week": 0}}, {"id": "ophom", "published": "2020-08-16 00:00:00 +0000", "title": "Ophom", "description": "Octoprint Philips Hue Outlet Manager", "archive": "https://github.com/Salamafet/ophom/archive/master.zip", "author": "St\u00e9phane Z.", "homepage": "https://github.com/Salamafet/ophom", "page": "https://plugins.octoprint.org/plugins/ophom/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Fix for Octoprint 1.8.3 update", "date": "2022-09-28 21:41:19 +0000", "tag": "1.5.1"}, "releases": 17, "last_push": "2024-02-05 18:09:04 +0000", "stars": 7, "issues": {"open": 4, "closed": 34}}, "stats": {"instances_month": 261, "install_events_month": 10, "instances_week": 176, "install_events_week": 1}}, {"id": "prettygcode", "published": "2020-08-17 00:00:00 +0000", "title": "OctoPrint-PrettyGCode", "description": "A pretty GCode visualizer for Octoprint", "archive": "https://github.com/Kragrathea/OctoPrint-PrettyGCode/archive/master.zip", "author": "Kragrathea", "homepage": "https://github.com/Kragrathea/OctoPrint-PrettyGCode", "page": "https://plugins.octoprint.org/plugins/prettygcode/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/prettygcode/PrettyGcode-Screen1.jpg", "abandoned": false, "github": {"latest_release": {"name": "Version 1.2.4", "date": "2020-12-14 01:39:57 +0000", "tag": "v1.2.4"}, "releases": 10, "last_push": "2021-10-11 20:58:45 +0000", "stars": 113, "issues": {"open": 47, "closed": 58}}, "stats": {"instances_month": 15645, "install_events_month": 1498, "instances_week": 12074, "install_events_week": 340}}, {"id": "procastinator", "published": "2020-08-21 00:00:00 +0000", "title": "Procastinator", "description": "Puts printjobs on hold until a certain time", "archive": "https://github.com/juergenpabel/OctoPrint-Procastinator/archive/master.zip", "author": "Juergen Pabel", "homepage": "https://github.com/juergenpabel/OctoPrint-Procastinator", "page": "https://plugins.octoprint.org/plugins/procastinator/", "compatibility": {"octoprint": ["1.4.2"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/procastinator/settings.png", "abandoned": false, "github": {"latest_release": {"name": "1.1.1", "date": "2020-08-25 18:48:39 +0000", "tag": "1.1.1"}, "releases": 19, "last_push": "2020-08-25 18:48:35 +0000", "stars": 2, "issues": {"open": 10, "closed": 3}}, "stats": {"instances_month": 162, "install_events_month": 10, "instances_week": 121, "install_events_week": 3}}, {"id": "SpoolManager", "published": "2020-08-23 00:00:00 +0000", "title": "SpoolManager", "description": "The OctoPrint-Plugin manages all spool informations and stores it in a database.", "archive": "https://github.com/dojohnso/OctoPrint-SpoolManager/releases/latest/download/main.zip", "author": "dojohnso, Olli", "homepage": "https://github.com/dojohnso/OctoPrint-SpoolManager", "page": "https://plugins.octoprint.org/plugins/SpoolManager/", "compatibility": {"octoprint": ["1.3.10", "1.4.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/SpoolManager/editSpool-dialog.png", "abandoned": false, "github": {"latest_release": {"name": "V1.7.3", "date": "2023-12-10 19:46:21 +0000", "tag": "1.7.3"}, "releases": 4, "last_push": "2024-02-08 15:07:10 +0000", "stars": 17, "issues": {"open": 4, "closed": 24}}, "stats": {"instances_month": 3835, "install_events_month": 360, "instances_week": 2759, "install_events_week": 91}}, {"id": "ender3v2tempfix", "published": "2020-09-07 00:00:00 +0000", "title": "Creality 2x temperature reporting fix", "description": "Fixes the temperature reporting from Creality printers shipped with the new mainboard (new Ender-3 Pro's, Ender-3 Pro v2, CR-6 SE & possibly more)", "archive": "https://github.com/SimplyPrint/OctoPrint-Creality2xTemperatureReportingFix/archive/master.zip", "author": "Albert MN. @ SimplyPrint, b-morgan", "homepage": "https://github.com/SimplyPrint/OctoPrint-Creality2xTemperatureReportingFix", "page": "https://plugins.octoprint.org/plugins/ender3v2tempfix/", "compatibility": {"octoprint": [], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "abandoned": false, "github": {"latest_release": {"name": "0.0.4", "date": "2020-09-23 11:41:29 +0000", "tag": "0.0.4"}, "releases": 3, "last_push": "2021-04-26 18:52:11 +0000", "stars": 27, "issues": {"open": 2, "closed": 15}}, "stats": {"instances_month": 12231, "install_events_month": 889, "instances_week": 8959, "install_events_week": 204}}, {"id": "backupscheduler", "published": "2020-09-19 00:00:00 +0000", "title": "Backup Scheduler", "description": "Schedule OctoPrint backups at regular intervals.", "archive": "https://github.com/jneilliii/OctoPrint-BackupScheduler/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-BackupScheduler", "page": "https://plugins.octoprint.org/plugins/backupscheduler/", "compatibility": {"octoprint": ["1.3.10"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/backupscheduler/screenshot_settings.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.0", "date": "2021-07-31 06:30:14 +0000", "tag": "0.1.0"}, "releases": 11, "last_push": "2024-01-14 15:58:41 +0000", "stars": 11, "issues": {"open": 2, "closed": 18}}, "stats": {"instances_month": 1534, "install_events_month": 95, "instances_week": 1184, "install_events_week": 12}}, {"id": "googledrivebackup", "published": "2020-09-21 00:00:00 +0000", "title": "Google Drive Backup", "description": "This plugin will automatically save a copy of your OctoPrint backup to Google Drive upon completion.", "archive": "https://github.com/jneilliii/OctoPrint-GoogleDriveBackup/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-GoogleDriveBackup", "page": "https://plugins.octoprint.org/plugins/googledrivebackup/", "compatibility": {"octoprint": ["1.5.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/googledrivebackup/configuration_step7.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.3", "date": "2024-01-21 18:08:08 +0000", "tag": "0.1.3"}, "releases": 10, "last_push": "2024-01-21 18:06:45 +0000", "stars": 29, "issues": {"open": 1, "closed": 42}}, "stats": {"instances_month": 978, "install_events_month": 88, "instances_week": 701, "install_events_week": 20}}, {"id": "terminalmessaging", "published": "2020-09-22 00:00:00 +0000", "title": "Terminal Messaging", "description": "Adds styling to the terminal tab that makes it easier to see where a message is from.", "archive": "https://github.com/jeffeb3/OctoPrint-TerminalMessaging/archive/master.zip", "author": "jeffeb3", "homepage": "https://github.com/jeffeb3/OctoPrint-TerminalMessaging", "page": "https://plugins.octoprint.org/plugins/terminalmessaging/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/terminalmessaging/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "v0.1.0", "date": "2020-10-27 17:53:09 +0000", "tag": "0.1.0"}, "releases": 4, "last_push": "2020-10-27 17:50:18 +0000", "stars": 7, "issues": {"open": 3, "closed": 2}}, "stats": {"instances_month": 375, "install_events_month": 24, "instances_week": 297, "install_events_week": 5}}, {"id": "marlingcodedocumentation", "published": "2020-09-27 00:00:00 +0000", "title": "MarlinGcodeDocumentation", "description": "Provides documentation for Marlin, RepRap, and Klipper, GCode commands in the Terminal tab", "archive": "https://github.com/costas-basdekis/MarlinGcodeDocumentation/archive/master.zip", "author": "Costas Basdekis", "homepage": "https://github.com/costas-basdekis/MarlinGcodeDocumentation", "page": "https://plugins.octoprint.org/plugins/marlingcodedocumentation/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/marlingcodedocumentation/screenshot-example-command.png", "abandoned": false, "github": {"latest_release": {"name": "Release v0.18.0", "date": "2022-05-20 22:39:41 +0000", "tag": "v0.18.0"}, "releases": 12, "last_push": "2022-05-20 13:51:46 +0000", "stars": 18, "issues": {"open": 3, "closed": 17}}, "stats": {"instances_month": 1713, "install_events_month": 134, "instances_week": 1217, "install_events_week": 24}}, {"id": "MakerOS", "published": "2020-10-05 00:00:00 +0000", "title": "MakerOS", "description": "An OctoPrint plugin integration with the MakerOS Platform API.", "archive": "https://github.com/makeros3d/Octoprint-Makeros/archive/master.zip", "author": "Thomas Lawton", "homepage": "https://github.com/makeros3d/Octoprint-Makeros", "page": "https://plugins.octoprint.org/plugins/MakerOS/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/MakerOS/Octoprint-Makeros-projects.png", "abandoned": false, "github": {"last_push": "2020-11-23 15:28:16 +0000", "stars": 1, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 10, "install_events_month": 5, "instances_week": 8, "install_events_week": 1}}, {"id": "wifistatus", "published": "2020-10-08 00:00:00 +0000", "title": "WiFi Status", "description": "Displays the WiFi connection status on the OctoPrint navigation bar.", "archive": "https://github.com/ManuelMcLure/OctoPrint-WiFiStatus/archive/main.zip", "author": "Manuel McLure", "homepage": "https://github.com/ManuelMcLure/OctoPrint-WiFiStatus", "page": "https://plugins.octoprint.org/plugins/wifistatus/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/wifistatus/WiFiStatus.png", "abandoned": false, "github": {"latest_release": {"name": "Fix netmask fetching in OctoPrint 1.10+", "date": "2024-04-24 19:07:59 +0000", "tag": "v1.9.0"}, "releases": 19, "last_push": "2024-04-24 19:04:25 +0000", "stars": 12, "issues": {"open": 0, "closed": 20}}, "stats": {"instances_month": 3161, "install_events_month": 320, "instances_week": 2082, "install_events_week": 62}}, {"id": "raisecloud", "published": "2020-10-10 00:00:00 +0000", "title": "RaiseCloud", "description": "Manage your OctoPi powered 3D printer through our powerful cloud management platform, RaiseCloud (web or app).", "archive": "https://github.com/Raise3D/Octoprint-Raisecloud/archive/master.zip", "author": "Raise3D", "homepage": "https://github.com/Raise3D/Octoprint-Raisecloud", "privacypolicy": "https://www.raise3d.com/legal/privacy-policy/", "page": "https://plugins.octoprint.org/plugins/raisecloud/", "compatibility": {"octoprint": ["1.3.12"], "os": ["linux", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/raisecloud/Raise3D.jpg", "abandoned": false, "github": {"latest_release": {"name": "1.1.0", "date": "2020-08-21 02:36:10 +0000", "tag": "1.1.0"}, "releases": 3, "last_push": "2023-08-17 07:52:43 +0000", "stars": 7, "issues": {"open": 4, "closed": 5}}, "stats": {"instances_month": 364, "install_events_month": 28, "instances_week": 241, "install_events_week": 5}}, {"id": "smartfilamentsensor", "published": "2020-10-16 00:00:00 +0000", "title": "Octoprint-Smart-Filament-Sensor", "description": "A plugin to directly add Smart Filament Sensors like BigTreeTech Smart Filament Sensor to Octoprint.", "archive": "https://github.com/Royrdan/Octoprint-Smart-Filament-Sensor/archive/master.zip", "author": "Royrdan, Anni Lange", "homepage": "https://github.com/Royrdan/Octoprint-Smart-Filament-Sensor", "page": "https://plugins.octoprint.org/plugins/smartfilamentsensor/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "GPLv3", "abandoned": false, "github": {"latest_release": {"name": "GPIO interupt fix, Resume fix, GPIO cleanup fix", "date": "2022-06-29 07:41:10 +0000", "tag": "1.2"}, "releases": 7, "last_push": "2022-07-08 09:04:09 +0000", "stars": 7, "issues": {"open": 21, "closed": 8}}, "stats": {"instances_month": 490, "install_events_month": 42, "instances_week": 345, "install_events_week": 10}}, {"id": "arc_welder", "published": "2020-10-24 00:00:00 +0000", "title": "Arc Welder", "description": "Anti-Stutter and GCode Compression. Replaces G0/G1 with G2/G3 where possible.", "archive": "https://github.com/FormerLurker/ArcWelderPlugin/archive/master.zip", "author": "Brad Hochgesang", "homepage": "https://github.com/FormerLurker/ArcWelderPlugin", "page": "https://plugins.octoprint.org/plugins/arc_welder/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPL-3.0", "image": "https://plugins.octoprint.org/assets/img/plugins/arc_welder/tab_full.jpg", "abandoned": false, "github": {"latest_release": {"name": "1.0.0", "date": "2020-10-24 22:19:14 +0000", "tag": "1.0.0"}, "releases": 11, "last_push": "2020-10-25 21:25:50 +0000", "stars": 438, "issues": {"open": 100, "closed": 129}}, "stats": {"instances_month": 6768, "install_events_month": 570, "instances_week": 4761, "install_events_week": 121}}, {"id": "octoeverywhere", "published": "2020-11-07 00:00:00 +0000", "title": "OctoEverywhere - Free Remote Access, AI Failure Detection, And More!", "description": "Free, simple, and secure remote monitoring and control of your OctoPrint printer anywhere in the world. OctoEverywhere gives you unlimited OctoPrint access on any web browser and can empower your favorite OctoPrint Android and iOS apps to work everywhere. Meet Gadget, your new free and unlimited AI-powered print failure detection assistant! Gadget continuously watches your prints for errors, so you don't have to!", "archive": "https://github.com/QuinnDamerell/OctoPrint-OctoEverywhere/archive/master.zip", "author": "Quinn Damerell", "homepage": "https://OctoEverywhere.com/", "page": "https://plugins.octoprint.org/plugins/octoeverywhere/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/octoeverywhere/homepage.png", "abandoned": false, "github": {"latest_release": {"name": "\ud83c\udf89 Bambu Labs Is Here! Also RTSP Webcam Streaming, Default Camera, And More", "date": "2024-05-03 05:44:41 +0000", "tag": "3.3.3"}, "releases": 55, "last_push": "2024-05-04 04:41:54 +0000", "stars": 126, "issues": {"open": 4, "closed": 50}}, "stats": {"instances_month": 51552, "install_events_month": 3039, "instances_week": 47483, "install_events_week": 724}}, {"id": "lightsout", "published": "2020-11-08 00:00:00 +0000", "title": "OctoPrint-LightsOut", "description": "Automatically shuts off lights after some delay when printing completes", "archive": "https://github.com/Peaches491/OctoPrint-LightsOut/archive/master.zip", "author": "Daniel Miller", "homepage": "https://github.com/Peaches491/OctoPrint-LightsOut", "page": "https://plugins.octoprint.org/plugins/lightsout/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/lightsout/settings_screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "*Actually* Ignore M150 while printing", "date": "2020-11-09 23:10:54 +0000", "tag": "0.1.2"}, "releases": 3, "last_push": "2020-11-09 23:06:00 +0000", "stars": 1, "issues": {"open": 1, "closed": 0}}, "stats": {"instances_month": 84, "install_events_month": 5, "instances_week": 62, "install_events_week": 0}}, {"id": "autologin_config", "published": "2020-11-15 00:00:00 +0000", "title": "OctoPrint-AutoLoginConfig", "description": "Configure AutoLoginLocal from the UI with ease.", "archive": "https://github.com/OctoPrint/OctoPrint-AutoLoginConfig/releases/latest/download/release.zip", "author": "Charlie Powell", "homepage": "https://github.com/OctoPrint/OctoPrint-AutoLoginConfig", "page": "https://plugins.octoprint.org/plugins/autologin_config/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/autologin_config/config.png", "abandoned": false, "github": {"latest_release": {"name": "0.2.1 Stable Release", "date": "2023-03-19 21:47:12 +0000", "tag": "0.2.1"}, "releases": 10, "last_push": "2023-03-19 21:41:07 +0000", "stars": 2, "issues": {"open": 2, "closed": 5}}, "stats": {"instances_month": 519, "install_events_month": 44, "instances_week": 374, "install_events_week": 11}}, {"id": "gcodeleveling", "published": "2020-11-29 00:00:00 +0000", "title": "OctoPrint-GcodeLeveling", "description": "Leveling of Z values in Gcode using manually measured positions", "archive": "https://github.com/willmac16/OctoPrint-GcodeLeveling/archive/master.zip", "author": "Will MacCormack", "homepage": "https://github.com/willmac16/OctoPrint-GcodeLeveling", "page": "https://plugins.octoprint.org/plugins/gcodeleveling/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/gcodeleveling/point-entry.png", "abandoned": false, "github": {"latest_release": {"name": "Auto-Probing", "date": "2021-03-16 05:20:06 +0000", "tag": "0.4.0"}, "releases": 8, "last_push": "2021-03-16 05:13:57 +0000", "stars": 5, "issues": {"open": 0, "closed": 10}}, "stats": {"instances_month": 89, "install_events_month": 11, "instances_week": 58, "install_events_week": 4}}, {"id": "uicustomizer", "published": "2020-11-30 00:00:00 +0000", "title": "UI Customizer", "description": "Customize Octoprint with 5+ awesome themes, webcam and gcode widgets, rearrange layout and support mobile/tablets and much more...", "archive": "https://github.com/LazeMSS/OctoPrint-UICustomizer/archive/main.zip", "author": "Mikkel Skovgaard", "homepage": "https://github.com/LazeMSS/OctoPrint-UICustomizer", "page": "https://plugins.octoprint.org/plugins/uicustomizer/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/uicustomizer/responsive.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.9.91 - prepare for OP 1.10.0", "date": "2024-02-12 15:35:26 +0000", "tag": "0.1.9.91"}, "releases": 59, "last_push": "2024-02-12 15:33:56 +0000", "stars": 166, "issues": {"open": 16, "closed": 253}}, "stats": {"instances_month": 13136, "install_events_month": 1196, "instances_week": 9192, "install_events_week": 251}}, {"id": "customcss", "published": "2020-12-10 00:00:00 +0000", "title": "OctoPrint-CustomCSS", "description": "Quickly add custom CSS to modify your OctoPrint UI.", "archive": "https://github.com/crankeye/OctoPrint-CustomCSS/archive/master.zip", "author": "Neal Lambert", "homepage": "https://github.com/crankeye/OctoPrint-CustomCSS", "page": "https://plugins.octoprint.org/plugins/customcss/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"last_push": "2020-12-10 09:07:48 +0000", "stars": 4, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 112, "install_events_month": 2, "instances_week": 90, "install_events_week": 0}}, {"id": "display_panel", "published": "2020-12-16 00:00:00 +0000", "title": "OctoPrint Micro Panel", "description": "Simple control and status paired with a physical button panel and OLED display", "archive": "https://github.com/sethvoltz/OctoPrint-DisplayPanel/archive/main.zip", "author": "Seth Voltz", "homepage": "https://github.com/sethvoltz/OctoPrint-DisplayPanel", "page": "https://plugins.octoprint.org/plugins/display_panel/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/display_panel/in-situ.jpeg", "abandoned": false, "github": {"latest_release": {"name": "Version 3.0.1", "date": "2021-04-12 05:04:28 +0000", "tag": "v3.0.1"}, "releases": 10, "last_push": "2022-01-25 05:22:42 +0000", "stars": 56, "issues": {"open": 0, "closed": 39}}, "stats": {"instances_month": 64, "install_events_month": 9, "instances_week": 39, "install_events_week": 1}}, {"id": "octoprint_nanny", "published": "2020-12-25 00:00:00 +0000", "title": "OctoPrint Nanny", "description": "Get notified of print defects and safety hazards", "archive": "https://github.com/bitsy-ai/octoprint-nanny-plugin/archive/main.zip", "author": "Leigh Johnson", "homepage": "https://print-nanny.com", "page": "https://plugins.octoprint.org/plugins/octoprint_nanny/", "compatibility": {"octoprint": ["1.5.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "GNU AFFERO GENERAL PUBLIC LICENSE", "image": "https://plugins.octoprint.org/assets/img/plugins/octoprint_nanny/screenshot_2.png", "abandoned": false, "github": {"latest_release": {"name": "0.15.15", "date": "2023-03-08 14:16:28 +0000", "tag": "0.15.15"}, "releases": 117, "last_push": "2023-03-29 18:54:59 +0000", "stars": 24, "issues": {"open": 0, "closed": 81}}, "stats": {"instances_month": 16, "install_events_month": 4, "instances_week": 5, "install_events_week": 0}}, {"id": "LongPathSDList", "published": "2021-01-03 00:00:00 +0000", "title": "OctoPrint-Longpathsdlist", "description": "Could block serial communication - read more at the plugin homepage! This is a simple plugin to show long path names in the SD List.", "archive": "https://github.com/Petttkous/OctoPrint-Longpathsdlist/archive/master.zip", "author": "Petttkous", "homepage": "https://github.com/Petttkous/OctoPrint-Longpathsdlist", "page": "https://plugins.octoprint.org/plugins/LongPathSDList/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/LongPathSDList/after.png", "abandoned": false, "github": {"last_push": "2023-04-20 23:27:13 +0000", "stars": 3, "issues": {"open": 4, "closed": 3}}, "stats": {"instances_month": 240, "install_events_month": 13, "instances_week": 179, "install_events_week": 3}}, {"id": "TimeToFilament", "published": "2021-01-14 00:00:00 +0000", "title": "OctoPrint-TimeToFilament", "description": "Display time until next filament change", "archive": "https://github.com/eyal0/OctoPrint-TimeToFilament/archive/master.zip", "author": "eyal0", "homepage": "https://github.com/eyal0/OctoPrint-TimeToFilament", "page": "https://plugins.octoprint.org/plugins/TimeToFilament/", "compatibility": {"octoprint": ["1.5.0"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/TimeToFilament/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "Auto-install PrintTimeGenius", "date": "2021-01-19 19:20:39 +0000", "tag": "1.2.1"}, "releases": 7, "last_push": "2023-03-31 17:19:39 +0000", "stars": 4, "issues": {"open": 18, "closed": 20}}, "stats": {"instances_month": 546, "install_events_month": 31, "instances_week": 424, "install_events_week": 6}}, {"id": "webdavbackup", "published": "2021-01-16 00:00:00 +0000", "title": "WebDAV Backup", "description": "This plugin will automatically save a copy of your OctoPrint backup to a WebDAV server upon completion.", "archive": "https://github.com/edekeijzer/OctoPrint-WebDavBackup/archive/main.zip", "author": "edekeijzer", "homepage": "https://github.com/edekeijzer/OctoPrint-WebDavBackup", "page": "https://plugins.octoprint.org/plugins/webdavbackup/", "compatibility": {"octoprint": ["1.5.0"], "os": [], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/webdavbackup/configuration_screen.png", "abandoned": false, "github": {"latest_release": {"name": "0.5.1", "date": "2021-04-07 17:28:35 +0000", "tag": "0.5.1"}, "releases": 8, "last_push": "2023-10-04 09:55:05 +0000", "stars": 7, "issues": {"open": 0, "closed": 25}}, "stats": {"instances_month": 140, "install_events_month": 10, "instances_week": 104, "install_events_week": 2}}, {"id": "OctoBuddy", "published": "2021-01-17 00:00:00 +0000", "title": "OctoBuddy", "description": "A plugin that allows common printer actions to be performed with physical buttons via GPIO", "archive": "https://github.com/mlo821/OctoBuddy/archive/master.zip", "author": "Mark Lorenz", "homepage": "https://github.com/mlo821/OctoBuddy", "page": "https://plugins.octoprint.org/plugins/OctoBuddy/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/OctoBuddy/ShelfMount1.jpg", "abandoned": false, "github": {"latest_release": {"name": "1.0.5 Release", "date": "2021-01-19 01:06:03 +0000", "tag": "1.0.5"}, "releases": 5, "last_push": "2021-01-19 01:04:52 +0000", "stars": 17, "issues": {"open": 11, "closed": 2}}, "stats": {"instances_month": 51, "install_events_month": 3, "instances_week": 40, "install_events_week": 0}}, {"id": "octolight", "published": "2021-01-18 00:00:00 +0000", "title": "OctoLight", "description": "A simple plugin to toggle a GPIO pin on a RPi. This can be toggled through a button, printer events or custom GCODE.", "archive": "https://github.com/thomst08/OctoLight/archive/master.zip", "author": "Steven Thomson, \u017diga Kralj", "homepage": "https://github.com/thomst08/OctoLight", "page": "https://plugins.octoprint.org/plugins/octolight/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/octolight/screenshoot.png", "abandoned": false, "github": {"latest_release": {"name": "OctoLight v0.2.3", "date": "2024-04-07 03:45:56 +0000", "tag": "v0.2.3"}, "releases": 9, "last_push": "2024-04-07 03:42:22 +0000", "stars": 6, "issues": {"open": 0, "closed": 6}}, "stats": {"instances_month": 510, "install_events_month": 56, "instances_week": 355, "install_events_week": 13}}, {"id": "usb_keyboard", "published": "2021-01-20 00:00:00 +0000", "title": "USB Keyboard", "description": "Use a USB Keyboard to control your printer and Octoprint!", "archive": "https://github.com/barrettford/Octoprint-Usb_keyboard/archive/master.zip", "author": "Barrett Ford", "homepage": "https://github.com/barrettford/Octoprint-Usb_keyboard", "page": "https://plugins.octoprint.org/plugins/usb_keyboard/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "GPL-3.0 License", "image": "https://plugins.octoprint.org/assets/img/plugins/usb_keyboard/example_qwerty.png", "abandoned": false, "github": {"latest_release": {"name": "Added shutdown/restart commands", "date": "2021-04-08 22:43:46 +0000", "tag": "v0.2.6"}, "releases": 11, "last_push": "2023-03-29 16:51:58 +0000", "stars": 18, "issues": {"open": 7, "closed": 24}}, "stats": {"instances_month": 147, "install_events_month": 12, "instances_week": 108, "install_events_week": 3}}, {"id": "toptemp", "published": "2021-01-24 00:00:00 +0000", "title": "Top Temp", "description": "Show the temperatures of everything in the navbar/topbar of OctoPrint. It can display the hotend, chamber, all tools/hotends and also add an unlimited number of your own \u201ctop widgets\u201d for example showing cpu temperature, fan speed - well anything that is a number (for now) that you can get back from running a command.", "archive": "https://github.com/LazeMSS/OctoPrint-TopTemp/archive/main.zip", "author": "Mikkel Skovgaard", "homepage": "https://github.com/LazeMSS/OctoPrint-TopTemp", "page": "https://plugins.octoprint.org/plugins/toptemp/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/toptemp/main.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.2.3 - More custom cmd fixing", "date": "2023-01-15 21:02:14 +0000", "tag": "0.0.2.3"}, "releases": 18, "last_push": "2023-01-15 20:59:14 +0000", "stars": 22, "issues": {"open": 10, "closed": 72}}, "stats": {"instances_month": 1811, "install_events_month": 116, "instances_week": 1286, "install_events_week": 25}}, {"id": "meatpack", "published": "2021-01-26 00:00:00 +0000", "title": "MeatPack", "description": "Automatic G-Code Compression", "archive": "https://github.com/scottmudge/OctoPrint-MeatPack/archive/master.zip", "author": "Scott Mudge", "homepage": "https://github.com/scottmudge/OctoPrint-MeatPack", "page": "https://plugins.octoprint.org/plugins/meatpack/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/meatpack/meatpack.png", "abandoned": false, "github": {"latest_release": {"name": "Version 1.5.22 - License Update", "date": "2023-08-14 06:32:47 +0000", "tag": "v1.5.22"}, "releases": 10, "last_push": "2023-08-14 06:29:24 +0000", "stars": 120, "issues": {"open": 17, "closed": 12}}, "stats": {"instances_month": 272, "install_events_month": 25, "instances_week": 188, "install_events_week": 6}}, {"id": "SimplyPrint", "published": "2021-02-02 00:00:00 +0000", "title": "SimplyPrint Cloud", "description": "3D print online anywhere; elevate your 3D printing experience from your computer or phone, with smart features like filament manager, livestream, print queue, and much more. Simple, beautiful, smart.", "archive": "https://github.com/SimplyPrint/OctoPrint-SimplyPrint/archive/master.zip", "author": "SimplyPrint", "homepage": "https://simplyprint.io/", "privacypolicy": "https://simplyprint.io/legal/en/privacy", "page": "https://plugins.octoprint.org/plugins/SimplyPrint/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "GNU General Public License v3.0", "image": "https://plugins.octoprint.org/assets/img/plugins/SimplyPrint/showcase_feature_image.png", "abandoned": false, "github": {"latest_release": {"name": "4.1.3", "date": "2023-11-12 19:36:25 +0000", "tag": "4.1.3"}, "releases": 38, "last_push": "2023-11-12 15:37:44 +0000", "stars": 11, "issues": {"open": 5, "closed": 16}}, "stats": {"instances_month": 1269, "install_events_month": 147, "instances_week": 816, "install_events_week": 24}}, {"id": "robotcontrol", "published": "2021-02-11 00:00:00 +0000", "title": "Robot Control", "description": "Plugin to control a robot over i2c", "archive": "https://github.com/Zinc-OS/octoprint-robot-plugin/archive/master.zip", "author": "Louis Sarwal", "homepage": "https://github.com/Zinc-OS/octoprint-robot-plugin", "page": "https://plugins.octoprint.org/plugins/robotcontrol/", "compatibility": {"octoprint": ["1.5.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/robotcontrol/Screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.2", "date": "2021-02-12 22:49:34 +0000", "tag": "0.0.2"}, "releases": 2, "last_push": "2021-02-13 23:03:42 +0000", "stars": 2, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 11, "install_events_month": 2, "instances_week": 9, "install_events_week": 1}}, {"id": "inlineconfirm", "published": "2021-02-14 00:00:00 +0000", "title": "OctoPrint-InlineConfirm", "description": "Removes the confirm cancel print dialog and replaces it with confirmation by clicking the cancel buton twice.", "archive": "https://github.com/j7126/OctoPrint-InlineConfirm/archive/master.zip", "author": "j7126", "homepage": "https://github.com/j7126/OctoPrint-InlineConfirm", "page": "https://plugins.octoprint.org/plugins/inlineconfirm/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/inlineconfirm/cancel_print_button.gif", "abandoned": false, "github": {"latest_release": {"name": "1.1.4", "date": "2021-08-25 04:18:32 +0000", "tag": "1.1.4"}, "releases": 6, "last_push": "2021-08-25 04:17:02 +0000", "stars": 3, "issues": {"open": 0, "closed": 5}}, "stats": {"instances_month": 224, "install_events_month": 5, "instances_week": 167, "install_events_week": 0}}, {"id": "gpiocontrol", "published": "2021-02-16 00:00:00 +0000", "title": "GPIO Control", "description": "GPIO Control adds a sidebar with on/off buttons. You can add as many buttons as you want that will control each device connected to your Raspberry Pi.", "archive": "https://github.com/catgiggle/OctoPrint-GpioControl/archive/master.zip", "author": "Damian W\u00f3jcik", "homepage": "https://github.com/catgiggle/OctoPrint-GpioControl", "page": "https://plugins.octoprint.org/plugins/gpiocontrol/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/gpiocontrol/sidebar.png", "abandoned": false, "github": {"latest_release": {"name": "v1.0.8", "date": "2021-02-23 20:25:44 +0000", "tag": "v1.0.8"}, "releases": 9, "last_push": "2021-02-23 20:22:23 +0000", "stars": 22, "issues": {"open": 16, "closed": 11}}, "stats": {"instances_month": 1225, "install_events_month": 87, "instances_week": 860, "install_events_week": 21}}, {"id": "TpLinkAutoShutdown", "published": "2021-02-17 00:00:00 +0000", "title": "OctoPrint-TpLinkAutoShutdown", "description": "This plugin is designed to help you integrate your IoT TP-Link Kasa wireless plug into OctoPrint. The basis of the plug-in is to enable you to automatically switch-off your 3D printer once a print has successfully completed.", "archive": "https://github.com/jamesmccannon02/OctoPrint-Tplinkautoshutdown/archive/master.zip", "author": "James D. McCannon", "homepage": "https://github.com/jamesmccannon02/OctoPrint-Tplinkautoshutdown", "page": "https://plugins.octoprint.org/plugins/TpLinkAutoShutdown/", "compatibility": {"octoprint": ["1.5.3"], "os": ["linux", "windows", "macos"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.3.0 - HS300 specific features", "date": "2021-09-19 21:59:38 +0000", "tag": "1.3.0"}, "releases": 18, "last_push": "2023-04-23 13:38:40 +0000", "stars": 8, "issues": {"open": 9, "closed": 25}}, "stats": {"instances_month": 480, "install_events_month": 42, "instances_week": 325, "install_events_week": 8}}, {"id": "SlicerEstimator", "published": "2021-02-24 00:00:00 +0000", "title": "Slicer Estimator", "description": "Slicer Estimator - adds accurate remaining time to print, remaining time to filament changes and other custom metadata like filament brand, etc. to OctoPrint", "archive": "https://github.com/NilsRo/OctoPrint-SlicerEstimator/archive/master.zip", "author": "Nils Hendrik Rottgardt", "homepage": "https://github.com/NilsRo/OctoPrint-SlicerEstimator", "page": "https://plugins.octoprint.org/plugins/SlicerEstimator/", "compatibility": {"octoprint": ["1.3.9"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Bugfix: Reupload a downloaded file breaks metadata parsing", "date": "2024-05-02 20:25:04 +0000", "tag": "1.6.6"}, "releases": 43, "last_push": "2024-05-02 20:22:40 +0000", "stars": 5, "issues": {"open": 0, "closed": 34}}, "stats": {"instances_month": 1110, "install_events_month": 98, "instances_week": 770, "install_events_week": 26}}, {"id": "ublmeshedit", "published": "2021-02-24 00:00:00 +0000", "title": "OctoPrint-UBLMeshEdit", "description": "A plugin that provides a method for manually editing and saving/loading UBL meshes.", "archive": "https://github.com/The-EG/OctoPrint-UBLMeshEdit/archive/main.zip", "author": "Taylor Talkington", "homepage": "https://github.com/The-EG/OctoPrint-UBLMeshEdit", "page": "https://plugins.octoprint.org/plugins/ublmeshedit/", "compatibility": {"octoprint": ["1.3.7"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ublmeshedit/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.2", "date": "2021-05-19 16:13:38 +0000", "tag": "0.3.2"}, "releases": 11, "last_push": "2021-05-19 16:12:29 +0000", "stars": 16, "issues": {"open": 2, "closed": 11}}, "stats": {"instances_month": 426, "install_events_month": 35, "instances_week": 310, "install_events_week": 5}}, {"id": "ignorepausedforuser", "published": "2021-02-25 00:00:00 +0000", "title": "IgnorePausedForUser", "description": "Plugin to ignore 'Paused for User' message from printer.", "archive": "https://github.com/DavideM84/OctoPrint-IgnorePausedForUser/archive/main.zip", "author": "Davide Mencarelli", "homepage": "https://github.com/DavideM84/OctoPrint-IgnorePausedForUser", "page": "https://plugins.octoprint.org/plugins/ignorepausedforuser/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "GNU v3.0", "image": "https://plugins.octoprint.org/assets/img/plugins/ignorepausedforuser/ignorepausedforuser.jpg", "abandoned": false, "github": {"latest_release": {"name": "v1.2.8", "date": "2021-03-17 10:49:09 +0000", "tag": "v1.2.8"}, "releases": 6, "last_push": "2021-03-17 10:45:30 +0000", "stars": 2, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 54, "install_events_month": 4, "instances_week": 44, "install_events_week": 0}}, {"id": "translatemodel", "published": "2021-03-01 00:00:00 +0000", "title": "OctoPrint-TranslateModel", "description": "A plugin to move models around without re-slicing.", "archive": "https://github.com/Willmac16/OctoPrint-TranslateModel/archive/main.zip", "author": "Will MacCormack", "homepage": "https://github.com/Willmac16/OctoPrint-TranslateModel", "page": "https://plugins.octoprint.org/plugins/translatemodel/", "compatibility": {"octoprint": ["1.3.1"], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/translatemodel/viewerGraphic.png", "abandoned": false, "github": {"latest_release": {"name": "0.3.0 Added support for Prusa M555 Command", "date": "2023-09-29 02:55:46 +0000", "tag": "0.3.0"}, "releases": 8, "last_push": "2023-09-29 02:53:53 +0000", "stars": 7, "issues": {"open": 2, "closed": 13}}, "stats": {"instances_month": 260, "install_events_month": 12, "instances_week": 187, "install_events_week": 4}}, {"id": "youtube_timelapse", "published": "2021-03-09 00:00:00 +0000", "title": "Octoprint Youtube Timelapse", "description": "Automatically upload rendered timelapses to Youtube. Can also delete after upload to save space on the Raspberry Pi SD Card.", "archive": "https://github.com/ryanfox1985/OctoPrint-Youtube-Timelapse/archive/master.zip", "author": "ryanfox1985", "homepage": "https://github.com/ryanfox1985/OctoPrint-Youtube-Timelapse", "page": "https://plugins.octoprint.org/plugins/youtube_timelapse/", "compatibility": {"octoprint": ["1.5.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/youtube_timelapse/configuration_step7.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.8", "date": "2021-03-10 17:25:26 +0000", "tag": "0.1.8"}, "releases": 3, "last_push": "2021-08-01 09:26:49 +0000", "stars": 14, "issues": {"open": 22, "closed": 5}}, "stats": {"instances_month": 161, "install_events_month": 24, "instances_week": 109, "install_events_week": 6}}, {"id": "octorelay", "published": "2021-03-13 00:00:00 +0000", "title": "OctoRelay", "description": "A plugin to control relays or other things on the GPIO pins of your raspberry pi. For example turn the power of printer, the light or a fan ON and OFF via the web interface.", "archive": "https://github.com/borisbu/OctoRelay/releases/latest/download/release.zip", "author": "Boris Burgstaller", "homepage": "https://github.com/borisbu/OctoRelay", "page": "https://plugins.octoprint.org/plugins/octorelay/", "compatibility": {"octoprint": ["1.5.3"], "os": ["linux"], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/octorelay/controls.jpg", "abandoned": false, "github": {"latest_release": {"name": "4.2.0", "date": "2024-04-24 16:06:14 +0000", "tag": "4.2.0"}, "releases": 117, "last_push": "2024-04-29 20:36:08 +0000", "stars": 42, "issues": {"open": 8, "closed": 86}}, "stats": {"instances_month": 1253, "install_events_month": 94, "instances_week": 901, "install_events_week": 23}}, {"id": "octolabel", "published": "2021-03-21 00:00:00 +0000", "title": "OctoPrint-OctoLabel", "description": "Label printing plugin for OctoPrint", "archive": "https://github.com/LowieGoossens/octolabel/archive/master.zip", "author": "Lowie Goossens", "homepage": "https://github.com/LowieGoossens/octolabel", "page": "https://plugins.octoprint.org/plugins/octolabel/", "compatibility": {"octoprint": ["1.4.2"], "os": [], "python": ">=2.7,<4"}, "license": "MIT", "abandoned": false, "github": {"latest_release": {"name": "latest bug free version", "date": "2021-03-21 19:33:40 +0000", "tag": "master_previous"}, "releases": 3, "last_push": "2023-01-30 12:12:57 +0000", "stars": 6, "issues": {"open": 0, "closed": 6}}, "stats": {"instances_month": 20, "install_events_month": 0, "instances_week": 17, "install_events_week": 0}}, {"id": "OctoText", "published": "2021-03-30 00:00:00 +0000", "title": "OctoText", "description": "Send text messages on common printer events", "archive": "https://github.com/berrystephenw/OctoText/archive/refs/heads/main.zip", "author": "Stephen Berry", "homepage": "https://github.com/berrystephenw/OctoText", "page": "https://plugins.octoprint.org/plugins/OctoText/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/OctoText/octotext-email.png", "abandoned": false, "github": {"latest_release": {"name": "Bug fix in CC field", "date": "2022-05-11 17:46:12 +0000", "tag": "0.3.3.1"}, "releases": 28, "last_push": "2022-05-11 17:03:00 +0000", "stars": 11, "issues": {"open": 10, "closed": 35}}, "stats": {"instances_month": 579, "install_events_month": 44, "instances_week": 441, "install_events_week": 10}}, {"id": "energeniecontrol", "published": "2021-04-05 00:00:00 +0000", "title": "OctoPrint-EnergenieControl", "description": "Controls Energenie sockets to turn printer on and off.", "archive": "https://github.com/arlohb/OctoPrint-EnergenieControl/archive/main.zip", "author": "Arlo Blythe", "homepage": "https://github.com/arlohb/OctoPrint-EnergenieControl", "page": "https://plugins.octoprint.org/plugins/energeniecontrol/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.2", "date": "2022-02-19 18:20:42 +0000", "tag": "v1.0.2"}, "releases": 3, "last_push": "2022-02-19 18:19:05 +0000", "stars": 0, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 15, "install_events_month": 4, "instances_week": 11, "install_events_week": 1}}, {"id": "psucontrol_rpigpio", "published": "2021-04-05 00:00:00 +0000", "title": "PSU Control - RPi.GPIO", "description": "Adds legacy RPi.GPIO to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/kantlivelong/OctoPrint-PSUControl-RPiGPIO/archive/master.zip", "author": "Shawn Bruce", "homepage": "https://github.com/kantlivelong/OctoPrint-PSUControl-RPiGPIO", "page": "https://plugins.octoprint.org/plugins/psucontrol_rpigpio/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.4", "date": "2021-05-12 13:57:49 +0000", "tag": "1.0.4"}, "releases": 5, "last_push": "2021-05-12 13:56:05 +0000", "stars": 7, "issues": {"open": 1, "closed": 14}}, "stats": {"instances_month": 697, "install_events_month": 55, "instances_week": 476, "install_events_week": 13}}, {"id": "wled", "published": "2021-04-16 00:00:00 +0000", "title": "WLED Connection", "description": "WLED is an awesome project, as is OctoPrint. What could be better than a plugin linking the two?", "archive": "https://github.com/cp2004/OctoPrint-WLED/releases/latest/download/release.zip", "author": "Charlie Powell", "homepage": "https://github.com/cp2004/OctoPrint-WLED", "page": "https://plugins.octoprint.org/plugins/wled/", "compatibility": {"octoprint": ["1.5.0"], "os": [], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/wled/wled-octoprint.png", "abandoned": false, "github": {"latest_release": {"name": "0.2.1 (Stable Release)", "date": "2021-06-12 12:22:40 +0000", "tag": "0.2.1"}, "releases": 6, "last_push": "2023-12-27 13:00:32 +0000", "stars": 60, "issues": {"open": 22, "closed": 19}}, "stats": {"instances_month": 445, "install_events_month": 38, "instances_week": 308, "install_events_week": 5}}, {"id": "networkhealth", "published": "2021-04-20 00:00:00 +0000", "title": "Network Health", "description": "Monitors the health of the Network connection and restarts it if necessary", "archive": "https://github.com/jonfairbanks/OctoPrint-NetworkHealth/archive/master.zip", "author": "Jon Fairbanks", "homepage": "https://github.com/jonfairbanks/OctoPrint-NetworkHealth", "page": "https://plugins.octoprint.org/plugins/networkhealth/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/networkhealth/logo.png", "abandoned": false, "github": {"latest_release": {"name": "Error Handling", "date": "2021-05-11 00:11:38 +0000", "tag": "v1.0.4"}, "releases": 5, "last_push": "2023-05-14 06:34:18 +0000", "stars": 7, "issues": {"open": 2, "closed": 5}}, "stats": {"instances_month": 528, "install_events_month": 39, "instances_week": 403, "install_events_week": 6}}, {"id": "psucontrol_tplink", "published": "2021-04-28 00:00:00 +0000", "title": "PSU Control - TPLink", "description": "Adds TPLink Smart Plug support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/kantlivelong/OctoPrint-PSUControl-TPLink/archive/master.zip", "author": "Shawn Bruce", "homepage": "https://github.com/kantlivelong/OctoPrint-PSUControl-TPLink", "page": "https://plugins.octoprint.org/plugins/psucontrol_tplink/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.1", "date": "2021-05-12 14:00:05 +0000", "tag": "1.0.1"}, "releases": 2, "last_push": "2021-05-12 13:58:37 +0000", "stars": 5, "issues": {"open": 4, "closed": 3}}, "stats": {"instances_month": 440, "install_events_month": 45, "instances_week": 322, "install_events_week": 7}}, {"id": "camerasettings", "published": "2021-04-29 00:00:00 +0000", "title": "Camera Settings", "description": "Interactive camera settings via v4l2-ctl", "archive": "https://github.com/The-EG/OctoPrint-CameraSettings/archive/main.zip", "author": "Taylor Talkington", "homepage": "https://github.com/The-EG/OctoPrint-CameraSettings", "page": "https://plugins.octoprint.org/plugins/camerasettings/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/camerasettings/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.4.3", "date": "2023-07-02 14:05:53 +0000", "tag": "0.4.3"}, "releases": 31, "last_push": "2023-07-02 14:57:27 +0000", "stars": 55, "issues": {"open": 15, "closed": 196}}, "stats": {"instances_month": 9056, "install_events_month": 911, "instances_week": 6251, "install_events_week": 220}}, {"id": "filament_scale", "published": "2021-04-29 00:00:00 +0000", "title": "Filament Scale Enhanced", "description": "Display filament weight using a HX-711 and a load cell", "archive": "https://github.com/techman83/Filament-Scale-Enhanced/releases/latest/download/Filament_Scale_Enhanced.zip", "author": "Victor Noordhoek, Techman83", "homepage": "https://github.com/techman83/Filament-Scale-Enhanced", "page": "https://plugins.octoprint.org/plugins/filament_scale/", "compatibility": {"octoprint": ["1.5.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/filament_scale/display.png", "abandoned": false, "github": {"latest_release": {"name": "v0.2.12", "date": "2023-08-12 12:47:11 +0000", "tag": "v0.2.12"}, "releases": 12, "last_push": "2023-08-12 12:29:50 +0000", "stars": 23, "issues": {"open": 17, "closed": 10}}, "stats": {"instances_month": 108, "install_events_month": 9, "instances_week": 80, "install_events_week": 3}}, {"id": "psucontrol_tasmota", "published": "2021-05-02 00:00:00 +0000", "title": "PSU Control - Tasmota", "description": "Adds Tasmota Smart Plug support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/kantlivelong/OctoPrint-PSUControl-Tasmota/archive/master.zip", "author": "Shawn Bruce", "homepage": "https://github.com/kantlivelong/OctoPrint-PSUControl-Tasmota", "page": "https://plugins.octoprint.org/plugins/psucontrol_tasmota/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.1", "date": "2021-05-12 14:04:20 +0000", "tag": "1.0.1"}, "releases": 2, "last_push": "2021-05-12 14:02:36 +0000", "stars": 8, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 245, "install_events_month": 23, "instances_week": 185, "install_events_week": 1}}, {"id": "octodashcompanion", "published": "2021-05-03 00:00:00 +0000", "title": "OctoDash Companion", "description": "This plugin allows for configuring OctoDash settings and upload custom theme files from within the OctoPrint interface.", "archive": "https://github.com/jneilliii/OctoPrint-OctoDashCompanion/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-OctoDashCompanion", "page": "https://plugins.octoprint.org/plugins/octodashcompanion/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/octodashcompanion/screenshot_settings.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.7", "date": "2022-03-20 20:01:43 +0000", "tag": "0.0.7"}, "releases": 21, "last_push": "2024-01-14 15:58:52 +0000", "stars": 16, "issues": {"open": 6, "closed": 23}}, "stats": {"instances_month": 3048, "install_events_month": 239, "instances_week": 2046, "install_events_week": 51}}, {"id": "psucontrol_tendabeli", "published": "2021-05-03 00:00:00 +0000", "title": "PSU Control - Tenda Beli", "description": "Adds Tenda Beli SP3 Smart Plug support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/jgroman/OctoPrint-PSUControl-TendaBeli/archive/master.zip", "author": "Jaroslav Groman", "homepage": "https://github.com/jgroman/OctoPrint-PSUControl-TendaBeli", "page": "https://plugins.octoprint.org/plugins/psucontrol_tendabeli/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2021-05-03 18:50:54 +0000", "tag": "1.0.0"}, "releases": 1, "last_push": "2021-05-20 10:30:39 +0000", "stars": 2, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 14, "install_events_month": 2, "instances_week": 13, "install_events_week": 0}}, {"id": "psucontrol_wemo", "published": "2021-05-08 00:00:00 +0000", "title": "PSU Control - Wemo", "description": "Adds Wemo Smart Plug support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/jneilliii/OctoPrint-PSUControl-Wemo/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-PSUControl-Wemo", "page": "https://plugins.octoprint.org/plugins/psucontrol_wemo/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.1 - Upstream Bugfixes", "date": "2021-05-11 00:39:49 +0000", "tag": "1.0.1"}, "releases": 2, "last_push": "2021-05-11 00:38:47 +0000", "stars": 1, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 49, "install_events_month": 8, "instances_week": 38, "install_events_week": 1}}, {"id": "calibrationcompanion", "published": "2021-05-10 00:00:00 +0000", "title": "Calibration Companion", "description": "This plugin was created to calibrate 3D printer settings easily.", "archive": "https://github.com/iFrostizz/OctoPrint-CalibrationCompanion/archive/main.zip", "author": "iFrostizz", "homepage": "https://github.com/iFrostizz/OctoPrint-CalibrationCompanion", "page": "https://plugins.octoprint.org/plugins/calibrationcompanion/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/calibrationcompanion/setup.png", "abandoned": false, "github": {"latest_release": {"name": "Faster UI, progess bar, smaller acc. tower, more variables.", "date": "2021-06-20 23:35:48 +0000", "tag": "1.0.1"}, "releases": 3, "last_push": "2022-09-08 15:29:58 +0000", "stars": 32, "issues": {"open": 7, "closed": 25}}, "stats": {"instances_month": 1543, "install_events_month": 143, "instances_week": 1055, "install_events_week": 38}}, {"id": "mqtt_for_psucontrol", "published": "2021-05-12 00:00:00 +0000", "title": "MQTT exposure for PSU Control", "description": "Control your PSU Control with MQTT or Home Assistant", "archive": "https://github.com/oerkel47/OctoPrint-MQTT-for-PSUcontrol/archive/main.zip", "author": "oerkel47", "homepage": "https://github.com/oerkel47/OctoPrint-MQTT-for-PSUcontrol", "page": "https://plugins.octoprint.org/plugins/mqtt_for_psucontrol/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/mqtt_for_psucontrol/screenshot_settings.PNG", "abandoned": false, "github": {"latest_release": {"name": "1.2.0", "date": "2021-10-21 17:47:37 +0000", "tag": "1.2.0"}, "releases": 5, "last_push": "2021-10-21 17:42:30 +0000", "stars": 4, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 192, "install_events_month": 14, "instances_week": 151, "install_events_week": 5}}, {"id": "psucontrol_homeassistant", "published": "2021-05-15 00:00:00 +0000", "title": "PSU Control - HomeAssistant", "description": "Adds HomeAssistant support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/edekeijzer/OctoPrint-PSUControl-HomeAssistant/archive/main.zip", "author": "Erik de Keijzer", "homepage": "https://github.com/edekeijzer/OctoPrint-PSUControl-HomeAssistant", "page": "https://plugins.octoprint.org/plugins/psucontrol_homeassistant/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.5", "date": "2022-05-09 09:30:59 +0000", "tag": "1.0.5"}, "releases": 4, "last_push": "2023-10-08 13:40:38 +0000", "stars": 29, "issues": {"open": 1, "closed": 17}}, "stats": {"instances_month": 1122, "install_events_month": 105, "instances_week": 859, "install_events_week": 22}}, {"id": "psucontrol_shelly", "published": "2021-05-15 00:00:00 +0000", "title": "PSU Control - Shelly", "description": "Adds Shelly smart switch support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/edekeijzer/OctoPrint-PSUControl-Shelly/archive/main.zip", "author": "Erik de Keijzer", "homepage": "https://github.com/edekeijzer/OctoPrint-PSUControl-Shelly", "page": "https://plugins.octoprint.org/plugins/psucontrol_shelly/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.2", "date": "2021-05-19 14:54:27 +0000", "tag": "1.0.2"}, "releases": 2, "last_push": "2023-01-26 13:36:11 +0000", "stars": 8, "issues": {"open": 5, "closed": 12}}, "stats": {"instances_month": 352, "install_events_month": 24, "instances_week": 255, "install_events_week": 6}}, {"id": "draggable_files", "published": "2021-05-18 00:00:00 +0000", "title": "Draggable Files", "description": "Plugin that allows for the dragging of files in the File Manager", "archive": "https://github.com/SanderRonde/Octoprint-Draggable-Files/archive/main.zip", "author": "Sander Ronde", "homepage": "https://github.com/SanderRonde/Octoprint-Draggable-Files", "page": "https://plugins.octoprint.org/plugins/draggable_files/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "MIT", "abandoned": false, "github": {"latest_release": {"name": "1.1.2", "date": "2021-10-09 17:49:31 +0000", "tag": "1.1.2"}, "releases": 9, "last_push": "2021-10-09 17:48:36 +0000", "stars": 5, "issues": {"open": 1, "closed": 8}}, "stats": {"instances_month": 1252, "install_events_month": 76, "instances_week": 942, "install_events_week": 16}}, {"id": "navbarclock", "published": "2021-06-01 00:00:00 +0000", "title": "Navbar Clock", "description": "Displays the current time on the OctoPrint navigation bar", "archive": "https://github.com/ManuelMcLure/OctoPrint-NavbarClock/archive/main.zip", "author": "Manuel McLure", "homepage": "https://github.com/ManuelMcLure/OctoPrint-NavbarClock", "page": "https://plugins.octoprint.org/plugins/navbarclock/", "compatibility": {"octoprint": [], "os": [], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/navbarclock/NavbarClock.png", "abandoned": false, "github": {"latest_release": {"name": "Less whitespace", "date": "2021-09-26 05:04:41 +0000", "tag": "v1.1.4"}, "releases": 8, "last_push": "2021-09-26 05:03:56 +0000", "stars": 0, "issues": {"open": 0, "closed": 5}}, "stats": {"instances_month": 534, "install_events_month": 53, "instances_week": 362, "install_events_week": 17}}, {"id": "fortune", "published": "2021-06-04 00:00:00 +0000", "title": "OctoPrint-Fortune", "description": "Gives you a pithy fortune on web login or startup", "archive": "https://github.com/berrystephenw/OctoPrint-Fortune/archive/main.zip", "author": "Stephen Berry", "homepage": "https://github.com/berrystephenw/OctoPrint-Fortune", "page": "https://plugins.octoprint.org/plugins/fortune/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "BSD", "image": "https://plugins.octoprint.org/assets/img/plugins/fortune/fortune-1.png", "abandoned": false, "github": {"latest_release": {"name": "Additional Fortune files", "date": "2022-03-04 14:45:39 +0000", "tag": "0.1.2"}, "releases": 3, "last_push": "2022-03-04 14:40:46 +0000", "stars": 3, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 41, "install_events_month": 1, "instances_week": 32, "install_events_week": 0}}, {"id": "ArducamCameraControl", "published": "2021-06-18 00:00:00 +0000", "title": "ArducamCameraControl", "description": "Plugin to control Arducam motorized and ptz camera", "archive": "https://github.com/arducam/ArducamCameraControl/archive/master.zip", "author": "Arducam", "homepage": "https://github.com/arducam/ArducamCameraControl", "page": "https://plugins.octoprint.org/plugins/ArducamCameraControl/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ArducamCameraControl/ArducamCameraControl.png", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2021-06-18 06:58:42 +0000", "tag": "0.3"}, "releases": 3, "last_push": "2022-03-08 09:13:03 +0000", "stars": 8, "issues": {"open": 4, "closed": 1}}, "stats": {"instances_month": 296, "install_events_month": 36, "instances_week": 174, "install_events_week": 8}}, {"id": "gpiofancontroller", "published": "2021-07-04 00:00:00 +0000", "title": "OctoPrint-GpioFanController", "description": "Uses PI GPIO pins to control a variable speed fan with PWM", "archive": "https://github.com/z4gunn/OctoPrint-GpioFanController/archive/master.zip", "author": "Erik Gundersen", "homepage": "https://github.com/z4gunn/OctoPrint-GpioFanController", "page": "https://plugins.octoprint.org/plugins/gpiofancontroller/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/gpiofancontroller/featured.png", "abandoned": false, "github": {"latest_release": {"name": "added dependency for RPi.GPIO and fixed lag while adjusting sidebar speed control", "date": "2021-07-18 14:18:52 +0000", "tag": "0.2.1"}, "releases": 4, "last_push": "2021-08-02 14:46:39 +0000", "stars": 6, "issues": {"open": 10, "closed": 2}}, "stats": {"instances_month": 188, "install_events_month": 24, "instances_week": 134, "install_events_week": 11}}, {"id": "gpiorgbcontroller", "published": "2021-07-07 00:00:00 +0000", "title": "OctoPrint-GpioRgbController", "description": "Uses PI GPIO pins to control a RGB Led strip", "archive": "https://github.com/z4gunn/OctoPrint-GpioRgbController/archive/master.zip", "author": "Erik Gundersen", "homepage": "https://github.com/z4gunn/OctoPrint-GpioRgbController", "page": "https://plugins.octoprint.org/plugins/gpiorgbcontroller/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/gpiorgbcontroller/featured.png", "abandoned": false, "github": {"latest_release": {"name": "fixed unused pin factory import", "date": "2021-07-18 13:18:22 +0000", "tag": "0.3.3"}, "releases": 6, "last_push": "2021-08-02 14:48:53 +0000", "stars": 9, "issues": {"open": 7, "closed": 8}}, "stats": {"instances_month": 90, "install_events_month": 14, "instances_week": 62, "install_events_week": 3}}, {"id": "LightControls", "published": "2021-07-09 00:00:00 +0000", "title": "OctoPrint-LightControls", "description": "Adds easily configurable PWM Light controls to Octoprint Control Tab", "archive": "https://github.com/RoboMagus/OctoPrint-LightControls/archive/main.zip", "author": "RoboMagus", "homepage": "https://github.com/RoboMagus/OctoPrint-LightControls", "page": "https://plugins.octoprint.org/plugins/LightControls/", "compatibility": {"octoprint": ["1.6.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Support for Hardware PWM", "date": "2023-08-26 08:28:46 +0000", "tag": "0.4.3"}, "releases": 11, "last_push": "2023-08-26 08:23:35 +0000", "stars": 5, "issues": {"open": 0, "closed": 6}}, "stats": {"instances_month": 96, "install_events_month": 8, "instances_week": 67, "install_events_week": 3}}, {"id": "mote_lighting_control", "published": "2021-07-14 00:00:00 +0000", "title": "OctoPrint-MoteLightingControl", "description": "Control a set of Mote lights - with different OctoPrint conditions causing changes in the lighting colour and state.", "archive": "https://github.com/nigelm/OctoPrint-MoteLightingControl/archive/main.zip", "author": "Nigel Metheringham", "homepage": "https://github.com/nigelm/OctoPrint-MoteLightingControl", "page": "https://plugins.octoprint.org/plugins/mote_lighting_control/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/mote_lighting_control/mote_lights.jpg", "abandoned": false, "github": {"last_push": "2021-08-31 10:53:10 +0000", "stars": 2, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 7, "install_events_month": 2, "instances_week": 6, "install_events_week": 0}}, {"id": "matrix_notifier", "published": "2021-07-21 00:00:00 +0000", "title": "Matrix Notifier", "description": "Sends matrix notifications and snapshots of your print.", "archive": "https://github.com/Cadair/octoprint-matrix-notifier-plugin/archive/main.zip", "author": "Stuart Mumford", "homepage": "https://github.com/Cadair/octoprint-matrix-notifier-plugin", "page": "https://plugins.octoprint.org/plugins/matrix_notifier/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/matrix_notifier/printstarted.png", "abandoned": false, "github": {"latest_release": {"name": "v0.3.0", "date": "2024-03-26 10:41:23 +0000", "tag": "v0.3.0"}, "releases": 3, "last_push": "2024-04-29 17:49:40 +0000", "stars": 15, "issues": {"open": 3, "closed": 8}}, "stats": {"instances_month": 21, "install_events_month": 3, "instances_week": 18, "install_events_week": 0}}, {"id": "physicalbutton", "published": "2021-08-01 00:00:00 +0000", "title": "Physical Button", "description": "Add physical buttons to OctoPrint", "archive": "https://github.com/LuxuSam/PhysicalButton/archive/master.zip", "author": "LuxuSam", "homepage": "https://github.com/LuxuSam/PhysicalButton/tree/master", "page": "https://plugins.octoprint.org/plugins/physicalbutton/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/physicalbutton/PhysicalButton_Logo.png", "abandoned": false, "github": {"latest_release": {"name": "Installation Fix for Python Versions < 3.8 - 29 February 2024", "date": "2024-02-29 15:02:29 +0000", "tag": "v0.6.2"}, "releases": 11, "last_push": "2024-02-29 14:48:12 +0000", "stars": 30, "issues": {"open": 6, "closed": 33}}, "stats": {"instances_month": 246, "install_events_month": 20, "instances_week": 183, "install_events_week": 6}}, {"id": "gcode_macro", "published": "2021-08-09 00:00:00 +0000", "title": "Gcode Macros", "description": "Configure custom gcode macros you can use anywhere!", "archive": "https://github.com/cp2004/OctoPrint-GCodeMacros/releases/latest/download/release.zip", "author": "Charlie Powell", "homepage": "https://github.com/cp2004/OctoPrint-GCodeMacros", "page": "https://plugins.octoprint.org/plugins/gcode_macro/", "compatibility": {"octoprint": ["1.5.0"], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/gcode_macro/settings.png", "abandoned": false, "github": {"latest_release": {"name": "1.3.0", "date": "2022-12-20 21:22:10 +0000", "tag": "1.3.0"}, "releases": 7, "last_push": "2023-12-27 13:00:32 +0000", "stars": 8, "issues": {"open": 3, "closed": 11}}, "stats": {"instances_month": 383, "install_events_month": 28, "instances_week": 278, "install_events_week": 6}}, {"id": "autobim", "published": "2021-08-15 00:00:00 +0000", "title": "AutoBim", "description": "A bed tramming utility for OctoPrint", "archive": "https://github.com/j-be/AutoBim/archive/master.zip", "author": "Juri Berlanda", "homepage": "https://github.com/j-be/AutoBim", "page": "https://plugins.octoprint.org/plugins/autobim/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/autobim/ui_1.png", "abandoned": false, "github": {"latest_release": {"name": "v0.4.1 - Add support for new G30 response", "date": "2023-09-29 09:57:44 +0000", "tag": "v0.4.1"}, "releases": 19, "last_push": "2023-09-29 09:56:06 +0000", "stars": 29, "issues": {"open": 15, "closed": 22}}, "stats": {"instances_month": 441, "install_events_month": 46, "instances_week": 317, "install_events_week": 7}}, {"id": "Chituboard", "published": "2021-08-16 00:00:00 +0000", "title": "Octoprint-Chituboard", "description": "compatibility layer for SLA printers with Chituboards like the Photon and Mars series", "archive": "https://github.com/rudetrooper/Octoprint-Chituboard/archive/main.zip", "author": "Vikram Sarkhel", "homepage": "https://github.com/rudetrooper/Octoprint-Chituboard", "page": "https://plugins.octoprint.org/plugins/Chituboard/", "compatibility": {"octoprint": ["1.6.1"], "os": ["linux"], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/Chituboard/octoprint_chituboard.png", "abandoned": false, "github": {"latest_release": {"name": "v0.1.4", "date": "2021-12-14 00:58:52 +0000", "tag": "v0.1.4"}, "releases": 3, "last_push": "2023-05-20 02:07:13 +0000", "stars": 78, "issues": {"open": 24, "closed": 13}}, "stats": {"instances_month": 49, "install_events_month": 6, "instances_week": 24, "install_events_week": 0}}, {"id": "plotlytempgraph", "published": "2021-08-21 00:00:00 +0000", "title": "OctoPrint-PlotlyTempGraph", "description": "Display temperature data in a plotly js graph.", "archive": "https://github.com/jneilliii/OctoPrint-PlotlyTempGraph/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-PlotlyTempGraph", "page": "https://plugins.octoprint.org/plugins/plotlytempgraph/", "compatibility": {"octoprint": ["1.3.6"], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/plotlytempgraph/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.7", "date": "2023-09-30 01:00:05 +0000", "tag": "0.1.7"}, "releases": 31, "last_push": "2024-01-14 15:58:55 +0000", "stars": 22, "issues": {"open": 1, "closed": 44}}, "stats": {"instances_month": 562, "install_events_month": 44, "instances_week": 405, "install_events_week": 13}}, {"id": "printscheduler", "published": "2021-08-21 00:00:00 +0000", "title": "Print Scheduler", "description": "Plugin that allows to schedule prints to run at a specified time.", "archive": "https://github.com/jneilliii/OctoPrint-PrintScheduler/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-PrintScheduler", "page": "https://plugins.octoprint.org/plugins/printscheduler/", "compatibility": {"octoprint": ["1.6.1"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/printscheduler/screenshot_tab.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.2", "date": "2023-03-19 04:52:32 +0000", "tag": "1.0.2"}, "releases": 15, "last_push": "2024-01-14 15:58:59 +0000", "stars": 10, "issues": {"open": 2, "closed": 41}}, "stats": {"instances_month": 976, "install_events_month": 86, "instances_week": 743, "install_events_week": 14}}, {"id": "ups", "published": "2021-08-22 00:00:00 +0000", "title": "UPS", "description": "Integrates a UPS monitored by NUT into OctoPrint", "archive": "https://github.com/kantlivelong/OctoPrint-UPS/archive/master.zip", "author": "Shawn Bruce", "homepage": "https://github.com/kantlivelong/OctoPrint-UPS", "page": "https://plugins.octoprint.org/plugins/ups/", "compatibility": {"octoprint": ["1.6.0"], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ups/ups_navbar.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.1", "date": "2021-08-20 03:54:03 +0000", "tag": "0.0.1"}, "releases": 1, "last_push": "2021-08-20 03:50:38 +0000", "stars": 15, "issues": {"open": 8, "closed": 6}}, "stats": {"instances_month": 187, "install_events_month": 21, "instances_week": 149, "install_events_week": 6}}, {"id": "SafetyPrinter", "published": "2021-08-30 00:00:00 +0000", "title": "Safety Printer", "description": "This plugin interfaces with Safety Printer MCU to improve your printer's safety.", "archive": "https://github.com/SinisterRj/Octoprint_SafetyPrinter/archive/refs/heads/main.zip", "author": "Rodrigo C. C. Silva", "homepage": "https://github.com/SinisterRj/SafetyPrinter/wiki", "page": "https://plugins.octoprint.org/plugins/SafetyPrinter/", "compatibility": {"octoprint": [], "os": ["linux", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/SafetyPrinter/icon.PNG", "abandoned": false, "github": {"latest_release": {"name": "1.2.0", "date": "2022-12-26 18:47:41 +0000", "tag": "1.2.0"}, "releases": 13, "last_push": "2024-01-15 18:27:00 +0000", "stars": 3, "issues": {"open": 0, "closed": 4}}, "stats": {"instances_month": 52, "install_events_month": 9, "instances_week": 32, "install_events_week": 2}}, {"id": "thingiverse_downloader", "published": "2021-09-10 00:00:00 +0000", "title": "Thingiverse Downloader", "description": "Download and extract a thing from Thingiverse to your Octoprint instance", "archive": "https://github.com/appdevelopmentandsuch/Thingiverse-Downloader/archive/main.zip", "author": "Lucas Bock", "homepage": "https://github.com/appdevelopmentandsuch/Thingiverse-Downloader", "page": "https://plugins.octoprint.org/plugins/thingiverse_downloader/", "compatibility": {"octoprint": ["1.3.5"], "os": [], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/thingiverse_downloader/demo.png", "abandoned": false, "github": {"latest_release": {"name": "v0.3.0", "date": "2021-09-10 12:23:23 +0000", "tag": "v0.3.0"}, "releases": 5, "last_push": "2021-09-10 12:20:49 +0000", "stars": 8, "issues": {"open": 1, "closed": 9}}, "stats": {"instances_month": 635, "install_events_month": 56, "instances_week": 394, "install_events_week": 9}}, {"id": "fractalbridge", "published": "2021-09-15 00:00:00 +0000", "title": "Fractal Bridge", "description": "Fractal's printer control plugin for OctoPrint", "archive": "https://github.com/FractalManufacturing/OctoPrint-FractalBridge/archive/master.zip", "author": "Fractal", "homepage": "https://github.com/FractalManufacturing/OctoPrint-FractalBridge", "page": "https://plugins.octoprint.org/plugins/fractalbridge/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/fractalbridge/fractal-home.png", "abandoned": false, "github": {"last_push": "2021-09-16 15:19:50 +0000", "stars": 6, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 8, "install_events_month": 3, "instances_week": 5, "install_events_week": 0}}, {"id": "bedcooldown", "published": "2021-09-26 00:00:00 +0000", "title": "OctoPrint-BedCooldown", "description": "Turns off the bed heater toward the end of a print", "archive": "https://github.com/rfinnie/OctoPrint-BedCooldown/archive/main.zip", "author": "Ryan Finnie", "homepage": "https://github.com/rfinnie/OctoPrint-BedCooldown", "page": "https://plugins.octoprint.org/plugins/bedcooldown/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "MPL-2.0", "image": "https://plugins.octoprint.org/assets/img/plugins/bedcooldown/graph.png", "abandoned": false, "github": {"latest_release": {"name": "Bed Cooldown 0.6.0", "date": "2022-11-20 21:50:41 +0000", "tag": "v0.6.0"}, "releases": 9, "last_push": "2023-12-06 23:31:40 +0000", "stars": 3, "issues": {"open": 3, "closed": 7}}, "stats": {"instances_month": 729, "install_events_month": 34, "instances_week": 547, "install_events_week": 8}}, {"id": "psucontrol_openhab3", "published": "2021-09-27 00:00:00 +0000", "title": "PSU Control - openHAB3", "description": "Adds openHAB3 support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/Tomatenjoghurt/OctoPrint-PSUControl-openHAB3/archive/main.zip", "author": "Philipp Gro\u00dfe", "homepage": "https://github.com/Tomatenjoghurt/OctoPrint-PSUControl-openHAB3", "page": "https://plugins.octoprint.org/plugins/psucontrol_openhab3/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.8", "date": "2021-09-09 09:37:27 +0000", "tag": "1.0.8"}, "releases": 9, "last_push": "2022-06-13 13:07:17 +0000", "stars": 5, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 40, "install_events_month": 3, "instances_week": 31, "install_events_week": 0}}, {"id": "psucontrol_mqtt", "published": "2021-10-05 00:00:00 +0000", "title": "PSU Control - MQTT", "description": "adds support for generic MQTT switches to PSU Control as a subplugin", "archive": "https://github.com/oerkel47/OctoPrint-PSUControl-MQTT/archive/main.zip", "author": "oerkel47", "homepage": "https://github.com/oerkel47/OctoPrint-PSUControl-MQTT", "page": "https://plugins.octoprint.org/plugins/psucontrol_mqtt/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/psucontrol_mqtt/screenshot_settings.PNG", "abandoned": false, "github": {"latest_release": {"name": "1.0.2", "date": "2021-11-17 09:56:59 +0000", "tag": "1.0.2"}, "releases": 2, "last_push": "2021-11-17 09:50:32 +0000", "stars": 8, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 163, "install_events_month": 9, "instances_week": 126, "install_events_week": 4}}, {"id": "octoapp", "published": "2021-12-01 00:00:00 +0000", "title": "OctoApp", "description": "The Companion Plugin for OctoApp", "archive": "https://github.com/crysxd/OctoApp-Plugin/archive/refs/heads/release.zip", "author": "Christian W\u00fcrthner", "homepage": "https://play.google.com/store/apps/details?id=de.crysxd.octoapp&hl=en&gl=US", "page": "https://plugins.octoprint.org/plugins/octoapp/", "compatibility": {"octoprint": ["1.7.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPL v3", "image": "https://plugins.octoprint.org/assets/img/plugins/octoapp/carousel.webp", "abandoned": false, "github": {"latest_release": {"name": "2.0.10", "date": "2024-04-06 07:23:23 +0000", "tag": "2.0.10"}, "releases": 28, "last_push": "2024-04-13 15:18:13 +0000", "stars": 46, "issues": {"open": 2, "closed": 35}}, "stats": {"instances_month": 6863, "install_events_month": 796, "instances_week": 5019, "install_events_week": 192}}, {"id": "BLOCKS", "published": "2021-12-24 00:00:00 +0000", "title": "Blocks", "description": "Theme for Blocks 3D printers and extended functionalities.", "archive": "https://github.com/HugoCLSC/Octoprint-BLOCKS/archive/main.zip", "author": "Hugo C. Lopes Santos Costa", "homepage": "https://github.com/HugoCLSC/OctoPrint-BLOCKS", "page": "https://plugins.octoprint.org/plugins/BLOCKS/", "compatibility": {"octoprint": ["1.7.2"], "os": ["linux"], "python": ">=3.3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/BLOCKS/Blocks_VECTORIZADOpreto.png", "abandoned": false, "github": {"latest_release": {"name": "Release V1.0.4", "date": "2023-08-03 13:31:34 +0000", "tag": "v1.0.4"}, "releases": 5, "last_push": "2023-08-14 16:44:38 +0000", "stars": 1, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 16, "install_events_month": 4, "instances_week": 10, "install_events_week": 0}}, {"id": "custom_gcode_events", "published": "2022-01-02 00:00:00 +0000", "title": "OctoPrint-Custom_gcode_events", "description": "Enables the User to configure custom GCode hooks (both sent and received) that will fire a User-defined event to be picked up by other plugins.", "archive": "https://github.com/RoboMagus/OctoPrint-Custom_gcode_events/archive/master.zip", "author": "RoboMagus", "homepage": "https://github.com/RoboMagus/OctoPrint-Custom_gcode_events", "page": "https://plugins.octoprint.org/plugins/custom_gcode_events/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Custom Event Registration + Settings bugfix", "date": "2023-11-14 19:39:54 +0000", "tag": "0.3.2"}, "releases": 5, "last_push": "2023-11-14 19:33:49 +0000", "stars": 4, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 43, "install_events_month": 2, "instances_week": 32, "install_events_week": 0}}, {"id": "onedrive_backup", "published": "2022-01-03 00:00:00 +0000", "title": "OneDrive Backup", "description": "Automatically upload OctoPrint backups to Microsoft OneDrive", "archive": "https://github.com/cp2004/OctoPrint-OneDrive-Backup/releases/latest/download/release.zip", "author": "Charlie Powell", "homepage": "https://github.com/cp2004/OctoPrint-OneDrive-Backup", "page": "https://plugins.octoprint.org/plugins/onedrive_backup/", "compatibility": {"octoprint": ["1.5.0"], "os": [], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/onedrive_backup/config-3.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.1 Stable Release", "date": "2022-01-17 22:32:58 +0000", "tag": "1.0.1"}, "releases": 2, "last_push": "2023-12-27 13:00:34 +0000", "stars": 15, "issues": {"open": 4, "closed": 14}}, "stats": {"instances_month": 693, "install_events_month": 43, "instances_week": 505, "install_events_week": 5}}, {"id": "gpiostatus", "published": "2022-01-08 00:00:00 +0000", "title": "GPIO Status", "description": "Check the Raspberry GPIO status and other hardware data.", "archive": "https://github.com/danieleborgo/OctoPrint-GPIOStatus/archive/master.zip", "author": "danieleborgo", "homepage": "https://github.com/danieleborgo/OctoPrint-GPIOStatus", "page": "https://plugins.octoprint.org/plugins/gpiostatus/", "compatibility": {"octoprint": ["1.7.2"], "os": ["linux"], "python": ">=3,<4"}, "license": "GPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/gpiostatus/GPIO.png", "abandoned": false, "github": {"latest_release": {"name": "GPIO Status 0.2.1", "date": "2022-01-17 17:31:20 +0000", "tag": "0.2.1"}, "releases": 1, "last_push": "2022-08-23 19:00:35 +0000", "stars": 9, "issues": {"open": 1, "closed": 7}}, "stats": {"instances_month": 518, "install_events_month": 49, "instances_week": 378, "install_events_week": 16}}, {"id": "shutdownbuttonledbuzzer", "published": "2022-01-08 00:00:00 +0000", "title": "ShutdownButtonLEDBuzzer", "description": "It implements a shutdown physical button for the Raspberry Pi, with a buzzer and a status LED.", "archive": "https://github.com/danieleborgo/OctoPrint-ShutdownButtonLEDBuzzer/archive/master.zip", "author": "danieleborgo", "homepage": "https://github.com/danieleborgo/OctoPrint-ShutdownButtonLEDBuzzer", "page": "https://plugins.octoprint.org/plugins/shutdownbuttonledbuzzer/", "compatibility": {"octoprint": ["1.7.2"], "os": ["linux"], "python": ">=3,<4"}, "license": "GPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/shutdownbuttonledbuzzer/circuit.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.4", "date": "2022-05-30 18:10:54 +0000", "tag": "0.1.4"}, "releases": 4, "last_push": "2023-02-25 17:16:17 +0000", "stars": 5, "issues": {"open": 0, "closed": 7}}, "stats": {"instances_month": 66, "install_events_month": 5, "instances_week": 35, "install_events_week": 1}}, {"id": "activeconnections", "published": "2022-01-22 00:00:00 +0000", "title": "Active Connections", "description": "Displays list of active connections in a sidebar panel.", "archive": "https://github.com/jneilliii/OctoPrint-ActiveConnections/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-ActiveConnections", "page": "https://plugins.octoprint.org/plugins/activeconnections/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/activeconnections/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.2.1", "date": "2022-01-29 05:30:27 +0000", "tag": "0.2.1"}, "releases": 3, "last_push": "2024-01-14 15:58:38 +0000", "stars": 4, "issues": {"open": 1, "closed": 4}}, "stats": {"instances_month": 367, "install_events_month": 25, "instances_week": 278, "install_events_week": 3}}, {"id": "googledrivefiles", "published": "2022-01-22 00:00:00 +0000", "title": "Google Drive Files", "description": "Adds Google Drive file access from within OctoPrint's file manager.", "archive": "https://github.com/jneilliii/OctoPrint-GoogleDriveFiles/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-GoogleDriveFiles", "page": "https://plugins.octoprint.org/plugins/googledrivefiles/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/googledrivefiles/screenshot_filelist.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.1", "date": "2024-01-11 01:12:09 +0000", "tag": "0.1.1"}, "releases": 6, "last_push": "2024-01-14 15:58:39 +0000", "stars": 15, "issues": {"open": 4, "closed": 16}}, "stats": {"instances_month": 320, "install_events_month": 28, "instances_week": 229, "install_events_week": 9}}, {"id": "printwatch", "published": "2022-01-31 00:00:00 +0000", "title": "Abort Failures - Printwatch", "description": "PrintWatch monitors your prints for defects in real-time and optimizes your 3D printers using Artificial Intelligence for Free. PrintWatch allows you to remotely view and manage your printers from anywhere in the world. Save wasted material and time with our AI monitoring system that notifies you and/or pauses the print when something goes wrong. Go about your day with the peace of mind that your 3D printer is working as it should.", "archive": "https://github.com/printpal-io/OctoPrint-Printwatch/archive/master.zip", "author": "printpal.io", "homepage": "https://github.com/printpal-io/OctoPrint-Printwatch", "privacypolicy": "https://printpal.io/privacy/", "page": "https://plugins.octoprint.org/plugins/printwatch/", "compatibility": {"octoprint": ["1.3.2"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.6,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/printwatch/printwatch-web-app-individual-printer.jpg", "abandoned": false, "github": {"latest_release": {"name": "1.3.01 - Free Plan", "date": "2023-07-13 15:37:14 +0000", "tag": "1.3.01"}, "releases": 7, "last_push": "2024-01-31 22:27:16 +0000", "stars": 37, "issues": {"open": 0, "closed": 4}}, "stats": {"instances_month": 415, "install_events_month": 54, "instances_week": 257, "install_events_week": 16}}, {"id": "timelapsepurger", "published": "2022-02-06 00:00:00 +0000", "title": "Timelapse Purger", "description": "Automatically deletes timelapses that are older than configured number of days.", "archive": "https://github.com/jneilliii/OctoPrint-TimelapsePurger/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-TimelapsePurger", "page": "https://plugins.octoprint.org/plugins/timelapsepurger/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/timelapsepurger/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.4", "date": "2022-11-13 03:00:16 +0000", "tag": "0.1.4"}, "releases": 4, "last_push": "2024-01-14 15:59:14 +0000", "stars": 1, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 877, "install_events_month": 63, "instances_week": 647, "install_events_week": 14}}, {"id": "CalibrationTools", "published": "2022-02-09 00:00:00 +0000", "title": "Calibration Tools", "description": "Marlin Calibration Tools", "archive": "https://github.com/SergiuToporjinschi/OctoPrint-CalibrationTools/archive/main.zip", "author": "Sergiu Toporjinschi", "homepage": "https://github.com/SergiuToporjinschi/OctoPrint-CalibrationTools", "page": "https://plugins.octoprint.org/plugins/CalibrationTools/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "GNUv3", "image": "https://plugins.octoprint.org/assets/img/plugins/CalibrationTools/featuredimage.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.4", "date": "2022-02-16 10:41:32 +0000", "tag": "1.0.4"}, "releases": 7, "last_push": "2022-02-16 11:18:01 +0000", "stars": 18, "issues": {"open": 14, "closed": 6}}, "stats": {"instances_month": 2897, "install_events_month": 301, "instances_week": 1949, "install_events_week": 71}}, {"id": "emc2101", "published": "2022-02-14 00:00:00 +0000", "title": "OctoPrint-Emc2101", "description": "Enable control status display of up to 8 4-Pin PWM fans each controlled by an Adafruit 2101", "archive": "https://github.com/JeremyLaurenson/OctoPrint-Emc2101/archive/main.zip", "author": "Jeremy Laurenson", "homepage": "https://github.com/JeremyLaurenson/OctoPrint-Emc2101", "page": "https://plugins.octoprint.org/plugins/emc2101/", "compatibility": {"octoprint": ["1.2.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/emc2101/EMC_ss_0.0.4-2.png", "abandoned": false, "github": {"latest_release": {"name": "Bugfix for single sensor use case", "date": "2022-05-25 15:58:53 +0000", "tag": "0.0.8"}, "releases": 8, "last_push": "2024-02-18 13:49:30 +0000", "stars": 8, "issues": {"open": 7, "closed": 3}}, "stats": {"instances_month": 19, "install_events_month": 4, "instances_week": 13, "install_events_week": 1}}, {"id": "octoprint_psucontrol_meross", "published": "2022-02-22 00:00:00 +0000", "title": "PSU Control - Meross", "description": "Adds Meross IOT device support to PSUControl", "archive": "https://github.com/VRGhost/OctoPrint-PSUControl-Meross/archive/refs/tags/stable-latest.zip", "author": "Ilja Orlovs", "homepage": "https://github.com/VRGhost/OctoPrint-PSUControl-Meross", "page": "https://plugins.octoprint.org/plugins/octoprint_psucontrol_meross/", "compatibility": {"octoprint": ["1.7.3"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.13.3", "date": "2024-01-13 20:59:59 +0000", "tag": "0.13.3"}, "releases": 12, "last_push": "2024-01-13 20:55:12 +0000", "stars": 4, "issues": {"open": 3, "closed": 6}}, "stats": {"instances_month": 0, "install_events_month": 0, "instances_week": 0, "install_events_week": 0}}, {"id": "openmiko", "published": "2022-02-26 00:00:00 +0000", "title": "OctoPrint-OpenMiko", "description": "Control OpenMiko Day/Night Mode", "archive": "https://github.com/tmountjr/OctoPrint-OpenMiko/archive/main.zip", "author": "Tom Mount", "homepage": "https://github.com/tmountjr/OctoPrint-OpenMiko", "page": "https://plugins.octoprint.org/plugins/openmiko/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/openmiko/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "v0.2.1", "date": "2022-03-24 03:03:05 +0000", "tag": "v0.2.1"}, "releases": 3, "last_push": "2022-03-24 03:02:09 +0000", "stars": 0, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 34, "install_events_month": 4, "instances_week": 27, "install_events_week": 1}}, {"id": "ServoSpindle", "published": "2022-02-27 00:00:00 +0000", "title": "Servo Spindle for GRBL CNC", "description": "Servo Spindle enables servo based control of a CNC spindle by connecting to an ESC and trapping Grbl M3/M5/S### commands", "archive": "https://github.com/synman/OctoPrint-Servospindle/archive/main.zip", "author": "Shell M. Shrader", "homepage": "https://github.com/synman/OctoPrint-Servospindle", "page": "https://plugins.octoprint.org/plugins/ServoSpindle/", "compatibility": {"octoprint": ["1.3.10"], "os": [], "python": ">=2.7,<4"}, "license": "Apache 2.0", "image": "https://plugins.octoprint.org/assets/img/plugins/ServoSpindle/Grbl_logo.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.0", "date": "2022-02-28 14:44:50 +0000", "tag": "0.1.0"}, "releases": 1, "last_push": "2022-02-07 11:58:33 +0000", "stars": 1, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 16, "install_events_month": 5, "instances_week": 6, "install_events_week": 0}}, {"id": "usbrelaycontrol", "published": "2022-03-01 00:00:00 +0000", "title": "USB Relay Control", "description": "Control USB relays from within OctoPrint", "archive": "https://github.com/abudden/OctoPrint-USBRelayControl/archive/master.zip", "author": "A. S. Budden", "homepage": "https://github.com/abudden/OctoPrint-USBRelayControl", "page": "https://plugins.octoprint.org/plugins/usbrelaycontrol/", "compatibility": {"octoprint": ["1.5.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPL", "image": "https://plugins.octoprint.org/assets/img/plugins/usbrelaycontrol/sidebar.png", "abandoned": false, "github": {"latest_release": {"name": "v1.0.0", "date": "2022-02-28 18:51:26 +0000", "tag": "v1.0.0"}, "releases": 2, "last_push": "2022-02-28 18:37:28 +0000", "stars": 11, "issues": {"open": 7, "closed": 3}}, "stats": {"instances_month": 125, "install_events_month": 19, "instances_week": 82, "install_events_week": 4}}, {"id": "cnc_gcodeviewer", "published": "2022-03-03 00:00:00 +0000", "title": "CNC GCode Viewer", "description": "GCode Viewer for CNC toolpaths with no extrusions", "archive": "https://github.com/vector76/cnc_gcodeviewer/archive/main.zip", "author": "Jamie Kawabata", "homepage": "https://github.com/vector76/cnc_gcodeviewer", "page": "https://plugins.octoprint.org/plugins/cnc_gcodeviewer/", "compatibility": {"octoprint": ["1.4.1"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/cnc_gcodeviewer/crown_screen_shot.png", "abandoned": false, "github": {"latest_release": {"name": "v1.1.1", "date": "2022-11-14 08:35:02 +0000", "tag": "v1.1.1"}, "releases": 7, "last_push": "2022-11-14 08:33:14 +0000", "stars": 3, "issues": {"open": 2, "closed": 10}}, "stats": {"instances_month": 131, "install_events_month": 16, "instances_week": 85, "install_events_week": 4}}, {"id": "wyze", "published": "2022-03-16 00:00:00 +0000", "title": "OctoPrint-Wyze", "description": "Control Wyze devices through OctoPrint", "archive": "https://github.com/eshapiro42/OctoPrint-Wyze/archive/main.zip", "author": "Eric Shapiro", "homepage": "https://github.com/eshapiro42/OctoPrint-Wyze", "page": "https://plugins.octoprint.org/plugins/wyze/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.8,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/wyze/OctoPrint-Wyze.png", "abandoned": false, "github": {"latest_release": {"name": "v0.2.2", "date": "2023-10-27 18:37:18 +0000", "tag": "v0.2.2"}, "releases": 9, "last_push": "2023-10-27 18:39:47 +0000", "stars": 10, "issues": {"open": 3, "closed": 12}}, "stats": {"instances_month": 71, "install_events_month": 18, "instances_week": 46, "install_events_week": 6}}, {"id": "pwmbuzzer", "published": "2022-03-29 00:00:00 +0000", "title": "OctoPrint-PWMBuzzer", "description": "Uses PWM via GPIO to sound tones whenever an M300 command is encountered", "archive": "https://github.com/stealthmonkey99/OctoPrint-PWMBuzzer/archive/main.zip", "author": "Matt Bielich", "homepage": "https://github.com/stealthmonkey99/OctoPrint-PWMBuzzer", "page": "https://plugins.octoprint.org/plugins/pwmbuzzer/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/pwmbuzzer/composer.png", "abandoned": false, "github": {"latest_release": {"name": "v1.2.0: better sound with hardware timer PWM", "date": "2022-07-31 22:29:54 +0000", "tag": "v1.2.0"}, "releases": 3, "last_push": "2022-09-10 20:54:32 +0000", "stars": 6, "issues": {"open": 2, "closed": 10}}, "stats": {"instances_month": 72, "install_events_month": 8, "instances_week": 51, "install_events_week": 1}}, {"id": "framer", "published": "2022-04-05 00:00:00 +0000", "title": "OctoPrint-Framer", "description": "Adds frame buttons to the items in the file list which let you verify the area used for the laser/CNC job.", "archive": "https://github.com/rriet/OctoPrint-Framer/archive/master.zip", "author": "Ricardo Riet Correa", "homepage": "https://github.com/rriet/OctoPrint-Framer", "page": "https://plugins.octoprint.org/plugins/framer/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "GNUv3", "image": "https://plugins.octoprint.org/assets/img/plugins/framer/screen.png", "abandoned": false, "github": {"last_push": "2022-04-06 17:35:54 +0000", "stars": 2, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 96, "install_events_month": 12, "instances_week": 60, "install_events_week": 1}}, {"id": "crealitycloud", "published": "2022-04-14 00:00:00 +0000", "title": "OctoPrint-CrealityCloud", "description": "A OctoPrint-Plugin that connect the Octoprint to Creality Cloud", "archive": "https://github.com/crealitycloud/OctoPrint-Crealitycloud/archive/master.zip", "author": "Creality", "homepage": "https://github.com/crealitycloud/OctoPrint-CrealityCloud", "privacypolicy": "https://www.crealitycloud.com/policy?type=policy", "page": "https://plugins.octoprint.org/plugins/crealitycloud/", "compatibility": {"octoprint": ["1.6.1"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2024-04-03 06:40:26 +0000", "tag": "1.0.9"}, "releases": 16, "last_push": "2024-04-03 06:34:53 +0000", "stars": 26, "issues": {"open": 9, "closed": 13}}, "stats": {"instances_month": 1206, "install_events_month": 253, "instances_week": 753, "install_events_week": 62}}, {"id": "psucontrol_tapo", "published": "2022-04-14 00:00:00 +0000", "title": "PSU Control - Tapo", "description": "Adds Tapo Smart Plug support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/dswd/OctoPrint-PSUControl-Tapo/archive/master.zip", "author": "Dennis Schwerdel", "homepage": "https://github.com/dswd/OctoPrint-PSUControl-Tapo", "page": "https://plugins.octoprint.org/plugins/psucontrol_tapo/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "v0.4.0", "date": "2023-10-05 18:03:26 +0000", "tag": "0.4.0"}, "releases": 5, "last_push": "2023-10-05 16:39:23 +0000", "stars": 7, "issues": {"open": 8, "closed": 6}}, "stats": {"instances_month": 439, "install_events_month": 74, "instances_week": 315, "install_events_week": 15}}, {"id": "detector2", "published": "2022-04-15 00:00:00 +0000", "title": "OctoPrint-Detector2", "description": "Detects errors directly in your browser and sends email with detected error", "archive": "https://github.com/mikulash/OctoPrint-Detector2/archive/master.zip", "author": "Mikulas Heinz", "homepage": "https://github.com/mikulash/OctoPrint-Detector2", "page": "https://plugins.octoprint.org/plugins/detector2/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/detector2/errorPreview.png", "abandoned": false, "github": {"latest_release": {"name": "Email fix and communication with other plugins", "date": "2022-07-26 22:23:15 +0000", "tag": "0.1.4"}, "releases": 4, "last_push": "2022-07-26 22:16:43 +0000", "stars": 27, "issues": {"open": 10, "closed": 4}}, "stats": {"instances_month": 189, "install_events_month": 12, "instances_week": 129, "install_events_week": 1}}, {"id": "psucontrol_opigpio", "published": "2022-04-27 00:00:00 +0000", "title": "PSUControl - OPi.GPIO", "description": "Adds OPi.GPIO to OctoPrint-PSUControl as a sub-plugin for OrangePi Zero and other SBCs supported by OPi.GPIO.", "archive": "https://github.com/Blue-Beaker/OctoPrint-PSUControl-OPi.GPIO/archive/master.zip", "author": "Blue-Beaker", "homepage": "https://github.com/Blue-Beaker/OctoPrint-PSUControl-OPi.GPIO", "page": "https://plugins.octoprint.org/plugins/psucontrol_opigpio/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "v1.0.4", "date": "2022-04-27 07:32:28 +0000", "tag": "1.0.4"}, "releases": 1, "last_push": "2022-04-27 07:26:37 +0000", "stars": 3, "issues": {"open": 1, "closed": 0}}, "stats": {"instances_month": 37, "install_events_month": 10, "instances_week": 17, "install_events_week": 2}}, {"id": "psucontrol_fritz", "published": "2022-04-28 00:00:00 +0000", "title": "PSU Control - FRITZ!Box", "description": "Adds FRITZ!Dect Smart Plug support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/not-na/OctoPrint-PSUControl-Fritz/archive/master.zip", "author": "not-na", "homepage": "https://github.com/not-na/OctoPrint-PSUControl-Fritz", "page": "https://plugins.octoprint.org/plugins/psucontrol_fritz/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "PSUControl - Fritz v1.0.3", "date": "2022-04-27 22:50:57 +0000", "tag": "1.0.3"}, "releases": 2, "last_push": "2022-04-27 22:45:27 +0000", "stars": 0, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 33, "install_events_month": 3, "instances_week": 26, "install_events_week": 0}}, {"id": "bedready", "published": "2022-04-29 00:00:00 +0000", "title": "OctoPrint-BedReady", "description": "Plugin that uses the camera and opencv to determine if the bed matches a reference image indicating that the bed is clear and ready to start a print.", "archive": "https://github.com/jneilliii/OctoPrint-BedReady/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-BedReady", "page": "https://plugins.octoprint.org/plugins/bedready/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.6,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/bedready/screenshot_bed_not_ready.png", "abandoned": false, "github": {"latest_release": {"name": "0.2.2", "date": "2023-12-27 17:23:06 +0000", "tag": "0.2.2"}, "releases": 10, "last_push": "2024-01-14 15:58:39 +0000", "stars": 11, "issues": {"open": 11, "closed": 8}}, "stats": {"instances_month": 318, "install_events_month": 53, "instances_week": 201, "install_events_week": 16}}, {"id": "extrafileinfo", "published": "2022-05-05 00:00:00 +0000", "title": "ExtraFileInfo", "description": "Adds a file's slicer settings to its additional data column.", "archive": "https://github.com/larsjuhw/OctoPrint-Extrafileinfo/archive/master.zip", "author": "Larsjuhw", "homepage": "https://github.com/larsjuhw/OctoPrint-Extrafileinfo", "page": "https://plugins.octoprint.org/plugins/extrafileinfo/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/extrafileinfo/file.png", "abandoned": false, "github": {"latest_release": {"name": "1.4.0", "date": "2023-11-20 18:28:48 +0000", "tag": "1.4.0"}, "releases": 9, "last_push": "2023-11-20 18:27:05 +0000", "stars": 8, "issues": {"open": 0, "closed": 12}}, "stats": {"instances_month": 585, "install_events_month": 11, "instances_week": 468, "install_events_week": 7}}, {"id": "preheathelper", "published": "2022-05-07 00:00:00 +0000", "title": "OctoPrint-PreheatHelper", "description": "A little helper to automate your printer pre-heating!", "archive": "https://github.com/RoboMagus/OctoPrint-PreheatHelper/archive/master.zip", "author": "RoboMagus", "homepage": "https://github.com/RoboMagus/OctoPrint-PreheatHelper", "page": "https://plugins.octoprint.org/plugins/preheathelper/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Add release channels to plugin", "date": "2022-12-20 08:58:06 +0000", "tag": "0.1.2"}, "releases": 3, "last_push": "2023-07-06 10:05:08 +0000", "stars": 1, "issues": {"open": 0, "closed": 3}}, "stats": {"instances_month": 418, "install_events_month": 31, "instances_week": 275, "install_events_week": 5}}, {"id": "psucontrol_jeedom", "published": "2022-05-24 00:00:00 +0000", "title": "PSU Control - Jeedom", "description": "Adds Jeedom support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/TexGG/OctoPrint-PSUControl-Jeedom/archive/main.zip", "author": "Tex", "homepage": "https://github.com/TexGG/OctoPrint-PSUControl-Jeedom", "page": "https://plugins.octoprint.org/plugins/psucontrol_jeedom/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "Corrections for plugin publication", "date": "2022-05-21 20:07:45 +0000", "tag": "v1.0.2"}, "releases": 3, "last_push": "2022-05-21 20:06:05 +0000", "stars": 1, "issues": {"open": 1, "closed": 0}}, "stats": {"instances_month": 15, "install_events_month": 2, "instances_week": 9, "install_events_week": 0}}, {"id": "queue", "published": "2022-06-06 00:00:00 +0000", "title": "OctoPrint-Queue", "description": "A simple queue setup designed for use by staff at a public library.", "archive": "https://github.com/chennes/OctoPrint-Queue/archive/master.zip", "author": "Chris Hennes, Pioneer Library System", "homepage": "https://github.com/chennes/OctoPrint-Queue", "page": "https://plugins.octoprint.org/plugins/queue/", "compatibility": {"octoprint": ["1.3.0"], "os": [], "python": ">=3.0,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/queue/queue.png", "abandoned": false, "github": {"latest_release": {"name": "v2.0.0", "date": "2022-06-07 03:11:37 +0000", "tag": "v2.0.0"}, "releases": 2, "last_push": "2023-05-22 00:53:36 +0000", "stars": 14, "issues": {"open": 8, "closed": 2}}, "stats": {"instances_month": 116, "install_events_month": 17, "instances_week": 70, "install_events_week": 4}}, {"id": "CreatbotUtil", "published": "2022-06-14 00:00:00 +0000", "title": "Creatbot Util", "description": "Various utility functions to make OctoPrint work better with Creatbot printers.", "archive": "https://github.com/kForth/OctoPrint-CreatbotUtil/archive/main.zip", "author": "Kestin Goforth", "homepage": "https://github.com/kForth/OctoPrint-CreatbotUtil", "page": "https://plugins.octoprint.org/plugins/CreatbotUtil/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "OctoPrint-CreatbotUtil v1.2.0", "date": "2022-09-19 15:12:51 +0000", "tag": "1.2.0"}, "releases": 4, "last_push": "2023-01-25 16:06:45 +0000", "stars": 3, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 16, "install_events_month": 4, "instances_week": 13, "install_events_week": 0}}, {"id": "psucontrol_espurna", "published": "2022-06-21 00:00:00 +0000", "title": "Octoprint-PSUControl-ESPurna", "description": "Plugin to control devices with ESPurna firmware", "archive": "https://github.com/luismanson/Octoprint-PSUControl-ESPurna/archive/master.zip", "author": "Luis Diaz", "homepage": "https://github.com/luismanson/Octoprint-PSUControl-ESPurna", "page": "https://plugins.octoprint.org/plugins/psucontrol_espurna/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "v0.1.3", "date": "2022-06-22 23:40:42 +0000", "tag": "v0.1.3"}, "releases": 3, "last_push": "2022-06-22 23:20:11 +0000", "stars": 2, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 5, "install_events_month": 2, "instances_week": 3, "install_events_week": 0}}, {"id": "persist_terminal_command_history", "published": "2022-07-17 00:00:00 +0000", "title": "OctoPrint-PersistTerminalCommandHistory", "description": "Persist terminal command history across reloads", "archive": "https://github.com/nivekmai/OctoPrint-PersistTerminalCommandHistory/archive/master.zip", "author": "Kevin Christensen", "homepage": "https://github.com/nivekmai/OctoPrint-PersistTerminalCommandHistory", "page": "https://plugins.octoprint.org/plugins/persist_terminal_command_history/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.2.0", "date": "2022-07-19 05:21:59 +0000", "tag": "0.2.0"}, "releases": 2, "last_push": "2022-07-20 13:40:07 +0000", "stars": 1, "issues": {"open": 1, "closed": 0}}, "stats": {"instances_month": 165, "install_events_month": 15, "instances_week": 125, "install_events_week": 2}}, {"id": "autoprint", "published": "2022-07-21 00:00:00 +0000", "title": "OctoPrint-Autoprint", "description": "Tool to automatically start the printer and prints remotely", "archive": "https://github.com/chof747/octoprint-autoprint/archive/master.zip", "author": "Christian Hofbauer", "homepage": "https://github.com/chof747/octoprint-autoprint", "page": "https://plugins.octoprint.org/plugins/autoprint/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/autoprint/featured_screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "Energy Saving Options", "date": "2022-10-08 06:35:46 +0000", "tag": "1.1.0"}, "releases": 8, "last_push": "2022-10-08 06:33:12 +0000", "stars": 2, "issues": {"open": 3, "closed": 4}}, "stats": {"instances_month": 90, "install_events_month": 6, "instances_week": 70, "install_events_week": 3}}, {"id": "sdwire", "published": "2022-07-24 00:00:00 +0000", "title": "OctoPrint-Sdwire", "description": "Fast file upload to SD card using sdwire hardware", "archive": "https://github.com/arekm/OctoPrint-Sdwire/archive/master.zip", "author": "Arkadiusz Mi\u015bkiewicz", "homepage": "https://github.com/arekm/OctoPrint-Sdwire", "page": "https://plugins.octoprint.org/plugins/sdwire/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/sdwire/sdwire-hw.jpg", "abandoned": false, "github": {"latest_release": {"name": "0.1.5", "date": "2022-10-03 16:28:56 +0000", "tag": "0.1.5"}, "releases": 6, "last_push": "2022-10-03 16:19:50 +0000", "stars": 6, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 27, "install_events_month": 5, "instances_week": 19, "install_events_week": 0}}, {"id": "mkswifisdcard", "published": "2022-08-01 00:00:00 +0000", "title": "OctoPrint-mkswifisdcard", "description": "Octoprint plugin for fast upload file to SD-card over MKS WiFi module", "archive": "https://github.com/om2804/octoprint_mkswifisdcard/archive/main.zip", "author": "om2804", "homepage": "https://github.com/om2804/octoprint_mkswifisdcard", "page": "https://plugins.octoprint.org/plugins/mkswifisdcard/", "compatibility": {"octoprint": ["1.4.0"], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/mkswifisdcard/plugin-settings.png", "abandoned": false, "github": {"latest_release": {"name": "1.1.0", "date": "2022-08-16 15:38:29 +0000", "tag": "1.1.0"}, "releases": 2, "last_push": "2022-08-16 15:31:59 +0000", "stars": 2, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 89, "install_events_month": 8, "instances_week": 54, "install_events_week": 1}}, {"id": "prusammu", "published": "2022-08-01 00:00:00 +0000", "title": "Prusa MMU", "description": "This plugin adds Prusa MMU support to OctoPrint. The active filament will be displayed in the navbar and you will be prompted to select which filament to use when slicing in \"MMU Single\" mode. Other settings are available to name each tool and set defaults. This plugin only works for Prusa printers with an MMU. Supports MMU firmware 1.X.X and 3.X.X.", "archive": "https://github.com/jukebox42/Octoprint-PrusaMMU/releases/latest/download/Octoprint-PrusaMmu.zip", "author": "jukebox42", "homepage": "https://github.com/jukebox42/Octoprint-PrusaMMU", "page": "https://plugins.octoprint.org/plugins/prusammu/", "compatibility": {"octoprint": ["1.8.0", "1.8.1"], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/prusammu/nav.png", "abandoned": false, "github": {"latest_release": {"name": "2023.10.29", "date": "2023-10-29 22:41:32 +0000", "tag": "2023.10.29"}, "releases": 18, "last_push": "2023-10-29 22:36:26 +0000", "stars": 10, "issues": {"open": 3, "closed": 20}}, "stats": {"instances_month": 845, "install_events_month": 92, "instances_week": 643, "install_events_week": 19}}, {"id": "karmen", "published": "2022-08-15 00:00:00 +0000", "title": "Karmen Connector", "description": "Secured 3D printer monitoring and sharing. G-codes and user management. Schedule print jobs, view print history and timelapse videos. FREE!", "archive": "https://github.com/fragaria/karmen-octoprint-plugin/archive/refs/heads/main.zip", "author": "Pavel Vojacek", "homepage": "https://github.com/fragaria/karmen-octoprint-plugin", "privacypolicy": "https://karmen.tech/documents/fragaria-privacy-policy.pdf", "page": "https://plugins.octoprint.org/plugins/karmen/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/karmen/versionA.png", "abandoned": false, "github": {"latest_release": {"name": "0.8.0", "date": "2023-11-28 09:50:36 +0000", "tag": "0.8.0"}, "releases": 25, "last_push": "2023-11-28 09:48:34 +0000", "stars": 3, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 85, "install_events_month": 8, "instances_week": 50, "install_events_week": 2}}, {"id": "HeaderAnnouncements", "published": "2022-09-12 00:00:00 +0000", "title": "OctoPrint-HeaderAnnouncements", "description": "Add an announcement to the header of your octoprint install for use in a shared environment", "archive": "https://github.com/wwsean08/OctoPrint-HeaderAnnouncements/archive/main.zip", "author": "Sean Smith", "homepage": "https://github.com/wwsean08/OctoPrint-HeaderAnnouncements", "page": "https://plugins.octoprint.org/plugins/HeaderAnnouncements/", "compatibility": {"octoprint": ["1.4.0"], "os": [], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/HeaderAnnouncements/announcement.png", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2022-09-17 20:58:04 +0000", "tag": "v0.1.1"}, "releases": 4, "last_push": "2022-09-17 20:57:38 +0000", "stars": 1, "issues": {"open": 1, "closed": 0}}, "stats": {"instances_month": 28, "install_events_month": 1, "instances_week": 25, "install_events_week": 0}}, {"id": "nexus_ai", "published": "2022-09-29 00:00:00 +0000", "title": "Octoprint Nexus AI", "description": "Nexus AI was oriniall developed for Sentry Pro to detect print failure. Fiberpunk make it free and accessible to as many 3D printer users as possible.", "archive": "https://github.com/fiberpunk1/OctoPrint-Nexus-AI/archive/master.zip", "author": "Fiberpunk team", "homepage": "https://fiber-punk.com/pages/nexusai", "page": "https://plugins.octoprint.org/plugins/nexus_ai/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.6,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/nexus_ai/featured.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.0", "date": "2022-10-02 23:15:26 +0000", "tag": "0.1.0"}, "releases": 1, "last_push": "2022-11-28 15:51:16 +0000", "stars": 79, "issues": {"open": 7, "closed": 4}}, "stats": {"instances_month": 388, "install_events_month": 16, "instances_week": 261, "install_events_week": 3}}, {"id": "SmartABL", "published": "2022-12-29 00:00:00 +0000", "title": "SmartABL", "description": "Plugin designed to expedite your 3D printing process. It smartly reduces unnecessary Auto Bed Leveling (ABL) actions", "archive": "https://github.com/scmanjarrez/OctoPrint-SmartABL/archive/master.zip", "author": "scmanjarrez", "homepage": "https://github.com/scmanjarrez/OctoPrint-SmartABL", "page": "https://plugins.octoprint.org/plugins/SmartABL/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/SmartABL/settings.png", "abandoned": false, "github": {"latest_release": {"name": "SmartABL 1.2.2", "date": "2023-06-25 22:52:03 +0000", "tag": "1.2.2"}, "releases": 28, "last_push": "2024-01-01 03:17:24 +0000", "stars": 10, "issues": {"open": 2, "closed": 20}}, "stats": {"instances_month": 591, "install_events_month": 53, "instances_week": 433, "install_events_week": 8}}, {"id": "esp32camUI", "published": "2023-01-04 00:00:00 +0000", "title": "OctoPrint-Esp32CamUI", "description": "Extend the interface of the ESP32-CAM into the OctoPrint interface.", "archive": "https://github.com/CyberSensei1/OctoPrint-Esp32CamUI/archive/main.zip", "author": "CyberSensei", "homepage": "https://github.com/CyberSensei1/OctoPrint-Esp32CamUI", "page": "https://plugins.octoprint.org/plugins/esp32camUI/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/esp32camUI/Tab_ScreenShot.jpg", "abandoned": false, "github": {"latest_release": {"name": "OctoPrint-Esp32CamUI v0.1.0", "date": "2023-01-04 06:31:45 +0000", "tag": "v0.1.0"}, "releases": 1, "last_push": "2023-01-04 06:33:21 +0000", "stars": 11, "issues": {"open": 2, "closed": 1}}, "stats": {"instances_month": 250, "install_events_month": 24, "instances_week": 162, "install_events_week": 6}}, {"id": "onedrive_files", "published": "2023-01-07 00:00:00 +0000", "title": "OneDrive File Sync", "description": "Automatically sync your OctoPrint files with OneDrive", "archive": "https://github.com/cp2004/OctoPrint-OneDriveFileSync/releases/latest/download/release.zip", "author": "Charlie Powell", "homepage": "https://github.com/cp2004/OctoPrint-OneDriveFileSync", "page": "https://plugins.octoprint.org/plugins/onedrive_files/", "compatibility": {"octoprint": ["1.6.0"], "os": [], "python": ">=3.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/onedrive_files/config-3.png", "abandoned": false, "github": {"latest_release": {"name": "1.0.6 Stable Release", "date": "2023-04-05 21:53:24 +0000", "tag": "1.0.6"}, "releases": 11, "last_push": "2023-12-27 13:00:33 +0000", "stars": 5, "issues": {"open": 5, "closed": 15}}, "stats": {"instances_month": 339, "install_events_month": 24, "instances_week": 240, "install_events_week": 2}}, {"id": "MacroSteps", "published": "2023-01-11 00:00:00 +0000", "title": "OctoPrint-MacroSteps", "description": "A plugin that shows a step by step any print start macro.", "archive": "https://github.com/SinisterRj/OctoPrint-MacroSteps/archive/main.zip", "author": "Rodrigo C. C. Silva", "homepage": "https://github.com/SinisterRj/OctoPrint-MacroSteps", "page": "https://plugins.octoprint.org/plugins/MacroSteps/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/MacroSteps/MSfeatured.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.1", "date": "2023-01-22 11:21:22 +0000", "tag": "0.1.1"}, "releases": 2, "last_push": "2024-01-15 18:27:28 +0000", "stars": 4, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 174, "install_events_month": 6, "instances_week": 118, "install_events_week": 0}}, {"id": "powerfailure", "published": "2023-01-23 00:00:00 +0000", "title": "OctoPrint-PowerFailure", "description": "This plugin attempts to recover a print after a power failure or printer disconnect.", "archive": "https://github.com/pablogventura/OctoPrint-PowerFailure/archive/master.zip", "author": "Pablo Ventura, Paul Paukstelis", "homepage": "https://github.com/pablogventura/OctoPrint-PowerFailure", "page": "https://plugins.octoprint.org/plugins/powerfailure/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.2.1", "date": "2023-06-08 10:14:08 +0000", "tag": "1.2.1"}, "releases": 12, "last_push": "2023-06-08 10:09:46 +0000", "stars": 27, "issues": {"open": 9, "closed": 17}}, "stats": {"instances_month": 5472, "install_events_month": 301, "instances_week": 3789, "install_events_week": 67}}, {"id": "influxdb2", "published": "2023-03-04 00:00:00 +0000", "title": "InfluxDB2", "description": "Push Metrics to InfluxDB 2.0+", "archive": "https://gitlab.com/moltenbytes32/octoprint-influxdb2/-/archive/master/octoprint-influxdb2-master.zip", "author": "MoltenBytes", "homepage": "https://gitlab.com/moltenbytes32/octoprint-influxdb2", "page": "https://plugins.octoprint.org/plugins/influxdb2/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/influxdb2/thumbnail.jpg", "abandoned": false, "stats": {"instances_month": 118, "install_events_month": 4, "instances_week": 72, "install_events_week": 1}}, {"id": "turn_off_heat_on_pause_timer", "published": "2023-03-16 00:00:00 +0000", "title": "OctoPrint-TurnOffHeatOnPauseTimer", "description": "Enables setting a timer for how long after the printer is paused that it should turn off hotend, heatbed and/or chamber.", "archive": "https://github.com/Argon2000/OctoPrint-TurnOffHeatOnPauseTimer/archive/master.zip", "author": "Per \u00c5strand", "homepage": "https://github.com/Argon2000/OctoPrint-TurnOffHeatOnPauseTimer", "page": "https://plugins.octoprint.org/plugins/turn_off_heat_on_pause_timer/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/turn_off_heat_on_pause_timer/settings.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.1", "date": "2023-03-18 14:15:41 +0000", "tag": "0.0.1"}, "releases": 1, "last_push": "2023-03-18 08:16:10 +0000", "stars": 0, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 135, "install_events_month": 4, "instances_week": 99, "install_events_week": 0}}, {"id": "ssd1306_oled_display", "published": "2023-03-25 00:00:00 +0000", "title": "SSD1306 OLED Display", "description": "Use a 128x32 SSD1306-based display to display printer and job status for OctoPrint.", "archive": "https://github.com/fredrikbaberg/OctoPrint-SSD1306/archive/main.zip", "author": "Fredrik Baberg", "homepage": "https://github.com/fredrikbaberg/OctoPrint-SSD1306", "page": "https://plugins.octoprint.org/plugins/ssd1306_oled_display/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/ssd1306_oled_display/pioled.jpg", "abandoned": false, "github": {"latest_release": {"name": "", "date": "2023-03-25 19:23:33 +0000", "tag": "0.1.4"}, "releases": 12, "last_push": "2023-05-02 06:40:58 +0000", "stars": 4, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 42, "install_events_month": 7, "instances_week": 25, "install_events_week": 4}}, {"id": "psucontrol_fhem", "published": "2023-04-18 00:00:00 +0000", "title": "PSU Control - FHEM", "description": "Adds FHEM support to OctoPrint-PSUControl as a sub-plugin", "archive": "https://github.com/nils-org/OctoPrint-PSUControl-FHEM/archive/main.zip", "author": "Nils Andresen", "homepage": "https://github.com/nils-org/OctoPrint-PSUControl-FHEM", "page": "https://plugins.octoprint.org/plugins/psucontrol_fhem/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/psucontrol_fhem/fhem-settings.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.0", "date": "2023-04-17 18:55:58 +0000", "tag": "0.1.0"}, "releases": 1, "last_push": "2023-04-17 18:50:15 +0000", "stars": 0, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 12, "install_events_month": 2, "instances_week": 9, "install_events_week": 0}}, {"id": "webcamextras", "published": "2023-04-22 00:00:00 +0000", "title": "Webcam extras", "description": "Zoom, fullscreen and minimize the webcam view", "archive": "https://github.com/poulou0/OctoPrint-WebcamExtras/archive/refs/heads/main.zip", "author": "poulou", "homepage": "https://github.com/poulou0/OctoPrint-WebcamExtras", "page": "https://plugins.octoprint.org/plugins/webcamextras/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "Apache 2.0", "image": "https://plugins.octoprint.org/assets/img/plugins/webcamextras/default_theme.jpg", "abandoned": false, "github": {"latest_release": {"name": "Integration dashboard + multicam", "date": "2023-07-20 14:09:20 +0000", "tag": "0.0.11"}, "releases": 10, "last_push": "2023-09-19 09:55:36 +0000", "stars": 10, "issues": {"open": 1, "closed": 9}}, "stats": {"instances_month": 3211, "install_events_month": 264, "instances_week": 2166, "install_events_week": 47}}, {"id": "timelapseplus", "published": "2023-04-24 00:00:00 +0000", "title": "Timelapse+", "description": "Timelapse+ is a powerful yet lightweight plugin to stabilize, capture, enhance and render your print timelapses.", "archive": "https://github.com/cmuche/octoprint-timelapseplus/archive/master.zip", "author": "Christoph Muche", "homepage": "https://github.com/cmuche/octoprint-timelapseplus", "page": "https://plugins.octoprint.org/plugins/timelapseplus/", "compatibility": {"octoprint": ["1.8.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.7,<4"}, "license": "CC BY-ND", "image": "https://plugins.octoprint.org/assets/img/plugins/timelapseplus/logo.png", "abandoned": false, "github": {"latest_release": {"name": "1.4.1", "date": "2023-07-02 14:22:42 +0000", "tag": "1.4.1"}, "releases": 9, "last_push": "2023-07-02 14:11:41 +0000", "stars": 24, "issues": {"open": 19, "closed": 68}}, "stats": {"instances_month": 1231, "install_events_month": 124, "instances_week": 764, "install_events_week": 23}}, {"id": "connectandprint", "published": "2023-04-26 00:00:00 +0000", "title": "Connect And Print", "description": "Automatically connect to your printer and start the print job on file upload", "archive": "https://raw.githubusercontent.com/Maxinger15/connectandprint/master/connectandprint.py", "author": "Max Grallinger", "homepage": "https://github.com/Maxinger15/connectandprint", "page": "https://plugins.octoprint.org/plugins/connectandprint/", "compatibility": {"octoprint": [], "os": [], "python": ">=2.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.2.0", "date": "2023-05-25 14:20:01 +0000", "tag": "1.2.0"}, "releases": 3, "last_push": "2023-08-06 18:01:42 +0000", "stars": 5, "issues": {"open": 3, "closed": 8}}, "stats": {"instances_month": 382, "install_events_month": 16, "instances_week": 226, "install_events_week": 4}}, {"id": "siocontrol", "published": "2023-05-02 00:00:00 +0000", "title": "SIO Control", "description": "Serial IO Control, an alterative way to control locally connected IO. Works on any device(PC,SBC) and OS that supports OctoPrint including Windows.", "archive": "https://github.com/jcassel/OctoPrint-Siocontrol/archive/main.zip", "author": "jcassel", "homepage": "https://github.com/jcassel/OctoPrint-Siocontrol", "page": "https://plugins.octoprint.org/plugins/siocontrol/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/siocontrol/SideBarExample.PNG", "abandoned": false, "github": {"latest_release": {"name": "v1.0.2", "date": "2024-04-08 22:35:32 +0000", "tag": "v1.0.2"}, "releases": 9, "last_push": "2024-04-08 22:30:07 +0000", "stars": 10, "issues": {"open": 0, "closed": 2}}, "stats": {"instances_month": 111, "install_events_month": 8, "instances_week": 50, "install_events_week": 3}}, {"id": "marlinslider", "published": "2023-05-20 00:00:00 +0000", "title": "Marlin Slider Controls", "description": "Control your fans, feedrate and flowrate in Marlinfw Version 2+.", "archive": "https://github.com/CmdrCody51/OctoPrint-MarlinSlider/archive/main.zip", "author": "CmdrCody51", "homepage": "https://github.com/CmdrCody51/OctoPrint-MarlinSlider", "page": "https://plugins.octoprint.org/plugins/marlinslider/", "compatibility": {"octoprint": ["1.4.0"], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/marlinslider/slider-tools.png", "abandoned": false, "github": {"latest_release": {"name": "Fixed - Again", "date": "2024-03-07 03:28:18 +0000", "tag": "v0.3.1"}, "releases": 6, "last_push": "2024-03-07 03:20:43 +0000", "stars": 2, "issues": {"open": 0, "closed": 6}}, "stats": {"instances_month": 2150, "install_events_month": 102, "instances_week": 1062, "install_events_week": 24}}, {"id": "cmdexec", "published": "2023-06-13 00:00:00 +0000", "title": "Cmd exec", "description": "Execute bash commands from Octoprint's UI", "archive": "https://github.com/Chargnn/Octoprint-CmdExec/archive/master.zip", "author": "Alexis Coulombe", "homepage": "https://github.com/Chargnn/Octoprint-CmdExec/", "page": "https://plugins.octoprint.org/plugins/cmdexec/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux"], "python": ">=3.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.6", "date": "2023-06-30 00:57:21 +0000", "tag": "1.0.6"}, "releases": 6, "last_push": "2023-06-30 00:56:47 +0000", "stars": 6, "issues": {"open": 3, "closed": 5}}, "stats": {"instances_month": 272, "install_events_month": 33, "instances_week": 178, "install_events_week": 9}}, {"id": "octolightHA", "published": "2023-07-04 00:00:00 +0000", "title": "OctoLight Home Assistant", "description": "Adds a button to the navbar, toggling a Home Assistant controlled light. Forked off of OctoLight by \u017diga Kralj", "archive": "https://github.com/mark-bloom/OctoLight_Home-Assistant/archive/master.zip", "author": "Mark Bloom", "homepage": "https://github.com/mark-bloom/OctoLight_Home-Assistant", "page": "https://plugins.octoprint.org/plugins/octolightHA/", "compatibility": {"octoprint": ["0.0.1"], "os": ["linux"], "python": ">=2.7,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/octolightHA/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "v0.0.4 update: add configuration settings", "date": "2023-10-26 01:44:01 +0000", "tag": "v0.0.4"}, "releases": 4, "last_push": "2024-01-02 01:20:51 +0000", "stars": 5, "issues": {"open": 0, "closed": 8}}, "stats": {"instances_month": 307, "install_events_month": 43, "instances_week": 238, "install_events_week": 15}}, {"id": "Wattometer", "published": "2023-07-17 00:00:00 +0000", "title": "Wattometer", "description": "Get an overview of the used power for a print via FRITZ!DECT 200.", "archive": "https://github.com/RealTryZ/Wattometer/archive/master.zip", "author": "Pascal Witt", "homepage": "https://github.com/RealTryZ/Wattometer", "page": "https://plugins.octoprint.org/plugins/Wattometer/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/Wattometer/Wattometer_Settings.png", "abandoned": false, "github": {"latest_release": {"name": "v0.4.0 Major Release", "date": "2023-10-25 17:06:54 +0000", "tag": "v0.4.0"}, "releases": 6, "last_push": "2023-10-25 17:04:07 +0000", "stars": 2, "issues": {"open": 0, "closed": 4}}, "stats": {"instances_month": 155, "install_events_month": 12, "instances_week": 104, "install_events_week": 3}}, {"id": "FileDescription", "published": "2023-08-23 00:00:00 +0000", "title": "FileDescription", "description": "Adds description and searchable tags entries to all files in the file manager.", "archive": "https://github.com/larsjuhw/Octoprint-FileDescription/archive/master.zip", "author": "Larsjuhw", "homepage": "https://github.com/larsjuhw/Octoprint-FileDescription", "page": "https://plugins.octoprint.org/plugins/FileDescription/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/FileDescription/featured.png", "abandoned": false, "github": {"latest_release": {"name": "0.1.2", "date": "2023-09-17 15:18:30 +0000", "tag": "0.1.2"}, "releases": 7, "last_push": "2023-09-17 15:16:25 +0000", "stars": 1, "issues": {"open": 1, "closed": 2}}, "stats": {"instances_month": 454, "install_events_month": 16, "instances_week": 365, "install_events_week": 4}}, {"id": "bedcheckai", "published": "2023-09-18 00:00:00 +0000", "title": "OctoPrint-BedCheckAI", "description": "Detects the print bed in the camera frame. Useful for automation and smarter printing", "archive": "https://github.com/printpal-io/OctoPrint-BedCheckAI/archive/master.zip", "author": "printpal.io", "homepage": "https://printpal.io", "page": "https://plugins.octoprint.org/plugins/bedcheckai/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.6,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/bedcheckai/tools.jpg", "abandoned": false, "github": {"last_push": "2024-02-06 22:39:41 +0000", "stars": 7, "issues": {"open": 1, "closed": 2}}, "stats": {"instances_month": 427, "install_events_month": 65, "instances_week": 312, "install_events_week": 17}}, {"id": "ActivatePrusaHostTimer", "published": "2023-12-01 00:00:00 +0000", "title": "Activate Prusa HostTimer", "description": "OctoPrint plugin to activate Prusa host features.", "archive": "https://github.com/sarusani/OctoPrint-ActivatePrusaHostTimer/archive/master.zip", "author": "sarusani", "homepage": "https://github.com/sarusani/OctoPrint-ActivatePrusaHostTimer", "page": "https://plugins.octoprint.org/plugins/ActivatePrusaHostTimer/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.1.0", "date": "2023-12-28 18:00:29 +0000", "tag": "1.1.0"}, "releases": 12, "last_push": "2023-12-28 17:59:47 +0000", "stars": 7, "issues": {"open": 0, "closed": 6}}, "stats": {"instances_month": 210, "install_events_month": 19, "instances_week": 162, "install_events_week": 5}}, {"id": "bgcode", "published": "2023-12-06 00:00:00 +0000", "title": "BGCode", "description": "Adds bgcode support provided in PrusaSlicer version 2.7.0+", "archive": "https://github.com/jneilliii/OctoPrint-BGCode/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-BGCode", "page": "https://plugins.octoprint.org/plugins/bgcode/", "compatibility": {"octoprint": ["1.4.0"], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "0.2.0", "date": "2023-11-26 18:44:21 +0000", "tag": "0.2.0"}, "releases": 2, "last_push": "2024-03-02 19:00:50 +0000", "stars": 9, "issues": {"open": 1, "closed": 11}}, "stats": {"instances_month": 836, "install_events_month": 140, "instances_week": 688, "install_events_week": 30}}, {"id": "psucontrol_momentarygpio", "published": "2023-12-07 00:00:00 +0000", "title": "OctoPrint-PSUControl-MomentaryGpio", "description": "A sub-plugin for PSUControl. Adds a momentary option to PSUControl power controls that sends a signal for a brief time rather than continuous. Useful for bistable relays.", "archive": "https://github.com/irotsoma/OctoPrint-PSUControl-MomentaryGpio/archive/master.zip", "author": "Justin Zak", "homepage": "https://github.com/irotsoma/OctoPrint-PSUControl-MomentaryGpio", "page": "https://plugins.octoprint.org/plugins/psucontrol_momentarygpio/", "compatibility": {"octoprint": [], "os": ["linux"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/psucontrol_momentarygpio/momentarygpio_screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "v1.0.1", "date": "2024-02-02 22:15:36 +0000", "tag": "v1.0.1"}, "releases": 2, "last_push": "2024-02-02 22:13:41 +0000", "stars": 0, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 22, "install_events_month": 6, "instances_week": 15, "install_events_week": 2}}, {"id": "xmpp_plugin", "published": "2023-12-27 00:00:00 +0000", "title": "XMPP Plugin", "description": "Sends print progress notifications over xmpp", "archive": "https://github.com/tobser/octoprint-xmpp-plugin/archive/main.zip", "author": "Tobias Sachs", "homepage": "https://github.com/tobser/octoprint-xmpp-plugin", "page": "https://plugins.octoprint.org/plugins/xmpp_plugin/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/xmpp_plugin/xmpp-plugin-configuration.png", "abandoned": false, "github": {"last_push": "2023-12-27 21:32:12 +0000", "stars": 0, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 20, "install_events_month": 1, "instances_week": 12, "install_events_week": 0}}, {"id": "mqttchambertemperature", "published": "2024-01-02 00:00:00 +0000", "title": "MQTT Chamber Temperature", "description": "Enables Chamber temperature reporting via subscribing to an MQTT topic", "archive": "https://github.com/synman/OctoPrint-MqttChamberTemperature/archive/master.zip", "author": "Shell M. Shrader", "homepage": "https://github.com/synman/OctoPrint-MqttChamberTemperature", "page": "https://plugins.octoprint.org/plugins/mqttchambertemperature/", "compatibility": {"octoprint": ["1.3.0"], "os": ["linux", "windows"], "python": ">=2.7,<4"}, "license": "WTFPL", "image": "https://plugins.octoprint.org/assets/img/plugins/mqttchambertemperature/toptemp.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.3", "date": "2024-05-04 19:09:07 +0000", "tag": "0.0.3"}, "releases": 6, "last_push": "2024-05-04 19:07:22 +0000", "stars": 1, "issues": {"open": 2, "closed": 2}}, "stats": {"instances_month": 62, "install_events_month": 9, "instances_week": 46, "install_events_week": 4}}, {"id": "api_notifications", "published": "2024-01-21 00:00:00 +0000", "title": "API Notifications", "description": "Adds an API endpoint which allows you to send notification pop-ups to the OctoPrint interface from scripts", "archive": "https://github.com/edekeijzer/OctoPrint-API-Notifications/archive/main.zip", "author": "Erik de Keijzer", "homepage": "https://github.com/edekeijzer/OctoPrint-API-Notifications", "page": "https://plugins.octoprint.org/plugins/api_notifications/", "compatibility": {"octoprint": [], "os": ["linux", "freebsd", "macos", "windows"], "python": ">=3,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"last_push": "2024-01-21 11:22:17 +0000", "stars": 1, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 34, "install_events_month": 6, "instances_week": 32, "install_events_week": 2}}, {"id": "filamentbuddy", "published": "2024-01-21 00:00:00 +0000", "title": "FilamentBuddy", "description": "This plugin implements three features, filament change buttons, filament sensor manager and filament remover when the print is completed.", "archive": "https://github.com/danieleborgo/OctoPrint-FilamentBuddy/archive/master.zip", "author": "danieleborgo", "homepage": "https://github.com/danieleborgo/OctoPrint-FilamentBuddy", "page": "https://plugins.octoprint.org/plugins/filamentbuddy/", "compatibility": {"octoprint": ["1.7.2"], "os": ["linux", "windows"], "python": ">=3,<4"}, "license": "GPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/filamentbuddy/fc_simplified.png", "abandoned": false, "github": {"latest_release": {"name": "FilamentBuddy 0.1.0", "date": "2024-02-20 21:44:21 +0000", "tag": "0.1.0"}, "releases": 1, "last_push": "2024-02-15 21:18:50 +0000", "stars": 1, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 399, "install_events_month": 66, "instances_week": 301, "install_events_week": 14}}, {"id": "pause_management", "published": "2024-01-22 00:00:00 +0000", "title": "Pause Management", "description": "Plugin allowing to ignore upcoming pauses in gcode or add additional pauses while printing.", "archive": "https://github.com/jneilliii/OctoPrint-PauseManagement/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-PauseManagement", "page": "https://plugins.octoprint.org/plugins/pause_management/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/pause_management/screenshot_sidebar.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.4", "date": "2023-12-21 02:24:11 +0000", "tag": "0.0.4"}, "releases": 4, "last_push": "2024-04-12 03:11:58 +0000", "stars": 2, "issues": {"open": 0, "closed": 1}}, "stats": {"instances_month": 249, "install_events_month": 36, "instances_week": 194, "install_events_week": 4}}, {"id": "camerastreamer_control", "published": "2024-02-01 00:00:00 +0000", "title": "Camera-Streamer Control", "description": "Make use of smooth, low-latency, low-bandwidth WebRTC streams from the OctoPi 'New camera stack'", "archive": "https://github.com/cp2004/OctoPrint-CameraStreamer-Control/releases/latest/download/release.zip", "author": "Charlie Powell", "homepage": "https://github.com/cp2004/OctoPrint-CameraStreamer-Control", "page": "https://plugins.octoprint.org/plugins/camerastreamer_control/", "compatibility": {"octoprint": ["1.9.0"], "os": ["linux"], "python": ">=3.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "1.0.1 Initial Release", "date": "2024-02-01 17:05:47 +0000", "tag": "1.0.1"}, "releases": 3, "last_push": "2024-02-01 17:05:40 +0000", "stars": 17, "issues": {"open": 3, "closed": 3}}, "stats": {"instances_month": 902, "install_events_month": 261, "instances_week": 637, "install_events_week": 75}}, {"id": "SIOReaction", "published": "2024-02-11 00:00:00 +0000", "title": "SIO Reaction", "description": "Sub Plugin for SIO Control. Create Reactions to changes in IO, GCode, and more.", "archive": "https://github.com/jcassel/OctoPrint-SIOReaction/archive/main.zip", "author": "jcassel", "homepage": "https://github.com/jcassel/OctoPrint-SIOReaction", "page": "https://plugins.octoprint.org/plugins/SIOReaction/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/SIOReaction/SettingsExample.png", "abandoned": false, "github": {"latest_release": {"name": "v0.1.6, update to documentation.", "date": "2024-04-08 17:00:49 +0000", "tag": "v0.1.6"}, "releases": 6, "last_push": "2024-04-08 16:59:37 +0000", "stars": 1, "issues": {"open": 0, "closed": 0}}, "stats": {"instances_month": 12, "install_events_month": 5, "instances_week": 8, "install_events_week": 2}}, {"id": "Nozzle_Filament_Validator", "published": "2024-02-26 00:00:00 +0000", "title": "OctoPrint-Nozzle-Filament-Validator", "description": "Validate nozzle size and filament type before starting a print.", "archive": "https://github.com/Rylan-Meilutis/OctoPrint-Nozzle-Filament-Validator/archive/master.zip", "author": "Rylan Meilutis", "homepage": "https://github.com/Rylan-Meilutis/OctoPrint-Nozzle-Filament-Validator", "page": "https://plugins.octoprint.org/plugins/Nozzle_Filament_Validator/", "compatibility": {"octoprint": ["1.9.3"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/Nozzle_Filament_Validator/settings_page.png", "abandoned": false, "github": {"latest_release": {"name": "Version 3.1.1", "date": "2024-05-02 04:13:54 +0000", "tag": "v3.1.1"}, "releases": 20, "last_push": "2024-05-02 04:07:48 +0000", "stars": 1, "issues": {"open": 0, "closed": 4}}, "stats": {"instances_month": 95, "install_events_month": 17, "instances_week": 70, "install_events_week": 3}}, {"id": "PrusaResetMode", "published": "2024-03-01 00:00:00 +0000", "title": "Prusa Reset Mode", "description": "A simple plugin to prevent your Prusa printer from resetting when OctoPrint connects", "archive": "https://github.com/jacopotediosi/OctoPrint-PrusaResetMode/archive/main.zip", "author": "Jacopo Tediosi", "homepage": "https://github.com/jacopotediosi/Octoprint-PrusaResetMode", "page": "https://plugins.octoprint.org/plugins/PrusaResetMode/", "compatibility": {"octoprint": [], "os": [], "python": ">=3,<4"}, "license": "MIT", "image": "https://plugins.octoprint.org/assets/img/plugins/PrusaResetMode/screenshot.png", "abandoned": false, "github": {"latest_release": {"name": "Version 0.1.1", "date": "2024-03-04 10:08:38 +0000", "tag": "v0.1.1"}, "releases": 2, "last_push": "2024-03-04 09:58:34 +0000", "stars": 0, "issues": {"open": 1, "closed": 1}}, "stats": {"instances_month": 410, "install_events_month": 111, "instances_week": 314, "install_events_week": 22}}, {"id": "zupfe", "published": "2024-03-03 00:00:00 +0000", "title": "OctoPrint-Zupfe", "description": "A plugin for octoprint that allows you to see in real time print jobs in ZupFe, the interactive online gcode viewer. View gcode content and interact with the 3d model to find the exact command of any extrusion.", "archive": "https://github.com/glennerichall/OctoPrint-Zupfe/archive/master.zip", "author": "Glenn Hall", "homepage": "https://zupfe.velor.ca", "page": "https://plugins.octoprint.org/plugins/zupfe/", "compatibility": {"octoprint": ["1.9.0"], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/zupfe/img_3.png", "abandoned": false, "github": {"latest_release": {"name": "v0.1.2", "date": "2024-04-23 20:38:07 +0000", "tag": "v0.1.2"}, "releases": 1, "last_push": "2024-04-23 19:59:58 +0000", "stars": 2, "issues": {"open": 1, "closed": 2}}, "stats": {"instances_month": 152, "install_events_month": 41, "instances_week": 108, "install_events_week": 4}}, {"id": "pinozcam", "published": "2024-03-06 00:00:00 +0000", "title": "OctoPrint-PiNozCam", "description": "AI-driven FREE monitoring for 3D print failures using Pi Arm CPU.", "archive": "https://github.com/DrAlexLiu/OctoPrint-PiNozCam/archive/master.zip", "author": "DrAlexLiu", "homepage": "https://github.com/DrAlexLiu/OctoPrint-PiNozCam", "page": "https://plugins.octoprint.org/plugins/pinozcam/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3.7,<4"}, "license": "AGPLv3", "abandoned": false, "github": {"latest_release": {"name": "v1.0.1", "date": "2024-03-31 18:49:18 +0000", "tag": "v1.0.1"}, "releases": 2, "last_push": "2024-04-15 06:01:05 +0000", "stars": 22, "issues": {"open": 2, "closed": 10}}, "stats": {"instances_month": 140, "install_events_month": 73, "instances_week": 92, "install_events_week": 11}}, {"id": "jogwheel", "published": "2024-03-25 00:00:00 +0000", "title": "Jog Wheel Control", "description": "Replaces the control tab axis buttons with a jog wheel interface.", "archive": "https://github.com/jneilliii/OctoPrint-JogWheelControl/archive/master.zip", "author": "jneilliii", "homepage": "https://github.com/jneilliii/OctoPrint-JogWheelControl", "page": "https://plugins.octoprint.org/plugins/jogwheel/", "compatibility": {"octoprint": ["1.4.0"], "os": ["linux", "windows", "macos", "freebsd"], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/jogwheel/screenshot_tab.png", "abandoned": false, "github": {"latest_release": {"name": "0.0.2", "date": "2024-03-27 04:26:40 +0000", "tag": "0.0.2"}, "releases": 2, "last_push": "2024-03-27 04:25:42 +0000", "stars": 1, "issues": {"open": 1, "closed": 2}}, "stats": {"instances_month": 488, "install_events_month": 235, "instances_week": 350, "install_events_week": 26}}, {"id": "Spoolman", "published": "2024-04-27 00:00:00 +0000", "title": "octoprint-spoolman", "description": "Plugin integrating OctoPrint with Spoolman, a universal filament spools inventory manager.", "archive": "https://github.com/mdziekon/octoprint-spoolman/archive/master.zip", "author": "Micha\u0142 Dzieko\u0144ski (mdziekon)", "homepage": "https://github.com/mdziekon/octoprint-spoolman", "page": "https://plugins.octoprint.org/plugins/Spoolman/", "compatibility": {"octoprint": ["1.9.0"], "os": [], "python": ">=3,<4"}, "license": "AGPLv3", "image": "https://plugins.octoprint.org/assets/img/plugins/Spoolman/showcase__selected_spools.png", "abandoned": false, "github": {"latest_release": {"name": "v1.1.2", "date": "2024-05-03 19:44:49 +0000", "tag": "1.1.2"}, "releases": 7, "last_push": "2024-05-03 19:43:12 +0000", "stars": 5, "issues": {"open": 5, "closed": 20}}, "stats": {"instances_month": 216, "install_events_month": 212, "instances_week": 172, "install_events_week": 108}}] \ No newline at end of file diff --git a/builder/octoprint/octoprint/data/preemptive_cache_config.yaml b/builder/octoprint/octoprint/data/preemptive_cache_config.yaml new file mode 100644 index 0000000..e7b7a3c --- /dev/null +++ b/builder/octoprint/octoprint/data/preemptive_cache_config.yaml @@ -0,0 +1,6 @@ +/: +- _count: 32 + _timestamp: 1715285965.6765628 + base_url: http://localhost:50136/ + path: / + query_string: l10n=en diff --git a/builder/octoprint/octoprint/data/softwareupdate/versioncache.yaml b/builder/octoprint/octoprint/data/softwareupdate/versioncache.yaml new file mode 100644 index 0000000..245c02a --- /dev/null +++ b/builder/octoprint/octoprint/data/softwareupdate/versioncache.yaml @@ -0,0 +1,73 @@ +__version: 1.10.0 +bambu_printer: + available: false + compatible: true + disabled: false + error: null + hash: c5c2a267896bf792143ac3aac05223f7 + information: + local: + name: 0.0.18 + value: 0.0.18 + needs_online: true + remote: + name: 0.0.18 + release_notes: https://github.com/jneilliii/OctoPrint-BambuPrinter/releases/tag/0.0.18 + value: 0.0.18 + online: true + possible: true + timestamp: 1715253505.066055 +file_check: + available: false + compatible: true + disabled: false + error: null + hash: f595880f4ef52d3ad09769ae10d6157f + information: + local: + name: 2024.3.27 + value: 2024.3.27 + needs_online: true + remote: + name: 2024.3.27 + release_notes: https://github.com/OctoPrint/OctoPrint-FileCheck/releases/tag/2024.3.27 + value: 2024.3.27 + online: true + possible: true + timestamp: 1715245191.0575087 +firmware_check: + available: false + compatible: true + disabled: false + error: null + hash: 2cc0c5c664767763a036f68d2318d063 + information: + local: + name: 2021.10.11 + value: 2021.10.11 + needs_online: true + remote: + name: 2021.10.11 + release_notes: https://github.com/OctoPrint/OctoPrint-FirmwareCheck/releases/tag/2021.10.11 + value: 2021.10.11 + online: true + possible: true + timestamp: 1715245191.0564404 +octoprint: + available: false + compatible: true + disabled: false + error: null + hash: b188a004c8f9dfd4213157c84536db06 + information: + local: + name: 1.10.0 + value: 1.10.0 + needs_online: true + remote: + name: 1.10.0 + release_notes: https://github.com/OctoPrint/OctoPrint/releases/tag/1.10.0 + value: 1.10.0 + online: true + possible: true + timestamp: 1715245191.0577404 diff --git a/builder/octoprint/octoprint/generated/webassets/packed_client.js b/builder/octoprint/octoprint/generated/webassets/packed_client.js new file mode 100644 index 0000000..24fd3f4 --- /dev/null +++ b/builder/octoprint/octoprint/generated/webassets/packed_client.js @@ -0,0 +1,202 @@ +// source: js/app/client/base.js +(function(global,factory){if(typeof define==="function"&&define.amd){define("OctoPrintClient",["jquery","lodash"],factory);}else{global.OctoPrintClient=factory(global.$,global._);global.OctoPrint=new global.OctoPrintClient();}})(this,function($,_){var PluginRegistry=function(base){this.base=base;this.components={};};var OctoPrintClient=function(options){this.options=options||{baseurl:undefined,apikey:undefined,locale:undefined};this.components={};this.plugins=new PluginRegistry(this);};OctoPrintClient.registerComponent=function(name,component){Object.defineProperty(OctoPrintClient.prototype,name,{get:function(){if(this.components[name]!==undefined){return this.components[name];} +var instance=new component(this);this.components[name]=instance;return instance;},enumerable:false,configurable:false});};OctoPrintClient.registerPluginComponent=function(name,component){Object.defineProperty(PluginRegistry.prototype,name,{get:function(){if(this.components[name]!==undefined){return this.components[name];} +var instance=new component(this.base);this.components[name]=instance;return instance;},enumerable:false,configurable:false});};var noCache=function(opts){opts=opts||{};var params=$.extend({},opts);params.headers=$.extend({},params.headers||{});params.headers["Cache-Control"]="no-cache";return params;};var contentTypeJson=function(opts){opts=opts||{};var params=$.extend({},opts);params.contentType="application/json; charset=UTF-8";return params;};var contentTypeFalse=function(opts){opts=opts||{};var params=$.extend({},opts);params.contentType=false;return params;};var noProcessData=function(opts){opts=opts||{};var params=$.extend({},opts);params.processData=false;return params;};var replaceUndefinedWithNull=function(key,value){if(value===undefined){return null;}else{return value;}};OctoPrintClient.prototype.getBaseUrl=function(){var url=this.options.baseurl;if(!_.endsWith(url,"/")){url=url+"/";} +return url;};OctoPrintClient.prototype.getParsedBaseUrl=function(location){if(!this.options.baseurl)return"";try{var url=new URL(this.options.baseurl);}catch(e){location=location||window.location;var parsed=new URL(location);var path=this.options.baseurl;if(!path||path[0]!=="/"){path="/"+(path?path:"");} +var url=new URL(parsed.protocol+"//"+parsed.host+path);} +return url;};OctoPrintClient.prototype.getCookieSuffix=function(){if(!this.options.baseurl)return"";var url=this.getParsedBaseUrl();var port=url.port||(url.protocol==="https:"?443:80);if(url.pathname&&url.pathname!=="/"){var path=url.pathname;if(path.endsWith("/")){path=path.substring(0,path.length-1);} +return"_P"+port+"_R"+path.replace(/\//g,"|");}else{return"_P"+port;}};OctoPrintClient.prototype.getCookieName=function(name){return name+this.getCookieSuffix();};OctoPrintClient.prototype.getCookie=function(name){name=this.getCookieName(name);return("; "+document.cookie).split("; "+name+"=").pop().split(";")[0];};OctoPrintClient.prototype.getRequestHeaders=function(method,additional,opts){if(arguments.length<=1){if(!_.isString(method)){additional=method;console.warn("Calling OctoPrintClient.getRequestHeaders with additional "+"headers as the first parameter is deprecated. Please "+"consult the docs about the current signature and adjust "+"your code accordingly.");}} +method=method||"GET";additional=additional||{};opts=opts||{};var headers=$.extend({},additional);if(this.options.apikey){headers["X-Api-Key"]=this.options.apikey;}else{var csrfToken=this.getCookie("csrf_token");if(!/^(GET|HEAD|OPTIONS)$/.test(method)&&csrfToken&&!opts.crossDomain){headers["X-CSRF-Token"]=csrfToken;}} +if(this.options.locale!==undefined){headers["X-Locale"]=this.options.locale;} +return headers;};OctoPrintClient.prototype.ajax=function(method,url,opts){opts=opts||{};method=opts.method||method||"GET";url=opts.url||url||"";var urlToCall=url;if(!_.startsWith(url,"http://")&&!_.startsWith(url,"https://")){urlToCall=this.getBaseUrl()+url;opts.url=urlToCall;} +var headers=this.getRequestHeaders(method,opts.headers,opts);var params=$.extend({},opts);params.type=method;params.headers=headers;params.dataType=params.dataType||"json";return $.ajax(urlToCall,params);};OctoPrintClient.prototype.ajaxWithData=function(method,url,data,opts){opts=opts||{};var params=$.extend({},opts);params.data=data;return this.ajax(method,url,params);};OctoPrintClient.prototype.get=function(url,opts){return this.ajax("GET",url,opts);};OctoPrintClient.prototype.getWithQuery=function(url,data,opts){return this.ajaxWithData("GET",url,data,opts);};OctoPrintClient.prototype.post=function(url,data,opts){return this.ajaxWithData("POST",url,data,noCache(opts));};OctoPrintClient.prototype.postForm=function(url,data,opts){var form=new FormData();_.each(data,function(value,key){form.append(key,value);});return this.post(url,form,contentTypeFalse(noProcessData(opts)));};OctoPrintClient.prototype.postJson=function(url,data,opts){return this.post(url,JSON.stringify(data,replaceUndefinedWithNull),contentTypeJson(opts));};OctoPrintClient.prototype.put=function(url,data,opts){return this.ajaxWithData("PUT",url,data,noCache(opts));};OctoPrintClient.prototype.putJson=function(url,data,opts){return this.put(url,JSON.stringify(data,replaceUndefinedWithNull),contentTypeJson(opts));};OctoPrintClient.prototype.patch=function(url,data,opts){return this.ajaxWithData("PATCH",url,data,noCache(opts));};OctoPrintClient.prototype.patchJson=function(url,data,opts){return this.patch(url,JSON.stringify(data,replaceUndefinedWithNull),contentTypeJson(opts));};OctoPrintClient.prototype.delete=function(url,opts){return this.ajax("DELETE",url,opts);};OctoPrintClient.prototype.download=function(url,opts){var params=$.extend({},opts||{});params.dataType="text";return this.get(url,params);};OctoPrintClient.prototype.bulkDownloadUrl=function(url,files){return(url+"?"+ +_.map(files,function(f){return"files="+encodeURIComponent(f);}).join("&"));};OctoPrintClient.prototype.upload=function(url,file,filename,additional){additional=additional||{};var fileData;if(file instanceof jQuery){fileData=file[0].files[0];}else if(typeof file=="string"){fileData=$(file)[0].files[0];}else{fileData=file;} +filename=filename||fileData.name;var filesize=fileData.size;var form=new FormData();form.append("file",fileData,filename);_.each(additional,function(value,key){form.append(key,value);});var deferred=$.Deferred();var request=new XMLHttpRequest();request.onreadystatechange=function(){if(request.readyState==4){deferred.notify({loaded:filesize,total:filesize});var success=(request.status>=200&&request.status<300)||request.status===304;var error,json,statusText;try{json=JSON.parse(request.response);statusText="success";}catch(e){success=false;error=e;statusText="parsererror";} +if(success){deferred.resolve([json,statusText,request]);}else{if(!statusText){statusText=request.statusText;} +deferred.reject([request,statusText,error]);}}};request.ontimeout=function(){deferred.reject([request,"timeout","Timeout"]);};request.upload.addEventListener("loadstart",function(e){deferred.notify({loaded:e.loaded,total:e.total});});request.upload.addEventListener("progress",function(e){deferred.notify({loaded:e.loaded,total:e.total});});request.upload.addEventListener("loadend",function(e){deferred.notify({loaded:e.loaded,total:e.total});});var method="POST";var headers=this.getRequestHeaders(method);var urlToCall=url;if(!_.startsWith(url,"http://")&&!_.startsWith(url,"https://")){urlToCall=this.getBaseUrl()+url;} +request.open(method,urlToCall);_.each(headers,function(value,key){request.setRequestHeader(key,value);});request.send(form);return deferred.promise();};OctoPrintClient.prototype.issueCommand=function(url,command,payload,opts){payload=payload||{};var data=$.extend({},payload);data.command=command;return this.postJson(url,data,opts);};OctoPrintClient.prototype.getSimpleApiUrl=function(plugin){return"api/plugin/"+plugin;};OctoPrintClient.prototype.simpleApiGet=function(plugin,opts){return this.get(OctoPrintClient.prototype.getSimpleApiUrl(plugin),opts);};OctoPrintClient.prototype.simpleApiCommand=function(plugin,command,payload,opts){return this.issueCommand(OctoPrintClient.prototype.getSimpleApiUrl(plugin),command,payload,opts);};OctoPrintClient.prototype.getBlueprintUrl=function(plugin){return"plugin/"+plugin+"/";};OctoPrintClient.createRejectedDeferred=function(){var deferred=$.Deferred();deferred.reject(arguments);return deferred;};OctoPrintClient.createCustomException=function(name){var constructor;if(_.isFunction(name)){constructor=name;}else{constructor=function(message){this.name=name;this.message=message;this.stack=new Error().stack;};} +constructor.prototype=Object.create(Error.prototype);constructor.prototype.constructor=constructor;return constructor;};OctoPrintClient.InvalidArgumentError=OctoPrintClient.createCustomException("InvalidArgumentError");OctoPrintClient.deprecated=function(deprecatedFct,newFct,fn){return function(){console.warn(deprecatedFct+" is deprecated, please use the new "+ +newFct+" function instead");return fn.apply(this,arguments);};};OctoPrintClient.deprecatedMethod=function(object,oldNamespace,oldFct,newNamespace,newFct,fn){object[oldFct]=OctoPrintClient.deprecated(oldNamespace+"."+oldFct,newNamespace+"."+newFct,fn);};OctoPrintClient.deprecatedVariable=function(object,oldNamespace,oldVar,newNamespace,newVar,getter,setter){Object.defineProperty(object,oldVar,{get:function(){return OctoPrintClient.deprecated(oldNamespace+"."+oldVar,newNamespace+"."+newVar,getter)();},set:function(val){OctoPrintClient.deprecated(oldNamespace+"."+oldVar,newNamespace+"."+newVar,setter)(val);}});};OctoPrintClient.escapePath=function(path){return _.map(path.split("/"),function(p){return encodeURIComponent(p);}).join("/");};return OctoPrintClient;}); +; + +// source: js/app/client/socket.js +(function(global,factory){if(typeof define==="function"&&define.amd){define(["OctoPrintClient","jquery","lodash","sockjs"],factory);}else{factory(global.OctoPrintClient,global.$,global._,global.SockJS);}})(this,function(OctoPrintClient,$,_,SockJS){var normalClose=1000;var OctoPrintSocketClient=function(base){var self=this;this.base=base;this.options={timeouts:[0,1,1,2,3,5,8,13,20,40,100],connectTimeout:5000,transportTimeout:4000,rateSlidingWindowSize:20};this.socket=undefined;this.reconnecting=false;this.reconnectTrial=0;this.registeredHandlers={};this.rateThrottleFactor=1;this.rateBase=500;this.rateLastMeasurements=[];this.connectTimeout=undefined;this.onMessage("connected",function(){if(self.connectTimeout){clearTimeout(self.connectTimeout);self.connectTimeout=undefined;}});};OctoPrintSocketClient.prototype.propagateMessage=function(event,data){var start=new Date().getTime();var eventObj={event:event,data:data};var catchAllHandlers=this.registeredHandlers["*"];if(catchAllHandlers&&catchAllHandlers.length){_.each(catchAllHandlers,function(handler){handler(eventObj);});} +var handlers=this.registeredHandlers[event];if(handlers&&handlers.length){_.each(handlers,function(handler){handler(eventObj);});} +var end=new Date().getTime();this.analyzeTiming(end-start);};OctoPrintSocketClient.prototype.analyzeTiming=function(measurement){while(this.rateLastMeasurements.length>=this.options.rateSlidingWindowSize){this.rateLastMeasurements.shift();} +this.rateLastMeasurements.push(measurement);var processingLimit=this.rateThrottleFactor*this.rateBase;if(measurement>processingLimit){this.onRateTooHigh(measurement,processingLimit);}else if(this.rateThrottleFactor>1){var maxProcessingTime=Math.max.apply(null,this.rateLastMeasurements);var lowerProcessingLimit=(this.rateThrottleFactor-1)*this.rateBase;if(maxProcessingTime0){self.connectTimeout=setTimeout(function(){self.onConnectTimeout();},timeout);} +var transportTimeout=self.options.transportTimeout;if(opts.hasOwnProperty("transportTimeout")){transportTimeout=opts.transportTimeout;delete opts.transportTimeout;} +opts.timeout=transportTimeout;self.socket=new SockJS(url+"sockjs",undefined,opts);self.socket.onopen=onOpen;self.socket.onclose=onClose;self.socket.onmessage=onMessage;};OctoPrintSocketClient.prototype.reconnect=function(){this.disconnect();this.socket=undefined;this.connect();};OctoPrintSocketClient.prototype.disconnect=function(){if(this.socket!==undefined){this.socket.close();}};OctoPrintSocketClient.prototype.onMessage=function(message,handler){if(!this.registeredHandlers.hasOwnProperty(message)){this.registeredHandlers[message]=[];} +this.registeredHandlers[message].push(handler);return this;};OctoPrintSocketClient.prototype.removeMessage=function(message,handler){if(!this.registeredHandlers.hasOwnProperty(message)){return;} +const index=OctoPrint.socket.registeredHandlers[message].indexOf(handler);if(index>-1){OctoPrint.socket.registeredHandlers[message].splice(index,1);}};OctoPrintSocketClient.prototype.onReconnectAttempt=function(trial){};OctoPrintSocketClient.prototype.onReconnectFailed=function(){};OctoPrintSocketClient.prototype.onConnected=function(){};OctoPrintSocketClient.prototype.onDisconnected=function(code){};OctoPrintSocketClient.prototype.onConnectTimeout=function(){};OctoPrintSocketClient.prototype.onRateTooLow=function(measured,minimum){this.increaseRate();};OctoPrintSocketClient.prototype.onRateTooHigh=function(measured,maximum){this.decreaseRate();};OctoPrintClient.registerComponent("socket",OctoPrintSocketClient);return OctoPrintSocketClient;}); +; + +// source: js/app/client/access.js +(function(global,factory){if(typeof define==="function"&&define.amd){define("OctoPrintAccessClient",["OctoPrintClient"],factory);}else{global.OctoPrintAccessClient=factory(global.OctoPrintClient);}})(this,function(OctoPrintClient){var baseAccessUrl="api/access";var OctoPrintAccessPermissionsClient=function(access){this.access=access;this.base=this.access.base;var baseUrl=baseAccessUrl+"/permissions";this.url=function(){if(arguments.length){return baseUrl+"/"+Array.prototype.join.call(arguments,"/");}else{return baseUrl;}};};OctoPrintAccessPermissionsClient.prototype.list=function(opts){return this.base.get(this.url(),opts);};var OctoPrintAccessGroupsClient=function(access){this.access=access;this.base=this.access.base;var baseUrl=baseAccessUrl+"/groups";this.url=function(){if(arguments.length){return baseUrl+"/"+Array.prototype.join.call(arguments,"/");}else{return baseUrl;}};};OctoPrintAccessGroupsClient.prototype.list=function(opts){return this.base.get(this.url(),opts);};OctoPrintAccessGroupsClient.prototype.add=function(group,opts){if(!group.key){throw new OctoPrintClient.InvalidArgumentError("group key must be set");} +if(!group.name){throw new OctoPrintClient.InvalidArgumentError("group name must be set");} +var data={key:group.key,name:group.name,description:group.description,permissions:group.permissions,subgroups:group.subgroups,default:group.default};return this.base.postJson(this.url(),data,opts);};OctoPrintAccessGroupsClient.prototype.get=function(key,opts){if(!key){throw new OctoPrintClient.InvalidArgumentError("group key must be set");} +return this.base.get(this.url(key),opts);};OctoPrintAccessGroupsClient.prototype.update=function(group,opts){if(!group.key){throw new OctoPrintClient.InvalidArgumentError("group key must be set");} +var data={description:group.hasOwnProperty("description")?group.description:"",permissions:group.permissions,subgroups:group.subgroups,default:group.default};return this.base.putJson(this.url(group.key),data,opts);};OctoPrintAccessGroupsClient.prototype.delete=function(key,opts){if(!key){throw new OctoPrintClient.InvalidArgumentError("group key must be set");} +return this.base.delete(this.url(key),opts);};var OctoPrintAccessUsersClient=function(access){this.access=access;this.base=this.access.base;var baseUrl=baseAccessUrl+"/users";this.url=function(){if(arguments.length){return baseUrl+"/"+Array.prototype.join.call(arguments,"/");}else{return baseUrl;}};};OctoPrintAccessUsersClient.prototype.list=function(opts){return this.base.get(this.url(),opts);};OctoPrintAccessUsersClient.prototype.add=function(user,opts){if(!user.name||!user.password){throw new OctoPrintClient.InvalidArgumentError("Both user's name and password need to be set");} +var data={name:user.name,password:user.password,groups:user.hasOwnProperty("groups")?user.groups:[],permissions:user.hasOwnProperty("permissions")?user.permissions:[],active:user.hasOwnProperty("active")?!!user.active:true,admin:user.hasOwnProperty("admin")?!!user.admin:false};return this.base.postJson(this.url(),data,opts);};OctoPrintAccessUsersClient.prototype.get=function(name,opts){if(!name){throw new OctoPrintClient.InvalidArgumentError("user name must be set");} +return this.base.get(this.url(name),opts);};OctoPrintAccessUsersClient.prototype.update=function(name,active,admin,permissions,groups,opts){if(!name){throw new OctoPrintClient.InvalidArgumentError("user name must be set");} +var data={active:!!active,groups:groups,permissions:permissions,admin:!!admin};return this.base.putJson(this.url(name),data,opts);};OctoPrintAccessUsersClient.prototype.delete=function(name,opts){if(!name){throw new OctoPrintClient.InvalidArgumentError("user name must be set");} +return this.base.delete(this.url(name),opts);};OctoPrintAccessUsersClient.prototype.changePassword=function(name,password,oldpw,opts){if(_.isObject(oldpw)){opts=oldpw;oldpw=undefined;} +if(!name||!password){throw new OctoPrintClient.InvalidArgumentError("user name and new password must be set");} +var data={password:password};if(oldpw){data["current"]=oldpw;} +return this.base.putJson(this.url(name,"password"),data,opts);};OctoPrintAccessUsersClient.prototype.generateApiKey=function(name,opts){if(!name){throw new OctoPrintClient.InvalidArgumentError("user name must be set");} +return this.base.postJson(this.url(name,"apikey"),opts);};OctoPrintAccessUsersClient.prototype.resetApiKey=function(name,opts){if(!name){throw new OctoPrintClient.InvalidArgumentError("user name must be set");} +return this.base.delete(this.url(name,"apikey"),opts);};OctoPrintAccessUsersClient.prototype.getSettings=function(name,opts){if(!name){throw new OctoPrintClient.InvalidArgumentError("user name must be set");} +return this.base.get(this.url(name,"settings"),opts);};OctoPrintAccessUsersClient.prototype.saveSettings=function(name,settings,opts){if(!name){throw new OctoPrintClient.InvalidArgumentError("user name must be set");} +settings=settings||{};return this.base.patchJson(this.url(name,"settings"),settings,opts);};var OctoPrintAccessClient=function(base){this.base=base;this.permissions=new OctoPrintAccessPermissionsClient(this);this.groups=new OctoPrintAccessGroupsClient(this);this.users=new OctoPrintAccessUsersClient(this);};OctoPrintClient.registerComponent("access",OctoPrintAccessClient);return OctoPrintAccessClient;}); +; + +// source: js/app/client/browser.js +(function(global,factory){if(typeof define==="function"&&define.amd){define(["OctoPrintClient"],factory);}else{factory(global.OctoPrintClient);}})(this,function(OctoPrintClient){var loginUrl="api/login";var logoutUrl="api/logout";var OctoPrintBrowserClient=function(base){this.base=base;};OctoPrintBrowserClient.prototype.login=function(username,password,remember,opts){var data={user:username,pass:password,remember:!!remember};return this.base.postJson(loginUrl,data,opts);};OctoPrintBrowserClient.prototype.passiveLogin=function(opts){return this.base.postJson(loginUrl,{passive:true},opts);};OctoPrintBrowserClient.prototype.logout=function(opts){return this.base.postJson(logoutUrl,{},opts);};OctoPrintClient.registerComponent("browser",OctoPrintBrowserClient);return OctoPrintBrowserClient;}); +; + +// source: js/app/client/connection.js +(function(global,factory){if(typeof define==="function"&&define.amd){define(["OctoPrintClient"],factory);}else{factory(global.OctoPrintClient);}})(this,function(OctoPrintClient){var url="api/connection";var OctoPrintConnectionClient=function(base){this.base=base;};OctoPrintConnectionClient.prototype.getSettings=function(opts){return this.base.get(url,opts);};OctoPrintConnectionClient.prototype.connect=function(data,opts){return this.base.issueCommand(url,"connect",data||{},opts);};OctoPrintConnectionClient.prototype.disconnect=function(opts){return this.base.issueCommand(url,"disconnect",{},opts);};OctoPrintConnectionClient.prototype.fakeAck=function(opts){return this.base.issueCommand(url,"fake_ack",{},opts);};OctoPrintClient.registerComponent("connection",OctoPrintConnectionClient);return OctoPrintConnectionClient;}); +; + +// source: js/app/client/control.js +(function(global,factory){if(typeof define==="function"&&define.amd){define(["OctoPrintClient"],factory);}else{factory(global.OctoPrintClient);}})(this,function(OctoPrintClient){var customUrl="api/printer/command/custom";var commandUrl="api/printer/command";var OctoPrintControlClient=function(base){this.base=base;};OctoPrintControlClient.prototype.getCustomControls=function(opts){return this.base.get(customUrl,opts);};OctoPrintControlClient.prototype.sendGcodeWithParameters=function(commands,parameters,opts){commands=commands||[];parameters=parameters||{};if(typeof commands==="string"){commands=[commands];} +return this.base.postJson(commandUrl,{commands:commands,parameters:parameters},opts);};OctoPrintControlClient.prototype.sendGcodeScriptWithParameters=function(script,context,parameters,opts){script=script||"";context=context||{};parameters=parameters||{};return this.base.postJson(commandUrl,{script:script,context:context,parameters:parameters},opts);};OctoPrintControlClient.prototype.sendGcode=function(commands,opts){return this.sendGcodeWithParameters(commands,undefined,opts);};OctoPrintControlClient.prototype.sendGcodeScript=function(script,context,opts){return this.sendGcodeScriptWithParameters(script,context,undefined,opts);};OctoPrintClient.registerComponent("control",OctoPrintControlClient);return OctoPrintControlClient;}); +; + +// source: js/app/client/files.js +(function(global,factory){if(typeof define==="function"&&define.amd){define(["OctoPrintClient","jquery","lodash"],factory);}else{factory(global.OctoPrintClient,global.$,global._);}})(this,function(OctoPrintClient,$,_){var url="api/files";var downloadUrl="downloads/files";var testUrl=url+"/test";var OctoPrintFilesClient=function(base){this.base=base;};var resourceForLocation=function(location){return url+"/"+OctoPrintClient.escapePath(location);};var downloadForLocation=function(location){return downloadUrl+"/"+OctoPrintClient.escapePath(location);};var downloadForEntry=function(location,filename){return downloadForLocation(location)+"/"+OctoPrintClient.escapePath(filename);};var resourceForEntry=function(location,filename){return resourceForLocation(location)+"/"+OctoPrintClient.escapePath(filename);};var preProcessList=function(response){var recursiveCheck=function(element,index,list){if(!element.hasOwnProperty("parent")) +element.parent={children:list,parent:undefined};if(!element.hasOwnProperty("size"))element.size=undefined;if(!element.hasOwnProperty("date"))element.date=undefined;if(element.type=="folder"){element.weight=0;_.each(element.children,function(e,i,l){e.parent=element;recursiveCheck(e,i,l);element.weight+=e.weight;});}else{element.weight=1;}};_.each(response.files,recursiveCheck);};OctoPrintFilesClient.prototype.get=function(location,entryname,opts){return this.base.get(resourceForEntry(location,entryname),opts);};OctoPrintFilesClient.prototype.list=function(recursively,force,opts){recursively=recursively||false;force=force||false;var query={};if(recursively){query.recursive=recursively;} +if(force){query.force=force;} +return this.base.getWithQuery(url,query,opts).done(preProcessList);};OctoPrintFilesClient.prototype.listForLocation=function(location,recursively,opts){recursively=recursively||false;return this.base.getWithQuery(resourceForLocation(location),{recursive:recursively},opts).done(preProcessList);};OctoPrintFilesClient.prototype.issueEntryCommand=function(location,entryname,command,data,opts){var url=resourceForEntry(location,entryname);return this.base.issueCommand(url,command,data,opts);};OctoPrintFilesClient.prototype.select=function(location,path,print,opts){print=print||false;var data={print:print};return this.issueEntryCommand(location,path,"select",data,opts);};OctoPrintFilesClient.prototype.analyse=function(location,path,parameters,opts){return this.issueEntryCommand(location,path,"analyse",parameters||{},opts);};OctoPrintFilesClient.prototype.slice=function(location,path,parameters,opts){return this.issueEntryCommand(location,path,"slice",parameters||{},opts);};OctoPrintFilesClient.prototype.delete=function(location,path,opts){return this.base.delete(resourceForEntry(location,path),opts);};OctoPrintFilesClient.prototype.copy=function(location,path,destination,opts){return this.issueEntryCommand(location,path,"copy",{destination:destination},opts);};OctoPrintFilesClient.prototype.move=function(location,path,destination,opts){return this.issueEntryCommand(location,path,"move",{destination:destination},opts);};OctoPrintFilesClient.prototype.createFolder=function(location,name,path,opts){var data={foldername:name};if(path!==undefined&&path!==""){data.path=path;} +return this.base.postForm(resourceForLocation(location),data,opts);};OctoPrintFilesClient.prototype.upload=function(location,file,data){data=data||{};var filename=data.filename||undefined;if(data.userdata&&typeof data.userdata==="object"){data.userdata=JSON.stringify(userdata);} +return this.base.upload(resourceForLocation(location),file,filename,data);};OctoPrintFilesClient.prototype.download=function(location,path,opts){return this.base.download(downloadForEntry(location,path),opts);};OctoPrintFilesClient.prototype.downloadPath=function(location,path){var url=downloadForEntry(location,path);if(!_.startsWith(url,"http://")&&!_.startsWith(url,"https://")){url=this.base.getBaseUrl()+url;} +return url;};OctoPrintFilesClient.prototype.pathForEntry=function(entry){if(!entry||!entry.hasOwnProperty("parent")||entry.parent==undefined){return"";} +var recursivePath=function(element,path){if(element.hasOwnProperty("parent")&&element.parent!=undefined){return recursivePath(element.parent,element.name+"/"+path);} +return path;};return recursivePath(entry.parent,entry.name);};OctoPrintFilesClient.prototype.entryForPath=function(path,root){if(_.isArray(root)){root={children:root};} +var recursiveSearch=function(path,entry){if(path.length==0){return entry;} +if(!entry.hasOwnProperty("children")||!entry.children){return undefined;} +var name=path.shift();for(var i=0;ili>a{text-shadow:0 1px 0 #ccc;color:#333}#navbar .navbar-inner .brand .caret,#navbar .navbar-inner .nav>li>a .caret{border-bottom-color:#939393;border-top-color:#939393}#navbar .navbar-inner .brand:focus .caret,#navbar .navbar-inner .brand:hover .caret,#navbar .navbar-inner .nav>li>a:focus .caret,#navbar .navbar-inner .nav>li>a:hover .caret{border-bottom-color:#636363;border-top-color:#636363}#navbar .navbar-inner .brand span{background-image:url(../img/tentacle-20x20.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner .brand span{background-image:url(../img/tentacle-20x20@2x.png)}}#navbar .navbar-inner .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner .nav>li.dropdown.open>.dropdown-toggle{background-color:#e0e0e0;background-image:-moz-linear-gradient(top,#ccc,#fff);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ccc),to(#fff));background-image:-webkit-linear-gradient(top,#ccc,#fff);background-image:-o-linear-gradient(top,#ccc,#fff);background-image:linear-gradient(to bottom,#ccc,#fff);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffcccccc', endColorstr='#ffffffff', GradientType=0)}#navbar .navbar-inner .nav>li>a:hover{background-color:#dedede;background-image:-moz-linear-gradient(top,#f2f2f2,#bfbfbf);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#bfbfbf));background-image:-webkit-linear-gradient(top,#f2f2f2,#bfbfbf);background-image:-o-linear-gradient(top,#f2f2f2,#bfbfbf);background-image:linear-gradient(to bottom,#f2f2f2,#bfbfbf);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffbfbfbf', GradientType=0)}#navbar .navbar-inner.transparent{background-color:rgba(235,235,235,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(255,255,255,.6),rgba(204,204,204,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(255,255,255,.6)),to(rgba(204,204,204,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(255,255,255,.6),rgba(204,204,204,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(255,255,255,.6),rgba(204,204,204,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(255,255,255,.6),rgba(204,204,204,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99ffffff', endColorstr='#99cccccc', GradientType=0)}#navbar .navbar-inner.transparent .brand,#navbar .navbar-inner.transparent .nav>li>a{text-shadow:0 1px 0 #ccc;color:#333}#navbar .navbar-inner.transparent .brand .caret,#navbar .navbar-inner.transparent .nav>li>a .caret{border-bottom-color:#939393;border-top-color:#939393}#navbar .navbar-inner.transparent .brand:focus .caret,#navbar .navbar-inner.transparent .brand:hover .caret,#navbar .navbar-inner.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.transparent .nav>li>a:hover .caret{border-bottom-color:#636363;border-top-color:#636363}#navbar .navbar-inner.transparent .brand span{background-image:url(../img/tentacle-20x20.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.transparent .brand span{background-image:url(../img/tentacle-20x20@2x.png)}}#navbar .navbar-inner.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(224,224,224,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(204,204,204,.6),rgba(255,255,255,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(204,204,204,.6)),to(rgba(255,255,255,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(204,204,204,.6),rgba(255,255,255,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(204,204,204,.6),rgba(255,255,255,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(204,204,204,.6),rgba(255,255,255,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99cccccc', endColorstr='#99ffffff', GradientType=0)}#navbar .navbar-inner.transparent .nav>li>a:hover{background-color:rgba(222,222,222,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(242,242,242,.6),rgba(191,191,191,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(242,242,242,.6)),to(rgba(191,191,191,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(242,242,242,.6),rgba(191,191,191,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(242,242,242,.6),rgba(191,191,191,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(242,242,242,.6),rgba(191,191,191,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99f2f2f2', endColorstr='#99bfbfbf', GradientType=0)}#navbar .navbar-inner.red{background-color:#bb645f;background-image:-moz-linear-gradient(top,#e28e8a,#802420);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e28e8a),to(#802420));background-image:-webkit-linear-gradient(top,#e28e8a,#802420);background-image:-o-linear-gradient(top,#e28e8a,#802420);background-image:linear-gradient(to bottom,#e28e8a,#802420);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe28e8a', endColorstr='#ff802420', GradientType=0)}#navbar .navbar-inner.red .brand,#navbar .navbar-inner.red .nav>li>a{text-shadow:0 1px 0 #d86761;color:#f2f2f2}#navbar .navbar-inner.red .brand .caret,#navbar .navbar-inner.red .nav>li>a .caret{border-bottom-color:#d89491;border-top-color:#d89491}#navbar .navbar-inner.red .brand:focus .caret,#navbar .navbar-inner.red .brand:hover .caret,#navbar .navbar-inner.red .nav>li>a:focus .caret,#navbar .navbar-inner.red .nav>li>a:hover .caret{border-bottom-color:#e5c3c1;border-top-color:#e5c3c1}#navbar .navbar-inner.red .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.red .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.red .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.red .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.red .nav>li.dropdown.open>.dropdown-toggle{background-color:#a74f4a;background-image:-moz-linear-gradient(top,#802420,#e28e8a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#802420),to(#e28e8a));background-image:-webkit-linear-gradient(top,#802420,#e28e8a);background-image:-o-linear-gradient(top,#802420,#e28e8a);background-image:linear-gradient(to bottom,#802420,#e28e8a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff802420', endColorstr='#ffe28e8a', GradientType=0)}#navbar .navbar-inner.red .nav>li>a:hover{background-color:#af5651;background-image:-moz-linear-gradient(top,#dd7a75,#6b1f1b);background-image:-webkit-gradient(linear,0 0,0 100%,from(#dd7a75),to(#6b1f1b));background-image:-webkit-linear-gradient(top,#dd7a75,#6b1f1b);background-image:-o-linear-gradient(top,#dd7a75,#6b1f1b);background-image:linear-gradient(to bottom,#dd7a75,#6b1f1b);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd7a75', endColorstr='#ff6b1f1b', GradientType=0)}#navbar .navbar-inner.red.transparent{background-color:rgba(187,100,95,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(226,142,138,.6),rgba(128,36,32,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(226,142,138,.6)),to(rgba(128,36,32,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(226,142,138,.6),rgba(128,36,32,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(226,142,138,.6),rgba(128,36,32,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(226,142,138,.6),rgba(128,36,32,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99e28e8a', endColorstr='#99802420', GradientType=0)}#navbar .navbar-inner.red.transparent .brand,#navbar .navbar-inner.red.transparent .nav>li>a{text-shadow:0 1px 0 #d86761;color:#f2f2f2}#navbar .navbar-inner.red.transparent .brand .caret,#navbar .navbar-inner.red.transparent .nav>li>a .caret{border-bottom-color:#d89491;border-top-color:#d89491}#navbar .navbar-inner.red.transparent .brand:focus .caret,#navbar .navbar-inner.red.transparent .brand:hover .caret,#navbar .navbar-inner.red.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.red.transparent .nav>li>a:hover .caret{border-bottom-color:#e5c3c1;border-top-color:#e5c3c1}#navbar .navbar-inner.red.transparent .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.red.transparent .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.red.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.red.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.red.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(167,79,74,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(128,36,32,.6),rgba(226,142,138,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(128,36,32,.6)),to(rgba(226,142,138,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(128,36,32,.6),rgba(226,142,138,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(128,36,32,.6),rgba(226,142,138,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(128,36,32,.6),rgba(226,142,138,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99802420', endColorstr='#99e28e8a', GradientType=0)}#navbar .navbar-inner.red.transparent .nav>li>a:hover{background-color:rgba(175,86,81,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(221,122,117,.6),rgba(107,31,27,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(221,122,117,.6)),to(rgba(107,31,27,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(221,122,117,.6),rgba(107,31,27,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(221,122,117,.6),rgba(107,31,27,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(221,122,117,.6),rgba(107,31,27,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99dd7a75', endColorstr='#996b1f1b', GradientType=0)}#navbar .navbar-inner.orange{background-color:#e39665;background-image:-moz-linear-gradient(top,#f9c3a0,#c2530c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f9c3a0),to(#c2530c));background-image:-webkit-linear-gradient(top,#f9c3a0,#c2530c);background-image:-o-linear-gradient(top,#f9c3a0,#c2530c);background-image:linear-gradient(to bottom,#f9c3a0,#c2530c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9c3a0', endColorstr='#ffc2530c', GradientType=0)}#navbar .navbar-inner.orange .brand,#navbar .navbar-inner.orange .nav>li>a{text-shadow:0 1px 0 #f6a570;color:#f2f2f2}#navbar .navbar-inner.orange .brand .caret,#navbar .navbar-inner.orange .nav>li>a .caret{border-bottom-color:#f2b58d;border-top-color:#f2b58d}#navbar .navbar-inner.orange .brand:focus .caret,#navbar .navbar-inner.orange .brand:hover .caret,#navbar .navbar-inner.orange .nav>li>a:focus .caret,#navbar .navbar-inner.orange .nav>li>a:hover .caret{border-bottom-color:#f2d3bf;border-top-color:#f2d3bf}#navbar .navbar-inner.orange .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.orange .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.orange .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.orange .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.orange .nav>li.dropdown.open>.dropdown-toggle{background-color:#d88047;background-image:-moz-linear-gradient(top,#c2530c,#f9c3a0);background-image:-webkit-gradient(linear,0 0,0 100%,from(#c2530c),to(#f9c3a0));background-image:-webkit-linear-gradient(top,#c2530c,#f9c3a0);background-image:-o-linear-gradient(top,#c2530c,#f9c3a0);background-image:linear-gradient(to bottom,#c2530c,#f9c3a0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc2530c', endColorstr='#fff9c3a0', GradientType=0)}#navbar .navbar-inner.orange .nav>li>a:hover{background-color:#d98956;background-image:-moz-linear-gradient(top,#f8b488,#aa490a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f8b488),to(#aa490a));background-image:-webkit-linear-gradient(top,#f8b488,#aa490a);background-image:-o-linear-gradient(top,#f8b488,#aa490a);background-image:linear-gradient(to bottom,#f8b488,#aa490a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff8b488', endColorstr='#ffaa490a', GradientType=0)}#navbar .navbar-inner.orange.transparent{background-color:rgba(227,150,101,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(249,195,160,.6),rgba(194,83,12,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(249,195,160,.6)),to(rgba(194,83,12,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(249,195,160,.6),rgba(194,83,12,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(249,195,160,.6),rgba(194,83,12,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(249,195,160,.6),rgba(194,83,12,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99f9c3a0', endColorstr='#99c2530c', GradientType=0)}#navbar .navbar-inner.orange.transparent .brand,#navbar .navbar-inner.orange.transparent .nav>li>a{text-shadow:0 1px 0 #f6a570;color:#f2f2f2}#navbar .navbar-inner.yellow .brand,#navbar .navbar-inner.yellow .nav>li>a,#navbar .navbar-inner.yellow.transparent .brand,#navbar .navbar-inner.yellow.transparent .nav>li>a{text-shadow:0 1px 0 #c2b00c;color:#f2f2f2}#navbar .navbar-inner.orange.transparent .brand .caret,#navbar .navbar-inner.orange.transparent .nav>li>a .caret{border-bottom-color:#f2b58d;border-top-color:#f2b58d}#navbar .navbar-inner.orange.transparent .brand:focus .caret,#navbar .navbar-inner.orange.transparent .brand:hover .caret,#navbar .navbar-inner.orange.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.orange.transparent .nav>li>a:hover .caret{border-bottom-color:#f2d3bf;border-top-color:#f2d3bf}#navbar .navbar-inner.orange.transparent .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.orange.transparent .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.orange.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.orange.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.orange.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(216,128,71,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(194,83,12,.6),rgba(249,195,160,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(194,83,12,.6)),to(rgba(249,195,160,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(194,83,12,.6),rgba(249,195,160,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(194,83,12,.6),rgba(249,195,160,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(194,83,12,.6),rgba(249,195,160,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99c2530c', endColorstr='#99f9c3a0', GradientType=0)}#navbar .navbar-inner.orange.transparent .nav>li>a:hover{background-color:rgba(217,137,86,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(248,180,136,.6),rgba(170,73,10,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(248,180,136,.6)),to(rgba(170,73,10,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(248,180,136,.6),rgba(170,73,10,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(248,180,136,.6),rgba(170,73,10,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(248,180,136,.6),rgba(170,73,10,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99f8b488', endColorstr='#99aa490a', GradientType=0)}#navbar .navbar-inner.yellow{background-color:#e3d765;background-image:-moz-linear-gradient(top,#f9f0a0,#c2b00c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f9f0a0),to(#c2b00c));background-image:-webkit-linear-gradient(top,#f9f0a0,#c2b00c);background-image:-o-linear-gradient(top,#f9f0a0,#c2b00c);background-image:linear-gradient(to bottom,#f9f0a0,#c2b00c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f0a0', endColorstr='#ffc2b00c', GradientType=0)}#navbar .navbar-inner.yellow .brand .caret,#navbar .navbar-inner.yellow .nav>li>a .caret{border-bottom-color:#f2e88d;border-top-color:#f2e88d}#navbar .navbar-inner.yellow .brand:focus .caret,#navbar .navbar-inner.yellow .brand:hover .caret,#navbar .navbar-inner.yellow .nav>li>a:focus .caret,#navbar .navbar-inner.yellow .nav>li>a:hover .caret{border-bottom-color:#f2edbf;border-top-color:#f2edbf}#navbar .navbar-inner.yellow .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.yellow .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.yellow .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.yellow .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.yellow .nav>li.dropdown.open>.dropdown-toggle{background-color:#d8ca47;background-image:-moz-linear-gradient(top,#c2b00c,#f9f0a0);background-image:-webkit-gradient(linear,0 0,0 100%,from(#c2b00c),to(#f9f0a0));background-image:-webkit-linear-gradient(top,#c2b00c,#f9f0a0);background-image:-o-linear-gradient(top,#c2b00c,#f9f0a0);background-image:linear-gradient(to bottom,#c2b00c,#f9f0a0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc2b00c', endColorstr='#fff9f0a0', GradientType=0)}#navbar .navbar-inner.yellow .nav>li>a:hover{background-color:#d9cc56;background-image:-moz-linear-gradient(top,#f8ed88,#aa9a0a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f8ed88),to(#aa9a0a));background-image:-webkit-linear-gradient(top,#f8ed88,#aa9a0a);background-image:-o-linear-gradient(top,#f8ed88,#aa9a0a);background-image:linear-gradient(to bottom,#f8ed88,#aa9a0a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff8ed88', endColorstr='#ffaa9a0a', GradientType=0)}#navbar .navbar-inner.yellow.transparent{background-color:rgba(227,215,101,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(249,240,160,.6),rgba(194,176,12,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(249,240,160,.6)),to(rgba(194,176,12,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(249,240,160,.6),rgba(194,176,12,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(249,240,160,.6),rgba(194,176,12,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(249,240,160,.6),rgba(194,176,12,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99f9f0a0', endColorstr='#99c2b00c', GradientType=0)}#navbar .navbar-inner.green .brand,#navbar .navbar-inner.green .nav>li>a,#navbar .navbar-inner.green.transparent .brand,#navbar .navbar-inner.green.transparent .nav>li>a{text-shadow:0 1px 0 #50da00;color:#333}#navbar .navbar-inner.yellow.transparent .brand .caret,#navbar .navbar-inner.yellow.transparent .nav>li>a .caret{border-bottom-color:#f2e88d;border-top-color:#f2e88d}#navbar .navbar-inner.yellow.transparent .brand:focus .caret,#navbar .navbar-inner.yellow.transparent .brand:hover .caret,#navbar .navbar-inner.yellow.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.yellow.transparent .nav>li>a:hover .caret{border-bottom-color:#f2edbf;border-top-color:#f2edbf}#navbar .navbar-inner.yellow.transparent .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.yellow.transparent .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.yellow.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.yellow.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.yellow.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(216,202,71,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(194,176,12,.6),rgba(249,240,160,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(194,176,12,.6)),to(rgba(249,240,160,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(194,176,12,.6),rgba(249,240,160,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(194,176,12,.6),rgba(249,240,160,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(194,176,12,.6),rgba(249,240,160,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99c2b00c', endColorstr='#99f9f0a0', GradientType=0)}#navbar .navbar-inner.yellow.transparent .nav>li>a:hover{background-color:rgba(217,204,86,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(248,237,136,.6),rgba(170,154,10,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(248,237,136,.6)),to(rgba(170,154,10,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(248,237,136,.6),rgba(170,154,10,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(248,237,136,.6),rgba(170,154,10,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(248,237,136,.6),rgba(170,154,10,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99f8ed88', endColorstr='#99aa9a0a', GradientType=0)}#navbar .navbar-inner.green{background-color:#98f064;background-image:-moz-linear-gradient(top,#c8ffa7,#50da00);background-image:-webkit-gradient(linear,0 0,0 100%,from(#c8ffa7),to(#50da00));background-image:-webkit-linear-gradient(top,#c8ffa7,#50da00);background-image:-o-linear-gradient(top,#c8ffa7,#50da00);background-image:linear-gradient(to bottom,#c8ffa7,#50da00);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc8ffa7', endColorstr='#ff50da00', GradientType=0)}#navbar .navbar-inner.green .brand .caret,#navbar .navbar-inner.green .nav>li>a .caret{border-bottom-color:#55992e;border-top-color:#55992e}#navbar .navbar-inner.green .brand:focus .caret,#navbar .navbar-inner.green .brand:hover .caret,#navbar .navbar-inner.green .nav>li>a:focus .caret,#navbar .navbar-inner.green .nav>li>a:hover .caret{border-bottom-color:#446630;border-top-color:#446630}#navbar .navbar-inner.green .brand span{background-image:url(../img/tentacle-20x20.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.green .brand span{background-image:url(../img/tentacle-20x20@2x.png)}}#navbar .navbar-inner.green .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.green .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.green .nav>li.dropdown.open>.dropdown-toggle{background-color:#80e943;background-image:-moz-linear-gradient(top,#50da00,#c8ffa7);background-image:-webkit-gradient(linear,0 0,0 100%,from(#50da00),to(#c8ffa7));background-image:-webkit-linear-gradient(top,#50da00,#c8ffa7);background-image:-o-linear-gradient(top,#50da00,#c8ffa7);background-image:linear-gradient(to bottom,#50da00,#c8ffa7);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff50da00', endColorstr='#ffc8ffa7', GradientType=0)}#navbar .navbar-inner.green .nav>li>a:hover{background-color:#8ae655;background-image:-moz-linear-gradient(top,#b8ff8e,#47c100);background-image:-webkit-gradient(linear,0 0,0 100%,from(#b8ff8e),to(#47c100));background-image:-webkit-linear-gradient(top,#b8ff8e,#47c100);background-image:-o-linear-gradient(top,#b8ff8e,#47c100);background-image:linear-gradient(to bottom,#b8ff8e,#47c100);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb8ff8e', endColorstr='#ff47c100', GradientType=0)}#navbar .navbar-inner.green.transparent{background-color:rgba(152,240,100,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(200,255,167,.6),rgba(80,218,0,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(200,255,167,.6)),to(rgba(80,218,0,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(200,255,167,.6),rgba(80,218,0,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(200,255,167,.6),rgba(80,218,0,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(200,255,167,.6),rgba(80,218,0,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99c8ffa7', endColorstr='#9950da00', GradientType=0)}#navbar .navbar-inner.blue .brand,#navbar .navbar-inner.blue .nav>li>a,#navbar .navbar-inner.blue.transparent .brand,#navbar .navbar-inner.blue.transparent .nav>li>a{text-shadow:0 1px 0 #1a66ff;color:#f2f2f2}#navbar .navbar-inner.green.transparent .brand .caret,#navbar .navbar-inner.green.transparent .nav>li>a .caret{border-bottom-color:#55992e;border-top-color:#55992e}#navbar .navbar-inner.green.transparent .brand:focus .caret,#navbar .navbar-inner.green.transparent .brand:hover .caret,#navbar .navbar-inner.green.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.green.transparent .nav>li>a:hover .caret{border-bottom-color:#446630;border-top-color:#446630}#navbar .navbar-inner.green.transparent .brand span{background-image:url(../img/tentacle-20x20.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.green.transparent .brand span{background-image:url(../img/tentacle-20x20@2x.png)}}#navbar .navbar-inner.green.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.green.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.green.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(128,233,67,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(80,218,0,.6),rgba(200,255,167,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(80,218,0,.6)),to(rgba(200,255,167,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(80,218,0,.6),rgba(200,255,167,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(80,218,0,.6),rgba(200,255,167,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(80,218,0,.6),rgba(200,255,167,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9950da00', endColorstr='#99c8ffa7', GradientType=0)}#navbar .navbar-inner.green.transparent .nav>li>a:hover{background-color:rgba(138,230,85,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(184,255,142,.6),rgba(71,193,0,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(184,255,142,.6)),to(rgba(71,193,0,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(184,255,142,.6),rgba(71,193,0,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(184,255,142,.6),rgba(71,193,0,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(184,255,142,.6),rgba(71,193,0,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99b8ff8e', endColorstr='#9947c100', GradientType=0)}#navbar .navbar-inner.blue{background-color:#2e63cc;background-image:-moz-linear-gradient(top,#4d88ff,#002b80);background-image:-webkit-gradient(linear,0 0,0 100%,from(#4d88ff),to(#002b80));background-image:-webkit-linear-gradient(top,#4d88ff,#002b80);background-image:-o-linear-gradient(top,#4d88ff,#002b80);background-image:linear-gradient(to bottom,#4d88ff,#002b80);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4d88ff', endColorstr='#ff002b80', GradientType=0)}#navbar .navbar-inner.blue .brand .caret,#navbar .navbar-inner.blue .nav>li>a .caret{border-bottom-color:#799bdf;border-top-color:#799bdf}#navbar .navbar-inner.blue .brand:focus .caret,#navbar .navbar-inner.blue .brand:hover .caret,#navbar .navbar-inner.blue .nav>li>a:focus .caret,#navbar .navbar-inner.blue .nav>li>a:hover .caret{border-bottom-color:#b6c7e9;border-top-color:#b6c7e9}#navbar .navbar-inner.blue .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.blue .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.blue .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.blue .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.blue .nav>li.dropdown.open>.dropdown-toggle{background-color:#1f50b3;background-image:-moz-linear-gradient(top,#002b80,#4d88ff);background-image:-webkit-gradient(linear,0 0,0 100%,from(#002b80),to(#4d88ff));background-image:-webkit-linear-gradient(top,#002b80,#4d88ff);background-image:-o-linear-gradient(top,#002b80,#4d88ff);background-image:linear-gradient(to bottom,#002b80,#4d88ff);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff002b80', endColorstr='#ff4d88ff', GradientType=0)}#navbar .navbar-inner.blue .nav>li>a:hover{background-color:#1f55c2;background-image:-moz-linear-gradient(top,#37f,#026);background-image:-webkit-gradient(linear,0 0,0 100%,from(#37f),to(#026));background-image:-webkit-linear-gradient(top,#37f,#026);background-image:-o-linear-gradient(top,#37f,#026);background-image:linear-gradient(to bottom,#37f,#026);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3377ff', endColorstr='#ff002266', GradientType=0)}#navbar .navbar-inner.blue.transparent{background-color:rgba(46,99,204,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(77,136,255,.6),rgba(0,43,128,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(77,136,255,.6)),to(rgba(0,43,128,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(77,136,255,.6),rgba(0,43,128,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(77,136,255,.6),rgba(0,43,128,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(77,136,255,.6),rgba(0,43,128,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#994d88ff', endColorstr='#99002b80', GradientType=0)}#navbar .navbar-inner.blue.transparent .brand .caret,#navbar .navbar-inner.blue.transparent .nav>li>a .caret{border-bottom-color:#799bdf;border-top-color:#799bdf}#navbar .navbar-inner.blue.transparent .brand:focus .caret,#navbar .navbar-inner.blue.transparent .brand:hover .caret,#navbar .navbar-inner.blue.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.blue.transparent .nav>li>a:hover .caret{border-bottom-color:#b6c7e9;border-top-color:#b6c7e9}#navbar .navbar-inner.blue.transparent .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.blue.transparent .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.blue.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.blue.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.blue.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(31,80,179,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(0,43,128,.6),rgba(77,136,255,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(0,43,128,.6)),to(rgba(77,136,255,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(0,43,128,.6),rgba(77,136,255,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(0,43,128,.6),rgba(77,136,255,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(0,43,128,.6),rgba(77,136,255,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99002b80', endColorstr='#994d88ff', GradientType=0)}#navbar .navbar-inner.blue.transparent .nav>li>a:hover{background-color:rgba(31,85,194,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(51,119,255,.6),rgba(0,34,102,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(51,119,255,.6)),to(rgba(0,34,102,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(51,119,255,.6),rgba(0,34,102,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(51,119,255,.6),rgba(0,34,102,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(51,119,255,.6),rgba(0,34,102,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#993377ff', endColorstr='#99002266', GradientType=0)}#navbar .navbar-inner.violet{background-color:#9864f0;background-image:-moz-linear-gradient(top,#c8a7ff,#5000da);background-image:-webkit-gradient(linear,0 0,0 100%,from(#c8a7ff),to(#5000da));background-image:-webkit-linear-gradient(top,#c8a7ff,#5000da);background-image:-o-linear-gradient(top,#c8a7ff,#5000da);background-image:linear-gradient(to bottom,#c8a7ff,#5000da);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc8a7ff', endColorstr='#ff5000da', GradientType=0)}#navbar .navbar-inner.violet .brand,#navbar .navbar-inner.violet .nav>li>a{text-shadow:0 1px 0 #a774ff;color:#f2f2f2}#navbar .navbar-inner.violet .brand .caret,#navbar .navbar-inner.violet .nav>li>a .caret{border-bottom-color:#b58df9;border-top-color:#b58df9}#navbar .navbar-inner.violet .brand:focus .caret,#navbar .navbar-inner.violet .brand:hover .caret,#navbar .navbar-inner.violet .nav>li>a:focus .caret,#navbar .navbar-inner.violet .nav>li>a:hover .caret{border-bottom-color:#d3bff5;border-top-color:#d3bff5}#navbar .navbar-inner.violet .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.violet .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.violet .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.violet .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.violet .nav>li.dropdown.open>.dropdown-toggle{background-color:#8043e9;background-image:-moz-linear-gradient(top,#5000da,#c8a7ff);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5000da),to(#c8a7ff));background-image:-webkit-linear-gradient(top,#5000da,#c8a7ff);background-image:-o-linear-gradient(top,#5000da,#c8a7ff);background-image:linear-gradient(to bottom,#5000da,#c8a7ff);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5000da', endColorstr='#ffc8a7ff', GradientType=0)}#navbar .navbar-inner.violet .nav>li>a:hover{background-color:#8a55e6;background-image:-moz-linear-gradient(top,#b88eff,#4700c1);background-image:-webkit-gradient(linear,0 0,0 100%,from(#b88eff),to(#4700c1));background-image:-webkit-linear-gradient(top,#b88eff,#4700c1);background-image:-o-linear-gradient(top,#b88eff,#4700c1);background-image:linear-gradient(to bottom,#b88eff,#4700c1);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb88eff', endColorstr='#ff4700c1', GradientType=0)}#navbar .navbar-inner.violet.transparent{background-color:rgba(152,100,240,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(200,167,255,.6),rgba(80,0,218,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(200,167,255,.6)),to(rgba(80,0,218,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(200,167,255,.6),rgba(80,0,218,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(200,167,255,.6),rgba(80,0,218,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(200,167,255,.6),rgba(80,0,218,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99c8a7ff', endColorstr='#995000da', GradientType=0)}#navbar .navbar-inner.violet.transparent .brand,#navbar .navbar-inner.violet.transparent .nav>li>a{text-shadow:0 1px 0 #a774ff;color:#f2f2f2}#navbar .navbar-inner.black .brand,#navbar .navbar-inner.black .nav>li>a,#navbar .navbar-inner.black.transparent .brand,#navbar .navbar-inner.black.transparent .nav>li>a{text-shadow:0 1px 0 #5e5e5e;color:#f2f2f2}#navbar .navbar-inner.violet.transparent .brand .caret,#navbar .navbar-inner.violet.transparent .nav>li>a .caret{border-bottom-color:#b58df9;border-top-color:#b58df9}#navbar .navbar-inner.violet.transparent .brand:focus .caret,#navbar .navbar-inner.violet.transparent .brand:hover .caret,#navbar .navbar-inner.violet.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.violet.transparent .nav>li>a:hover .caret{border-bottom-color:#d3bff5;border-top-color:#d3bff5}#navbar .navbar-inner.violet.transparent .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.violet.transparent .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.violet.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.violet.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.violet.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(128,67,233,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(80,0,218,.6),rgba(200,167,255,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(80,0,218,.6)),to(rgba(200,167,255,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(80,0,218,.6),rgba(200,167,255,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(80,0,218,.6),rgba(200,167,255,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(80,0,218,.6),rgba(200,167,255,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#995000da', endColorstr='#99c8a7ff', GradientType=0)}#navbar .navbar-inner.violet.transparent .nav>li>a:hover{background-color:rgba(138,85,230,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(184,142,255,.6),rgba(71,0,193,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(184,142,255,.6)),to(rgba(71,0,193,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(184,142,255,.6),rgba(71,0,193,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(184,142,255,.6),rgba(71,0,193,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(184,142,255,.6),rgba(71,0,193,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99b88eff', endColorstr='#994700c1', GradientType=0)}#navbar .navbar-inner.black{background-color:#4f4f4f;background-image:-moz-linear-gradient(top,#787878,#121212);background-image:-webkit-gradient(linear,0 0,0 100%,from(#787878),to(#121212));background-image:-webkit-linear-gradient(top,#787878,#121212);background-image:-o-linear-gradient(top,#787878,#121212);background-image:linear-gradient(to bottom,#787878,#121212);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff787878', endColorstr='#ff121212', GradientType=0)}#navbar .navbar-inner.black .brand .caret,#navbar .navbar-inner.black .nav>li>a .caret{border-bottom-color:#959595;border-top-color:#959595}#navbar .navbar-inner.black .brand:focus .caret,#navbar .navbar-inner.black .brand:hover .caret,#navbar .navbar-inner.black .nav>li>a:focus .caret,#navbar .navbar-inner.black .nav>li>a:hover .caret{border-bottom-color:#c4c4c4;border-top-color:#c4c4c4}#navbar .navbar-inner.black .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.black .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.black .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.black .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.black .nav>li.dropdown.open>.dropdown-toggle{background-color:#3b3b3b;background-image:-moz-linear-gradient(top,#121212,#787878);background-image:-webkit-gradient(linear,0 0,0 100%,from(#121212),to(#787878));background-image:-webkit-linear-gradient(top,#121212,#787878);background-image:-o-linear-gradient(top,#121212,#787878);background-image:linear-gradient(to bottom,#121212,#787878);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff121212', endColorstr='#ff787878', GradientType=0)}#navbar .navbar-inner.black .nav>li>a:hover{background-color:#424242;background-image:-moz-linear-gradient(top,#6b6b6b,#050505);background-image:-webkit-gradient(linear,0 0,0 100%,from(#6b6b6b),to(#050505));background-image:-webkit-linear-gradient(top,#6b6b6b,#050505);background-image:-o-linear-gradient(top,#6b6b6b,#050505);background-image:linear-gradient(to bottom,#6b6b6b,#050505);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff6b6b6b', endColorstr='#ff050505', GradientType=0)}#navbar .navbar-inner.black.transparent{background-color:rgba(79,79,79,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(120,120,120,.6),rgba(18,18,18,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(120,120,120,.6)),to(rgba(18,18,18,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(120,120,120,.6),rgba(18,18,18,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(120,120,120,.6),rgba(18,18,18,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(120,120,120,.6),rgba(18,18,18,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99787878', endColorstr='#99121212', GradientType=0)}#navbar .navbar-inner.black.transparent .brand .caret,#navbar .navbar-inner.black.transparent .nav>li>a .caret{border-bottom-color:#959595;border-top-color:#959595}#navbar .navbar-inner.black.transparent .brand:focus .caret,#navbar .navbar-inner.black.transparent .brand:hover .caret,#navbar .navbar-inner.black.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.black.transparent .nav>li>a:hover .caret{border-bottom-color:#c4c4c4;border-top-color:#c4c4c4}#navbar .navbar-inner.black.transparent .brand span{background-image:url(../img/tentacle-20x20-light.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.black.transparent .brand span{background-image:url(../img/tentacle-20x20-light@2x.png)}}#navbar .navbar-inner.black.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.black.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.black.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(59,59,59,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(18,18,18,.6),rgba(120,120,120,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(18,18,18,.6)),to(rgba(120,120,120,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(18,18,18,.6),rgba(120,120,120,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(18,18,18,.6),rgba(120,120,120,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(18,18,18,.6),rgba(120,120,120,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99121212', endColorstr='#99787878', GradientType=0)}#navbar .navbar-inner.black.transparent .nav>li>a:hover{background-color:rgba(66,66,66,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(107,107,107,.6),rgba(5,5,5,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(107,107,107,.6)),to(rgba(5,5,5,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(107,107,107,.6),rgba(5,5,5,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(107,107,107,.6),rgba(5,5,5,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(107,107,107,.6),rgba(5,5,5,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#996b6b6b', endColorstr='#99050505', GradientType=0)}#navbar .navbar-inner.white{background-color:#e9e9e9;background-image:-moz-linear-gradient(top,#fff,#c8c8c8);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#c8c8c8));background-image:-webkit-linear-gradient(top,#fff,#c8c8c8);background-image:-o-linear-gradient(top,#fff,#c8c8c8);background-image:linear-gradient(to bottom,#fff,#c8c8c8);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffc8c8c8', GradientType=0)}#navbar .navbar-inner.white .brand,#navbar .navbar-inner.white .nav>li>a{text-shadow:0 1px 0 #c8c8c8;color:#333}#navbar .navbar-inner.white .brand .caret,#navbar .navbar-inner.white .nav>li>a .caret{border-bottom-color:#919191;border-top-color:#919191}#navbar .navbar-inner.white .brand:focus .caret,#navbar .navbar-inner.white .brand:hover .caret,#navbar .navbar-inner.white .nav>li>a:focus .caret,#navbar .navbar-inner.white .nav>li>a:hover .caret{border-bottom-color:#626262;border-top-color:#626262}#navbar .navbar-inner.white .brand span{background-image:url(../img/tentacle-20x20.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.white .brand span{background-image:url(../img/tentacle-20x20@2x.png)}}#navbar .navbar-inner.white .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.white .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.white .nav>li.dropdown.open>.dropdown-toggle{background-color:#dedede;background-image:-moz-linear-gradient(top,#c8c8c8,#fff);background-image:-webkit-gradient(linear,0 0,0 100%,from(#c8c8c8),to(#fff));background-image:-webkit-linear-gradient(top,#c8c8c8,#fff);background-image:-o-linear-gradient(top,#c8c8c8,#fff);background-image:linear-gradient(to bottom,#c8c8c8,#fff);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc8c8c8', endColorstr='#ffffffff', GradientType=0)}#navbar .navbar-inner.white .nav>li>a:hover{background-color:#dcdcdc;background-image:-moz-linear-gradient(top,#f2f2f2,#bbb);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#bbb));background-image:-webkit-linear-gradient(top,#f2f2f2,#bbb);background-image:-o-linear-gradient(top,#f2f2f2,#bbb);background-image:linear-gradient(to bottom,#f2f2f2,#bbb);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffbbbbbb', GradientType=0)}#navbar .navbar-inner.white.transparent{background-color:rgba(233,233,233,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(255,255,255,.6),rgba(200,200,200,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(255,255,255,.6)),to(rgba(200,200,200,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(255,255,255,.6),rgba(200,200,200,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(255,255,255,.6),rgba(200,200,200,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(255,255,255,.6),rgba(200,200,200,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99ffffff', endColorstr='#99c8c8c8', GradientType=0)}#navbar .navbar-inner.white.transparent .brand,#navbar .navbar-inner.white.transparent .nav>li>a{text-shadow:0 1px 0 #c8c8c8;color:#333}#navbar .navbar-inner.white.transparent .brand .caret,#navbar .navbar-inner.white.transparent .nav>li>a .caret{border-bottom-color:#919191;border-top-color:#919191}#navbar .navbar-inner.white.transparent .brand:focus .caret,#navbar .navbar-inner.white.transparent .brand:hover .caret,#navbar .navbar-inner.white.transparent .nav>li>a:focus .caret,#navbar .navbar-inner.white.transparent .nav>li>a:hover .caret{border-bottom-color:#626262;border-top-color:#626262}#navbar .navbar-inner.white.transparent .brand span{background-image:url(../img/tentacle-20x20.png)}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){#navbar .navbar-inner.white.transparent .brand span{background-image:url(../img/tentacle-20x20@2x.png)}}#navbar .navbar-inner.white.transparent .nav>li.dropdown.active>.dropdown-toggle,#navbar .navbar-inner.white.transparent .nav>li.dropdown.open.active>.dropdown-toggle,#navbar .navbar-inner.white.transparent .nav>li.dropdown.open>.dropdown-toggle{background-color:rgba(222,222,222,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(200,200,200,.6),rgba(255,255,255,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(200,200,200,.6)),to(rgba(255,255,255,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(200,200,200,.6),rgba(255,255,255,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(200,200,200,.6),rgba(255,255,255,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(200,200,200,.6),rgba(255,255,255,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99c8c8c8', endColorstr='#99ffffff', GradientType=0)}#navbar .navbar-inner.white.transparent .nav>li>a:hover{background-color:rgba(220,220,220,.6);background-image:"../img/trans-background.png";background-image:-moz-linear-gradient(top,rgba(242,242,242,.6),rgba(187,187,187,.6)),url(../img/trans-background.png);background-image:-webkit-gradient(linear,0 0,0 100%,from(rgba(242,242,242,.6)),to(rgba(187,187,187,.6))),url(../img/trans-background.png);background-image:-webkit-linear-gradient(top,rgba(242,242,242,.6),rgba(187,187,187,.6)),url(../img/trans-background.png);background-image:-o-linear-gradient(top,rgba(242,242,242,.6),rgba(187,187,187,.6)),url(../img/trans-background.png);background-image:linear-gradient(to bottom,rgba(242,242,242,.6),rgba(187,187,187,.6)),url(../img/trans-background.png);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#99f2f2f2', endColorstr='#99bbbbbb', GradientType=0)}#navbar .navbar-inner .brand{padding:10px 20px 6px}#navbar .navbar-inner .brand span{padding-left:26px;background-size:20px 20px;background-repeat:no-repeat;display:inline-block;max-width:250px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:top;line-height:20px;height:24px}#navbar_login a.dropdown-toggle span{display:inline-block;max-width:100px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:top}.octoprint-container{margin-top:20px}.octoprint-container .tab-content{padding:9px 15px;border-left:1px solid #ddd;border-right:1px solid #ddd;border-bottom:1px solid #ddd;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.octoprint-container .nav{margin-bottom:0}.octoprint-container .tab-content h1{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5;font-weight:400}.octoprint-container .accordion-heading .accordion-heading-button{float:right}.octoprint-container .accordion-heading .accordion-heading-button>a{display:inline-block;padding:8px 15px;font-size:14px;line-height:20px;color:#000;text-decoration:none;background:0 0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.octoprint-container .accordion-heading a.accordion-toggle{display:inline-block}.octoprint-container .accordion-heading [class*=" icon-"],.octoprint-container .accordion-heading [class^=icon-]{color:#000}.print-control .btn{padding-left:4px;padding-right:4px}.upload-buttons .btn{margin-right:0}table{table-layout:fixed}table .popover-title{text-overflow:ellipsis;word-break:break-all}table td,table th{overflow:hidden}table td.gcode_files_name,table th.gcode_files_name{text-overflow:ellipsis;text-align:left;white-space:nowrap}table td.gcode_files_action,table th.gcode_files_action{width:90px;text-align:center;white-space:nowrap}table td.gcode_files_action a,table th.gcode_files_action a{text-decoration:none;color:#000}table td.gcode_files_action a.disabled,table th.gcode_files_action a.disabled{color:#ccc;cursor:default}table td.timelapse_files_checkbox,table td.timelapse_unrendered_checkbox,table th.timelapse_files_checkbox,table th.timelapse_unrendered_checkbox{text-align:center;vertical-align:middle;width:10px}table td.timelapse_unrendered_name,table th.timelapse_unrendered_name{text-overflow:ellipsis;text-align:left}table td.timelapse_files_details .name,table th.timelapse_files_details .name{text-overflow:ellipsis;text-align:left;margin:0}table td.timelapse_files_details .detail,table th.timelapse_files_details .detail{text-overflow:ellipsis;text-align:left;margin:0;font-size:85%;color:#999}table td.timelapse_files_thumb,table th.timelapse_files_thumb{width:110px;position:relative}table td.timelapse_files_thumb .thumb,table th.timelapse_files_thumb .thumb{width:110px;height:calc(110px * 9 / 16);border-radius:3px;background-color:#eee;position:relative}table td.timelapse_files_thumb .thumb.letterbox,table th.timelapse_files_thumb .thumb.letterbox{background-color:#000}table td.timelapse_files_thumb .thumb img,table th.timelapse_files_thumb .thumb img{max-width:100%;max-height:100%;border-radius:3px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}table td table.settings_groups_details_table td,table td table.settings_groups_details_table th,table td table.settings_users_details_table td,table td table.settings_users_details_table th,table th table.settings_groups_details_table td,table th table.settings_groups_details_table th,table th table.settings_users_details_table td,table th table.settings_users_details_table th{padding:0;border:0}table td.timelapse_files_thumb .thumb a,table th.timelapse_files_thumb .thumb a{background-image:url(/static/img/play.svg);background-position:center;background-repeat:no-repeat;background-size:32px 32px;width:100%;height:100%;opacity:.8;position:absolute;top:0;left:0;content:""}table td.timelapse_files_thumb .thumb a:hover,table th.timelapse_files_thumb .thumb a:hover{opacity:1}table td.timelapse_files_size,table td.timelapse_unrendered_size,table th.timelapse_files_size,table th.timelapse_unrendered_size{text-align:right;width:55px}table td.timelapse_unrendered_count,table th.timelapse_unrendered_count{text-align:right;width:45px}table td.timelapse_files_action,table td.timelapse_unrendered_action,table th.timelapse_files_action,table th.timelapse_unrendered_action{width:60px;position:relative;text-align:center;white-space:nowrap}table td.timelapse_files_action a,table td.timelapse_unrendered_action a,table th.timelapse_files_action a,table th.timelapse_unrendered_action a{text-decoration:none;color:#000}table td.timelapse_files_action a.disabled,table td.timelapse_unrendered_action a.disabled,table th.timelapse_files_action a.disabled,table th.timelapse_unrendered_action a.disabled{color:#ccc;cursor:default}table td.timelapse_files_action .btn-group,table td.timelapse_unrendered_action .btn-group,table th.timelapse_files_action .btn-group,table th.timelapse_unrendered_action .btn-group{position:absolute;bottom:5px;right:5px}table td.settings_users_name,table th.settings_users_name{text-overflow:ellipsis;text-align:left;width:100px}table td.settings_users_active,table th.settings_users_active{text-align:center;width:55px}table td table.settings_users_details_table,table th table.settings_users_details_table{font-size:.8em;margin-bottom:0}table td table.settings_users_details_table .settings_users_details_key,table th table.settings_users_details_table .settings_users_details_key{width:100px}table td.settings_groups_default,table th.settings_groups_default{text-align:center;width:20px}table td.settings_groups_name,table th.settings_groups_name{width:180px}table td table.settings_groups_details_table,table th table.settings_groups_details_table{font-size:.8em;margin-bottom:0}table td table.settings_groups_details_table .settings_groups_details_key,table th table.settings_groups_details_table .settings_groups_details_key{width:100px}table td.settings_groups_actions,table td.settings_users_actions,table th.settings_groups_actions,table th.settings_users_actions{width:60px;text-align:center;white-space:nowrap}table td.settings_groups_actions a,table td.settings_users_actions a,table th.settings_groups_actions a,table th.settings_users_actions a{text-decoration:none;color:#000}table td.settings_groups_actions a.disabled,table td.settings_users_actions a.disabled,table th.settings_groups_actions a.disabled,table th.settings_users_actions a.disabled{color:#ccc;cursor:default}table td.settings_accesscontrol_groups_list_checkbox,table td.settings_accesscontrol_permissions_list_checkbox,table td.settings_accesscontrol_subgroups_list_checkbox,table th.settings_accesscontrol_groups_list_checkbox,table th.settings_accesscontrol_permissions_list_checkbox,table th.settings_accesscontrol_subgroups_list_checkbox{width:20px}table td #settings-usersDialogAddUser,table td #settings-usersDialogEditUser,table th #settings-usersDialogAddUser,table th #settings-usersDialogEditUser{position:relative;top:50%;transform:translateY(-50%);margin-top:0!important}table td.settings_printerProfiles_profiles_name,table th.settings_printerProfiles_profiles_name{text-overflow:ellipsis;text-align:left}table td.settings_printerProfiles_profiles_model,table th.settings_printerProfiles_profiles_model{text-align:left;width:250px}table td.settings_printerProfiles_profiles_action,table th.settings_printerProfiles_profiles_action{width:80px;text-align:center;white-space:nowrap}table td.settings_printerProfiles_profiles_action a,table th.settings_printerProfiles_profiles_action a{text-decoration:none;color:#000}table td.settings_printerProfiles_profiles_action a.disabled,table th.settings_printerProfiles_profiles_action a.disabled{color:#ccc;cursor:default}#temperature-graph{height:350px;width:100%;background:url(../img/graph-background.png) center no-repeat}#temperature-table{table-layout:fixed;width:100%;margin-top:20px}#temperature-table td,#temperature-table th{line-height:25px}#temperature-table td.temperature_actual,#temperature-table td.temperature_offset,#temperature-table td.temperature_target,#temperature-table td.temperature_tool,#temperature-table th.temperature_actual,#temperature-table th.temperature_offset,#temperature-table th.temperature_target,#temperature-table th.temperature_tool{vertical-align:middle;text-align:center}#temperature-table td.temperature_actual form,#temperature-table td.temperature_offset form,#temperature-table td.temperature_target form,#temperature-table td.temperature_tool form,#temperature-table th.temperature_actual form,#temperature-table th.temperature_offset form,#temperature-table th.temperature_target form,#temperature-table th.temperature_tool form{margin:0}#temperature-table td.temperature_actual .dropdown-menu,#temperature-table td.temperature_offset .dropdown-menu,#temperature-table td.temperature_target .dropdown-menu,#temperature-table td.temperature_tool .dropdown-menu,#temperature-table th.temperature_actual .dropdown-menu,#temperature-table th.temperature_offset .dropdown-menu,#temperature-table th.temperature_target .dropdown-menu,#temperature-table th.temperature_tool .dropdown-menu{text-align:left}#temperature-table td.temperature_tool,#temperature-table th.temperature_tool{width:16%;text-align:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#speed_fill,#speed_innerWall,#speed_outerWall,#speed_support,#temp_newBedTemp,#temp_newTemp,#webcam_timelapse_fps,#webcam_timelapse_interval,#webcam_timelapse_postRoll,#webcam_timelapse_retractionZHop,.text-right{text-align:right}#temperature-table td.temperature_actual,#temperature-table th.temperature_actual{width:12%}#temperature-table td.temperature_target,#temperature-table th.temperature_target{width:42%;overflow:visible}#temperature-table td.temperature_offset,#temperature-table th.temperature_offset{width:30%}.temperature-mark-label{position:absolute;color:#fff;background-color:#aeb6bf;padding:0 5px;font-size:8px;transform-origin:0 0;transform:rotate(-90deg)}.temperature-mark-type-print{background-color:#218656}.temperature-mark-type-pause{background-color:#fdc02f}.temperature-mark-type-resume{background-color:#27caee}.temperature-mark-type-cancel{background-color:#da3749}.temperature-mark-type-done{background-color:#1b72f9}.temperature-mark-type-connected{background-color:#666}.temperature-mark-type-disconnected{background-color:#333}.tab-content,.tab-pane{overflow:visible}#connection_baudrates,#connection_ports,#connection_printers{width:100%}#offline_overlay,#reloadui_overlay{position:fixed;top:0;left:0;width:100%;height:100%;display:none}#offline_overlay{z-index:10002}#reloadui_overlay{z-index:10001}#offline_overlay_background,#reloadui_overlay_background{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#000;filter:alpha(opacity=50);-moz-opacity:.5;-khtml-opacity:.5;opacity:.5}#offline_overlay_wrapper,#reloadui_overlay_wrapper{position:absolute;top:0;bottom:0;left:0;right:0;padding-top:60px}#offline_overlay_wrapper .container,#reloadui_overlay_wrapper .container{margin:auto}#webcam_plugins_container{position:relative;border-radius:5px;margin-top:6px;overflow:hidden;min-height:300px;min-width:100%;background-color:#000}#webcam_plugins_container .tab-content{border:none;padding:0}#webcam_plugins_container:hover .keycontrol_overlay,#webcam_plugins_container:hover .nav,#webcam_plugins_container:hover .refresh_overlay{opacity:1}#webcam_plugins_container .nav{position:absolute;padding:5px;right:5px;top:5px;border-radius:5px;background:rgba(0,0,0,.5);opacity:0;transition:opacity .3s,visibility .3s}#webcam_plugins_container .nav .nav-item a{text-align:end;padding:5px;margin-bottom:1px;border-radius:5px;color:#fff}#webcam_plugins_container .nav .nav-item a:hover{background-color:rgba(255,255,255,.1);color:#fff}#webcam_plugins_container .nav .active{background-color:rgba(255,255,255,.2);border-radius:5px;color:#fff}#webcam_plugins_container .keycontrol_overlay,#webcam_plugins_container .refresh_overlay{position:absolute;left:5px;border-radius:5px;background:rgba(0,0,0,.5);opacity:0;transition:opacity .3s,visibility .3s}#webcam_plugins_container .refresh_overlay{padding:5px;top:5px}#webcam_plugins_container .refresh_overlay a{padding:5px;border-radius:5px;color:#fff}#webcam_plugins_container .refresh_overlay a:hover{background-color:rgba(255,255,255,.1);color:#fff}#webcam_plugins_container .keycontrol_overlay{right:5px;bottom:5px;overflow:hidden;font-size:85%;color:#fff;padding:0}#webcam_plugins_container .keycontrol_overlay kbd{border:1px solid #eee;border-radius:3px;margin-left:2px;margin-right:2px;font-size:90%;padding:2px;min-width:1em}#webcam_plugins_container .keycontrol_overlay .keycontrol_overlay_heading{position:relative;padding:10px;font-weight:700}#webcam_plugins_container .keycontrol_overlay .keycontrol_overlay_column{position:relative;width:45%;padding:10px;float:left}#state_wrapper hr{margin:5px 0}#files .gcode_files .scroll-wrapper{overflow-x:hidden;overflow-y:scroll;height:306px;padding-right:2px;position:relative}#files .gcode_files .entry{padding:5px;line-height:20px;border-bottom:1px solid #ddd;position:relative}#files .gcode_files .entry:hover{background-color:#f5f5f5}#files .gcode_files .entry .title{text-overflow:ellipsis;word-break:break-all;margin-right:30px;white-space:pre-wrap}#files .gcode_files .entry .additionalInfo,#files .gcode_files .entry .internal,#files .gcode_files .entry .size,#files .gcode_files .entry .uploaded{font-size:85%;color:#999}#files .gcode_files .entry .uploaded [title]{cursor:help}#control .custom_section h1,.clickable,.slider .slider-handle{cursor:pointer}#files .gcode_files .entry .internal{word-break:break-all}#files .gcode_files .entry .action-buttons{position:absolute;bottom:5px;right:5px}#files .gcode_files .entry .additionalInfo{padding-bottom:22px}@keyframes highlightframes{0%{background:#ff0}100%{background:0 0}}#files .gcode_files .entry.highlight{animation:highlightframes 2s}#files .gcode_files .back .back-path{white-space:nowrap}#files .gcode_files .back .back-path span{word-wrap:break-word;white-space:pre-line}#files .upload-buttons{margin-top:10px}#files .form-search{text-align:center;margin-bottom:5px!important}#control .box,#control .btn-group,#control .control-box,#control .jog-panel .slider{margin-bottom:10px}#control .jog-panel{float:left;margin-right:19px}#control h1{text-align:left}#control .jog-panel>div{text-align:center}#control .jog-panel>div.distance{text-align:left}#control .box{width:30px;height:30px;margin-right:10px;padding:0}#control .control-box{display:block;height:30px}#control .btn-group.distance>.btn{width:43px;padding:3px 0;height:30px}#control .slider-handle{width:14px;height:14px;margin-left:-7px;margin-top:-3px}#control .custom_section_horizontal>.custom_control{display:inline-block}#control .custom_section_vertical>.custom_control{display:block}#control .custom_control .slider{margin-left:10px;margin-right:10px;margin-bottom:2px}#control .pulsate_text_opacity{animation:pulsate_input 1s ease-out;animation-iteration-count:infinite}@keyframes pulsate_input{0%,100%{color:#555}50%{color:rgba(85,85,85,.2)}}#term .terminal{margin-bottom:30px}#term .terminal #terminal-output,#term .terminal #terminal-output-lowfi{min-height:340px;margin-bottom:5px}#settings_dialog .aboutlink,#settings_dialog .systeminfolink{float:left}#settings_dialog_menu,#wizard_dialog_menu{margin-left:0}#wizard_firstrun_acl .acl_decision{margin-top:1em}#wizard_firstrun_end p,#wizard_firstrun_start p{margin-bottom:1.5em;line-height:1.5}#settings_appearance_managelanguagesdialog_list{width:auto;height:300px;overflow-x:hidden;overflow-y:scroll;padding-right:2px}#settings_appearance_managelanguagesdialog_emptylist{overflow:hidden;width:100%;height:300px;text-align:center;display:table}#settings_appearance_managelanguagesdialog_emptylist div{display:table-cell;vertical-align:middle}#about_authors ul,#about_sponsors ul{columns:3;-webkit-columns:3;-moz-columns:3}.funding-banner{display:flex;flex-direction:row;align-items:center;padding:1em;height:60px;border-top:1px solid #85ba80;border-bottom:1px solid #85ba80;background-color:#85ba8066}.funding-banner .banner-icon{flex-shrink:0}.funding-banner .banner-text{flex-grow:1;font-size:1em;margin:0 0 0 1.5em}.footer ul li,.pnotify_additional_info .pnotify_more{font-size:85%}.footer ul{margin:0}.footer ul li{display:inline;margin-left:1em}.footer ul li:first-child{margin-left:0}.footer ul li a{color:#555}.footer #footer_links,.footer #footer_version{max-width:50%}.ui-pnotify{position:fixed}.ui-pnotify .alert a{color:#c09853}.ui-pnotify .alert-danger a,.ui-pnotify .alert-error a{color:#b94a48}.ui-pnotify .alert-success a{color:#468847}.ui-pnotify .alert-info a{color:#3a87ad}.text-center{text-align:center}.text-block{display:block}.overflow_visible{overflow:visible!important}.border_box{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none}textarea.block{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%}@keyframes pulsate{0%,100%{opacity:.5}50%{opacity:1}}#drop_overlay{position:fixed;top:0;left:0;width:100%;height:100%;z-index:10000;display:none}#drop_overlay.in{display:block}#drop_overlay #drop_overlay_background{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#000;filter:alpha(opacity=50);-moz-opacity:.5;-khtml-opacity:.5;opacity:.5}#drop_overlay #drop_overlay_wrapper{position:absolute;top:0;bottom:0;left:0;right:0;padding-top:60px}#drop_overlay #drop_overlay_wrapper #drop,#drop_overlay #drop_overlay_wrapper #drop_background{position:absolute;top:0;left:0;margin-left:0;width:100%}#drop_overlay #drop_overlay_wrapper #drop_locally,#drop_overlay #drop_overlay_wrapper #drop_locally_background{position:absolute;top:0;left:50%;margin-left:-50%;width:50%;border-right:2px dashed #ccc}#drop_overlay #drop_overlay_wrapper #drop_sd,#drop_overlay #drop_overlay_wrapper #drop_sd_background{position:absolute;top:0;left:50%;margin-left:0;width:50%;border-left:2px dashed #ccc}#drop_overlay #drop_overlay_wrapper .dropzone{height:100%;z-index:10001;color:#fff;font-size:30px}#drop_overlay #drop_overlay_wrapper .dropzone i{font-size:50px}#drop_overlay #drop_overlay_wrapper .dropzone .text{display:block;text-align:center;line-height:40px;position:absolute;width:100%;bottom:5%;filter:alpha(opacity=100);-moz-opacity:1;-khtml-opacity:1;opacity:1}#drop_overlay #drop_overlay_wrapper .dropzone_background{width:50%;height:100%;background-color:#000;filter:alpha(opacity=25);-moz-opacity:.25;-khtml-opacity:.25;opacity:.25}#drop_overlay #drop_overlay_wrapper .dropzone_background.hover{background-color:#000;filter:alpha(opacity=50);-moz-opacity:.5;-khtml-opacity:.5;opacity:.5}#drop_overlay #drop_overlay_wrapper .dropzone_background.fade{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;opacity:1}.center{float:none;margin-left:auto;margin-right:auto}.flipH{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.flipV{-webkit-transform:scaleY(-1);-moz-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}.flipH.flipV{-webkit-transform:scaleX(-1) scaleY(-1);-moz-transform:scaleX(-1) scaleY(-1);-ms-transform:scaleX(-1) scaleY(-1);transform:scaleX(-1) scaleY(-1)}.rotate90{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.ui-pnotify a{text-decoration:underline}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropdown-menu-right{right:0;left:auto}.slider .slider-selection{color:#fff;background-color:#006dcc;background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#04c;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.slider .slider-selection.active,.slider .slider-selection.disabled,.slider .slider-selection:active,.slider .slider-selection:focus,.slider .slider-selection:hover,.slider .slider-selection[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.slider .slider-selection.active,.slider .slider-selection:active{background-color:#039\9}.slider.slider-disabled .slider-selection{background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.slider .slider-track{background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.slider.slider-disabled .slider-track{background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.slider .slider-handle{display:inline-block;*display:inline;*zoom:1;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;*background-color:#e6e6e6;border:1px solid #ccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);padding:0;opacity:1;filter:alpha(opacity=100)}.slider .slider-handle.active,.slider .slider-handle.disabled,.slider .slider-handle:active,.slider .slider-handle:focus,.slider .slider-handle:hover,.slider .slider-handle[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.slider .slider-handle:first-child{*margin-left:0}.slider .slider-handle:focus,.slider .slider-handle:hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.slider .slider-handle:focus{outline:#333 dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.slider .slider-handle.active,.slider .slider-handle:active{background-color:#ccc\9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.slider .slider-handle.disabled,.slider .slider-handle[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.slider .slider-handle.hide{display:none}.slider .slider-handle.round{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%}.modal.large{width:975px;margin-left:-487px}.full-sized-box{position:absolute;bottom:0;left:0;right:0;top:0;padding:15px}.full-sized-box .row-fluid{height:100%}@media (max-width:979px){.full-sized-box{position:static}}:root .full-sized-box,_::-webkit-full-page-media,_:future{position:static}.safari ::-webkit-scrollbar{width:10px;height:10px}.safari ::-webkit-scrollbar-track{border-radius:10px;-webkit-border-radius:10px}.safari ::-webkit-scrollbar-thumb{-webkit-border-radius:10px;border-radius:10px;background:rgba(100,100,100,.8)}.scrollable{height:100%;overflow:auto;-webkit-overflow-scrolling:touch}.pre-output span{display:block}.input-append .add-on.add-on-limited,.input-prepend .add-on.add-on-limited{overflow-x:hidden;text-overflow:ellipsis;width:inherit}.input-append .btn-group:first-child .btn:first-child,.input-prepend .btn-group:first-child .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append .btn-group .btn:first-child,.input-prepend .btn-group .btn:first-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}label.checkbox input[type=checkbox],label.checkbox input[type=radio],label.radio input[type=checkbox],label.radio input[type=radio]{margin-top:2px}.input-append.input-block-level,.input-prepend.input-block-level{display:table}.input-append.input-block-level .add-on,.input-prepend.input-block-level .add-on{display:table-cell;width:1%}.input-append.input-block-level>input,.input-prepend.input-block-level>input{box-sizing:border-box;display:table;min-height:inherit;width:100%}.input-append.input-block-level :not(:last-child),.input-prepend.input-block-level :not(:last-child){border-right:0}.control-group.error .input-append .fileinput-button,.control-group.error .input-prepend .fileinput-button{border-color:#b94a48}.control-text{padding-top:5px;cursor:default}input[type=number]{text-align:right}input[type=number].input-nospin::-webkit-inner-spin-button,input[type=number].input-nospin::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number].input-nospin{-moz-appearance:textfield}.dropdown-menu li a.disabled,.dropdown-menu li a.disabled:active,.dropdown-menu li a.disabled:hover,.dropdown-menu li a.disabled:visited{background-color:transparent;background-image:none;color:#aaa;cursor:default}textarea.monospace{font-family:monospace}.progress-text-centered{position:relative}.progress-text-centered .bar{z-index:1;position:absolute;overflow:hidden}.progress-text-centered .progress-text-back,.progress-text-centered .progress-text-front{position:absolute;top:0;z-index:2;text-align:center;width:100%;box-sizing:border-box;padding:0 10px;font-size:12px;line-height:20px}.progress-text-centered .progress-text-front{color:#fff}.search-query-with-clear{position:relative}.search-query-with-clear .search-clear{display:inline-block;color:#ccc;position:absolute;right:28px;height:20px;padding:4px 0;cursor:pointer;visibility:hidden}.search-query-with-clear.active-clear .search-query{padding-right:28px;width:192px}.search-query-with-clear.active-clear .search-clear{visibility:visible}.search-query-with-clear input::-ms-clear{display:none}.search-query-with-clear input[type=search]::-webkit-search-cancel-button,.search-query-with-clear input[type=search]::-webkit-search-decoration,.search-query-with-clear input[type=search]::-webkit-search-results-button,.search-query-with-clear input[type=search]::-webkit-search-results-decoration{-webkit-appearance:none}#navbar_login:not(.open) #login_dropdown_loggedout{display:block;z-index:-1;height:0;width:0;padding:0!important;overflow:hidden;border:0;box-shadow:none;left:-9999px}#navbar_login:not(.open) #login_dropdown_loggedout.hide{display:none}#loginForm{margin:0}#loginForm button{margin-top:20px}#page-container-loading{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#fff;z-index:12301}#page-container-loading .wrapper{position:absolute;top:0;bottom:0;left:0;right:0}#page-container-loading .wrapper .outer{display:table;width:100%;height:100%}#page-container-loading .wrapper .outer .inner{display:table-cell;vertical-align:middle}#page-container-loading .wrapper .outer .inner .content{text-align:center}#page-container-noscript{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#fff;z-index:12310}#page-container-noscript .wrapper{position:absolute;top:0;bottom:0;left:0;right:0}#page-container-noscript .wrapper .outer{display:table;width:100%;height:100%}#page-container-noscript .wrapper .outer .inner{display:table-cell;vertical-align:middle}#page-container-noscript .wrapper .outer .inner .content{text-align:center}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes backgroundFadeIn{from{opacity:0}to{opacity:.7}}.fade-in{animation-name:fadeIn;animation-duration:.3s}.modal-backdrop:not(.fade){animation-name:backgroundFadeIn;animation-duration:.3s} +.achievement-list .achievement-item .achievement-logo svg,.achievement-popup .achievement .achievement-logo svg{fill:currentColor}.achievement-list{display:flex;width:100%;flex-wrap:wrap}.achievement-list .achievement-item{display:flex;flex:1 1 calc(50% - 2.5em);max-width:calc(50% - 2.5em);padding:.5em;margin:.5em;border:1px solid #666;border-radius:.5em;opacity:.5}.achievement-list .achievement-item.achieved{color:#fff;background-color:#08c;border:1px solid #069;opacity:1}.achievement-list .achievement-item .achievement-logo{width:48px;height:48px;min-width:48px;margin-right:.5em}.achievement-popup .achievement{display:inline-flex;margin-top:1em}.achievement-popup .achievement .achievement-logo{width:48px;height:48px;min-width:48px;margin-right:.5em}.achievement-popup .achievement .achievement-description{flex-grow:1}.achievement-popup .achievement-nag{margin-top:1em}.achievement-popup .achievement-link{display:block;margin-top:1em} +.sidebar_plugin_action_command_notification_entry { + padding: 5px; + line-height: 20px; + border-bottom: 1px solid #ddd; +} + +.sidebar_plugin_action_command_notification_scrollable { + overflow-x: hidden; + overflow-y: scroll; + max-height: 306px; +} + +table td.settings_plugin_announcements_channels_name,table th.settings_plugin_announcements_channels_name{text-overflow:ellipsis;text-align:left}table td.settings_plugin_announcements_channels_actions,table th.settings_plugin_announcements_channels_actions{text-align:center;width:80px}table td.settings_plugin_announcements_channels_actions a,table th.settings_plugin_announcements_channels_actions a{text-decoration:none;color:#000}table td.settings_plugin_announcements_channels_actions a.disabled,table th.settings_plugin_announcements_channels_actions a.disabled{color:#ccc;cursor:default}#plugin_announcements_dialog .unread{font-weight:700}#plugin_announcements_dialog article{padding-right:20px}#plugin_announcements_dialog article.read{opacity:.5}#plugin_announcements_dialog article.read:hover{opacity:1}#plugin_announcements_dialog article .actions{background-color:#f5f5f5;border-radius:2px;padding:2px 5px;margin-top:5px}#plugin_announcements_dialog article .actions .markread{float:right}#plugin_announcements_dialog article .actions a{color:#000}#plugin_announcements_dialog .modal-footer .configurelink{float:left} +#settings_plugin_appkeys_allkeys_table .settings_plugin_appkeys_actions,#settings_plugin_appkeys_userkeys_table .settings_plugin_appkeys_actions{width:75px;text-align:center}#settings_plugin_appkeys_allkeys_table .settings_plugin_appkeys_actions a,#settings_plugin_appkeys_userkeys_table .settings_plugin_appkeys_actions a{color:#000}#settings_plugin_appkeys_allkeys_table .settings_plugin_appkeys_user,#settings_plugin_appkeys_userkeys_table .settings_plugin_appkeys_user{width:100px}#settings_plugin_appkeys_allkeys_table .settings_plugin_appkeys_checkbox,#settings_plugin_appkeys_userkeys_table .settings_plugin_appkeys_checkbox{text-align:center;width:10px}#settings_plugin_appkeys_allkeys_table .settings_plugin_appkeys_checkbox input[type=checkbox],#settings_plugin_appkeys_userkeys_table .settings_plugin_appkeys_checkbox input[type=checkbox]{margin-top:0}#plugin_appkeys_keygenerated .control-text{display:inline-block} +#settings_plugin_backup_backup_table .settings_plugin_backup_actions{width:75px;text-align:center}#settings_plugin_backup_backup_table .settings_plugin_backup_actions a{color:#000}#settings_plugin_backup_backup_table .settings_plugin_backup_date{width:200px;text-align:right}#settings_plugin_backup_backup_table .settings_plugin_backup_size{width:100px;text-align:right}#settings_plugin_backup_backup_table .settings_plugin_backup_checkbox{text-align:center;width:10px}#settings_plugin_backup_backup_table .settings_plugin_backup_checkbox input[type=checkbox]{margin-top:0}#settings_plugin_backup_restoredialog_output .message{font-weight:700}#settings_plugin_backup_restoredialog_output .error{font-weight:700;color:#900}#settings_plugin_backup_restoredialog_output .stdout{color:#333}#settings_plugin_backup_restoredialog_output .stderr{color:#900}#settings_plugin_backup_restoredialog_output .call{color:#009} +.classicwebcam_aspect_ratio_mixin{aspect-ratio:1}.classicwebcam_aspect_ratio_mixin.ratio43{aspect-ratio:4/3}.classicwebcam_aspect_ratio_mixin.ratio169{aspect-ratio:16/9}.classicwebcam_aspect_ratio_mixin.ratio1610{aspect-ratio:16/10}.classicwebcam_flexbox_mixin{width:100%;display:flex;justify-content:center;align-items:center}#webcam_video_container{width:100%;position:relative;outline:0}#webcam_video_container .video-controls{position:absolute;bottom:0;right:8px;z-index:10;opacity:.4}#webcam_video_container:hover .video-controls{opacity:1}#webcam_video_container #webcam_hls,#webcam_video_container #webcam_rtsp{width:100%;height:100%}#webcam_video_container .webcam_rotated,#webcam_video_container .webcam_unrotated{position:relative;width:100%;display:flex;justify-content:center;align-items:center;aspect-ratio:1}#webcam_video_container .webcam_rotated.ratio43,#webcam_video_container .webcam_unrotated.ratio43{aspect-ratio:4/3}#webcam_video_container .webcam_rotated.ratio169,#webcam_video_container .webcam_unrotated.ratio169{aspect-ratio:16/9}#webcam_video_container .webcam_rotated.ratio1610,#webcam_video_container .webcam_unrotated.ratio1610{aspect-ratio:16/10}#webcam_video_container .webcam_rotated .rotation_target,#webcam_video_container .webcam_rotated .rotation_target div,#webcam_video_container .webcam_unrotated .rotation_target,#webcam_video_container .webcam_unrotated .rotation_target div{width:100%;display:flex;justify-content:center;align-items:center}#webcam_video_container .webcam_rotated{aspect-ratio:1}#webcam_video_container .webcam_rotated .rotation_target{position:absolute;transform:rotate(-90deg)}#webcam_video_container .webcam_rotated .rotation_target div{height:100%}#webcam_img_container{width:100%;position:relative;outline:0;background-color:#000}#webcam_img_container .keycontrol_overlay{position:absolute;left:10px;right:10px;bottom:10px;background:rgba(0,0,0,.5);font-size:85%;color:#fff;padding:0}#webcam_img_container .keycontrol_overlay kbd{border:1px solid #eee;border-radius:3px;margin-left:2px;margin-right:2px;font-size:90%;padding:2px;min-width:1em}#webcam_img_container .keycontrol_overlay .keycontrol_overlay_heading{position:relative;padding:10px;font-weight:700}#webcam_img_container .keycontrol_overlay .keycontrol_overlay_column{position:relative;width:45%;padding:10px;float:left}#webcam_img_container .nowebcam{position:absolute;top:0;left:0;right:0;bottom:0}#webcam_img_container .nowebcam .text{color:#fff;text-align:center;position:relative;margin:auto;width:80%;top:50%;transform:translateY(-50%);display:block}#webcam_img_container .nowebcam .text.webcam_loading{animation:pulsate 3s ease-out;animation-iteration-count:infinite}#webcam_img_container .webcam_rotated{position:relative;width:100%;padding-bottom:100%;pointer-events:none}#webcam_img_container .webcam_rotated .webcam_fixed_ratio{position:absolute;transform:rotate(-90deg);top:0;bottom:0;pointer-events:none}#webcam_img_container .webcam_rotated .webcam_fixed_ratio .webcam_fixed_ratio_inner{width:100%;height:100%;pointer-events:none}#webcam_img_container .webcam_unrotated .webcam_fixed_ratio{width:100%;pointer-events:none;aspect-ratio:1;position:relative}#webcam_img_container .webcam_unrotated .webcam_fixed_ratio.ratio43{aspect-ratio:4/3}#webcam_img_container .webcam_unrotated .webcam_fixed_ratio.ratio169{aspect-ratio:16/9}#webcam_img_container .webcam_unrotated .webcam_fixed_ratio.ratio1610{aspect-ratio:16/10}#webcam_img_container .webcam_unrotated .webcam_fixed_ratio .webcam_fixed_ratio_inner{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none}#webcam_img_container img{width:100%;height:100%;object-fit:contain}#webcamTestContainer{min-height:384px} +#sidebar_plugin_firmware_check_warning_wrapper{border:1px solid #b94a48}#sidebar_plugin_firmware_check_warning_wrapper .accordion-heading{background-color:#b94a48;font-weight:700;color:#fff}#sidebar_plugin_firmware_check_warning_wrapper .accordion-heading .icon-black,#sidebar_plugin_firmware_check_warning_wrapper .accordion-heading a,#sidebar_plugin_firmware_check_warning_wrapper .accordion-heading a:active,#sidebar_plugin_firmware_check_warning_wrapper .accordion-heading a:hover,#sidebar_plugin_firmware_check_warning_wrapper .accordion-heading a:visited{color:#fff} +#gcode .progress{width:588px}#gcode .progress .bar{-webkit-transition:width 0s linear;-moz-transition:width 0s linear;-o-transition:width 0s linear;transition:width 0s linear}#gcode .canvas_container{position:relative}#gcode .canvas_container:active,#gcode .canvas_container:hover{outline:0}#gcode .layer-buttons{padding-top:5px;padding-bottom:7px}#gcode #gcode_layer_slider{position:absolute;right:0;top:0;height:568px;float:right}#gcode #gcode_layer_slider .slider-handle{width:14px;height:14px;margin-left:-3px;margin-top:-7px}#gcode #gcode_command_slider .slider-handle{width:14px;height:14px;margin-left:-7px;margin-top:-3px} +table td.settings_logs_checkbox,table th.settings_logs_checkbox{text-align:center;width:10px}table td.settings_logs_checkbox input[type=checkbox],table th.settings_logs_checkbox input[type=checkbox]{margin-top:0}table td.settings_logs_name,table th.settings_logs_name{text-overflow:ellipsis;text-align:left}table td.settings_logs_size,table th.settings_logs_size{text-align:right;width:70px}table td.settings_logs_date,table th.settings_logs_date{text-align:left;width:130px}table td.settings_logs_action,table th.settings_logs_action{width:70px;text-align:center;white-space:nowrap}table td.settings_logs_action a,table th.settings_logs_action a{text-decoration:none;color:#000}table td.settings_logs_action a.disabled,table th.settings_logs_action a.disabled{color:#ccc;cursor:default} +#settings_plugin_pluginmanager_pluginlist table td.settings_plugin_plugin_manager_plugins_checkbox input[type=checkbox],#settings_plugin_pluginmanager_pluginlist table th.settings_plugin_plugin_manager_plugins_checkbox input[type=checkbox],#settings_plugin_pluginmanager_pluginlist>table{margin-top:0}#settings_plugin_pluginmanager_orphanlist table td.settings_plugin_plugin_manager_orphans_actions a,#settings_plugin_pluginmanager_orphanlist table th.settings_plugin_plugin_manager_orphans_actions a,#settings_plugin_pluginmanager_pluginlist table td.settings_plugin_plugin_manager_plugins_actions a,#settings_plugin_pluginmanager_pluginlist table th.settings_plugin_plugin_manager_plugins_actions a{color:#000;text-decoration:none}#settings_plugin_pluginmanager_pluginlist{height:calc(100vh - 450px);display:block;width:auto;overflow-x:hidden;padding-right:2px;margin-bottom:1em;position:relative;border-top:1px solid #eee;padding-top:6px}#settings_plugin_pluginmanager_pluginlist table td.settings_plugin_plugin_manager_plugins_checkbox,#settings_plugin_pluginmanager_pluginlist table th.settings_plugin_plugin_manager_plugins_checkbox{text-align:center;width:10px}#settings_plugin_pluginmanager_pluginlist table td.settings_plugin_plugin_manager_plugins_name,#settings_plugin_pluginmanager_pluginlist table th.settings_plugin_plugin_manager_plugins_name{text-overflow:ellipsis;text-align:left}#settings_plugin_pluginmanager_pluginlist table td.settings_plugin_plugin_manager_plugins_name .prop,#settings_plugin_pluginmanager_pluginlist table th.settings_plugin_plugin_manager_plugins_name .prop{white-space:nowrap}#settings_plugin_pluginmanager_pluginlist table td.settings_plugin_plugin_manager_plugins_actions,#settings_plugin_pluginmanager_pluginlist table th.settings_plugin_plugin_manager_plugins_actions{text-align:center;width:80px}#settings_plugin_pluginmanager_pluginlist table td.settings_plugin_plugin_manager_plugins_actions a.disabled,#settings_plugin_pluginmanager_pluginlist table th.settings_plugin_plugin_manager_plugins_actions a.disabled{color:#ccc;cursor:default}#settings_plugin_pluginmanager_orphanlist{display:block;width:auto;max-height:400px;overflow-x:hidden;overflow-y:scroll;padding-right:2px;margin-bottom:1em}#settings_plugin_pluginmanager_orphanlist table td.settings_plugin_plugin_manager_orphans_id,#settings_plugin_pluginmanager_orphanlist table th.settings_plugin_plugin_manager_orphans_id{text-overflow:ellipsis;text-align:left}#settings_plugin_pluginmanager_orphanlist table td.settings_plugin_plugin_manager_orphans_actions,#settings_plugin_pluginmanager_orphanlist table th.settings_plugin_plugin_manager_orphans_actions{text-align:center;width:80px}#settings_plugin_pluginmanager_orphanlist table td.settings_plugin_plugin_manager_orphans_actions a.disabled,#settings_plugin_pluginmanager_orphanlist table th.settings_plugin_plugin_manager_orphans_actions a.disabled{color:#ccc;cursor:default}#settings_plugin_pluginmanager_repositorydialog h4{position:relative}#settings_plugin_pluginmanager_repositorydialog h4 a.dropdown-toggle{color:inherit;text-decoration:none;font-size:14px}#settings_plugin_pluginmanager_repositorydialog h4 ul.dropdown-menu{font-size:14px}#settings_plugin_pluginmanager_repositorydialog .form-search{text-align:center;margin-bottom:5px!important}#settings_plugin_pluginmanager_repositorydialog .form-inline{padding:5px 10px 5px 5px;margin-bottom:0}#settings_plugin_pluginmanager_repositorydialog .form-inline .help-block{margin-bottom:0;font-size:85%}#settings_plugin_pluginmanager_repositorydialog #settings_plugin_pluginmanager_repositorydialog_empty,#settings_plugin_pluginmanager_repositorydialog #settings_plugin_pluginmanager_repositorydialog_unavailable{overflow:hidden;width:100%;height:400px;background-image:url(../../plugin/pluginmanager/static/img/repo_unavailable.png);text-align:center;display:table}#settings_plugin_pluginmanager_repositorydialog #settings_plugin_pluginmanager_repositorydialog_empty div,#settings_plugin_pluginmanager_repositorydialog #settings_plugin_pluginmanager_repositorydialog_unavailable div{display:table-cell;vertical-align:middle}#settings_plugin_pluginmanager_repositorydialog #settings_plugin_pluginmanager_repositorydialog_list{width:auto;height:400px;overflow-x:hidden;overflow-y:scroll;padding-right:2px}#settings_plugin_pluginmanager_repositorydialog #settings_plugin_pluginmanager_repositorydialog_list .entry{border-bottom:1px solid #ddd;padding:5px}#settings_plugin_pluginmanager_repositorydialog #settings_plugin_pluginmanager_repositorydialog_list .entry .meta{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}#settings_plugin_pluginmanager_repositorydialog #settings_plugin_pluginmanager_repositorydialog_list .entry .stats .prop{white-space:nowrap}#settings_plugin_pluginmanager_workingdialog_output{font-size:.8em}#settings_plugin_pluginmanager_workingdialog_output .message{font-weight:700}#settings_plugin_pluginmanager_workingdialog_output .separator{font-weight:700;color:#666}#settings_plugin_pluginmanager_workingdialog_output .error{font-weight:700;color:#900}#settings_plugin_pluginmanager_workingdialog_output .stdout{color:#333}#settings_plugin_pluginmanager_workingdialog_output .stderr{color:#900}#settings_plugin_pluginmanager_workingdialog_output .call{color:#009} +#settings_plugin_softwareupdate_updatelist{display:block;width:auto;overflow-x:hidden;padding-right:2px;margin-bottom:1em}div.swupdate-advanced{margin-bottom:5px}td.settings_plugin_softwareupdate_column_update{width:16px}td.settings_plugin_softwareupdate_column_update a{text-decoration:none;color:#000}td.settings_plugin_softwareupdate_column_information .line{display:block}td.settings_plugin_softwareupdate_column_information .settings_plugin_softwareupdate_release_channel{line-height:20px;height:20px;font-size:9px;margin-bottom:0;vertical-align:baseline}#settings_plugin_softwareupdate_updatelog_list .line{display:block}#settings_plugin_softwareupdate_updatelog_list td.settings_plugin_softwareupdate_column_datetime{width:150px}#settings_plugin_softwareupdate_workingdialog_output{font-size:.8em}#settings_plugin_softwareupdate_workingdialog_output .message{font-weight:700}#settings_plugin_softwareupdate_workingdialog_output .separator{font-weight:700;color:#666}#settings_plugin_softwareupdate_workingdialog_output .stdout{color:#333}#settings_plugin_softwareupdate_workingdialog_output .stderr{color:#900}#settings_plugin_softwareupdate_workingdialog_output .call{color:#009}#settings_plugin_softwareupdate_workingdialog_output .message_error{font-weight:700;color:#900}.softwareupdate_notification ul{margin:10px 0 10px 25px}.softwareupdate_notification ul .name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block}.progress-softwareupdate.progress{position:relative;display:flex;overflow:hidden;height:25px;font-size:12px}.progress-softwareupdate.progress .bar{display:flex;justify-content:center;align-items:center;width:100%;color:#fff;height:25px;font-size:12px}.progress-softwareupdate.progress .progress-text{position:absolute;display:flex;justify-content:center;align-items:center;left:0;right:0;top:0;bottom:0;background:#fff;transition:clip-path 1s linear;height:25px;font-size:12px} \ No newline at end of file diff --git a/builder/octoprint/octoprint/generated/webassets/packed_core.css.gz b/builder/octoprint/octoprint/generated/webassets/packed_core.css.gz new file mode 100644 index 0000000..3034e35 Binary files /dev/null and b/builder/octoprint/octoprint/generated/webassets/packed_core.css.gz differ diff --git a/builder/octoprint/octoprint/generated/webassets/packed_core.js b/builder/octoprint/octoprint/generated/webassets/packed_core.js new file mode 100644 index 0000000..30563e8 --- /dev/null +++ b/builder/octoprint/octoprint/generated/webassets/packed_core.js @@ -0,0 +1,1908 @@ +// source: js/app/bindings/allowbindings.js +ko.bindingHandlers.allowBindings={init:function(elem,valueAccessor){return{controlsDescendantBindings:!valueAccessor()};}};ko.virtualElements.allowedBindings.allowBindings=true; +; + +// source: js/app/bindings/contextmenu.js +ko.bindingHandlers.contextMenu={init:function(element,valueAccessor,allBindingsAccessor,viewModel,bindingContext){var val=ko.utils.unwrapObservable(valueAccessor());$(element).contextMenu(val);},update:function(element,valueAccessor,allBindingsAccessor,viewModel,bindingContext){var val=ko.utils.unwrapObservable(valueAccessor());$(element).contextMenu(val);}}; +; + +// source: js/app/bindings/gettext.js +ko.bindingHandlers.gettext={init:function(){return{controlsDescendantBindings:true};},update:function(element,valueAccessor){var gt=gettext||function(text){return text;};ko.utils.setTextContent(element,gt(valueAccessor()));}};ko.virtualElements.allowedBindings["gettext"]=true; +; + +// source: js/app/bindings/invisible.js +ko.bindingHandlers.invisible={init:function(element,valueAccessor,allBindings,viewModel,bindingContext){var val=ko.utils.unwrapObservable(valueAccessor());ko.bindingHandlers.style.update(element,function(){return{visibility:val?"hidden":"visible"};});},update:function(element,valueAccessor,allBindings,viewModel,bindingContext){var val=ko.utils.unwrapObservable(valueAccessor());ko.bindingHandlers.style.update(element,function(){return{visibility:val?"hidden":"visible"};});}}; +; + +// source: js/app/bindings/popover.js +ko.bindingHandlers.popover={keys:["title","animation","placement","trigger","delay","content","html"],init:function(element,valueAccessor,allBindingsAccessor,viewModel,bindingContext){var val=ko.utils.unwrapObservable(valueAccessor());var keys=ko.bindingHandlers.popover.keys;var options={};_.each(keys,function(key){options[key]=ko.utils.unwrapObservable(val[key]);});$(element).popover(options);},update:function(element,valueAccessor,allBindingsAccessor,viewModel,bindingContext){var val=ko.utils.unwrapObservable(valueAccessor());var keys=ko.bindingHandlers.popover.keys;var value;_.each(keys,function(key){value=ko.utils.unwrapObservable(val[key]);$(element).data("popover").options[key]=value;});}}; +; + +// source: js/app/bindings/qrcode.js +ko.bindingHandlers.qrcode={update:function(element,valueAccessor,allBindings,viewModel,bindingContext){var val=ko.utils.unwrapObservable(valueAccessor());var defaultOptions={text:"",size:200,fill:"#000",background:null,label:"",fontname:"sans",fontcolor:"#000",radius:0,ecLevel:"L"};var options={};_.each(defaultOptions,function(value,key){options[key]=ko.utils.unwrapObservable(val[key])||value;});$(element).empty().qrcode(options);}}; +; + +// source: js/app/bindings/slimscrolledforeach.js +ko.bindingHandlers.slimScrolledForeach={makeTemplateValueAccessor:function(valueAccessor){var modelValue=valueAccessor(),unwrappedValue=ko.utils.peekObservable(modelValue),result,slimscroll;if(!unwrappedValue||typeof unwrappedValue.length==="number"){result={foreach:modelValue,templateEngine:ko.nativeTemplateEngine.instance};slimscroll={};}else{ko.utils.unwrapObservable(modelValue);result={foreach:unwrappedValue["data"],as:unwrappedValue["as"],includeDestroyed:unwrappedValue["includeDestroyed"],afterAdd:unwrappedValue["afterAdd"],beforeRemove:unwrappedValue["beforeRemove"],afterRender:unwrappedValue["afterRender"],beforeMove:unwrappedValue["beforeMove"],afterMove:unwrappedValue["afterMove"],templateEngine:ko.nativeTemplateEngine.instance};slimscroll=unwrappedValue["slimscroll"];} +return{accessor:function(){return result;},slimscroll:slimscroll};},slimscroll:function(element,options){options=options||{};setTimeout(function(){if(element.nodeName==="#comment"){$(element.parentElement).slimScroll(options);}else{$(element).slimScroll(options);}},10);},init:function(element,valueAccessor,allBindings,viewModel,bindingContext){var prepped=ko.bindingHandlers["slimScrolledForeach"].makeTemplateValueAccessor(valueAccessor);ko.bindingHandlers["slimScrolledForeach"].slimscroll(element,prepped.slimscroll);return ko.bindingHandlers["template"]["init"](element,prepped.accessor);},update:function(element,valueAccessor,allBindings,viewModel,bindingContext){var prepped=ko.bindingHandlers["slimScrolledForeach"].makeTemplateValueAccessor(valueAccessor);var options=$.extend(prepped.slimscroll,{scrollBy:0});ko.bindingHandlers["slimScrolledForeach"].slimscroll(element,options);return ko.bindingHandlers["template"]["update"](element,prepped.accessor,allBindings,viewModel,bindingContext);}};ko.virtualElements.allowedBindings.slimScrolledForeach=true; +; + +// source: js/app/bindings/toggle.js +ko.bindingHandlers.toggle={init:function(element,valueAccessor){var value=valueAccessor();if(!ko.isObservable(value)){throw new Error("toggle binding should be used only with observable values");} +$(element).on("click",function(event){event.preventDefault();var previousValue=ko.utils.unwrapObservable(value);value(!previousValue);});},update:function(element,valueAccessor){ko.utils.toggleDomNodeCssClass(element,"active",ko.utils.unwrapObservable(valueAccessor()));}}; +; + +// source: js/app/bindings/togglecontent.js +ko.bindingHandlers.toggleContent={init:function(element,valueAccessor){var $elm=$(element),options=$.extend({class:null,container:null,parent:null,onComplete:function(){$(document).trigger("slideCompleted");}},valueAccessor());$elm.on("click",function(e){e.preventDefault();if(options.class){$elm.children('[class^="icon-"]').toggleClass(options.class);$elm.children('[class^="fa"]').toggleClass(options.class);} +if(options.container){if(options.parent){$elm.parents(options.parent).find(options.container).stop().slideToggle("fast",options.onComplete);}else{$(options.container).stop().slideToggle("fast",options.onComplete);}}});}}; +; + +// source: js/app/bindings/valuewithinit.js +ko.bindingHandlers.valueWithInit={init:function(element,valueAccessor,allBindingsAccessor,context){var observable=valueAccessor();var value=element.value;observable(value);ko.bindingHandlers.value.init(element,valueAccessor,allBindingsAccessor,context);},update:ko.bindingHandlers.value.update}; +; + +// source: js/app/viewmodels/access.js +$(function(){function AccessViewModel(parameters){var access=this;access.loginState=parameters[0];var GROUP_ADMINS="admins";var GROUP_GUESTS="guests";access.users=(function(){var self={};self.listHelper=new ItemListHelper("users",{name:function(a,b){if(a["name"].toLocaleLowerCase()b["name"].toLocaleLowerCase()) +return 1;return 0;}},{},"name",[],[],CONFIG_USERSPERPAGE);self.emptyUser={name:"",active:false};self.currentUser=ko.observable(self.emptyUser).extend({notify:"always"});self.isCurrentUser=(user)=>{return user&&user.name&&user.name==access.loginState.username();};self.isDeleteUserEnabled=(user)=>{return!self.isCurrentUser(user);};self.editor={name:ko.observable(undefined),groups:ko.observableArray([]),permissions:ko.observableArray([]),password:ko.observable(undefined),currentPassword:ko.observable(undefined),repeatedPassword:ko.observable(undefined),passwordMismatch:ko.pureComputed(function(){return self.editor.password()!==self.editor.repeatedPassword();}),providedUsername:ko.pureComputed(function(){return self.editor.name()&&self.editor.name().trim();}),validUsername:ko.pureComputed(function(){return(!self.editor.name()||self.editor.name()==self.editor.name().trim());}),currentPasswordMismatch:ko.observable(false),apikey:ko.observable(undefined),active:ko.observable(undefined),permissionSelectable:function(permission){return true;},permissionSelected:function(permission){var index=self.editor.permissions().indexOf(permission);return index>=0;},togglePermission:function(permission){var permissions=self.editor.permissions();var index=permissions.indexOf(permission);if(index<0){permissions.push(permission);}else{permissions.splice(index,1);} +self.editor.permissions(permissions);},groupSelected:function(group){var index=self.editor.groups().indexOf(group);return index>=0;},toggleGroup:function(group){var groups=self.editor.groups();var index=groups.indexOf(group);if(index<0){groups.push(group);}else{groups.splice(index,1);} +self.editor.groups(groups);},joinedGroupPermissions:function(group){return access.permissionList(group);},header:ko.observable(undefined),new:ko.observable(true),confirm:undefined,valid:ko.pureComputed(function(){return(self.editor.providedUsername()&&self.editor.validUsername()&&(!self.editor.new()||(self.editor.password()&&self.editor.password().trim()&&!self.editor.passwordMismatch())));}),dangerRestricted:function(){return false;},dangerRestrictedText:gettext("This user may not have dangerous permissions.")};self.userEditorDialog=undefined;self.changePasswordDialog=undefined;self.currentUser.subscribe(function(newValue){if(newValue===undefined){self.editor.name(undefined);self.editor.groups(access.groups.defaults.slice(0));self.editor.permissions([]);self.editor.active(true);self.editor.apikey(undefined);self.editor.header(gettext("Add user"));self.editor.new(true);self.editor.confirm=self.confirmAddUser;}else{self.editor.name(newValue.name);self.editor.groups(newValue.groups.slice(0));self.editor.permissions(newValue.permissions.slice(0));self.editor.active(newValue.active);self.editor.apikey(newValue.apikey);self.editor.header(_.sprintf(gettext('Edit user "%(name)s"'),{name:newValue.name}));self.editor.new(false);self.editor.confirm=self.confirmEditUser;} +self.editor.password(undefined);self.editor.repeatedPassword(undefined);self.editor.currentPassword(undefined);self.editor.currentPasswordMismatch(false);});self.editor.currentPassword.subscribe(function(){self.editor.currentPasswordMismatch(false);});self.requestData=function(){if(!CONFIG_ACCESS_CONTROL)return;if(!access.loginState.hasPermissionKo(access.permissions.ADMIN))return;return OctoPrint.access.users.list().done(self.fromResponse);};self.fromResponse=function(response){self.listHelper.updateItems(response.users);};self.showAddUserDialog=function(){if(!CONFIG_ACCESS_CONTROL)return;access.loginState.reauthenticateIfNecessary(()=>{self.currentUser(undefined);$('ul.nav-pills a[data-toggle="tab"]:first',self.userEditorDialog).tab("show");self.userEditorDialog.modal({minHeight:function(){return Math.max($.fn.modal.defaults.maxHeight()-80,250);}}).css({"margin-left":function(){return-($(this).width()/2);}});});};self.confirmAddUser=function(){if(!CONFIG_ACCESS_CONTROL)return;var user={name:self.editor.name(),password:self.editor.password(),groups:self.editor.groups(),permissions:self.editor.permissions(),active:self.editor.active()};access.loginState.reauthenticateIfNecessary(()=>{self.addUser(user).done(function(){self.currentUser(undefined);self.userEditorDialog.modal("hide");});});};self.showEditUserDialog=function(user){if(!CONFIG_ACCESS_CONTROL)return;var process=function(user){self.currentUser(user);$('ul.nav-pills a[data-toggle="tab"]:first',self.userEditorDialog).tab("show");self.userEditorDialog.modal({minHeight:function(){return Math.max($.fn.modal.defaults.maxHeight()-80,250);}}).css({"margin-left":function(){return-($(this).width()/2);}});};access.loginState.reauthenticateIfNecessary(()=>{OctoPrint.users.get(user.name).done(function(data){process(data);}).fail(function(){log.warn("Could not fetch current user data, proceeding with client side data copy");process(user);});});};self.confirmEditUser=function(){if(!CONFIG_ACCESS_CONTROL)return;var user=self.currentUser();user.active=self.editor.active();user.groups=self.editor.groups();user.permissions=self.editor.permissions();access.loginState.reauthenticateIfNecessary(()=>{self.updateUser(user).done(function(){self.currentUser(undefined);self.userEditorDialog.modal("hide");});});};self.confirmRemoveUser=(user)=>{if(!CONFIG_ACCESS_CONTROL)return;if(user.name===access.loginState.username()){new PNotify({title:gettext("Not possible"),text:gettext("You may not delete your own account."),type:"error"});return $.Deferred().reject("You may not delete your own account").promise();} +access.loginState.reauthenticateIfNecessary(()=>{showConfirmationDialog({title:gettext("Are you sure?"),message:_.sprintf(gettext('You are about to delete the user "%(name)s".'),{name:_.escape(user.name)}),proceed:gettext("Delete"),onproceed:()=>{self.removeUser(user);}});});};self.showChangePasswordDialog=function(user){if(!CONFIG_ACCESS_CONTROL)return;const proceed=()=>{self.currentUser(user);self.changePasswordDialog.modal("show");};if(self.isCurrentUser(user)){proceed();}else{access.loginState.reauthenticateIfNecessary(proceed);}};self.confirmChangePassword=function(){if(!CONFIG_ACCESS_CONTROL)return;const proceed=()=>{self.updatePassword(self.currentUser().name,self.editor.password(),self.editor.currentPassword()).done(function(){self.currentUser(undefined);self.changePasswordDialog.modal("hide");}).fail(function(xhr){if(xhr.status===403){self.currentPasswordMismatch(true);}});};if(self.isCurrentUser()){proceed();}else{access.loginState.reauthenticateIfNecessary(proceed);}};self.confirmGenerateApikey=function(){if(!CONFIG_ACCESS_CONTROL)return;access.loginState.reauthenticateIfNecessary(()=>{self.generateApikey(self.currentUser().name).done(function(response){self._updateApikey(response.apikey);});});};self.copyApikey=function(){copyToClipboard(self.editor.apikey());};self._updateApikey=function(apikey){self.editor.apikey(apikey);self.requestData();};self.confirmDeleteApikey=function(){if(!CONFIG_ACCESS_CONTROL)return;access.loginState.reauthenticateIfNecessary(()=>{self.deleteApikey(self.currentUser().name).done(function(){self._updateApikey(undefined);});});};self.onStartup=function(){self.userEditorDialog=$("#settings-usersEditorDialog");self.changePasswordDialog=$("#settings-usersDialogChangePassword");};self.addUser=function(user){if(!user){throw OctoPrint.InvalidArgumentError("user must be set");} +if(!access.loginState.hasPermissionKo(access.permissions.ADMIN)){return $.Deferred().reject("You are not authorized to perform this action").promise();} +if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();} +return OctoPrint.access.users.add(user).done(self.fromResponse);};self.removeUser=function(user){if(!user){throw OctoPrint.InvalidArgumentError("user must be set");} +if(!access.loginState.hasPermissionKo(access.permissions.ADMIN)){return $.Deferred().reject("You are not authorized to perform this action").promise();} +if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();} +return OctoPrint.access.users.delete(user.name).done(self.fromResponse);};self.updateUser=function(user){if(!user){throw OctoPrint.InvalidArgumentError("user must be set");} +if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();} +return OctoPrint.access.users.update(user.name,user.active,user.admin,user.permissions,user.groups).done(self.fromResponse);};self.updatePassword=function(username,password,current){if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();} +return OctoPrint.access.users.changePassword(username,password,current);};self.generateApikey=function(username){if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();} +return OctoPrint.access.users.generateApiKey(username).done(function(){self.requestData();});};self.deleteApikey=function(username){if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();} +return OctoPrint.access.users.resetApiKey(username);};return self;})();access.groups=(function(){var self={};self.listHelper=new ItemListHelper("groups",{name:function(a,b){if(a["name"].toLocaleLowerCase()b["name"].toLocaleLowerCase()) +return 1;return 0;}},{},"name",[],[],CONFIG_GROUPSPERPAGE);self.groupsList=self.listHelper.items;self.lookup={};self.defaults=[];self.emptyGroup={name:""};self.currentGroup=ko.observable(self.emptyGroup);self.editor={key:ko.observable(undefined),name:ko.observable(undefined),description:ko.observable(undefined),permissions:ko.observableArray([]),subgroups:ko.observableArray([]),default:ko.observable(false),permissionSelectable:function(permission){return self.editor.key()!==GROUP_GUESTS||!permission.dangerous;},permissionSelected:function(permission){var index=self.editor.permissions().indexOf(permission);return index>=0;},togglePermission:function(permission){var permissions=self.editor.permissions();var index=permissions.indexOf(permission);if(index<0){permissions.push(permission);}else{permissions.splice(index,1);} +self.editor.permissions(permissions);},subgroupSelectable:function(subgroup){return(self.editor.key()!==subgroup.key&&(self.editor.key()!==GROUP_GUESTS||!subgroup.dangerous));},subgroupSelected:function(subgroup){var index=self.editor.subgroups().indexOf(subgroup);return index>=0;},toggleSubgroup:function(subgroup){var subgroups=self.editor.subgroups();var index=subgroups.indexOf(subgroup);if(index<0){subgroups.push(subgroup);}else{subgroups.splice(index,1);} +self.editor.subgroups(subgroups);},joinedGroupPermissions:function(group){return access.permissionList(group);},header:ko.observable(undefined),new:ko.observable(true),confirm:undefined,valid:ko.pureComputed(function(){return self.editor.name()&&self.editor.name().trim();}),dangerRestricted:function(){return self.editor.key()===GROUP_GUESTS;},dangerRestrictedText:gettext("This group may not have dangerous permissions or subgroups.")};self.groupEditorDialog=undefined;self.groupsList.subscribe(function(oldValue){if(oldValue===undefined||oldValue.length===0)return;oldValue.forEach(function(p){delete self[p.key.toUpperCase()];});},null,"beforeChange");self.groupsList.subscribe(function(newValue){if(newValue===undefined)return;newValue.forEach(function(g){var needs=[];g.permissions.forEach(function(p){for(var key in p.needs){p.needs[key].forEach(function(value){needs.push(access.permissions.need(key,value));});}});if(needs.length>0){self.registerGroup(g.key.toUpperCase(),needs);}});});self.registerGroup=function(name,group){Object.defineProperty(self,name,{value:group,enumerable:true,configurable:true});};self.currentGroup.subscribe(function(newValue){if(newValue===undefined){self.editor.key(undefined);self.editor.name(undefined);self.editor.description(undefined);self.editor.permissions([]);self.editor.subgroups([]);self.editor.default(false);self.editor.header(gettext("Add group"));self.editor.new(true);self.editor.confirm=self.confirmAddGroup;}else{self.editor.key(newValue.key);self.editor.name(newValue.name);self.editor.description(newValue.description);self.editor.permissions(newValue.permissions.slice(0));self.editor.subgroups(newValue.subgroups.slice(0));self.editor.default(newValue.default);self.editor.header(_.sprintf(gettext('Edit group "%(name)s"'),{name:newValue.name}));self.editor.new(false);self.editor.confirm=self.confirmEditGroup;}});self.requestData=function(){return OctoPrint.access.groups.list().done(self.fromResponse);};self.fromResponse=function(response){var lookup={};var defaults=[];_.each(response.groups,function(group){lookup[group.key]=group;if(group.default){defaults.push(group.key);}});self.lookup=lookup;self.defaults=defaults;self.listHelper.updateItems(response.groups);};self.showAddGroupDialog=function(){access.loginState.reauthenticateIfNecessary(()=>{self.currentGroup(undefined);$('ul.nav-pills a[data-toggle="tab"]:first',self.groupEditorDialog).tab("show");self.groupEditorDialog.modal({minHeight:function(){return Math.max($.fn.modal.defaults.maxHeight()-80,250);}}).css({"margin-left":function(){return-($(this).width()/2);}});});};self.confirmAddGroup=function(){var group={key:self.editor.name().toLowerCase().replace(/[^a-z0-9_ ]/g,"").replace(/ /g,"_"),name:self.editor.name(),description:self.editor.description(),permissions:self.editor.permissions(),subgroups:self.editor.subgroups(),default:self.editor.default()};self.addGroup(group).done(function(){self.currentGroup(undefined);self.groupEditorDialog.modal("hide");});};self.showEditGroupDialog=function(group){if(!group.changeable)return;access.loginState.reauthenticateIfNecessary(()=>{self.currentGroup(group);$('ul.nav-pills a[data-toggle="tab"]:first',self.groupEditorDialog).tab("show");self.groupEditorDialog.modal({minHeight:function(){return Math.max($.fn.modal.defaults.maxHeight()-80,250);}}).css({"margin-left":function(){return-($(this).width()/2);}});});};self.confirmEditGroup=function(){var group=self.currentGroup();var data={key:group.key,name:group.name,description:self.editor.description(),permissions:self.editor.permissions(),subgroups:self.editor.subgroups(),default:self.editor.default()};self.updateGroup(data).done(function(){self.currentGroup(undefined);self.groupEditorDialog.modal("hide");});};self.confirmRemoveGroup=(group)=>{if(!group.removable)return;access.loginState.reauthenticateIfNecessary(()=>{showConfirmationDialog({title:gettext("Are you sure?"),message:_.sprintf(gettext('You are about to delete the group "%(name)s".'),{name:_.escape(group.name)}),proceed:gettext("Delete"),onproceed:()=>{self.removeGroup(group);}});});};self.onStartup=function(){self.groupEditorDialog=$("#settings-groupsEditorDialog");};self.addGroup=function(group){if(!group){throw OctoPrint.InvalidArgumentError("group must be set");} +if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();} +return OctoPrint.access.groups.add(group).done(self.fromResponse);};self.removeGroup=function(group){if(!group){throw OctoPrint.InvalidArgumentError("group must be set");} +if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();} +OctoPrint.access.groups.delete(group.key).done((response)=>{self.fromResponse(response);access.users.requestData();});};self.updateGroup=function(group){if(!group){throw OctoPrint.InvalidArgumentError("group must be set");} +if(!access.loginState.credentialsSeen()){return $.Deferred().reject("You need to reauthenticate to perform this action").promise();} +return OctoPrint.access.groups.update(group).done(self.fromResponse);};return self;})();access.permissions=(function(){var self={};self.need=function(method,value){return{method:method,value:value};};self.roleNeed=function(value){return self.need("role",value);};self.permissionList=ko.observableArray([]);self.lookup={};var registeredPermissions=[];var registerPermission=function(key,permission){Object.defineProperty(self,key,{value:permission,enumerable:true,configurable:true});registeredPermissions.push(key);};var clearAllRegisteredPermissions=function(){_.each(registeredPermissions,function(key){delete self[key];});registeredPermissions=[];};self.initialize=function(){clearAllRegisteredPermissions();var permissionList=[];var lookup={};_.each(PERMISSIONS,function(permission){var needs=[];_.each(permission.needs,function(value,key){needs.push(self.need(key,value));});if(needs.length>0){registerPermission(permission.key,needs);} +if(!permission.combined){permissionList.push(permission);} +lookup[permission.key]=permission;});permissionList.sort(access.permissionComparator);self.permissionList(permissionList);self.lookup=lookup;};return self;})();access.groupComparator=function(a,b){var nameA=a.name?a.name.toUpperCase():"";var nameB=b.name?b.name.toUpperCase():"";if(nameAnameB){return 1;}else{return 0;}};access.permissionComparator=function(a,b){var nameA=a.name?a.name.toUpperCase():"";var nameB=b.name?b.name.toUpperCase():"";var pluginA=a.plugin||"";var pluginB=b.plugin||"";var compA=pluginA+":"+nameA;var compB=pluginB+":"+nameB;if(compAcompB){return 1;}else{return 0;}};access.groupList=function(data){if(data.groups===undefined)return"";var mappedGroups=_.filter(_.map(data.groups,function(g){return access.groups.lookup[g];}),function(g){return g!==undefined;});mappedGroups.sort(access.groupComparator);return _.map(mappedGroups,function(g){return g.name;}).join(", ");};access.subgroupList=function(data){if(data.subgroups===undefined)return"";var mappedGroups=_.filter(_.map(data.subgroups,function(g){return access.groups.lookup[g];}),function(g){return g!==undefined;});mappedGroups.sort(access.groupComparator);return _.map(mappedGroups,function(g){return g.name;}).join(", ");};access.permissionList=function(data){if(!data||data.permissions===undefined)return"";var mappedPermissions=_.filter(_.map(data.permissions,function(p){return access.permissions.lookup[p];}),function(p){return p!==undefined;});mappedPermissions.sort(access.permissionComparator);return _.map(mappedPermissions,function(p){return p.name;}).join(", ");};access.onStartup=function(){access.groups.onStartup();access.users.onStartup();};access.onServerConnect=function(){access.permissions.initialize();};access.onServerReconnect=function(){access.permissions.initialize();};access.onUserPermissionsChanged=access.onUserLoggedIn=access.onUserLoggedOut=function(user){if(access.loginState.hasPermission(access.permissions.ADMIN)){access.groups.requestData().done(function(){access.users.requestData();});}};} +OCTOPRINT_VIEWMODELS.push([AccessViewModel,["loginStateViewModel"],[]]);}); +; + +// source: js/app/viewmodels/appearance.js +$(function(){var save={};function themeFavicon(colorname){save.colorName=colorname;var link=document.querySelector("link[rel='shortcut icon']");if(!link){link=document.createElement("link");link.setAttribute("rel","shortcut icon");document.head.appendChild(link);} +var faviconUrl=document.querySelector("link[rel~='mask-icon-theme']").href||link.href||window.location.origin+"/favicon.ico";function onImageLoaded(){var icosize=256;var canvas=document.createElement("canvas");canvas.width=icosize;canvas.height=icosize;var context=canvas.getContext("2d");function grayscale(){var imageData=context.getImageData(0,0,canvas.width,canvas.height),pixels=imageData.data,i,l,r,g,b,a,luma;for(i=0,l=pixels.length;i0||self.settings.settings.serial.ignoreEmptyPorts());});self.enablePort=ko.pureComputed(function(){return self.validPort()&&self.isErrorOrClosed();});self.enableSaveSettings=ko.pureComputed(function(){return self.enableConnect()&&self.isErrorOrClosed();});self.enableAutoConnect=ko.pureComputed(function(){return self.enableConnect()&&self.isErrorOrClosed();});self.previousIsOperational=undefined;self.refreshVisible=ko.observable(true);self.requestData=function(){if(!self.loginState.hasPermission(self.access.permissions.CONNECTION)){return;} +OctoPrint.connection.getSettings().done(self.fromResponse);};self.fromResponse=function(response){var ports=response.options.ports;var baudrates=response.options.baudrates;var currentPort=response.current.port;var currentBaudrate=response.current.baudrate;var currentPrinterProfile=response.current.printerProfile;var portPreference=response.options.portPreference;var baudratePreference=response.options.baudratePreference;var printerPreference=response.options.printerProfilePreference;var printerProfiles=response.options.printerProfiles;self.portOptions(ports);self.baudrateOptions(baudrates);if(!self.selectedPort()&&ports){if(ports.indexOf(currentPort)>=0){self.selectedPort(currentPort);}else if(ports.indexOf(portPreference)>=0){self.selectedPort(portPreference);}} +if(!self.selectedBaudrate()&&baudrates){if(baudrates.indexOf(currentBaudrate)>=0){self.selectedBaudrate(currentBaudrate);}else if(baudrates.indexOf(baudratePreference)>=0){self.selectedBaudrate(baudratePreference);}} +if(!self.selectedPrinter()&&printerProfiles){if(printerProfiles.indexOf(currentPrinterProfile)>=0){self.selectedPrinter(currentPrinterProfile);}else if(printerProfiles.indexOf(printerPreference)>=0){self.selectedPrinter(printerPreference);}} +self.saveSettings(false);self.portOptionsFetched(true);};self.fromHistoryData=function(data){self._processStateData(data.state);};self.fromCurrentData=function(data){self._processStateData(data.state);};self.openOrCloseOnStateChange=function(force){if(!self._startupComplete&&!force)return;var connectionTab=$("#connection");if(self.isOperational()&&connectionTab.hasClass("in")){connectionTab.collapse("hide");self.refreshVisible(false);}else if(!self.isOperational()&&!connectionTab.hasClass("in")){connectionTab.collapse("show");self.refreshVisible(true);}};self._processStateData=function(data){self.previousIsOperational=self.isOperational();self.isErrorOrClosed(data.flags.closedOrError);self.isOperational(data.flags.operational);self.isPaused(data.flags.paused);self.isPrinting(data.flags.printing);self.isError(data.flags.error);self.isReady(data.flags.ready);self.isLoading(data.flags.loading);if(self.previousIsOperational!==self.isOperational()){self.openOrCloseOnStateChange();}};self.connect=function(){if(self.isErrorOrClosed()){var data={port:self.selectedPort()||"AUTO",baudrate:self.selectedBaudrate()||0,printerProfile:self.selectedPrinter(),autoconnect:self.settings.serial_autoconnect()};if(self.saveSettings())data["save"]=true;OctoPrint.connection.connect(data).done(function(){self.settings.requestData();self.settings.printerProfiles.requestData();});}else{if(!self.isPrinting()&&!self.isPaused()){self.requestData();OctoPrint.connection.disconnect();}else{showConfirmationDialog({title:gettext("Are you sure?"),message:gettext("

You are about to disconnect from the printer while a print "+"is in progress.

"+"

Disconnecting while a print is in progress will prevent OctoPrint from "+"completing the print. If you're printing from an SD card attached directly "+"to the printer, any attempt to restart OctoPrint or reconnect to the printer "+"could interrupt the print.

"),question:gettext("Are you sure you want to disconnect from the printer?"),cancel:gettext("Stay Connected"),proceed:gettext("Disconnect"),onproceed:function(){self.requestData();OctoPrint.connection.disconnect();}});}}};self.onEventSettingsUpdated=function(){self.requestData();};self.onEventConnected=function(){self.requestData();};self.onEventDisconnected=function(){self.requestData();};self.onEventConnectionsAutorefreshed=function(){self.requestData();};self.onStartup=function(){var connectionTab=$("#connection");connectionTab.on("show",function(){self.refreshVisible(true);});connectionTab.on("hide",function(){self.refreshVisible(false);});};self.onStartupComplete=function(){self.openOrCloseOnStateChange(true);};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){self.requestData();};} +OCTOPRINT_VIEWMODELS.push({construct:ConnectionViewModel,dependencies:["loginStateViewModel","settingsViewModel","printerProfilesViewModel","accessViewModel"],elements:["#connection_wrapper"]});}); +; + +// source: js/app/viewmodels/control.js +$(function(){function ControlViewModel(parameters){var self=this;self.loginState=parameters[0];self.settings=parameters[1];self.access=parameters[2];self._createToolEntry=function(){return{name:ko.observable(),key:ko.observable()};};self.isErrorOrClosed=ko.observable(undefined);self.isOperational=ko.observable(undefined);self.isPrinting=ko.observable(undefined);self.isPaused=ko.observable(undefined);self.isError=ko.observable(undefined);self.isReady=ko.observable(undefined);self.isLoading=ko.observable(undefined);self.extrusionAmount=ko.observable(undefined);self.controls=ko.observableArray([]);self.distances=ko.observableArray([0.1,1,10,100]);self.distance=ko.observable(10);self.tools=ko.observableArray([]);self.feedRate=ko.observable();self.flowRate=ko.observable();self.feedbackControlLookup={};self.controlsFromServer=[];self.additionalControls=[];self.intersectionObservers=[];self.keycontrolActive=ko.observable(false);self.keycontrolHelpActive=ko.observable(false);self.keycontrolPossible=ko.pureComputed(function(){return(self.loginState.hasPermission(self.access.permissions.CONTROL)&&self.settings.feature_keyboardControl()&&self.isOperational()&&!self.isPrinting()&&!$.browser.mobile);});self.showKeycontrols=ko.pureComputed(function(){return self.keycontrolPossible();});self._visibleWebcam=undefined;self._dispatchWebcamRefresh=function(target){log.debug(`Webcam refresh triggered for #${target.id}`);var vm=ko.dataFor(target.children[0]);if(vm===self){log.debug(`VM for webcam #${target.id} is not bound, skipping refresh`);}else if(vm===undefined){log.debug(`VM for webcam #${target.id} not found, skipping refresh`);}else if(typeof vm.onWebcamRefresh==="function"){vm.onWebcamRefresh();}else{log.debug(`VM for webcam #${target.id} does not declare 'onWebcamRefresh()', skipping refresh (vm=${vm.constructor.name})`);}};self._dispatchWebcamVisibilityChange=function(target,visible){log.debug(`Webcam visibility of #${target.id} changed to ${visible}`);var vm=ko.dataFor(target.children[0]);if(vm===self){log.debug(`VM for webcam #${target.id} is not bound, skipping visibility update`);}else if(vm===undefined){log.debug(`VM for webcam #${target.id} not found, skipping visibility update`);}else if(typeof vm.onWebcamVisibilityChange==="function"){vm.onWebcamVisibilityChange(visible);}else{log.debug(`VM for webcam #${target.id} does not declare 'onWebcamVisibilityChange(visible)', skipping visibility update (vm=${vm.constructor.name})`);}};const selectedCameraStorageKey="core.control.selectedCamera";self.selectDefaultWebcam=function(){if(!document.querySelector("#webcam_plugins_container .nav")){$("#webcam-group .tab-pane:first").addClass("active");return;} +let div=localStorage[selectedCameraStorageKey];if(!div||document.getElementById(div.slice(1))===null){div=undefined;} +if(div!==undefined){$(`${div}_link a`).tab("show");}else{$("#webcam_plugins_container .nav li:first a").tab("show");}};self.onStartupComplete=function(){$("#webcam_plugins_container .nav a[data-toggle='tab']").on("shown",(e)=>{localStorage[selectedCameraStorageKey]=e.target.hash;});self.selectDefaultWebcam();self.recreateIntersectionObservers();};self.recreateIntersectionObservers=function(){self.intersectionObservers.forEach(function(observer){observer.disconnect();});self.intersectionObservers=[];document.querySelectorAll("#webcam-group .tab-pane").forEach(function(target){var options={root:document.querySelector("#webcam_plugins_container"),rootMargin:"0px",threshold:0.01};var callback=function(entries){var visible=entries[0].isIntersecting;self._dispatchWebcamVisibilityChange(target,visible);if(visible){self._visibleWebcam=target;}else if(self._visibleWebcam===target&&!visible){self._visibleWebcam=undefined;}};var observer=new IntersectionObserver(callback,options);observer.observe(target);self.intersectionObservers.push(observer);});};self.onBrowserTabVisibilityChange=function(tabVisible){if(self._visibleWebcam!==undefined){self._dispatchWebcamVisibilityChange(self._visibleWebcam,tabVisible);}};self.refreshWebcam=function(){if(self._visibleWebcam!==undefined){self._dispatchWebcamRefresh(self._visibleWebcam);}};self.settings.printerProfiles.currentProfileData.subscribe(function(){self._updateExtruderCount();self._updateExtrusionAmount();const data=self.settings.printerProfiles.currentProfileData();if(data&&data.extruder){if(data.extruder.defaultExtrusionLength){data.extruder.defaultExtrusionLength.subscribe(self._updateExtrusionAmount);} +if(data.extruder.count){data.extruder.count.subscribe(self._updateExtruderCount);}} +self.settings.printerProfiles.currentProfileData().extruder.count.subscribe(self._updateExtruderCount);});self._updateExtrusionAmount=function(){const data=self.settings.printerProfiles.currentProfileData();if(!data||!data.extruder){return;} +self.extrusionAmount(self.settings.printerProfiles.currentProfileData().extruder.defaultExtrusionLength());};self._updateExtruderCount=function(){const data=self.settings.printerProfiles.currentProfileData();if(!data||!data.extruder||!data.extruder.count){return;} +var tools=[];var numExtruders=self.settings.printerProfiles.currentProfileData().extruder.count();if(numExtruders>1){for(var extruder=0;extruder0){self.additionalControls=additionalControls;self.rerenderControls();}};self.onFocus=function(data,event){if(!self.settings.feature_keyboardControl())return;self.keycontrolActive(true);};self.onMouseOver=function(data,event){if(!self.settings.feature_keyboardControl())return;$("#webcam_plugins_container").focus();self.keycontrolActive(true);};self.onMouseOut=function(data,event){if(!self.settings.feature_keyboardControl())return;$("#webcam_plugins_container").blur();self.keycontrolActive(false);};self.toggleKeycontrolHelp=function(){self.keycontrolHelpActive(!self.keycontrolHelpActive());};self.onKeyDown=function(data,event){if(!self.settings.feature_keyboardControl())return;var button=undefined;var visualizeClick=true;switch(event.which){case 37:button=$("#control-xdec");break;case 38:button=$("#control-yinc");break;case 39:button=$("#control-xinc");break;case 40:button=$("#control-ydec");break;case 49:case 97:button=$("#control-distance01");visualizeClick=false;break;case 50:case 98:button=$("#control-distance1");visualizeClick=false;break;case 51:case 99:button=$("#control-distance10");visualizeClick=false;break;case 52:case 100:button=$("#control-distance100");visualizeClick=false;break;case 33:case 87:button=$("#control-zinc");break;case 34:case 83:button=$("#control-zdec");break;case 36:button=$("#control-xyhome");break;case 35:button=$("#control-zhome");break;case 9:event.preventDefault();return false;default:return true;} +if(button===undefined){return false;}else{event.preventDefault();if(visualizeClick){button.addClass("active");setTimeout(function(){button.removeClass("active");},150);} +button.click();}};self.stripDistanceDecimal=function(distance){return distance.toString().replace(".","");};} +OCTOPRINT_VIEWMODELS.push({construct:ControlViewModel,dependencies:["loginStateViewModel","settingsViewModel","accessViewModel"],elements:["#control","#control_link"]});}); +; + +// source: js/app/viewmodels/files.js +$(function(){function FilesViewModel(parameters){var self=this;self.settingsViewModel=parameters[0];self.loginState=parameters[1];self.printerState=parameters[2];self.slicing=parameters[3];self.printerProfiles=parameters[4];self.access=parameters[5];self.allViewModels=undefined;self.filesListVisible=ko.observable(true);self.showInternalFilename=ko.observable(true);self.isErrorOrClosed=ko.observable(undefined);self.isOperational=ko.observable(undefined);self.isPrinting=ko.observable(undefined);self.isPaused=ko.observable(undefined);self.isError=ko.observable(undefined);self.isReady=ko.observable(undefined);self.isLoading=ko.observable(undefined);self.isSdReady=ko.observable(undefined);self.searchQuery=ko.observable(undefined);self.searchQuery.subscribe(function(){self.performSearch();});self.freeSpace=ko.observable(undefined);self.totalSpace=ko.observable(undefined);self.freeSpaceString=ko.pureComputed(function(){if(!self.freeSpace())return"-";return formatSize(self.freeSpace());});self.totalSpaceString=ko.pureComputed(function(){if(!self.totalSpace())return"-";return formatSize(self.totalSpace());});self.diskusageWarning=ko.pureComputed(function(){return(self.freeSpace()!==undefined&&self.freeSpace()0);},sd:function(data){return data["origin"]&&data["origin"]==="sdcard";},local:function(data){return!(data["origin"]&&data["origin"]==="sdcard");}};var listHelperExclusiveFilters=[["sd","local"]];if(SUPPORTED_FILETYPES.length>1){_.each(SUPPORTED_FILETYPES,function(filetype){listHelperFilters[filetype]=function(data){return(data["type"]&&(data["type"]===filetype||data["type"]==="folder"));};});listHelperExclusiveFilters.push(SUPPORTED_FILETYPES);} +var sortByName=function(a,b){if(a["display"].toLowerCase()b["display"].toLowerCase())return 1;return 0;};self.listHelper=new ItemListHelper("gcodeFiles",{name:sortByName,upload:function(a,b){if(a["date"]===undefined&&b["date"]===undefined){return sortByName(a,b);} +if(b["date"]===undefined||a["date"]>b["date"])return-1;if(a["date"]===undefined||a["date"]valB){return-1;}else if(valAb["size"])return-1;if(a["size"]===undefined||a["size"]=1){if(arguments.length>=2){focus={location:arguments[1],path:arguments[0]};}else{focus={location:"local",path:arguments[0]};}} +if(arguments.length>=3){switchToPath=arguments[2];} +if(arguments.length>=4){force=arguments[3];}} +self._filesToFocus=self._filesToFocus||focus;self._switchToPath=self._switchToPath||switchToPath;if(self._otherRequestInProgress!==undefined){return self._otherRequestInProgress;} +return(self._otherRequestInProgress=OctoPrint.files.list(true,force).done(function(response){self.fromResponse(response,{focus:self._filesToFocus,switchToPath:self._switchToPath});}).fail(function(){self.allItems(undefined);self.listHelper.updateItems([]);}).always(function(){self._otherRequestInProgress=undefined;self._filesToFocus=[];self._switchToPath=undefined;}));};self.fromResponse=function(response,params){var focus=[];var switchToPath;if(_.isObject(params)){focus=params.focus||undefined;switchToPath=params.switchToPath||undefined;}else if(arguments.length>1){log.warn("FilesViewModel.fromResponse called with old argument list. That is deprecated, please use parameter object instead.");if(arguments.length>2){focus={location:arguments[2],path:arguments[1]};}else{focus={location:"local",path:arguments[1]};} +if(arguments.length>3){switchToPath=arguments[3]||undefined;}} +var files=response.files;self.allItems(files);var createFolderList=function(entries){var result=[];_.each(entries,function(entry){if(entry.type!=="folder")return;result.push("/"+entry.path);if(entry.children){result=result.concat(createFolderList(entry.children));}});return result;};const folders=createFolderList(files);folders.sort();self.folderList(["/"].concat(folders));var nonrecursive=false;_.each(files,function(file){if(file.type==="folder"&&file.children===undefined){nonrecursive=true;}});if(nonrecursive){log.error("At least one folder doesn't have a 'children' element defined. That means the file list request "+"wasn't actually made with 'recursive=true' in the query.\n\n"+"This can happen on wrong reverse proxy configs that "+"swallow up query parameters, see https://github.com/OctoPrint/OctoPrint/issues/2572");} +if(!switchToPath){var currentPath=self.currentPath();if(currentPath===undefined){self.listHelper.updateItems(files);self.currentPath("");}else{self.changeFolderByPath(currentPath);}}else{self.changeFolderByPath(switchToPath);} +if(focus.length){_.each(focus,function(focusItem,index){var entryElement=self.getEntryElement({path:focusItem.path,origin:focusItem.location});if(entryElement){if(index+1===focus.length){self.listElement.scrollTop(entryElement.offsetTop);} +var element=$(entryElement);element.on("webkitAnimationEnd oanimationend msAnimationEnd animationend",function(e){element.removeClass("highlight");});element.addClass("highlight");}});} +if(response.free!==undefined){self.freeSpace(response.free);} +if(response.total!==undefined){self.totalSpace(response.total);} +self.highlightCurrentFile();};self.changeFolder=function(data){if(data.children===undefined){log.error("Can't switch to folder '"+data.path+"', no children available");return;} +self.currentPath(data.path);self.listHelper.updateItems(data.children);self.highlightCurrentFile();};self.navigateUp=function(){var path=self.currentPath().split("/");path.pop();self.changeFolderByPath(path.join("/"));};self.changeFolderByPath=function(path){var element=self.elementByPath(path);if(element){self.currentPath(path);self.listHelper.updateItems(element.children);}else{self.currentPath("");self.listHelper.updateItems(self.allItems());} +self.highlightCurrentFile();};self.showAddFolderDialog=function(){if(!self.loginState.hasPermission(self.access.permissions.FILES_UPLOAD)) +return;if(self.addFolderDialog){self.addFolderName("");self.addFolderDialog.modal("show");}};self.addFolder=function(){if(!self.loginState.hasPermission(self.access.permissions.FILES_UPLOAD)) +return;var name=self.addFolderName();var location="local";self.ignoreUpdatedFilesEvent=true;self.addingFolder(true);OctoPrint.files.createFolder(location,name,self.currentPath()).done(function(data){self.requestData({focus:{path:data.folder.name,location:data.folder.origin}}).done(function(){self.addFolderDialog.modal("hide");}).always(function(){self.addingFolder(false);});}).fail(function(){self.addingFolder(false);}).always(function(){self.ignoreUpdatedFilesEvent=false;});};self.removeFolder=function(folder,event){if(!self.loginState.hasPermission(self.access.permissions.FILES_DELETE)) +return;if(!folder){return;} +if(folder.type!=="folder"){return;} +if(folder.weight>0){var options={message:_.sprintf(gettext('You are about to delete the folder "%(folder)s" which still contains files and/or sub folders.'),{folder:_.escape(folder.name)}),onproceed:function(){self._removeEntry(folder,event);}};showConfirmationDialog(options);}else{self._removeEntry(folder,event);}};self.loadFile=function(data,printAfterLoad){if(!self.loginState.hasPermission(self.access.permissions.FILES_SELECT)) +return;if(!data){return;} +var proceed=function(p){var prevented=false;var callback=function(){OctoPrint.files.select(data.origin,data.path,p);};if(p){callViewModels(self.allViewModels,"onBeforePrintStart",function(method){prevented=prevented||method(callback)===false;});} +if(!prevented){callback();}};if(printAfterLoad&&self.listHelper.isSelectedByMatcher(function(item){return item&&item.origin===data.origin&&item.path===data.path;})&&self.enablePrint(data)){self.printerState.print();}else{var withinPrintDimensions=self.evaluatePrintDimensions(data,true);var print=printAfterLoad&&withinPrintDimensions;if(print&&self.settingsViewModel.feature_printStartConfirmation()){showConfirmationDialog({message:gettext("This will start a new print job. Please check that the print bed is clear."),question:gettext("Do you want to start the print job now?"),cancel:gettext("No"),proceed:gettext("Yes"),onproceed:function(){proceed(print);},nofade:true});}else{proceed(print);}}};self.showMoveDialog=function(entry,event){if(!self.loginState.hasAllPermissions(self.access.permissions.FILES_UPLOAD,self.access.permissions.FILES_DELETE)){return;} +if(!entry){return;} +if(entry.origin!=="local"){return;} +if(!self.moveDialog){return;} +var slashPos=entry.path.lastIndexOf("/");var current;if(slashPos>=0){current="/"+entry.path.substr(0,slashPos);}else{current="/";} +self.moveEntry(entry);self.moveError("");self.moveSource(current);self.moveDestination(current);self.moveSourceFilename(entry.name);self.moveDestinationFilename(entry.name);self.moveDialog.modal("show");};self.removeFile=function(file,event){if(!self.loginState.hasPermission(self.access.permissions.FILES_DELETE)) +return;if(!file){return;} +if(file.type==="folder"){return;} +self._removeEntry(file,event);};self.sliceFile=function(file){if(!self.loginState.hasPermission(self.access.permissions.SLICE))return;if(!file){return;} +self.slicing.show(file.origin,file.path,true,undefined,{display:file.display});};self.initSdCard=function(){if(!self.loginState.hasPermission(self.access.permissions.CONTROL))return;OctoPrint.printer.initSd();};self.releaseSdCard=function(){if(!self.loginState.hasPermission(self.access.permissions.CONTROL))return;OctoPrint.printer.releaseSd();};self.refreshSdFiles=function(){if(!self.loginState.hasPermission(self.access.permissions.CONTROL))return;OctoPrint.printer.refreshSd();};self.moveFileOrFolder=function(source,destination){self.movingFileOrFolder(true);return OctoPrint.files.move("local",source,destination).done(function(){self.requestData().done(function(){self.moveDialog.modal("hide");}).always(function(){self.movingFileOrFolder(false);});}).fail(function(){self.moveError(gettext("Unable to move file or folder")+" "+ +self.moveEntry().display+" "+ +gettext("to")+" "+ +self.moveDestination());self.movingFileOrFolder(false);});};self._removeEntry=function(entry,event){self.activeRemovals.push(entry.origin+":"+entry.path);var finishActiveRemoval=function(){self.activeRemovals(_.filter(self.activeRemovals(),function(e){return e!==entry.origin+":"+entry.path;}));};var activateSpinner=function(){},finishSpinner=function(){};if(event){var element=$(event.currentTarget);if(element.length){var icon=$("i.fa-trash-alt",element);if(icon.length){activateSpinner=function(){icon.removeClass("far fa-trash-alt").addClass("fas fa-spinner fa-spin");};finishSpinner=function(){icon.removeClass("fas fa-spinner fa-spin").addClass("far fa-trash-alt");};}}} +activateSpinner();var deferred=$.Deferred();OctoPrint.files.delete(entry.origin,entry.path).done(function(){self.requestData().done(function(){deferred.resolve();}).fail(function(){deferred.reject();});}).fail(function(data){deferred.reject();var error="

"+ +gettext("Could not remove entry. Please check octoprint.log for possible reasons.")+"

";if(data.responseJSON&&data.responseJSON.error){error+=pnotifyAdditionalInfo("
"+_.escape(data.responseJSON.error)+"
");} +new PNotify({title:gettext("Failed to remove entry"),text:error,type:"error",hide:false});});return deferred.promise().always(function(){finishActiveRemoval();finishSpinner();});};self.downloadLink=function(data){if(data["refs"]&&data["refs"]["download"]){return data["refs"]["download"];}else{return false;}};self.lastTimePrinted=function(data){if(data["prints"]&&data["prints"]["last"]&&data["prints"]["last"]["date"]){return data["prints"]["last"]["date"];}else{return"-";}};self.getSuccessClass=function(data){if(!data["prints"]||!data["prints"]["last"]){return"";} +return data["prints"]["last"]["success"]?"text-success":"text-error";};self.templateFor=function(data){return"files_template_"+data.type;};self.getEntryId=function(data){return"gcode_file_"+md5(data["origin"]+":"+data["path"]);};self.getEntryElement=function(data){var entryId=self.getEntryId(data);var entryElements=$("#"+entryId);if(entryElements&&entryElements[0]){return entryElements[0];}else{return undefined;}};self.enableRemove=function(data){if(_.contains(self.activeRemovals(),data.origin+":"+data.path)){return false;} +var busy=false;if(data.type==="folder"){busy=_.any(self.printerState.busyFiles(),function(name){return _.startsWith(name,data.origin+":"+data.path+"/");});}else{busy=_.contains(self.printerState.busyFiles(),data.origin+":"+data.path);} +return(self.loginState.hasPermission(self.access.permissions.FILES_DELETE)&&!busy);};self.enableMove=function(data){return(self.loginState.hasAllPermissions(self.access.permissions.FILES_UPLOAD,self.access.permissions.FILES_DELETE)&&data.origin==="local");};self.enableSelect=function(data){return(self.isLoadAndPrintActionPossible()&&!self.listHelper.isSelected(data));};self.enablePrint=function(data){return(self.loginState.hasPermission(self.access.permissions.PRINT)&&self.isOperational()&&!(self.isPrinting()||self.isPaused()||self.isLoading()));};self.enableSelectAndPrint=function(data,printAfterSelect){return self.isLoadAndPrintActionPossible();};self.enableSlicing=function(data){return(self.loginState.hasPermission(self.access.permissions.SLICE)&&self.slicing.enableSlicingDialog()&&self.slicing.enableSlicingDialogForFile(data.name));};self.enableAdditionalData=function(data){return data["gcodeAnalysis"]||(data["prints"]&&data["prints"]["last"]);};self.toggleAdditionalData=function(data){var entryElement=self.getEntryElement(data);if(!entryElement)return;var additionalInfo=$(".additionalInfo",entryElement);additionalInfo.slideToggle("fast",function(){$(".toggleAdditionalData i",entryElement).toggleClass("fa-chevron-down fa-chevron-up");});};self.getAdditionalData=function(data){var output="";if(data["gcodeAnalysis"]){if(data["gcodeAnalysis"]["_empty"]||!data["gcodeAnalysis"]["dimensions"]||(data["gcodeAnalysis"]["dimensions"]["width"]===0&&data["gcodeAnalysis"]["dimensions"]["depth"]===0&&data["gcodeAnalysis"]["dimensions"]["height"]===0)){output+=gettext("Model contains no extrusion.
");}else{if(data["gcodeAnalysis"]["dimensions"]){var dimensions=data["gcodeAnalysis"]["dimensions"];output+=gettext("Model size")+": "+ +_.sprintf("%(width).2fmm (X) × %(depth).2fmm (Y) × %(height).2fmm (Z)",dimensions);output+="
";} +if(data["gcodeAnalysis"]["filament"]&&typeof data["gcodeAnalysis"]["filament"]==="object"){var filament=data["gcodeAnalysis"]["filament"];if(_.keys(filament).length===1){output+=gettext("Filament")+": "+ +formatFilament(data["gcodeAnalysis"]["filament"]["tool"+0])+"
";}else if(_.keys(filament).length>1){_.each(filament,function(f,k){if(!_.startsWith(k,"tool")||!f||!f.hasOwnProperty("length")||f["length"]<=0) +return;output+=gettext("Filament")+" ("+ +gettext("Tool")+" "+ +k.substr("tool".length)+"): "+ +formatFilament(f)+"
";});}} +output+=gettext("Estimated print time")+": "+ +(self.settingsViewModel.appearance_fuzzyTimes()?formatFuzzyPrintTime(data["gcodeAnalysis"]["estimatedPrintTime"]):formatDuration(data["gcodeAnalysis"]["estimatedPrintTime"]))+"
";}} +if(data["prints"]&&data["prints"]["last"]){output+=gettext("Last printed")+": "+ +formatTimeAgo(data["prints"]["last"]["date"])+"
";if(data["prints"]["last"]["printTime"]){output+=gettext("Last print time")+": "+ +formatDuration(data["prints"]["last"]["printTime"]);}} +return output;};self.evaluatePrintDimensions=function(data,notify){if(!self.settingsViewModel.feature_modelSizeDetection()){return true;} +var analysis=data["gcodeAnalysis"];if(!analysis){return true;} +var printingArea=data["gcodeAnalysis"]["printingArea"];if(!printingArea){return true;} +var travelArea=data["gcodeAnalysis"]["travelArea"];if(!travelArea){return true;} +var printerProfile=self.printerProfiles.currentProfileData();if(!printerProfile){return true;} +var volumeInfo=printerProfile.volume;if(!volumeInfo){return true;} +var boundaries;if(_.isPlainObject(volumeInfo.custom_box)){boundaries={minX:volumeInfo.custom_box.x_min(),minY:volumeInfo.custom_box.y_min(),minZ:volumeInfo.custom_box.z_min(),maxX:volumeInfo.custom_box.x_max(),maxY:volumeInfo.custom_box.y_max(),maxZ:volumeInfo.custom_box.z_max()};}else{boundaries={minX:0,maxX:volumeInfo.width(),minY:0,maxY:volumeInfo.depth(),minZ:0,maxZ:volumeInfo.height()};if(volumeInfo.origin()==="center"){boundaries["maxX"]=volumeInfo.width()/2;boundaries["minX"]=-1*boundaries["maxX"];boundaries["maxY"]=volumeInfo.depth()/2;boundaries["minY"]=-1*boundaries["maxY"];}} +var info="";var objectFits=true;var travelFits=true;function _area_exceeds_boundaries(ax,area){return(area["min"+ax]boundaries["max"+ax]);} +function _exceed_warning(culprit,dimension){return _.sprintf(gettext("%(culprit)s exceeds print volume in %(dimension)s.
"),{culprit:culprit,dimension:dimension});} +if(_area_exceeds_boundaries("X",printingArea)){info+=_exceed_warning(gettext("Object"),gettext("width"));objectFits=false;} +if(_area_exceeds_boundaries("Y",printingArea)){info+=_exceed_warning(gettext("Object"),gettext("depth"));objectFits=false;} +if(_area_exceeds_boundaries("Z",printingArea)){info+=_exceed_warning(gettext("Object"),gettext("height"));objectFits=false;} +if(_area_exceeds_boundaries("X",travelArea)){info+=_exceed_warning(gettext("Travel"),gettext("width"));travelFits=false;} +if(_area_exceeds_boundaries("Y",travelArea)){info+=_exceed_warning(gettext("Travel"),gettext("depth"));travelFits=false;} +if(_area_exceeds_boundaries("Z",travelArea)){info+=_exceed_warning(gettext("Travel"),gettext("height"));travelFits=false;} +if(travelFits&&objectFits){return true;}else{if(notify){var formatData={name:_.escape(data.name),profile:boundaries,object:printingArea,travel:travelArea,culprit:!objectFits?"Object":"Travel area"};info+=_.sprintf(gettext("Travel area: (%(travel.minX).2f, %(travel.minY).2f, %(travel.minZ).2f) × (%(travel.maxX).2f, %(travel.maxY).2f, %(travel.maxZ).2f)"),formatData);info+="
";info+=_.sprintf(gettext("Object's bounding box: (%(object.minX).2f, %(object.minY).2f, %(object.minZ).2f) × (%(object.maxX).2f, %(object.maxY).2f, %(object.maxZ).2f)"),formatData);info+="
";info+=_.sprintf(gettext("Print volume: (%(profile.minX).2f, %(profile.minY).2f, %(profile.minZ).2f) × (%(profile.maxX).2f, %(profile.maxY).2f, %(profile.maxZ).2f)"),formatData);var warning="

"+ +_.sprintf(gettext("%(culprit)s in %(name)s exceeds the print volume of the currently selected printer profile, be careful when printing this."),formatData)+"

";warning+=pnotifyAdditionalInfo(info);warning+='

You can disable this check via Settings > Features > "Enable model size detection [...]"

';new PNotify({title:_.sprintf(gettext("%(culprit)s exceeds print volume"),formatData),text:warning,type:"warning",hide:false});} +return false;}};self.clearSearchQuery=function(){self.searchQuery("");};self.performSearch=function(e){var query=self.searchQuery();if(query!==undefined&&query.trim()!==""){query=query.toLocaleLowerCase();var recursiveSearch=function(entry){if(entry===undefined){return false;} +var success=(entry["display"]&&entry["display"].toLocaleLowerCase().indexOf(query)>-1)||entry["name"].toLocaleLowerCase().indexOf(query)>-1;if(!success&&entry["type"]==="folder"&&entry["children"]){return _.any(entry["children"],recursiveSearch);} +return success;};self.listHelper.changeSearchFunction(recursiveSearch);}else{self.listHelper.resetSearch();} +return false;};self.elementByPath=function(path,root){root=root||{children:self.allItems()};var recursiveSearch=function(location,element){if(location.length===0){return element;} +if(!element.hasOwnProperty("children")||!element.children){return undefined;} +var name=location.shift();for(var i=0;i{self._uploadExistsOpen=true;});self.uploadExistsDialog.on("hidden",()=>{self._uploadExistsOpen=false;});self.uploadButton=$("#gcode_upload");self.uploadSdButton=$("#gcode_upload_sd");if(!self.uploadSdButton.length){self.uploadSdButton=undefined;} +self.uploadProgress=$("#gcode_upload_progress");self.uploadProgressBar=$(".bar",self.uploadProgress);self.dropOverlay=$("#drop_overlay");self.dropZone=$("#drop");self.dropZoneLocal=$("#drop_locally");self.dropZoneSd=$("#drop_sd");self.dropZoneBackground=$("#drop_background");self.dropZoneLocalBackground=$("#drop_locally_background");self.dropZoneSdBackground=$("#drop_sd_background");if(CONFIG_SD_SUPPORT){self.localTarget=self.dropZoneLocal;}else{self.localTarget=self.dropZone;self.listHelper.removeFilter("sd");} +self.sdTarget=self.dropZoneSd;self.dropOverlay.on("drop",self._forceEndDragNDrop);function evaluateDropzones(){var enableLocal=self.loginState.hasPermission(self.access.permissions.FILES_UPLOAD);var enableSd=enableLocal&&CONFIG_SD_SUPPORT&&self.printerState.isSdReady()&&!self.isPrinting();self._setDropzone("local",enableLocal);self._setDropzone("sdcard",enableSd);} +self.loginState.currentUser.subscribe(evaluateDropzones);self.printerState.isSdReady.subscribe(evaluateDropzones);self.isPrinting.subscribe(evaluateDropzones);evaluateDropzones();};self.onEventUpdatedFiles=function(payload){if(self.ignoreUpdatedFilesEvent){return;} +if(payload.type!=="printables"){return;} +self.requestData();};self.onEventSlicingStarted=function(payload){self.uploadProgress.addClass("progress-striped").addClass("active");self.uploadProgressBar.css("width","100%");if(payload.progressAvailable){self.uploadProgressPercentage(0);self.uploadProgressText(_.sprintf(gettext("Slicing ... (%(percentage)d%%)"),{percentage:0}));}else{self.uploadProgressText(gettext("Slicing ..."));}};self.onSlicingProgress=function(slicer,modelPath,machinecodePath,progress){self.uploadProgressText(_.sprintf(gettext("Slicing ... (%(percentage)d%%)"),{percentage:Math.round(progress)}));self.uploadProgressPercentage(Math.round(progress));};self.onEventSlicingCancelled=function(payload){self.uploadProgress.removeClass("progress-striped").removeClass("active");self.uploadProgressBar.css("width","0%");self.uploadProgressText("");self.uploadProgressPercentage(0);};self.onEventSlicingDone=function(payload){self.uploadProgress.removeClass("progress-striped").removeClass("active");self.uploadProgressBar.css("width","0%");self.uploadProgressText("");self.uploadProgressPercentage(0);new PNotify({title:gettext("Slicing done"),text:_.sprintf(gettext("Sliced %(stl)s to %(gcode)s, took %(time).2f seconds"),{stl:_.escape(payload.stl),gcode:_.escape(payload.gcode),time:payload.time}),type:"success"});self.requestData();};self.onEventSlicingFailed=function(payload){self.uploadProgress.removeClass("progress-striped").removeClass("active");self.uploadProgressBar.css("width","0%");self.uploadProgressText("");self.uploadProgressPercentage(0);var html=_.sprintf(gettext("Could not slice %(stl)s to %(gcode)s: %(reason)s"),{stl:_.escape(payload.stl),gcode:_.escape(payload.gcode),reason:_.escape(payload.reason)});new PNotify({title:gettext("Slicing failed"),text:html,type:"error",hide:false});};self.onEventMetadataAnalysisFinished=function(payload){self.requestData();};self.onEventMetadataStatisticsUpdated=function(payload){self.requestData();};self.onEventTransferStarted=function(payload){self.uploadProgress.addClass("progress-striped").addClass("active");self.uploadProgressBar.css("width","100%");self.uploadProgressPercentage(100);self.uploadProgressText(gettext("Streaming ..."));};self.onEventTransferDone=function(payload){self.uploadProgress.removeClass("progress-striped").removeClass("active");self.uploadProgressBar.css("width","0");self.uploadProgressText("");self.uploadProgressPercentage(0);new PNotify({title:gettext("Streaming done"),text:_.sprintf(gettext("Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds"),{local:_.escape(payload.local),remote:_.escape(payload.remote),time:payload.time}),type:"success"});self.requestData({focus:{location:"sdcard",path:payload.remote}});};self.onEventTransferFailed=function(payload){self.uploadProgress.removeClass("progress-striped").removeClass("active");self.uploadProgressBar.css("width","0");self.uploadProgressText("");self.uploadProgressPercentage(0);new PNotify({title:gettext("Streaming failed"),text:_.sprintf(gettext("Did not finish streaming %(local)s to %(remote)s on SD"),{local:_.escape(payload.local),remote:_.escape(payload.remote)}),type:"error"});self.requestData();};self._setDropzone=function(dropzone,enable){var button=dropzone==="local"?self.uploadButton:self.uploadSdButton;var drop=dropzone==="local"?self.localTarget:self.sdTarget;var url=API_BASEURL+"files/"+dropzone;if(button===undefined)return;button.fileupload({url:url,dataType:"json",dropZone:enable?drop:null,sequentialUploads:true,drop:function(e,data){},add:self._handleUploadAdd,submit:self._handleUploadStart,done:self._handleUploadDone,fail:self._handleUploadFail,stop:self._handleUploadStop,progressall:self._handleUploadProgress});};self._dragNDropEnabled=false;self._enableDragNDrop=()=>{if(!self.settingsViewModel.feature_enableDragDropUpload())return;if(self._dragNDropEnabled)return;self._dragNDropEnabled=true;$(document).bind("dragenter",self._handleDragEnter);$(document).bind("dragleave",self._handleDragLeave);log.debug("Enabled drag-n-drop");};self._disableDragNDrop=()=>{if(!self._dragNDropEnabled)return;self._dragNDropEnabled=false;$(document).unbind("dragenter",self._handleDragEnter);$(document).unbind("dragleave",self._handleDragLeave);log.debug("Disabled drag-n-drop");};self._setProgressBar=function(percentage,text,active){self.uploadProgressBar.css("width",percentage+"%");self.uploadProgressText(text);self.uploadProgressPercentage(percentage);if(active){self.uploadProgress.addClass("progress-striped active");}else{self.uploadProgress.removeClass("progress-striped active");}};self._uploadExistsQueue=[];self._uploadExistsOpen=false;self._processUploadQueue=function(){if(!self._uploadExistsQueue.length>0||self._uploadExistsOpen)return;const hideAndSubmit=function(data){self.uploadExistsDialog.modal("hide");data.submit();if(self._uploadExistsQueue.length>0){self._processUploadQueue();}};const{data,response,path,fileSizeTooBig}=self._uploadExistsQueue.shift();const file=data.files[0];const formData={};if(path!==""){formData.path=path;} +$("h3",self.uploadExistsDialog).text(_.sprintf(gettext("File already exists: %(name)s"),{name:file.name}));$("span.existing_size",self.uploadExistsDialog).text(response.size?formatSize(response.size):"unknown");$("span.existing_date",self.uploadExistsDialog).text(response.date?new Date(response.date*1000).toLocaleString():"unknown");$("span.new_size",self.uploadExistsDialog).text(formatSize(file.size));$("span.new_date",self.uploadExistsDialog).text(new Date(file.lastModified).toLocaleString());$("p, form, .file_data",self.uploadExistsDialog).toggle(!fileSizeTooBig);$("span.not_enough_space",self.uploadExistsDialog).toggle(fileSizeTooBig);$("input",self.uploadExistsDialog).val("").prop("placeholder",response.suggestion);$("a.upload-rename",self.uploadExistsDialog).toggle(!fileSizeTooBig).prop("disabled",false).off("click").on("click",function(){var newName=$("input",self.uploadExistsDialog).val();if(newName==="")newName=response.suggestion;OctoPrint.files.exists("local",path,newName).done(function(r){if(r.exists){$(".control-group",self.uploadExistsDialog).addClass("error");$(".help-block",self.uploadExistsDialog).show();}else{$(".control-group",self.uploadExistsDialog).removeClass("error");$(".help-block",self.uploadExistsDialog).hide();formData.filename=newName;formData.noOverwrite=true;data.formData=formData;hideAndSubmit(data);}});});if(self.loginState.hasPermission(self.access.permissions.FILES_DELETE)){$("a.upload-overwrite",self.uploadExistsDialog).off("click").show().on("click",function(){data.formData=formData;hideAndSubmit(data);});}else{$("a.upload-overwrite",self.uploadExistsDialog).hide();} +self.uploadExistsDialog.modal("show");};self._handleUploadAdd=function(e,data){var file=data.files[0];var path=self.currentPath();var fileSizeTooBig=file.size>self.freeSpace();var formData={};if(path!==""){formData.path=path;} +if(self.settingsViewModel.feature_uploadOverwriteConfirmation()){OctoPrint.files.exists("local",path,file.name).done(function(response){if(response.exists){const queueEntry={data,response,path,fileSizeTooBig};self._uploadExistsQueue.push(queueEntry);self._processUploadQueue();}else{data.formData=formData;data.submit();}});}else{if(fileSizeTooBig){var error="

"+ +gettext("Could not upload the file. There is not enough disk space remaining.")+"

";error+="
"+
+_.sprintf(gettext("Free Space: %(freespace)s"),{freespace:self.freeSpaceString()})+"
"+ +_.sprintf(gettext("File Size: %(filesize)s"),{filesize:formatSize(file.size)})+"
";new PNotify({title:"Upload failed",text:error,type:"error",hide:false});}else{data.formData=formData;data.submit();}}};self._handleUploadStart=function(e,data){self.ignoreUpdatedFilesEvent=true;return true;};self._handleUploadDone=function(e,data){var focus=undefined;if(data.result.files.hasOwnProperty("sdcard")){focus={location:"sdcard",path:data.result.files.sdcard.path};}else if(data.result.files.hasOwnProperty("local")){focus={location:"local",path:data.result.files.local.path};} +if(focus){self._filesToFocus.push(focus);} +if(focus&&_.endsWith(focus.path.toLowerCase(),".stl")){self.slicing.show(focus.location,focus.path);}};self._handleUploadStop=function(e,data){var reset=function(){self.ignoreUpdatedFilesEvent=false;self._setProgressBar(0,"",false);};if(self._filesToFocus.length>0){self._setProgressBar(100,gettext("Refreshing list ..."),true);self.requestData({focus:self._filesToFocus}).always(function(){reset();});}else{reset();}};self._handleUploadFail=function(e,data){var extensions=_.map(SUPPORTED_EXTENSIONS,function(extension){return extension.toLowerCase();}).sort();extensions=extensions.join(", ");var error="

"+_.escape(data.files[0].name)+"

";switch(data.jqXHR.status){case 409:if(e.target.id==="gcode_upload_sd"){error+=gettext("Could not upload the file to the printer's SD. Make sure the SD is initialized and the printer is not busy with a print already.");}else{error+=gettext("Could not upload the file, overwrite not possible. Make sure it is not already printing and that you have allowed overwriting.");} +break;case 415:error+=_.sprintf(gettext("Could not upload the file. Make sure that it is a readable, valid file with one of these extensions: %(extensions)s"),{extensions:_.escape(extensions)});break;default:error+=gettext("Could not upload the file. Please check octoprint.log for possible reasons.");break;} +error+="

";if(data.jqXHR.responseJSON&&data.jqXHR.responseJSON.error){error+=pnotifyAdditionalInfo("
"+_.escape(data.jqXHR.responseJSON.error)+"
");} +new PNotify({title:"Upload failed",text:error,type:"error",hide:false});};self._handleUploadProgress=function(e,data){var progress=parseInt((data.loaded/data.total)*100,10);var uploaded=progress>=100;self._setProgressBar(progress,uploaded?gettext("Saving ..."):gettext("Uploading ..."),uploaded);};self._dragNDropTarget=null;self._dragNDropFFTimeout=undefined;self._dragNDropFFTimeoutDelay=100;self._forceEndDragNDrop=function(){self.dropOverlay.removeClass("in");if(self.dropZoneLocal)self.dropZoneLocalBackground.removeClass("hover");if(self.dropZoneSd)self.dropZoneSdBackground.removeClass("hover");if(self.dropZone)self.dropZoneBackground.removeClass("hover");self._dragNDropTarget=null;};self._handleDragLeave=function(e){if(e.target!==self._dragNDropTarget)return;self._forceEndDragNDrop();};self._handleDragEnter=function(e){if(!self.settingsViewModel.feature_enableDragDropUpload()){return;} +const draggedFiles=Array.from(e.originalEvent.dataTransfer.items).filter((item)=>item.kind==="file");if(!draggedFiles.length){return;} +self.dropOverlay.addClass("in");var foundLocal=false;var foundSd=false;var found=false;var node=e.target;do{if(self.dropZoneLocal&&node===self.dropZoneLocal[0]){foundLocal=true;break;}else if(self.dropZoneSd&&node===self.dropZoneSd[0]){foundSd=true;break;}else if(self.dropZone&&node===self.dropZone[0]){found=true;break;} +node=node.parentNode;}while(node!==null);if(foundLocal){self.dropZoneLocalBackground.addClass("hover");self.dropZoneSdBackground.removeClass("hover");}else if(foundSd&&self.printerState.isSdReady()&&!self.isPrinting()){self.dropZoneSdBackground.addClass("hover");self.dropZoneLocalBackground.removeClass("hover");}else if(found){self.dropZoneBackground.addClass("hover");}else{if(self.dropZoneLocalBackground) +self.dropZoneLocalBackground.removeClass("hover");if(self.dropZoneSdBackground) +self.dropZoneSdBackground.removeClass("hover");if(self.dropZoneBackground)self.dropZoneBackground.removeClass("hover");} +self._dragNDropTarget=e.target;self._dragNDropLastOver=Date.now();};self.onServerConnect=self.onServerReconnect=function(payload){self._enableDragNDrop();self.requestData();};self.onServerDisconnect=function(payload){self._disableDragNDrop();};self.onBeforeBinding=function(){self.showInternalFilename(self.settingsViewModel.settings.appearance.showInternalFilename());};self.onAllBound=function(allViewModels){self.allViewModels=allViewModels;};self.onStartupComplete=()=>{self.showInternalFilename(self.settingsViewModel.settings.appearance.showInternalFilename());self.settingsViewModel.settings.appearance.showInternalFilename.subscribe((value)=>{self.showInternalFilename(value);});self._enableDragNDrop();self.settingsViewModel.settings.feature.enableDragDropUpload.subscribe((value)=>{if(value){self._enableDragNDrop();}else{self._disableDragNDrop();}});};} +OCTOPRINT_VIEWMODELS.push({construct:FilesViewModel,name:"filesViewModel",additionalNames:["gcodeFilesViewModel"],dependencies:["settingsViewModel","loginStateViewModel","printerStateViewModel","slicingViewModel","printerProfilesViewModel","accessViewModel"],elements:["#files_wrapper","#add_folder_dialog","#move_file_or_folder_dialog","#upload_exists_dialog"]});}); +; + +// source: js/app/viewmodels/firstrun_wizard.js +$(function(){function FirstRunWizardViewModel(parameters){var self=this;self.dontPrintUnattendedAcknowledged=ko.observable(false);self.dontPortForwardAcknowledged=ko.observable(false);self.fundingRequestAcknowledged=ko.observable(false);self.error=ko.observable(false);self.acknowledgementNeeded=false;self.allAcknowledged=ko.pureComputed(function(){return(self.dontPrintUnattendedAcknowledged()&&self.dontPortForwardAcknowledged()&&self.fundingRequestAcknowledged());});self.onBeforeWizardTabChange=function(next,current){if(!self.acknowledgementNeeded){return true;} +if(!current||current!=="wizard_firstrun_end"||self.allAcknowledged()){return true;} +self._showAcknowledgementNeededDialog();return false;};self.onBeforeWizardFinish=function(){if(!self.acknowledgementNeeded||self.allAcknowledged()){return true;} +self._showAcknowledgementNeededDialog();return false;};self.onAfterBinding=function(){self.acknowledgementNeeded=document.getElementById("wizard_firstrun_end")!==null;};self._showAcknowledgementNeededDialog=function(){self.error(true);showMessageDialog({title:gettext("Please acknowledge the safety warnings and call for funding"),message:gettext("You haven't yet acknowledged all safety warnings and the call for funding. Please do so first.")});};} +OCTOPRINT_VIEWMODELS.push({construct:FirstRunWizardViewModel,elements:["#wizard_firstrun_start","#wizard_firstrun_end"]});}); +; + +// source: js/app/viewmodels/loginstate.js +$(function(){function LoginStateViewModel(parameters){var self=this;self.loginUser=ko.observable("");self.loginPass=ko.observable("");self.loginRemember=ko.observable(false);self.reauthenticateDialog=undefined;self.reauthenticatePass=ko.observable("");self.reauthenticateFailed=ko.observable(false);self.loggedIn=ko.observable(undefined);self.username=ko.observable(undefined);self.userneeds=ko.observable(undefined);self.isAdmin=ko.observable(false);self.isUser=ko.observable(false);self.allViewModels=undefined;self.startupDeferred=$.Deferred();self.currentUser=ko.observable(undefined);self.currentLoginMechanism=ko.observable(undefined);self.credentialsSeen=ko.observable(undefined);self.elementUsernameInput=undefined;self.elementPasswordInput=undefined;self.elementLoginButton=undefined;self.externalAddressNotification=undefined;self.userMenuText=ko.pureComputed(function(){if(self.loggedIn()){return self.username();}else{return gettext("Login");}});self.userMenuTitle=ko.pureComputed(function(){if(self.loggedIn()){return _.sprintf(gettext("Logged in as %(name)s"),{name:_.escape(self.username())});}else{return gettext("Login");}});self.logoutSupported=ko.pureComputed(function(){var mechanism=self.currentLoginMechanism();return!(mechanism==="apikey"||mechanism==="authheader"||mechanism==="remote_user");});self.logoutTooltip=ko.pureComputed(function(){var mechanism=self.currentLoginMechanism();if(!self.logoutSupported()){var methodMap={apikey:gettext("API key based login"),authheader:gettext("Authorization header based login"),remote_user:gettext("remote user based login")};return _.sprintf(gettext("Logout not supported for %(method)s, please close the browser instead"),{method:methodMap[mechanism]});}else{return gettext("Logout of OctoPrint");}});self.reloadUser=function(){if(self.currentUser()===undefined){return;} +return OctoPrint.access.users.get(self.currentUser().name).done(self.updateCurrentUserData);};self._reauthenticated=false;self.showReauthenticationDialog=()=>{const result=$.Deferred();self._reauthenticated=false;self.reauthenticateDialog.off("hidden");self.reauthenticateDialog.on("hidden",()=>{self.reauthenticatePass("");self.reauthenticateFailed(false);if(self._reauthenticated){result.resolve();}else{result.reject();}});self.reauthenticateDialog.modal("show");return result.promise();};self.reauthenticate=()=>{const user=self.currentUser().name;const pass=self.reauthenticatePass();return OctoPrint.browser.login(user,pass).done((response)=>{self.fromResponse(response);self.reauthenticateFailed(false);self._reauthenticated=self.credentialsSeen();$("#reauthenticate_dialog").modal("hide");}).fail((response)=>{self.reauthenticatePass("");self.reauthenticateFailed(true);});};self.reauthenticateIfNecessary=(callback)=>{if(!self.checkCredentialsSeen()){self.forceReauthentication(callback);}else{callback();}};self.forceReauthentication=(callback)=>{self.showReauthenticationDialog().done(()=>{callback();}).fail(()=>{});};self.checkCredentialsSeen=()=>{if(CONFIG_REAUTHENTICATION_TIMEOUT<=0)return true;const credentialsSeen=self.credentialsSeen();if(!credentialsSeen){return false;} +const now=new Date();const seen=new Date(credentialsSeen);return now-seen{if(CONFIG_REAUTHENTICATION_TIMEOUT<=0)return;if(timeout)window.clearTimeout(timeout);return window.setTimeout(callback,(CONFIG_REAUTHENTICATION_TIMEOUT*60+10)*1000);};self.requestData=function(){return OctoPrint.browser.passiveLogin().done(self.fromResponse).fail(function(){self.fromResponse();});};self.fromResponse=function(response){var process=function(){var currentLoggedIn=self.loggedIn();var currentNeeds=self.userneeds();if(response&&response.name){self.loggedIn(true);self.currentLoginMechanism(response._login_mechanism);self.credentialsSeen(response._credentials_seen);self.updateCurrentUserData(response);if(!currentLoggedIn||currentLoggedIn===undefined){callViewModels(self.allViewModels,"onUserLoggedIn",[response]);log.info("User "+response.name+" logged in");}else if(!_.isEqual(currentNeeds,self.userneeds())){callViewModels(self.allViewModels,"onUserPermissionsChanged");log.info("User needs for "+response.name+" changed");} +if(response.session){OctoPrint.socket.sendAuth(response.name,response.session);} +var ignorePublicAddressWarning=localStorage["loginState.ignorePublicAddressWarning"];if(ignorePublicAddressWarning===undefined){ignorePublicAddressWarning=false;}else{ignorePublicAddressWarning=JSON.parse(ignorePublicAddressWarning);} +if(response._is_external_client&&!ignorePublicAddressWarning){var text=gettext("

It seems that you are connecting to OctoPrint over the public internet.

"+"

This is strongly discouraged unless you have taken proper network security precautions. "+"Your printer is an appliance you really should not be giving access to "+"everyone with an internet connection.

Please see "+'this blog post for '+"ways to safely access your OctoPrint instance from remote.

"+"

If you know what you are doing or you are sure this message is "+"mistaken since you are in an isolated LAN, feel free to ignore it.

");text=_.sprintf(text,{url:"https://octoprint.org/blog/2018/09/03/safe-remote-access/"});if(self.externalAddressNotification!==undefined){self.externalAddressNotification.remove();} +self.externalAddressNotification=new PNotify({title:gettext("Possible external access detected"),text:text,hide:false,type:"error",confirm:{confirm:true,buttons:[{text:gettext("Ignore"),addClass:"btn btn-danger",click:function(notice){notice.remove();localStorage["loginState.ignorePublicAddressWarning"]=JSON.stringify(true);}},{text:gettext("Later"),addClass:"btn btn-primary",click:function(notice){notice.remove();}}]},buttons:{sticker:false}});} +if(response._login_mechanism){log.info("Login mechanism: "+response._login_mechanism);}}else{self.loggedIn(false);self.currentLoginMechanism(undefined);self.updateCurrentUserData(response);if(currentLoggedIn||currentLoggedIn===undefined){callViewModels(self.allViewModels,"onUserLoggedOut");log.info("User logged out");}else if(!_.isEqual(currentNeeds,self.userneeds())){callViewModels(self.allViewModels,"onUserPermissionsChanged");log.info("User needs for guest changed");}} +OctoPrint.coreui.updateTab();};if(self.startupDeferred!==undefined){self.startupDeferred.done(process);}else{process();}};self.updateCurrentUserData=function(data){if(data){self.userneeds(data.needs);}else{self.userneeds({});} +if(data&&data.name){self.username(data.name);self.currentUser(data);self.isUser(data.user);self.isAdmin(data.admin);}else{self.username(undefined);self.currentUser(undefined);self.isUser(false);self.isAdmin(false);}};self.login=function(u,p,r,notifications){var username=u||self.loginUser();var password=p||self.loginPass();var remember=r!==undefined?r:self.loginRemember();notifications=notifications!==false;return OctoPrint.browser.login(username,password,remember).done(function(response){if(notifications){new PNotify({title:gettext("Login successful"),text:_.sprintf(gettext('You are now logged in as "%(username)s"'),{username:_.escape(response.name)}),type:"success"});} +self.fromResponse(response);self.loginUser("");self.loginPass("");self.loginRemember(false);self.reauthenticatePass("");if(history&&history.replaceState){history.replaceState({success:true},document.title,window.location.pathname);}}).fail(function(response){if(!notifications){return;} +switch(response.status){case 403:{new PNotify({title:gettext("Login failed"),text:gettext("User unknown, wrong password or account deactivated"),type:"error"});break;}}});};var _logoutInProgress=false;self.logout=function(target,event){if(!self.logoutSupported()){event.stopPropagation();return;} +if(_logoutInProgress)return;_logoutInProgress=true;return OctoPrint.browser.logout().done(function(response){new PNotify({title:gettext("Logout successful"),text:gettext("You are now logged out"),type:"success"});self.fromResponse(response);}).fail(function(error){if(error&&error.status===403){self.fromResponse(false);}}).always(function(){_logoutInProgress=false;});};self.prepareLogin=function(data,event){if(event&&event.preventDefault){event.preventDefault();} +self.login();};self.onDataUpdaterReauthRequired=function(reason){if(reason==="logout"||reason==="stale"||reason==="removed"){self.logout();}else{self.requestData();}};self.onAllBound=function(allViewModels){self.allViewModels=allViewModels;self.startupDeferred.resolve();self.startupDeferred=undefined;};self.onStartup=function(){self.reauthenticateDialog=$("#reauthenticate_dialog");self.reauthenticateDialog.on("shown",function(){$("input[type=password]",self.reauthenticateDialog).focus();});self.elementUsernameInput=$("#login_user");self.elementPasswordInput=$("#login_pass");self.elementLoginButton=$("#login_button");var toggle=$("li.dropdown#navbar_login");var button=$("a",toggle);button.on("click",function(e){$(this).parent().toggleClass("open");});$("body").on("click",function(e){if(!toggle.hasClass("open")){return;} +var anyFormLinkOrButton=$("#login_dropdown_loggedout a, #login_dropdown_loggedin a, #login_dropdown_loggedout button, #login_dropdown_loggedin button");var dropdown=$("li.dropdown#navbar_login");var anyLastpassButton=$("#__lpform_login_user, #__lpform_login_pass");var isLinkOrButton=anyFormLinkOrButton.is(e.target)||anyFormLinkOrButton.has(e.target).length!==0;var isDropdown=dropdown.is(e.target)||dropdown.has(e.target).length!==0;var isLastpass=anyLastpassButton.is(e.target)||anyLastpassButton.has(e.target).length!==0;if(isLinkOrButton||!(isDropdown||isLastpass)){toggle.removeClass("open");}});if(self.elementUsernameInput&&self.elementUsernameInput.length&&self.elementLoginButton&&self.elementLoginButton.length){self.elementLoginButton.blur(function(){self.elementUsernameInput.focus();});}};self.hasPermission=function(permission){var userneeds=self.userneeds();if(userneeds===undefined||permission===undefined)return false;if($.isEmptyObject(userneeds)){return false;} +return _.any(permission,function(need){return(_.has(userneeds,need.method)&&_.all(need.value,function(value){return _.contains(userneeds[need.method],value);}));});};self.hasAnyPermission=function(){var result=false;_.each(arguments,function(permission){result=result||self.hasPermission(permission);});return result;};self.hasAllPermissions=function(){var result=true;_.each(arguments,function(permission){result=result&&self.hasPermission(permission);});return result;};self.hasPermissionKo=function(permission){return ko.pureComputed(function(){return self.hasPermission(permission);}).extend({notify:"always"});};self.hasAnyPermissionKo=function(){var permissions=arguments;return ko.pureComputed(function(){return self.hasAnyPermission.apply(null,permissions);}).extend({notify:"always"});};self.hasAllPermissionsKo=function(){var permissions=arguments;return ko.pureComputed(function(){return self.hasAllPermissions.apply(null,permissions);});};} +OCTOPRINT_VIEWMODELS.push({construct:LoginStateViewModel,elements:["#reauthenticate_dialog"]});}); +; + +// source: js/app/viewmodels/loginui.js +$(function(){function LoginUiViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.coreWizardAcl=parameters[2];self.onUserLoggedOut=self.onUserPermissionsChanged=function(){if(!self.loginState.hasAllPermissions(self.access.permissions.STATUS,self.access.permissions.SETTINGS_READ)&&(!CONFIG_FIRST_RUN||(self.coreWizardAcl&&self.coreWizardAcl.setup()))){location.reload();}};} +OCTOPRINT_VIEWMODELS.push({construct:LoginUiViewModel,dependencies:["loginStateViewModel","accessViewModel","coreWizardAclViewModel"],optional:["coreWizardAclViewModel"]});}); +; + +// source: js/app/viewmodels/navigation.js +$(function(){function NavigationViewModel(parameters){var self=this;self.loginState=parameters[0];self.appearance=parameters[1];self.settings=parameters[2];self.usersettings=parameters[3];self.system=parameters[4];self.access=parameters[5];self.offline=ko.observable(!ONLINE);self.offlinePopoverContent=function(){return("

"+ +gettext("OctoPrint cannot reach the internet. If this is not "+"intentional, please check OctoPrint's network settings and "+"the connectivity check configuration. Updates, plugin repository "+"and anything else requiring access to the public internet will not "+"work.")+"

");};self.appearanceClasses=ko.pureComputed(function(){var classes=self.appearance.color();if(self.appearance.colorTransparent()){classes+=" transparent";} +return classes;});self.onServerReconnect=self.onServerConnect=self.onEventConnectivityChanged=function(){self.offline(!ONLINE);};} +OCTOPRINT_VIEWMODELS.push({construct:NavigationViewModel,dependencies:["loginStateViewModel","appearanceViewModel","settingsViewModel","userSettingsViewModel","systemViewModel","accessViewModel"],elements:["#navbar"]});}); +; + +// source: js/app/viewmodels/printerstate.js +$(function(){function PrinterStateViewModel(parameters){var self=this;self.loginState=parameters[0];self.settings=parameters[1];self.access=parameters[2];self.allViewModels=undefined;self.stateString=ko.observable(undefined);self.errorString=ko.observable(undefined);self.hasErrorString=ko.pureComputed(function(){return!!self.errorString();});self.resendCount=ko.observable(0);self.resendTotalTransmitted=ko.observable(0);self.resendRatio=ko.observable(0);self.resendRatioCritical=ko.pureComputed(function(){return(self.resendRatio()>=self.settings.serial_resendRatioThreshold()&&self.resendTotalTransmitted()>=self.settings.serial_resendRatioStart());});self.resendRatioNotification=undefined;self.isErrorOrClosed=ko.observable(undefined);self.isOperational=ko.observable(undefined);self.isPrinting=ko.observable(undefined);self.isCancelling=ko.observable(undefined);self.isPausing=ko.observable(undefined);self.isPaused=ko.observable(undefined);self.isError=ko.observable(undefined);self.isReady=ko.observable(undefined);self.isLoading=ko.observable(undefined);self.isSdReady=ko.observable(undefined);self.isBusy=ko.pureComputed(function(){return(self.isPrinting()||self.isCancelling()||self.isPausing()||self.isPaused());});self.enablePrint=ko.pureComputed(function(){return(self.isOperational()&&(self.isReady()||self.isPaused())&&!self.isPrinting()&&!self.isCancelling()&&!self.isPausing()&&self.loginState.hasPermission(self.access.permissions.PRINT)&&self.filename());});self.enablePause=ko.pureComputed(function(){return(self.isOperational()&&(self.isPrinting()||self.isPaused())&&!self.isCancelling()&&!self.isPausing()&&self.loginState.hasPermission(self.access.permissions.PRINT));});self.enableCancel=ko.pureComputed(function(){return(self.isOperational()&&(self.isPrinting()||self.isPaused())&&!self.isCancelling()&&!self.isPausing()&&self.loginState.loggedIn());});self.filename=ko.observable(undefined);self.filepath=ko.observable(undefined);self.filedisplay=ko.observable(undefined);self.filesize=ko.observable(undefined);self.filepos=ko.observable(undefined);self.filedate=ko.observable(undefined);self.progress=ko.observable(undefined);self.printTime=ko.observable(undefined);self.printTimeLeft=ko.observable(undefined);self.printTimeLeftOrigin=ko.observable(undefined);self.sd=ko.observable(undefined);self.timelapse=ko.observable(undefined);self.user=ko.observable(undefined);self.busyFiles=ko.observableArray([]);self.filament=ko.observableArray([]);self.estimatedPrintTime=ko.observable(undefined);self.lastPrintTime=ko.observable(undefined);self.currentHeight=ko.observable(undefined);self.errorInfoAvailable=ko.observable(false);self.errorInfo={};self.TITLE_PRINT_BUTTON_PAUSED=gettext("Restarts the print job from the beginning");self.TITLE_PRINT_BUTTON_UNPAUSED=gettext("Starts the print job");self.TITLE_PAUSE_BUTTON_PAUSED=gettext("Resumes the print job");self.TITLE_PAUSE_BUTTON_UNPAUSED=gettext("Pauses the print job");self.titlePrintButton=ko.observable(self.TITLE_PRINT_BUTTON_UNPAUSED);self.titlePauseButton=ko.observable(self.TITLE_PAUSE_BUTTON_UNPAUSED);var estimatedPrintTimeStringHlpr=function(fmt){if(self.lastPrintTime())return fmt(self.lastPrintTime());if(self.estimatedPrintTime())return fmt(self.estimatedPrintTime());return"-";};self.estimatedPrintTimeString=ko.pureComputed(function(){return estimatedPrintTimeStringHlpr(self.settings.appearance_fuzzyTimes()?formatFuzzyPrintTime:formatDuration);});self.estimatedPrintTimeExactString=ko.pureComputed(function(){return estimatedPrintTimeStringHlpr(formatDuration);});self.byteString=ko.pureComputed(function(){if(!self.filesize())return"-";var filepos=self.filepos()?formatSize(self.filepos()):"-";return filepos+" / "+formatSize(self.filesize());});self.heightString=ko.pureComputed(function(){if(!self.currentHeight())return"-";return _.sprintf("%.02fmm",self.currentHeight());});self.printTimeString=ko.pureComputed(function(){if(!self.printTime())return"-";return formatDuration(self.printTime());});var printTimeLeftStringHlpr=function(fmt){if(self.printTimeLeft()===undefined){if(!self.printTime()||!(self.isPrinting()||self.isPaused())){return"-";}else{return gettext("Still stabilizing...");}}else{return fmt(self.printTimeLeft());}};self.printTimeLeftString=ko.pureComputed(function(){return printTimeLeftStringHlpr(self.settings.appearance_fuzzyTimes()?formatFuzzyPrintTime:formatDuration);});self.printTimeLeftExactString=ko.pureComputed(function(){return printTimeLeftStringHlpr(formatDuration);});self.printTimeLeftOriginString=ko.pureComputed(function(){var value=self.printTimeLeftOrigin();switch(value){case"linear":{return gettext("Based on a linear approximation (very low accuracy, especially at the beginning of the print)");} +case"analysis":{return gettext("Based on the estimate from analysis of file (medium accuracy)");} +case"mixed-analysis":{return gettext("Based on a mix of estimate from analysis and calculation (medium accuracy)");} +case"average":{return gettext("Based on the average total of past prints of this model with the same printer profile (usually good accuracy)");} +case"mixed-average":{return gettext("Based on a mix of average total from past prints and calculation (usually good accuracy)");} +case"estimate":{return gettext("Based on the calculated estimate (best accuracy)");} +default:{return"";}}});self.printTimeLeftOriginClass=ko.pureComputed(function(){var value=self.printTimeLeftOrigin();switch(value){default:case"linear":{return"text-error";} +case"analysis":case"mixed-analysis":{return"text-warning";} +case"average":case"mixed-average":case"estimate":{return"text-success";}}});self.progressString=ko.pureComputed(function(){if(!self.progress())return 0;return self.progress();});self.progressBarString=ko.pureComputed(function(){if(!self.progress()){return"";} +return _.sprintf("%d%%",self.progress());});self.pauseString=ko.pureComputed(function(){if(self.isPaused())return gettext("Continue");else return gettext("Pause");});self.timelapseString=ko.pureComputed(function(){var timelapse=self.timelapse();if(!timelapse||!timelapse.hasOwnProperty("type"))return"-";var type=timelapse["type"];if(type==="zchange"){return gettext("On Z Change");}else if(type==="timed"){return(gettext("Timed")+" ("+ +timelapse["options"]["interval"]+" "+ +gettext("sec")+")");}else{return"-";}});self.userString=ko.pureComputed(function(){var user=self.user();if(user==="_api"){user="API client";} +var file=self.filename();return user?user:file?"-":"";});self.dateString=ko.pureComputed(function(){var date=self.filedate();if(!date){return gettext("unknown");} +return formatDate(date,{seconds:true});});self.fromCurrentData=function(data){self._fromData(data);};self.fromHistoryData=function(data){self._fromData(data);};self.fromTimelapseData=function(data){self.timelapse(data);};self._fromData=function(data){self._processStateData(data.state);self._processJobData(data.job);self._processProgressData(data.progress);self._processZData(data.currentZ);self._processBusyFiles(data.busyFiles);self._processResends(data.resends);self._checkResendRatioCriticality();};self._processStateData=function(data){var prevPaused=self.isPaused();self.stateString(gettext(data.text));self.errorString(data.error);self.isErrorOrClosed(data.flags.closedOrError);self.isOperational(data.flags.operational);self.isPaused(data.flags.paused);self.isPrinting(data.flags.printing);self.isCancelling(data.flags.cancelling);self.isPausing(data.flags.pausing);self.isError(data.flags.error);self.isReady(data.flags.ready);self.isSdReady(data.flags.sdReady);if(self.isPaused()!==prevPaused){if(self.isPaused()){self.titlePrintButton(self.TITLE_PRINT_BUTTON_PAUSED);self.titlePauseButton(self.TITLE_PAUSE_BUTTON_PAUSED);}else{self.titlePrintButton(self.TITLE_PRINT_BUTTON_UNPAUSED);self.titlePauseButton(self.TITLE_PAUSE_BUTTON_UNPAUSED);}}};self._processJobData=function(data){if(data.file){self.filename(data.file.name);self.filepath(data.file.path);self.filesize(data.file.size);self.filedisplay(data.file.display);self.filedate(data.file.date);self.sd(data.file.origin==="sdcard");}else{self.filename(undefined);self.filepath(undefined);self.filesize(undefined);self.filedisplay(undefined);self.filedate(undefined);self.sd(undefined);} +self.estimatedPrintTime(data.estimatedPrintTime);self.lastPrintTime(data.lastPrintTime);var result=[];if(data.filament&&typeof data.filament==="object"&&_.keys(data.filament).length>0){var keys=_.keys(data.filament);keys.sort();_.each(keys,function(key){if(!_.startsWith(key,"tool")||!data.filament[key]||!data.filament[key].hasOwnProperty("length")||data.filament[key].length<=0) +return;result.push({name:ko.observable(gettext("Tool")+" "+key.substr("tool".length)),data:ko.observable(data.filament[key])});});} +self.filament(result);self.user(data.user);};self._processProgressData=function(data){if(data.completion){self.progress(data.completion);}else{self.progress(undefined);} +self.filepos(data.filepos);self.printTime(data.printTime);self.printTimeLeft(data.printTimeLeft);self.printTimeLeftOrigin(data.printTimeLeftOrigin);};self._processZData=function(data){self.currentHeight(data);};self._processBusyFiles=function(data){var busyFiles=[];_.each(data,function(entry){if(entry.hasOwnProperty("path")&&entry.hasOwnProperty("origin")){busyFiles.push(entry.origin+":"+entry.path);}});self.busyFiles(busyFiles);};self._processResends=function(data){self.resendCount(data.count);self.resendTotalTransmitted(data.transmitted);self.resendRatio(data.ratio);};self._checkResendRatioCriticality=function(){if(self.resendRatioCritical()){if(self.resendRatioNotification===undefined){var message=gettext("

%(ratio)d%% of transmitted lines have triggered resend "+"requests. The communication with the printer is unreliable "+"and this will cause print artefacts and failures.

Please "+"see this FAQ entry "+"on tips on how to solve this.

");message=_.sprintf(message,{ratio:self.resendRatio(),url:"https://faq.octoprint.org/communication-errors"});self.resendRatioNotification=new PNotify({title:gettext("Critical resend ratio!"),text:message,type:"error",hide:false});}}else if(self.resendRatioNotification!==undefined){self.resendRatioNotification.remove();self.resendRatioNotification=undefined;}};self.print=function(){if(self.isPaused()){showConfirmationDialog({message:gettext("This will restart the print job from the beginning."),onproceed:function(){OctoPrint.job.restart();}});}else{var proceed=function(p){var prevented=false;var callback=function(){OctoPrint.job.start();};callViewModels(self.allViewModels,"onBeforePrintStart",function(method){prevented=prevented||method(callback)===false;});if(!prevented){callback();}};if(!self.settings.feature_printStartConfirmation()){proceed();}else{showConfirmationDialog({message:gettext("This will start a new print job. Please check that the print bed is clear."),question:gettext("Do you want to start the print job now?"),cancel:gettext("No"),proceed:gettext("Yes"),onproceed:proceed,nofade:true});}}};self.onlyPause=function(){OctoPrint.job.pause();};self.onlyResume=function(){OctoPrint.job.resume();};self.pause=function(action){OctoPrint.job.togglePause();};self.cancel=function(){if(!self.settings.feature_printCancelConfirmation()){OctoPrint.job.cancel();}else{showConfirmationDialog({message:gettext("This will cancel your print."),cancel:gettext("No, continue the print"),proceed:gettext("Yes, cancel the print"),onproceed:function(){OctoPrint.job.cancel();},nofade:true});}};self.showFirmwareErrorModal=(data)=>{if(!data){data=self.errorInfo;} +if(!data)return;const modal=$("#firmwareErrorModal");if(!modal.length)return;$("#firmwareErrorModalError",modal).text(data.error);switch(data.consequence){case"emergency":{$("#firmwareErrorModalM112",modal).show();$("#firmwareErrorModalDisconnect",modal).hide();$("#firmwareErrorModalCancel",modal).hide();break;} +case"disconnect":{$("#firmwareErrorModalM112",modal).hide();$("#firmwareErrorModalDisconnect",modal).show();$("#firmwareErrorModalCancel",modal).hide();break;} +case"cancel":{$("#firmwareErrorModalM112",modal).hide();$("#firmwareErrorModalDisconnect",modal).hide();$("#firmwareErrorModalCancel",modal).show();break;} +default:{$("#firmwareErrorModalM112",modal).hide();$("#firmwareErrorModalDisconnect",modal).hide();$("#firmwareErrorModalCancel",modal).hide();break;}} +if(data.faq){$("#firmwareErrorModalFaq a",modal).attr("href","https://faq.octoprint.org/"+data.faq);$("#firmwareErrorModalFaq",modal).show();}else{$("#firmwareErrorModalFaq",modal).hide();} +const logs=$("#firmwareErrorModalLogs",modal);const logOutput=$("#firmwareErrorModalLogsOutput",logs);if(data.logs){logOutput.empty();_.each(data.logs,(line)=>{logOutput.append(''+_.escape(line)+"\n"+"");});logs.show();}else{logs.hide();} +modal.modal("show");logOutput.scrollTop(logOutput.prop("scrollHeight"));};self.requestErrorInfo=()=>{OctoPrint.printer.getErrorInfo().then((data)=>{if(data&&data.error&&data.error!==""){self.errorInfoAvailable(true);self.errorInfo=data;}else{self.errorInfoAvailable(false);self.errorInfo={};}});};self.onEventError=(payload)=>{if(payload.reason==="firmware"){self.errorInfo=payload;self.errorInfoAvailable(true);self.showFirmwareErrorModal();}};self.onEventConnecting=self.onEventPrintCancelling=self.onEventPrintStarted=()=>{self.requestErrorInfo();};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=()=>{self.requestErrorInfo();};self.onAllBound=(allViewModels)=>{self.allViewModels=allViewModels;};} +OCTOPRINT_VIEWMODELS.push({construct:PrinterStateViewModel,dependencies:["loginStateViewModel","settingsViewModel","accessViewModel"],elements:["#state_wrapper","#drop_overlay"]});}); +; + +// source: js/app/viewmodels/printerprofiles.js +$(function(){var cleanProfile=function(){return{id:"",name:"",model:"",color:"default",volume:{formFactor:"rectangular",width:200,depth:200,height:200,origin:"lowerleft",custom_box:false},heatedBed:true,heatedChamber:false,axes:{x:{speed:6000,inverted:false},y:{speed:6000,inverted:false},z:{speed:200,inverted:false},e:{speed:300,inverted:false}},extruder:{count:1,offsets:[[0,0]],nozzleDiameter:0.4,sharedNozzle:false,defaultExtrusionLength:5}};};function EditedProfileViewModel(profiles){var self=this;self.profiles=profiles;self.isNew=ko.observable(false);self.name=ko.observable();self.color=ko.observable();self.identifier=ko.observable();self.identifierPlaceholder=ko.observable();self.model=ko.observable();self.volumeWidth=ko.observable();self.volumeHeight=ko.observable();self.volumeDepth=ko.observable();self.volumeFormFactor=ko.observable();self.volumeOrigin=ko.observable();self.volumeFormFactor.subscribe(function(value){if(value=="circular"){self.volumeOrigin("center");}});self.volumeOrigin.subscribe(function(){self.toBoundingBoxPlaceholders(self.defaultBoundingBox(self.volumeWidth(),self.volumeDepth(),self.volumeHeight(),self.volumeOrigin()));});self.heatedBed=ko.observable();self.heatedChamber=ko.observable();self.nozzleDiameter=ko.observable();self.extruders=ko.observable();self.extruderOffsets=ko.observableArray();self.sharedNozzle=ko.observable();self.defaultExtrusionLength=ko.observable();self.axisXSpeed=ko.observable();self.axisYSpeed=ko.observable();self.axisZSpeed=ko.observable();self.axisESpeed=ko.observable();self.axisXInverted=ko.observable(false);self.axisYInverted=ko.observable(false);self.axisZInverted=ko.observable(false);self.axisEInverted=ko.observable(false);self.customBoundingBox=ko.observable(false);self.boundingBoxMinX=ko.observable();self.boundingBoxMinY=ko.observable();self.boundingBoxMinZ=ko.observable();self.boundingBoxMaxX=ko.observable();self.boundingBoxMaxY=ko.observable();self.boundingBoxMaxZ=ko.observable();self.boundingBoxMinXPlaceholder=ko.observable();self.boundingBoxMinYPlaceholder=ko.observable();self.boundingBoxMinZPlaceholder=ko.observable();self.boundingBoxMaxXPlaceholder=ko.observable();self.boundingBoxMaxYPlaceholder=ko.observable();self.boundingBoxMaxZPlaceholder=ko.observable();self.koExtruderOffsets=ko.pureComputed(function(){var extruderOffsets=self.extruderOffsets();var numExtruders=self.extruders();if(!numExtruders){numExtruders=1;} +if(numExtruders-1>extruderOffsets.length){for(var i=extruderOffsets.length;i0&&self.volumeWidth()<10000)||!(self.volumeDepth()>0&&self.volumeDepth()<10000)||!(self.volumeHeight()>0&&self.volumeHeight()<10000));});self.identifierInvalid=ko.pureComputed(function(){var identifier=self.identifier();var placeholder=self.identifierPlaceholder();var data=identifier;if(!identifier){data=placeholder;} +var validCharacters=data&&data==self._sanitize(data);var existingProfile=self.profiles.getItem(function(item){return item.id==data;});return(!data||!validCharacters||(self.isNew()&&existingProfile!=undefined));});self.identifierInvalidText=ko.pureComputed(function(){if(!self.identifierInvalid()){return"";} +if(!self.identifier()&&!self.identifierPlaceholder()){return gettext("Identifier must be set");}else if(self.identifier()!=self._sanitize(self.identifier())){return gettext("Invalid characters, only a-z, A-Z, 0-9, -, ., _, ( and ) are allowed");}else{return gettext("A profile with such an identifier already exists");}});self.name.subscribe(function(){self.identifierPlaceholder(self._sanitize(self.name()).toLowerCase());});self.valid=function(){return(!self.nameInvalid()&&!self.identifierInvalid()&&!self.sizeInvalid());};self.availableColors=ko.observable([{key:"default",name:gettext("default")},{key:"red",name:gettext("red")},{key:"orange",name:gettext("orange")},{key:"yellow",name:gettext("yellow")},{key:"green",name:gettext("green")},{key:"blue",name:gettext("blue")},{key:"black",name:gettext("black")}]);self.availableOrigins=ko.pureComputed(function(){var formFactor=self.volumeFormFactor();var possibleOrigins={lowerleft:gettext("Lower Left"),center:gettext("Center")};var keys=[];if(formFactor=="rectangular"){keys=["lowerleft","center"];}else if(formFactor=="circular"){keys=["center"];} +var result=[];_.each(keys,function(key){result.push({key:key,name:possibleOrigins[key]});});return result;});self.fromProfileData=function(data){self.isNew(data===undefined);if(data===undefined){data=cleanProfile();} +self.identifier(data.id);self.name(data.name);self.color(data.color);self.model(data.model);self.volumeWidth(data.volume.width);self.volumeHeight(data.volume.height);self.volumeDepth(data.volume.depth);self.volumeFormFactor(data.volume.formFactor);self.volumeOrigin(data.volume.origin);if(data.volume.custom_box){self.toBoundingBoxData(data.volume.custom_box,true);}else{var box=self.defaultBoundingBox(data.volume.width,data.volume.depth,data.volume.height,data.volume.origin);self.toBoundingBoxData(box,false);} +self.heatedBed(data.heatedBed);self.heatedChamber(data.heatedChamber);self.nozzleDiameter(data.extruder.nozzleDiameter);self.sharedNozzle(data.extruder.sharedNozzle);self.defaultExtrusionLength(data.extruder.defaultExtrusionLength);self.extruders(data.extruder.count);var offsets=[];if(data.extruder.count>1){_.each(_.slice(data.extruder.offsets,1),function(offset,index){offsets.push({idx:index+1,x:ko.observable(offset[0]),y:ko.observable(offset[1])});});} +self.extruderOffsets(offsets);self.axisXSpeed(data.axes.x.speed);self.axisXInverted(data.axes.x.inverted);self.axisYSpeed(data.axes.y.speed);self.axisYInverted(data.axes.y.inverted);self.axisZSpeed(data.axes.z.speed);self.axisZInverted(data.axes.z.inverted);self.axisESpeed(data.axes.e.speed);self.axisEInverted(data.axes.e.inverted);};self.toProfileData=function(){var identifier=self.identifier();if(!identifier){identifier=self.identifierPlaceholder();} +var defaultProfile=cleanProfile();var valid=function(value,f,def){var v=f(value);if(isNaN(v)){return def;} +return v;};var runChecks=function(value,def,checks){if(checks.gt!==undefined){if(!(value>checks.gt)){return def;}} +if(checks.lt!==undefined){if(!(value1){for(var i=0;ib["name"].toLocaleLowerCase()) +return 1;return 0;}},{},"name",[],[],10);self.defaultProfile=ko.observable();self.currentProfile=ko.observable();self.createProfileEditor=function(data){var editor=new EditedProfileViewModel(self.profiles);if(data!==undefined){editor.fromProfileData(data);} +return editor;};self.editor=self.createProfileEditor();self.currentProfileData=ko.observable();self.enableEditorSubmitButton=ko.pureComputed(function(){return self.editor.valid()&&!self.requestInProgress();});self.makeDefault=function(data){var profile={id:data.id,default:true};self.updateProfile(profile);};self.canMakeDefault=function(data){return!data.isdefault();};self.canRemove=function(data){return!data.iscurrent()&&!data.isdefault();};self.requestData=function(){if(!self.loginState.hasPermission(self.access.permissions.CONNECTION)){return;} +return OctoPrint.printerprofiles.list().done(self.fromResponse);};self.fromResponse=function(data){var items=[];var defaultProfile=undefined;var currentProfile=undefined;var currentProfileData=undefined;_.each(data.profiles,function(entry){if(entry.default){defaultProfile=entry.id;} +if(entry.current){currentProfile=entry.id;currentProfileData=ko.mapping.fromJS(entry,self.currentProfileData);} +entry["isdefault"]=ko.observable(entry.default);entry["iscurrent"]=ko.observable(entry.current);items.push(entry);});self.profiles.updateItems(items);self.defaultProfile(defaultProfile);if(currentProfile&¤tProfileData){self.currentProfile(currentProfile);self.currentProfileData(currentProfileData);}else{log.warn("Current printer profile could not be detected, using default values");self.currentProfile("");self.currentProfileData(ko.mapping.fromJS(cleanProfile(),self.currentProfileData));}};self.addProfile=function(callback){var profile=self.editor.toProfileData();self.requestInProgress(true);OctoPrint.printerprofiles.add(profile).done(function(){if(callback!==undefined){callback();} +self.requestData();}).fail(function(xhr){var text=gettext("There was unexpected error while saving the printer profile, please consult the logs.");new PNotify({title:gettext("Could not add profile"),text:text,type:"error",hide:false});}).always(function(){self.requestInProgress(false);});};self.removeProfile=function(data){var perform=function(){self.requestInProgress(true);OctoPrint.printerprofiles.delete(data.id,{url:data.resource}).done(function(){self.requestData().always(function(){self.requestInProgress(false);});}).fail(function(xhr){var text;if(xhr.status==409){text=gettext("Cannot delete the default profile or the currently active profile.");}else{text=gettext("There was unexpected error while removing the printer profile, please consult the logs.");} +new PNotify({title:gettext("Could not delete profile"),text:text,type:"error",hide:false});self.requestInProgress(false);});};showConfirmationDialog(_.sprintf(gettext('You are about to delete the printer profile "%(name)s".'),{name:_.escape(data.name)}),perform);};self.updateProfile=function(profile,callback){if(profile==undefined){profile=self.editor.toProfileData();} +self.requestInProgress(true);OctoPrint.printerprofiles.update(profile.id,profile).done(function(){if(callback!==undefined){callback();} +self.requestData().always(function(){self.requestInProgress(false);});}).fail(function(){var text=gettext("There was unexpected error while updating the printer profile, please consult the logs.");new PNotify({title:gettext("Could not update profile"),text:text,type:"error",hide:false});self.requestInProgress(false);});};self.showEditProfileDialog=function(data){self.editor.fromProfileData(data);var editDialog=$("#settings_printerProfiles_editDialog");var confirmButton=$("button.btn-confirm",editDialog);var dialogTitle=$("h3.modal-title",editDialog);var add=data===undefined;dialogTitle.text(add?gettext("Add Printer Profile"):_.sprintf(gettext('Edit Printer Profile "%(name)s"'),{name:_.escape(data.name)}));confirmButton.unbind("click");confirmButton.bind("click",function(){if(self.enableEditorSubmitButton()){self.confirmEditProfile(add);}});$('ul.nav-pills a[data-toggle="tab"]:first',editDialog).tab("show");editDialog.modal({minHeight:function(){return Math.max($.fn.modal.defaults.maxHeight()-80,250);}}).css({"margin-left":function(){return-($(this).width()/2);}});};self.confirmEditProfile=function(add){var callback=function(){$("#settings_printerProfiles_editDialog").modal("hide");};if(add){self.addProfile(callback);}else{self.updateProfile(undefined,callback);}};self.onSettingsShown=self.requestData;self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){self.requestData();};} +OCTOPRINT_VIEWMODELS.push({construct:PrinterProfilesViewModel,dependencies:["loginStateViewModel","accessViewModel"]});}); +; + +// source: js/app/viewmodels/settings.js +$(function(){function SettingsViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.printerProfiles=parameters[2];self.about=parameters[3];self.users=parameters[4];var firstRequest=$.Deferred();self.firstRequest=firstRequest.promise();self.allViewModels=[];self.receiving=ko.observable(false);self.sending=ko.observable(false);self.exchanging=ko.pureComputed(function(){return self.receiving()||self.sending();});self.outstanding=[];self.active=false;self.sawUpdateEventWhileActive=false;self.ignoreNextUpdateEvent=false;self.settingsDialog=undefined;self.settings_dialog_update_detected=undefined;self.translationManagerDialog=undefined;self.translationUploadElement=$("#settings_appearance_managelanguagesdialog_upload");self.translationUploadButton=$("#settings_appearance_managelanguagesdialog_upload_start");self.translationUploadFilename=ko.observable();self.invalidTranslationArchive=ko.pureComputed(function(){var name=self.translationUploadFilename();return name!==undefined&&!_.endsWith(name.toLocaleLowerCase(),".zip");});self.enableTranslationUpload=ko.pureComputed(function(){var name=self.translationUploadFilename();return(name!==undefined&&name.trim()!=""&&!self.invalidTranslationArchive());});self.translations=new ItemListHelper("settings.translations",{locale:function(a,b){if(a["locale"].toLocaleLowerCase()b["locale"].toLocaleLowerCase()) +return 1;return 0;}},{},"locale",[],[],0);self.appearance_available_colors=ko.observable([{key:"default",name:gettext("default")},{key:"red",name:gettext("red")},{key:"orange",name:gettext("orange")},{key:"yellow",name:gettext("yellow")},{key:"green",name:gettext("green")},{key:"blue",name:gettext("blue")},{key:"violet",name:gettext("violet")},{key:"black",name:gettext("black")},{key:"white",name:gettext("white")}]);self.appearance_colorName=function(color){switch(color){case"red":return gettext("red");case"orange":return gettext("orange");case"yellow":return gettext("yellow");case"green":return gettext("green");case"blue":return gettext("blue");case"violet":return gettext("violet");case"black":return gettext("black");case"white":return gettext("white");case"default":return gettext("default");default:return color;}};self.webcam_available_videocodecs=["libx264","mpeg2video"];var auto_locale={language:"_default",display:gettext("Autodetect from browser"),english:undefined};self.locales=ko.observableArray([auto_locale].concat(_.sortBy(_.values(AVAILABLE_LOCALES),function(n){return n.display;})));self.locale_languages=_.keys(AVAILABLE_LOCALES);self.api_key=ko.observable(undefined);self.api_allowCrossOrigin=ko.observable(undefined);self.apiKeyVisible=ko.observable(false);self.appearance_name=ko.observable(undefined);self.appearance_color=ko.observable(undefined);self.appearance_colorTransparent=ko.observable();self.appearance_colorIcon=ko.observable();self.appearance_defaultLanguage=ko.observable();self.appearance_showFahrenheitAlso=ko.observable(undefined);self.appearance_fuzzyTimes=ko.observable(undefined);self.appearance_closeModalsWithClick=ko.observable(undefined);self.appearance_showInternalFilename=ko.observable(undefined);self.printer_defaultExtrusionLength=ko.observable(undefined);self.webcam_webcamEnabled=ko.observable(undefined);self.webcam_timelapseEnabled=ko.observable(undefined);self.webcam_snapshotTimeout=ko.observable(undefined);self.webcam_snapshotSslValidation=ko.observable(undefined);self.webcam_ffmpegPath=ko.observable(undefined);self.webcam_ffmpegCommandline=ko.observable(undefined);self.webcam_bitrate=ko.observable(undefined);self.webcam_ffmpegThreads=ko.observable(undefined);self.webcam_ffmpegVideoCodec=ko.observable(undefined);self.webcam_watermark=ko.observable(undefined);self.webcam_defaultWebcam=ko.observable(undefined);self.webcam_snapshotWebcam=ko.observable(undefined);self.webcam_webcams=ko.observableArray([]);self.feature_temperatureGraph=ko.observable(undefined);self.feature_sdSupport=ko.observable(undefined);self.feature_keyboardControl=ko.observable(undefined);self.feature_pollWatched=ko.observable(undefined);self.feature_modelSizeDetection=ko.observable(undefined);self.feature_rememberFileFolder=ko.observable(undefined);self.feature_printStartConfirmation=ko.observable(undefined);self.feature_printCancelConfirmation=ko.observable(undefined);self.feature_uploadOverwriteConfirmation=ko.observable(undefined);self.feature_g90InfluencesExtruder=ko.observable(undefined);self.feature_autoUppercaseBlacklist=ko.observable(undefined);self.feature_enableDragDropUpload=ko.observable(undefined);self.gcodeAnalysis_runAt=ko.observable(undefined);self.serial_port=ko.observable();self.serial_baudrate=ko.observable();self.serial_exclusive=ko.observable();self.serial_lowLatency=ko.observable();self.serial_portOptions=ko.observableArray([]);self.serial_baudrateOptions=ko.observableArray([]);self.serial_autoconnect=ko.observable(undefined);self.serial_timeoutConnection=ko.observable(undefined);self.serial_timeoutDetectionFirst=ko.observable(undefined);self.serial_timeoutDetectionConsecutive=ko.observable(undefined);self.serial_timeoutCommunication=ko.observable(undefined);self.serial_timeoutCommunicationBusy=ko.observable(undefined);self.serial_timeoutTemperature=ko.observable(undefined);self.serial_timeoutTemperatureTargetSet=ko.observable(undefined);self.serial_timeoutTemperatureAutoreport=ko.observable(undefined);self.serial_timeoutSdStatus=ko.observable(undefined);self.serial_timeoutSdStatusAutoreport=ko.observable(undefined);self.serial_timeoutPosAutoreport=ko.observable(undefined);self.serial_timeoutBaudrateDetectionPause=ko.observable(undefined);self.serial_timeoutPositionLogWait=ko.observable(undefined);self.serial_log=ko.observable(undefined);self.serial_additionalPorts=ko.observable(undefined);self.serial_additionalBaudrates=ko.observable(undefined);self.serial_blacklistedPorts=ko.observable(undefined);self.serial_blacklistedBaudrates=ko.observable(undefined);self.serial_longRunningCommands=ko.observable(undefined);self.serial_checksumRequiringCommands=ko.observable(undefined);self.serial_blockedCommands=ko.observable(undefined);self.serial_ignoredCommands=ko.observable(undefined);self.serial_pausingCommands=ko.observable(undefined);self.serial_sdCancelCommand=ko.observable(undefined);self.serial_emergencyCommands=ko.observable(undefined);self.serial_helloCommand=ko.observable(undefined);self.serial_serialErrorBehaviour=ko.observable("cancel");self.serial_triggerOkForM29=ko.observable(undefined);self.serial_waitForStart=ko.observable(undefined);self.serial_waitToLoadSdFileList=ko.observable(undefined);self.serial_sendChecksum=ko.observable("print");self.serial_sendChecksumWithUnknownCommands=ko.observable(undefined);self.serial_unknownCommandsNeedAck=ko.observable(undefined);self.serial_sdRelativePath=ko.observable(undefined);self.serial_sdLowerCase=ko.observable(undefined);self.serial_sdAlwaysAvailable=ko.observable(undefined);self.serial_swallowOkAfterResend=ko.observable(undefined);self.serial_repetierTargetTemp=ko.observable(undefined);self.serial_disableExternalHeatupDetection=ko.observable(undefined);self.serial_ignoreIdenticalResends=ko.observable(undefined);self.serial_firmwareDetection=ko.observable(undefined);self.serial_blockWhileDwelling=ko.observable(undefined);self.serial_useParityWorkaround=ko.observable(undefined);self.serial_sanityCheckTools=ko.observable(undefined);self.serial_supportResendsWithoutOk=ko.observable(undefined);self.serial_logPositionOnPause=ko.observable(undefined);self.serial_logPositionOnCancel=ko.observable(undefined);self.serial_abortHeatupOnCancel=ko.observable(undefined);self.serial_maxTimeoutsIdle=ko.observable(undefined);self.serial_maxTimeoutsPrinting=ko.observable(undefined);self.serial_maxTimeoutsLong=ko.observable(undefined);self.serial_capAutoreportTemp=ko.observable(undefined);self.serial_capAutoreportSdStatus=ko.observable(undefined);self.serial_capAutoreportPos=ko.observable(undefined);self.serial_capBusyProtocol=ko.observable(undefined);self.serial_capEmergencyParser=ko.observable(undefined);self.serial_capExtendedM20=ko.observable(undefined);self.serial_capLfnWrite=ko.observable(undefined);self.serial_sendM112OnError=ko.observable(undefined);self.serial_disableSdPrintingDetection=ko.observable(undefined);self.serial_ackMax=ko.observable(undefined);self.serial_resendRatioThreshold=ko.observable(100);self.serial_resendRatioStart=ko.observable(100);self.serial_ignoreEmptyPorts=ko.observable(undefined);self.serial_enableShutdownActionCommand=ko.observable(undefined);self.folder_uploads=ko.observable(undefined);self.folder_timelapse=ko.observable(undefined);self.folder_watched=ko.observable(undefined);self.scripts_gcode_beforePrintStarted=ko.observable(undefined);self.scripts_gcode_afterPrintDone=ko.observable(undefined);self.scripts_gcode_afterPrintCancelled=ko.observable(undefined);self.scripts_gcode_afterPrintPaused=ko.observable(undefined);self.scripts_gcode_beforePrintResumed=ko.observable(undefined);self.scripts_gcode_afterPrinterConnected=ko.observable(undefined);self.scripts_gcode_beforePrinterDisconnected=ko.observable(undefined);self.scripts_gcode_afterToolChange=ko.observable(undefined);self.scripts_gcode_beforeToolChange=ko.observable(undefined);self.temperature_profiles=ko.observableArray(undefined);self.temperature_cutoff=ko.observable(undefined);self.temperature_sendAutomatically=ko.observable(undefined);self.temperature_sendAutomaticallyAfter=ko.observable(undefined);self.system_actions=ko.observableArray([]);self.terminalFilters=ko.observableArray([]);self.server_commands_systemShutdownCommand=ko.observable(undefined);self.server_commands_systemRestartCommand=ko.observable(undefined);self.server_commands_serverRestartCommand=ko.observable(undefined);self.server_diskspace_warning=ko.observable();self.server_diskspace_critical=ko.observable();self.server_diskspace_warning_str=sizeObservable(self.server_diskspace_warning);self.server_diskspace_critical_str=sizeObservable(self.server_diskspace_critical);self.server_onlineCheck_enabled=ko.observable();self.server_onlineCheck_interval=ko.observable();self.server_onlineCheck_host=ko.observable();self.server_onlineCheck_port=ko.observable();self.server_onlineCheck_name=ko.observable();self.server_pluginBlacklist_enabled=ko.observable();self.server_pluginBlacklist_url=ko.observable();self.server_pluginBlacklist_ttl=ko.observable();self.server_allowFraming=ko.observable();self.settings=undefined;self.lastReceivedSettings=undefined;self.webcam_ffmpegPathText=ko.observable();self.webcam_ffmpegPathOk=ko.observable(false);self.webcam_ffmpegPathBroken=ko.observable(false);self.webcam_ffmpegPathReset=function(){self.webcam_ffmpegPathText("");self.webcam_ffmpegPathOk(false);self.webcam_ffmpegPathBroken(false);};self.server_onlineCheckText=ko.observable();self.server_onlineCheckOk=ko.observable(false);self.server_onlineCheckBroken=ko.observable(false);self.server_onlineCheckReset=function(){self.server_onlineCheckText("");self.server_onlineCheckOk(false);self.server_onlineCheckBroken(false);};self.server_onlineCheckResolutionText=ko.observable();self.server_onlineCheckResolutionOk=ko.observable(false);self.server_onlineCheckResolutionBroken=ko.observable(false);self.server_onlineCheckResolutionReset=function(){self.server_onlineCheckResolutionText("");self.server_onlineCheckResolutionOk(false);self.server_onlineCheckResolutionBroken(false);};var folderTypes=["uploads","timelapse","watched"];var checkForDuplicateFolders=function(){_.each(folderTypes,function(folderType){var path=self["folder_"+folderType]();var duplicate=false;_.each(folderTypes,function(otherFolderType){if(folderType!==otherFolderType){duplicate=duplicate||path===self["folder_"+otherFolderType]();}});self.testFolderConfigDuplicate[folderType](duplicate);});};self.testFolderConfigText={};self.testFolderConfigOk={};self.testFolderConfigBroken={};self.testFolderConfigDuplicate={};self.testFolderConfigError={};self.testFolderConfigSuccess={};_.each(folderTypes,function(folderType){self.testFolderConfigText[folderType]=ko.observable("");self.testFolderConfigOk[folderType]=ko.observable(false);self.testFolderConfigBroken[folderType]=ko.observable(false);self.testFolderConfigDuplicate[folderType]=ko.observable(false);self.testFolderConfigError[folderType]=ko.pureComputed(function(){return(self.testFolderConfigBroken[folderType]()||self.testFolderConfigDuplicate[folderType]());});self.testFolderConfigSuccess[folderType]=ko.pureComputed(function(){return(self.testFolderConfigOk[folderType]()&&!self.testFolderConfigDuplicate[folderType]());});self["folder_"+folderType].subscribe(checkForDuplicateFolders);});self.testFolderConfigReset=function(){_.each(folderTypes,function(folderType){self.testFolderConfigText[folderType]("");self.testFolderConfigOk[folderType](false);self.testFolderConfigBroken[folderType](false);});};self.testFoldersDuplicate=ko.pureComputed(function(){var foundDupe=false;_.each(folderTypes,function(folderType){foundDupe=foundDupe||self.testFolderConfigDuplicate[folderType]();});return foundDupe;});self.observableCopies={feature_waitForStart:"serial_waitForStart",feature_waitToLoadSdFileList:"serial_waitToLoadSdFileList",feature_sendChecksum:"serial_sendChecksum",feature_sdRelativePath:"serial_sdRelativePath",feature_sdAlwaysAvailable:"serial_sdAlwaysAvailable",feature_swallowOkAfterResend:"serial_swallowOkAfterResend",feature_repetierTargetTemp:"serial_repetierTargetTemp",feature_disableExternalHeatupDetection:"serial_disableExternalHeatupDetection",feature_ignoreIdenticalResends:"serial_ignoreIdenticalResends",feature_firmwareDetection:"serial_firmwareDetection",feature_blockWhileDwelling:"serial_blockWhileDwelling",serial_:"feature_"};_.each(self.observableCopies,function(value,key){if(self.hasOwnProperty(value)){self[key]=self[value];}});self.webcamCompat={webcam_streamUrl:"streamUrl",webcam_streamRatio:"streamRatio",webcam_streamTimeout:"streamTimeout",webcam_streamWebrtcIceServers:"webrtcIceServers",webcam_snapshotUrl:"snapshotUrl",webcam_flipH:"flipH",webcam_flipV:"flipV",webcam_rotate90:"rotate90",webcam_cacheBuster:"cacheBuster"};self.addTemperatureProfile=function(){self.temperature_profiles.push({name:"New",extruder:0,bed:0,chamber:0});};self.removeTemperatureProfile=function(profile){self.temperature_profiles.remove(profile);};self.addTerminalFilter=function(){self.terminalFilters.push({name:"New",regex:"(Send:\\s+(N\\d+\\s+)?M105)|(Recv:\\s+(ok\\s+([PBN]\\d+\\s+)*)?.*([BCLPR]|T\\d*):-?\\d+)"});};self.removeTerminalFilter=function(filter){self.terminalFilters.remove(filter);};self.testWebcamFfmpegPathBusy=ko.observable(false);self.testWebcamFfmpegPath=function(){if(!self.webcam_ffmpegPath()){return;} +if(self.testWebcamFfmpegPathBusy()){return;} +self.testWebcamFfmpegPathBusy(true);OctoPrint.util.testExecutable(self.webcam_ffmpegPath()).done(function(response){if(!response.result){if(!response.exists){self.webcam_ffmpegPathText(gettext("The path doesn't exist"));}else if(!response.typeok){self.webcam_ffmpegPathText(gettext("The path is not a file"));}else if(!response.access){self.webcam_ffmpegPathText(gettext("The path is not an executable"));}}else{self.webcam_ffmpegPathText(gettext("The path is valid"));} +self.webcam_ffmpegPathOk(response.result);self.webcam_ffmpegPathBroken(!response.result);}).always(function(){self.testWebcamFfmpegPathBusy(false);});};self.testOnlineConnectivityConfigBusy=ko.observable(false);self.testOnlineConnectivityConfig=function(){if(!self.server_onlineCheck_host())return;if(!self.server_onlineCheck_port())return;if(self.testOnlineConnectivityConfigBusy())return;self.testOnlineConnectivityConfigBusy(true);OctoPrint.util.testServer(self.server_onlineCheck_host(),self.server_onlineCheck_port()).done(function(response){if(!response.result){self.server_onlineCheckText(gettext("The server is not reachable"));}else{self.server_onlineCheckText(gettext("The server is reachable"));} +self.server_onlineCheckOk(response.result);self.server_onlineCheckBroken(!response.result);}).always(function(){self.testOnlineConnectivityConfigBusy(false);});};self.testOnlineConnectivityResolutionConfigBusy=ko.observable(false);self.testOnlineConnectivityResolutionConfig=function(){if(!self.server_onlineCheck_name())return;if(self.testOnlineConnectivityResolutionConfigBusy())return;self.testOnlineConnectivityResolutionConfigBusy(true);OctoPrint.util.testResolution(self.server_onlineCheck_name()).done(function(response){if(!response.result){self.server_onlineCheckResolutionText(gettext("Name cannot be resolved"));}else{self.server_onlineCheckResolutionText(gettext("Name can be resolved"));} +self.server_onlineCheckResolutionOk(response.result);self.server_onlineCheckResolutionBroken(!response.result);}).always(function(){self.testOnlineConnectivityResolutionConfigBusy(false);});};self.testFolderConfigBusy=ko.observable(false);self.testFolderConfig=function(folder){var observable="folder_"+folder;if(!self.hasOwnProperty(observable))return;if(self.testFolderConfigBusy())return;self.testFolderConfigBusy(true);var opts={check_type:"dir",check_access:"w",allow_create_dir:true,check_writable_dir:true};var path=self[observable]();OctoPrint.util.testPath(path,opts).done(function(response){if(!response.result){if(response.broken_symlink){self.testFolderConfigText[folder](gettext("The path is a broken symlink."));}else if(!response.exists){self.testFolderConfigText[folder](gettext("The path does not exist and cannot be created."));}else if(!response.typeok){self.testFolderConfigText[folder](gettext("The path is not a folder."));}else if(!response.access){self.testFolderConfigText[folder](gettext("The path is not writable."));}}else{self.testFolderConfigText[folder](gettext("The path is valid"));} +self.testFolderConfigOk[folder](response.result);self.testFolderConfigBroken[folder](!response.result);}).always(function(){self.testFolderConfigBusy(false);});};self.onSettingsHidden=function(){self.webcam_ffmpegPathReset();self.server_onlineCheckReset();self.server_onlineCheckResolutionReset();self.testFolderConfigReset();};self.isDialogActive=function(){return self.settingsDialog.is(":visible");};self.onStartup=function(){self.settingsDialog=$("#settings_dialog");self.settingsUpdatedDialog=$("#settings_dialog_update_detected");self.translationManagerDialog=$("#settings_appearance_managelanguagesdialog");self.translationUploadElement=$("#settings_appearance_managelanguagesdialog_upload");self.translationUploadButton=$("#settings_appearance_managelanguagesdialog_upload_start");self.translationUploadElement.fileupload({dataType:"json",maxNumberOfFiles:1,autoUpload:false,add:function(e,data){if(data.files.length==0){return false;} +self.translationUploadFilename(data.files[0].name);self.translationUploadButton.unbind("click");self.translationUploadButton.bind("click",function(){data.submit();return false;});},done:function(e,data){self.translationUploadButton.unbind("click");self.translationUploadFilename(undefined);self.fromTranslationResponse(data.result);},fail:function(e,data){self.translationUploadButton.unbind("click");self.translationUploadFilename(undefined);}});};self.onAllBound=function(allViewModels){self.allViewModels=allViewModels;self.settingsDialog.on("show",function(event){OctoPrint.coreui.settingsOpen=true;if(event.target.id=="settings_dialog"){self.requestTranslationData();callViewModels(allViewModels,"onSettingsShown");}});self.settingsDialog.on("hidden",function(event){OctoPrint.coreui.settingsOpen=false;if(event.target.id=="settings_dialog"){callViewModels(allViewModels,"onSettingsHidden");}});self.settingsDialog.on("beforeSave",function(){callViewModels(allViewModels,"onSettingsBeforeSave");});$(".reload_all",self.settingsUpdatedDialog).click(function(e){e.preventDefault();self.settingsUpdatedDialog.modal("hide");self.requestData();return false;});$(".reload_nonconflicts",self.settingsUpdatedDialog).click(function(e){e.preventDefault();self.settingsUpdatedDialog.modal("hide");self.requestData(true);return false;});$('ul.nav-list a[data-toggle="tab"]',self.settingsDialog).on("show",function(){self._resetScrollPosition();});};self.show=function(tab){self.selectTab(tab);self._resetScrollPosition();self.settingsDialog.modal({minHeight:function(){return Math.max($.fn.modal.defaults.maxHeight()-80,250);}}).css({"margin-left":function(){return-($(this).width()/2);}});return false;};self.hide=function(){self.settingsDialog.modal("hide");};self.generateApiKey=function(){if(!CONFIG_ACCESS_CONTROL)return;showConfirmationDialog(gettext("This will generate a new API Key. The old API Key will cease to function immediately."),function(){OctoPrint.settings.generateApiKey().done(function(response){self.api_key(response.apikey);self.requestData();});});};self.deleteApiKey=()=>{if(!CONFIG_ACCESS_CONTROL)return;if(!self.api_key())return;showConfirmationDialog(gettext("This will delete the API Key. It will cease to to function immediately."),function(){OctoPrint.settings.deleteApiKey().done(()=>{self.api_key(undefined);});});};self.copyApiKey=function(){copyToClipboard(self.api_key());};self.revealingApiKey=ko.observable(false);self.revealApiKey=()=>{self.loginState.reauthenticateIfNecessary(()=>{self.revealingApiKey(true);self.requestData().always(()=>{self.revealingApiKey(false);});});};self.showTranslationManager=function(){self.translationManagerDialog.modal();return false;};self.requestData=function(local){var callback=undefined;if(arguments.length===2||_.isFunction(local)){var exc=new Error();log.warn("The callback parameter of SettingsViewModel.requestData is deprecated, the method now returns a promise, please use that instead. Stacktrace:",exc.stack||exc.stacktrace||"");if(arguments.length===2){callback=arguments[0];local=arguments[1];}else{callback=local;local=false;}} +var callbackHandler=function(){if(!callback)return;try{callback();}catch(exc){log.error("Error calling settings callback",callback,":",`${exc.message}\n${exc.stack || exc}`);}};if(self.receiving()){var deferred=$.Deferred();self.outstanding.push(deferred);if(callback){deferred.done(callbackHandler);} +return deferred.promise();} +self.receiving(true);return OctoPrint.settings.get().always(function(){self.receiving(false);}).done(function(response){self.fromResponse(response,local);if(callback){var deferred=$.Deferred();deferred.done(callbackHandler);self.outstanding.push(deferred);} +var args=arguments;_.each(self.outstanding,function(deferred){deferred.resolve(args);});self.outstanding=[];}).fail(function(){var args=arguments;_.each(self.outstanding,function(deferred){deferred.reject(args);});self.outstanding=[];});};self.requestTranslationData=function(){return OctoPrint.languages.list().done(self.fromTranslationResponse);};self.fromTranslationResponse=function(response){var translationsByLocale={};_.each(response.language_packs,function(item,key){_.each(item.languages,function(pack){var locale=pack.locale;if(!_.has(translationsByLocale,locale)){translationsByLocale[locale]={locale:locale,display:pack.locale_display,english:pack.locale_english,packs:[]};} +translationsByLocale[locale]["packs"].push({identifier:key,display:item.display,pack:pack});});});var translations=[];_.each(translationsByLocale,function(item){item["packs"].sort(function(a,b){if(a.identifier=="_core")return-1;if(b.identifier=="_core")return 1;if(a.displayb.display)return 1;return 0;});translations.push(item);});self.translations.updateItems(translations);};self.languagePackDisplay=function(item){return(item.display+ +(item.english!=undefined?" ("+item.english+")":""));};self.languagePacksAvailable=ko.pureComputed(function(){return self.translations.allSize()>0;});self.deleteLanguagePack=function(locale,pack){OctoPrint.languages.delete(locale,pack).done(self.fromTranslationResponse);};self.getLocalData=function(){var data={};if(self.settings!=undefined){data=ko.mapping.toJS(self.settings);} +var specialMappings={feature:{autoUppercaseBlacklist:function(){return splitTextToArray(self.feature_autoUppercaseBlacklist(),",",true);}},serial:{additionalPorts:function(){return commentableLinesToArray(self.serial_additionalPorts());},additionalBaudrates:function(){return _.map(splitTextToArray(self.serial_additionalBaudrates(),",",true,function(item){return!isNaN(parseInt(item));}),function(item){return parseInt(item);});},blacklistedPorts:function(){return commentableLinesToArray(self.serial_blacklistedPorts());},blacklistedBaudrates:function(){return _.map(splitTextToArray(self.serial_blacklistedBaudrates(),",",true,function(item){return!isNaN(parseInt(item));}),function(item){return parseInt(item);});},longRunningCommands:function(){return splitTextToArray(self.serial_longRunningCommands(),",",true);},checksumRequiringCommands:function(){return splitTextToArray(self.serial_checksumRequiringCommands(),",",true);},blockedCommands:function(){return splitTextToArray(self.serial_blockedCommands(),",",true);},ignoredCommands:function(){return splitTextToArray(self.serial_ignoredCommands(),",",true);},pausingCommands:function(){return splitTextToArray(self.serial_pausingCommands(),",",true);},emergencyCommands:function(){return splitTextToArray(self.serial_emergencyCommands(),",",true);},externalHeatupDetection:function(){return!self.serial_disableExternalHeatupDetection();},alwaysSendChecksum:function(){return self.serial_sendChecksum()==="always";},neverSendChecksum:function(){return self.serial_sendChecksum()==="never";},ignoreErrorsFromFirmware:function(){return self.serial_serialErrorBehaviour()==="ignore";},disconnectOnErrors:function(){return self.serial_serialErrorBehaviour()==="disconnect";}},scripts:{gcode:function(){var result={};var prefix="scripts_gcode_";var observables=_.filter(_.keys(self),function(key){return _.startsWith(key,prefix);});_.each(observables,function(observable){var script=observable.substring(prefix.length);result[script]=self[observable]();});return result;}},temperature:{profiles:function(){var result=[];_.each(self.temperature_profiles(),function(profile){try{result.push({name:profile.name,extruder:Math.floor(_.isNumber(profile.extruder)?profile.extruder:parseInt(profile.extruder)),bed:Math.floor(_.isNumber(profile.bed)?profile.bed:parseInt(profile.bed)),chamber:Math.floor(_.isNumber(profile.chamber)?profile.chamber:_.isNumber(parseInt(profile.chamber))?parseInt(profile.chamber):0)});}catch(ex){}});return result;}}};var mapFromObservables=function(data,mapping,keyPrefix){var flag=false;var result={};_.forOwn(data,function(value,key){var observable=key;if(keyPrefix!==undefined){observable=keyPrefix+"_"+observable;} +if(self.observableCopies.hasOwnProperty(observable)){return;} +if(self.webcamCompat.hasOwnProperty(observable)){return;} +if(mapping&&mapping[key]&&_.isFunction(mapping[key])){result[key]=mapping[key]();flag=true;}else if(_.isPlainObject(value)){var subresult=mapFromObservables(value,mapping&&mapping[key]?mapping[key]:undefined,observable);if(subresult!==undefined){result[key]=subresult;flag=true;}}else if(self.hasOwnProperty(observable)){result[key]=self[observable]();flag=true;}});return flag?result:undefined;};var dataFromObservables=mapFromObservables(data,specialMappings);data=deepMerge(data,dataFromObservables);return data;};self.reauthenticationTimeout=undefined;self.fromResponse=function(response,local){var serverChangedData;var clientChangedData;if(local){serverChangedData=getOnlyChangedData(response,self.lastReceivedSettings);clientChangedData=getOnlyChangedData(self.getLocalData(),self.lastReceivedSettings);}else{serverChangedData=response;clientChangedData=undefined;} +self.lastReceivedSettings=response;if(self.settings===undefined){self.settings=ko.mapping.fromJS(serverChangedData);}else{ko.mapping.fromJS(serverChangedData,self.settings);} +var specialMappings={appearance:{defaultLanguage:function(value){self.appearance_defaultLanguage("_default");if(_.includes(self.locale_languages,value)){self.appearance_defaultLanguage(value);}}},feature:{autoUppercaseBlacklist:function(value){self.feature_autoUppercaseBlacklist(value.join(", "));}},serial:{additionalPorts:function(value){self.serial_additionalPorts(value.join("\n"));},additionalBaudrates:function(value){self.serial_additionalBaudrates(value.join(", "));},blacklistedPorts:function(value){self.serial_blacklistedPorts(value.join("\n"));},blacklistedBaudrates:function(value){self.serial_blacklistedBaudrates(value.join(", "));},longRunningCommands:function(value){self.serial_longRunningCommands(value.join(", "));},checksumRequiringCommands:function(value){self.serial_checksumRequiringCommands(value.join(", "));},blockedCommands:function(value){self.serial_blockedCommands(value.join(", "));},ignoredCommands:function(value){self.serial_ignoredCommands(value.join(", "));},pausingCommands:function(value){self.serial_pausingCommands(value.join(", "));},emergencyCommands:function(value){self.serial_emergencyCommands(value.join(", "));},externalHeatupDetection:function(value){self.serial_disableExternalHeatupDetection(!value);},alwaysSendChecksum:function(value){if(value){self.serial_sendChecksum("always");}},neverSendChecksum:function(value){if(value){self.serial_sendChecksum("never");}},ignoreErrorsFromFirmware:function(value){if(value){self.serial_serialErrorBehaviour("ignore");}},disconnectOnErrors:function(value){if(value){self.serial_serialErrorBehaviour("disconnect");}}},terminalFilters:function(value){self.terminalFilters($.extend(true,[],value));},temperature:{profiles:function(value){self.temperature_profiles($.extend(true,[],value));}}};_.each(self.webcamCompat,(mapped,key)=>{if(self.settings.hasOwnProperty(key))return;if(!self.settings.webcam.hasOwnProperty(mapped))return;const message="Please use the webcam system introduced with 1.9.0, the "+ +key+" config setting is deprecated and will be removed in a future release. Stacktrace:";self[key]=ko.pureComputed({read:()=>{const exc=new Error();log.warn(message,exc.stack||exc.stacktrace||"");return self.settings.webcam[mapped]();},write:(value)=>{const exc=new Error();log.warn(message,exc.stack||exc.stacktrace||"");self.settings.webcam[mapped](value);},owner:self});});var mapToObservables=function(data,mapping,local,keyPrefix){if(!_.isPlainObject(data)){return;} +_.forOwn(data,function(value,key){var observable=key;if(keyPrefix!=undefined){observable=keyPrefix+"_"+observable;} +if(self.observableCopies.hasOwnProperty(observable)){return;} +if(self.webcamCompat.hasOwnProperty(observable)){return;} +var haveLocalVersion=local&&local.hasOwnProperty(key);if(mapping&&mapping[key]&&_.isFunction(mapping[key])&&!haveLocalVersion){mapping[key](value);}else if(_.isPlainObject(value)){mapToObservables(value,mapping&&mapping[key]?mapping[key]:undefined,local&&local[key]?local[key]:undefined,observable);}else if(!haveLocalVersion&&self.hasOwnProperty(observable)){self[observable](value);}});};mapToObservables(serverChangedData,specialMappings,clientChangedData);firstRequest.resolve();self.apiKeyVisible(self.loginState.checkCredentialsSeen());if(self.apiKeyVisible()){self.reauthenticationTimeout=self.loginState.afterReauthenticationTimeout(()=>{self.requestData();},self.reauthenticationTimeout);}};self.cancelData=function(){self.fromResponse(self.lastReceivedSettings);self.hide();};self.saveData=function(data,successCallback,setAsSending){var options;if(_.isPlainObject(successCallback)){options=successCallback;}else{options={success:successCallback,sending:setAsSending===true};} +self.settingsDialog.trigger("beforeSave");self.sawUpdateEventWhileSending=false;self.sending(data===undefined||options.sending||false);if(data===undefined){var localData=self.getLocalData();data=getOnlyChangedData(localData,self.lastReceivedSettings);} +if(self.testFoldersDuplicate()){delete data.folder;} +self.active=true;return OctoPrint.settings.save(data).done(function(data,status,xhr){self.ignoreNextUpdateEvent=!self.sawUpdateEventWhileSending;self.active=false;self.receiving(true);self.sending(false);try{self.fromResponse(data);if(options.success)options.success(data,status,xhr);}finally{self.receiving(false);}}).fail(function(xhr,status,error){self.sending(false);self.active=false;if(options.error)options.error(xhr,status,error);}).always(function(xhr,status){if(options.complete)options.complete(xhr,status);});};self.onEventSettingsUpdated=function(){if(self.active){self.sawUpdateEventWhileActive=true;} +var preventSettingsRefresh=_.any(self.allViewModels,function(viewModel){if(viewModel.hasOwnProperty("onSettingsPreventRefresh")){try{return viewModel["onSettingsPreventRefresh"]();}catch(e){log.warn("Error while calling onSettingsPreventRefresh on",viewModel,":",e);return false;}}else{return false;}});if(preventSettingsRefresh){return;} +if(self.isDialogActive()){if(self.sending()||self.receiving()||self.active||self.ignoreNextUpdateEvent){self.ignoreNextUpdateEvent=false;return;} +if(!hasDataChanged(self.getLocalData(),self.lastReceivedSettings)){self.requestData();}else{self.settingsUpdatedDialog.modal("show");}}else{self.requestData();}};self._resetScrollPosition=function(){$("#settings_dialog_content",self.settingsDialog).scrollTop(0);$('#settings_dialog_content ul.nav-pills a[data-toggle="tab"]:first',self.settingsDialog).tab("show");$('#settings_dialog_content ul.nav-list a[data-toggle="tab"]:first',self.settingsDialog).tab("show");$('#settings_dialog_content ul.nav-tabs a[data-toggle="tab"]:first',self.settingsDialog).tab("show");};self.selectTab=function(tab){if(tab!=undefined){if(!_.startsWith(tab,"#")){tab="#"+tab;} +$('ul.nav-list a[href="'+tab+'"]',self.settingsDialog).tab("show");}else{$('ul.nav-list a[data-toggle="tab"]:first',self.settingsDialog).tab("show");}};self.onServerReconnect=function(){self.requestData();};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){if(!self._startupComplete)return;self.requestData();};self.validURL=function(str){var pattern=new RegExp("^(https?:\\/\\/)?"+"((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|"+"((\\d{1,3}\\.){3}\\d{1,3}))"+"(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*"+"(\\?[;&a-z\\d%_.~+=-]*)?"+"(\\#[-a-z\\d_]*)?$","i");return!!pattern.test(str);};} +OCTOPRINT_VIEWMODELS.push({construct:SettingsViewModel,dependencies:["loginStateViewModel","accessViewModel","printerProfilesViewModel","aboutViewModel","usersViewModel"],elements:["#settings_dialog","#navbar_settings"]});}); +; + +// source: js/app/viewmodels/slicing.js +$(function(){function SlicingViewModel(parameters){var self=this;self.loginState=parameters[0];self.printerProfiles=parameters[1];self.printerState=parameters[2];self.access=parameters[3];self.file=ko.observable(undefined);self.target=undefined;self.path=undefined;self.data=undefined;self.defaultSlicer=undefined;self.defaultProfile=undefined;self.destinationFilename=ko.observable();self.gcodeFilename=self.destinationFilename;self.title=ko.observable();self.slicer=ko.observable();self.slicers=ko.observableArray();self.profile=ko.observable();self.profiles=ko.observableArray();self.printerProfile=ko.observable();self.slicerSameDevice=ko.observable();self.allViewModels=undefined;self.slicersForFile=function(file){if(file===undefined){return[];} +return _.filter(self.configuredSlicers(),function(slicer){return _.any(slicer.sourceExtensions,function(extension){return _.endsWith(file.toLowerCase(),"."+extension.toLowerCase());});});};self.profilesForSlicer=function(key){if(key==undefined){key=self.slicer();} +if(key==undefined||!self.data.hasOwnProperty(key)){return;} +var slicer=self.data[key];var selectedProfile=undefined;self.profiles.removeAll();_.each(_.values(slicer.profiles),function(profile){var name=profile.displayName;if(name==undefined){name=profile.key;} +if(profile.default){selectedProfile=profile.key;} +self.profiles.push({key:profile.key,name:name});});self.profile(selectedProfile);self.defaultProfile=selectedProfile;};self.resetProfiles=function(){self.profiles.removeAll();self.profile(undefined);};self.metadataForSlicer=function(key){if(key==undefined||!self.data.hasOwnProperty(key)){return;} +var slicer=self.data[key];self.slicerSameDevice(slicer.sameDevice);};self.resetMetadata=function(){self.slicerSameDevice(true);};self.configuredSlicers=ko.pureComputed(function(){return _.filter(self.slicers(),function(slicer){return slicer.configured;});});self.matchingSlicers=ko.computed(function(){var slicers=self.slicersForFile(self.file());var containsSlicer=function(key){return _.any(slicers,function(slicer){return slicer.key==key;});};var current=self.slicer();if(!containsSlicer(current)){if(self.defaultSlicer!==undefined&&containsSlicer(self.defaultSlicer)){self.slicer(self.defaultSlicer);}else{self.slicer(undefined);self.resetProfiles();}}else{self.profilesForSlicer(self.slicer());} +return slicers;});self.afterSlicingOptions=[{value:"none",text:gettext("Do nothing")},{value:"select",text:gettext("Select for printing")},{value:"print",text:gettext("Start printing")}];self.afterSlicing=ko.observable("none");self.show=function(target,file,force,path,options){options=options||{};if(!self.enableSlicingDialog()&&!force){return;} +var filename=file;if(filename.lastIndexOf("/")!=0){path=path||filename.substr(0,filename.lastIndexOf("/"));filename=filename.substr(filename.lastIndexOf("/")+1);} +var display=options.display||filename;var destination=display.substr(0,display.lastIndexOf("."));self.requestData();self.target=target;self.file(file);self.path=path;self.title(_.sprintf(gettext("Slicing %(filename)s"),{filename:_.escape(display)}));self.destinationFilename(destination);self.printerProfile(self.printerProfiles.currentProfile());self.afterSlicing("none");$("#slicing_configuration_dialog").modal("show");};self.slicer.subscribe(function(newValue){if(newValue===undefined){self.resetProfiles();self.resetMetadata();}else{self.profilesForSlicer(newValue);self.metadataForSlicer(newValue);}});self.enableSlicingDialog=ko.pureComputed(function(){return self.configuredSlicers().length>0;});self.enableSlicingDialogForFile=function(file){return self.slicersForFile(file).length>0;};self.enableSliceButton=ko.pureComputed(function(){return(self.destinationFilename()!=undefined&&self.destinationFilename().trim()!=""&&self.slicer()!=undefined&&self.profile()!=undefined&&(!(self.printerState.isPrinting()||self.printerState.isPaused())||!self.slicerSameDevice()));});self.sliceButtonTooltip=ko.pureComputed(function(){if(!self.enableSliceButton()){if((self.printerState.isPrinting()||self.printerState.isPaused())&&self.slicerSameDevice()){return gettext("Cannot slice on the same device while printing");}else{return gettext("Cannot slice, not all parameters specified");}}else{return gettext("Start the slicing process");}});self.requestData=function(){if(!self.loginState.hasPermission(self.access.permissions.SLICE)){return;} +return OctoPrint.slicing.listAllSlicersAndProfiles().done(function(data){self.fromResponse(data);});};self.destinationExtension=ko.pureComputed(function(){var fallback="???";if(self.slicer()===undefined){return fallback;} +var slicer=self.data[self.slicer()];if(slicer===undefined){return fallback;} +var extensions=slicer.extensions;if(extensions===undefined){return fallback;} +var destinationExtensions=extensions.destination;if(destinationExtensions===undefined||!destinationExtensions.length){return fallback;} +return destinationExtensions[0]||fallback;});self.fromResponse=function(data){self.data=data;var selectedSlicer=undefined;self.slicers.removeAll();_.each(_.values(data),function(slicer){var name=slicer.displayName;if(name==undefined){name=slicer.key;} +if(slicer.default&&slicer.configured){selectedSlicer=slicer.key;} +var props={key:slicer.key,name:name,configured:slicer.configured,sourceExtensions:slicer.extensions.source,destinationExtensions:slicer.extensions.destination,sameDevice:slicer.sameDevice};self.slicers.push(props);});self.defaultSlicer=selectedSlicer;if(self.allViewModels){callViewModels(self.allViewModels,"onSlicingData",[data]);}};self.slice=function(){if(!self.enableSliceButton()){return;} +var destinationFilename=self.destinationFilename();var destinationExtensions=self.data[self.slicer()]&&self.data[self.slicer()].extensions&&self.data[self.slicer()].extensions.destination?self.data[self.slicer()].extensions.destination:["???"];if(!_.any(destinationExtensions,function(extension){return _.endsWith(destinationFilename.toLowerCase(),"."+extension.toLowerCase());})){destinationFilename=destinationFilename+"."+destinationExtensions[0];} +var data={slicer:self.slicer(),profile:self.profile(),printerProfile:self.printerProfile(),destination:destinationFilename};if(self.path!=undefined){data["path"]=self.path;} +if(self.afterSlicing()=="print"){data["print"]=true;}else if(self.afterSlicing()=="select"){data["select"]=true;} +OctoPrint.files.slice(self.target,self.file(),data).done(function(){$("#slicing_configuration_dialog").modal("hide");self.destinationFilename(undefined);self.slicer(self.defaultSlicer);self.profile(self.defaultProfile);});};self._sanitize=function(name){return name.replace(/[^a-zA-Z0-9\-_\.\(\) ]/g,"").replace(/ /g,"_");};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){self.requestData();};self.onEventSettingsUpdated=function(payload){self.requestData();};self.onAllBound=function(allViewModels){self.allViewModels=allViewModels;};} +OCTOPRINT_VIEWMODELS.push({construct:SlicingViewModel,dependencies:["loginStateViewModel","printerProfilesViewModel","printerStateViewModel","accessViewModel"],elements:["#slicing_configuration_dialog"]});}); +; + +// source: js/app/viewmodels/system.js +$(function(){function SystemViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.lastCommandResponse=undefined;self.systemActions=ko.observableArray([]);self._startupNotification=undefined;self.requestData=function(){self.requestCommandData();self.requestStartupData();};self.requestCommandData=function(){if(!self.loginState.hasPermission(self.access.permissions.SYSTEM)){return $.Deferred().reject().promise();} +return OctoPrint.system.getCommands().done(self.fromCommandResponse);};self.fromCommandResponse=function(response){var actions=[];if(response.core&&response.core.length){_.each(response.core,function(data){var action=_.extend({},data);action.actionSource="core";actions.push(action);});if((response.custom&&response.custom.length)||(response.plugin&&response.plugin.length)){actions.push({action:"divider"});}} +_.each(response.plugin,function(data){var action=_.extend({},data);action.actionSource="plugin";actions.push(action);if(response.custom&&response.custom.length){actions.push({action:"divider"});}});_.each(response.custom,function(data){var action=_.extend({},data);action.actionSource="custom";actions.push(action);});self.lastCommandResponse=response;self.systemActions(actions);};self.requestStartupData=function(){if(!self.loginState.hasPermission(self.access.permissions.SYSTEM)){return $.Deferred().reject().promise();} +return OctoPrint.system.getStartupData().done(self.fromStartupResponse);};self.fromStartupResponse=function(response){const startupData=response.startup;if(startupData.flagged_basefolders){if(self._startupNotification)self._startupNotification.remove();let html="

"+ +gettext("The following folder(s) were found to be unusable by OctoPrint during startup and have been turned back to the default:")+"

";html+="
    ";_.each(startupData.flagged_basefolders,(value,key)=>{html+="
  • "+ +_.escape(key)+": "+ +_.escape(value)+"
  • ";});html+="
";html+="

"+ +gettext("Please check the permissions of these folders and make sure they are writable by the user running OctoPrint. In case of network shares, make sure they have been mounted before OctoPrint starts.")+"

";self._startupNotification=new PNotify({title:gettext("Warning"),text:html,type:"warning",hide:false});}};self.triggerCommand=function(commandSpec){if(!self.loginState.hasPermission(self.access.permissions.SYSTEM)){return $.Deferred().reject().promise();} +var deferred=$.Deferred();var callback=function(){OctoPrint.system.executeCommand(commandSpec.actionSource,commandSpec.action).done(function(){var text;if(commandSpec.async){text=gettext('The command "%(command)s" was triggered asynchronously');}else{text=gettext('The command "%(command)s" executed successfully');} +new PNotify({title:"Success",text:_.sprintf(text,{command:_.escape(commandSpec.name)}),type:"success"});deferred.resolve(["success",arguments]);}).fail(function(jqXHR,textStatus,errorThrown){if(!commandSpec.hasOwnProperty("ignore")||!commandSpec.ignore){var error="

"+ +_.sprintf(gettext('The command "%(command)s" could not be executed.'),{command:_.escape(commandSpec.name)})+"

";error+=pnotifyAdditionalInfo("
"+_.escape(jqXHR.responseText)+"
");new PNotify({title:gettext("Error"),text:error,type:"error",hide:false});deferred.reject(["error",arguments]);}else{deferred.resolve(["ignored",arguments]);}});};if(commandSpec.confirm){showConfirmationDialog({message:commandSpec.confirm,onproceed:function(){callback();},oncancel:function(){deferred.reject("cancelled",arguments);}});}else{callback();} +return deferred.promise();};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(user){if(self.loginState.hasPermission(self.access.permissions.SYSTEM)){self.requestData();}else{self.lastCommandResponse=undefined;self.systemActions([]);}};self.onEventSettingsUpdated=function(){if(self.loginState.hasPermission(self.access.permissions.SYSTEM)){self.requestData();}};} +OCTOPRINT_VIEWMODELS.push({construct:SystemViewModel,dependencies:["loginStateViewModel","accessViewModel"]});}); +; + +// source: js/app/viewmodels/temperature.js +$(function(){function TemperatureViewModel(parameters){var self=this;self.loginState=parameters[0];self.settingsViewModel=parameters[1];self.access=parameters[2];self.printerState=parameters[3];self._createToolEntry=function(){var entry={name:ko.observable(),key:ko.observable(),actual:ko.observable(0),target:ko.observable(0),offset:ko.observable(0),newTarget:ko.observable(),newOffset:ko.observable()};entry.newTargetValid=ko.pureComputed(function(){var value=entry.newTarget();try{value=parseInt(value);}catch(exc){return false;} +return value>=0&&value<=999;});entry.newOffsetValid=ko.pureComputed(function(){var value=entry.newOffset();try{value=parseInt(value);}catch(exc){return false;} +return-50<=value<=50;});entry.offset.subscribe(function(newValue){if(self.changingOffset.item!==undefined&&self.changingOffset.item.key()===entry.key()){self.changingOffset.offset(newValue);}});return entry;};self.changingOffset={offset:ko.observable(0),newOffset:ko.observable(0),name:ko.observable(""),item:undefined,title:ko.pureComputed(function(){return _.sprintf(gettext("Changing Offset of %(name)s"),{name:_.escape(self.changingOffset.name())});}),description:ko.pureComputed(function(){return _.sprintf(gettext('Use the form below to specify a new offset to apply to all temperature commands sent from printed files for "%(name)s"'),{name:_.escape(self.changingOffset.name())});})};self.changeOffsetDialog=undefined;self.loginStateSubscription=undefined;self.tools=ko.observableArray([]);self.hasTools=ko.pureComputed(function(){return self.tools().length>0;});self.hasBed=ko.observable(true);self.hasChamber=ko.observable(false);self.visible=ko.pureComputed(function(){return self.hasTools()||self.hasBed();});self.bedTemp=self._createToolEntry();self.bedTemp["name"](gettext("Bed"));self.bedTemp["key"]("bed");self.chamberTemp=self._createToolEntry();self.chamberTemp["name"](gettext("Chamber"));self.chamberTemp["key"]("chamber");self.isErrorOrClosed=ko.observable(undefined);self.isOperational=ko.observable(undefined);self.isPrinting=ko.observable(undefined);self.isPaused=ko.observable(undefined);self.isError=ko.observable(undefined);self.isReady=ko.observable(undefined);self.isLoading=ko.observable(undefined);self.temperature_profiles=self.settingsViewModel.temperature_profiles;self.temperature_cutoff=self.settingsViewModel.temperature_cutoff;self.heaterOptions=ko.observable({});self._printerProfileInitialized=false;self._currentTemperatureDataBacklog=[];self._historyTemperatureDataBacklog=[];self._graphUpdater=undefined;self._printerProfileUpdated=function(){var graphColors=["red","orange","green","brown","purple"];var heaterOptions={};var tools=[];var color;const currentProfileData=self.settingsViewModel.printerProfiles.currentProfileData();if(!currentProfileData)return;var numExtruders=currentProfileData?currentProfileData.extruder.count():0;var sharedNozzle=currentProfileData?currentProfileData.extruder.sharedNozzle():false;if(numExtruders&&numExtruders>1&&!sharedNozzle){for(var extruder=0;extruder=minTime;};_.each(_.keys(self.heaterOptions()),function(d){const actualLen=result[d].actual.length;result[d].actual=_.filter(result[d].actual,filterOld);if(actualLen&&result[d].actual.length<=actualLen){result[d].actual.unshift([minTime,undefined]);} +const targetLen=result[d].target.length;result[d].target=_.filter(result[d].target,filterOld);if(targetLen&&result[d].target.length<=targetLen){result[d].target.unshift([minTime,undefined]);}});} +return result;};self.profileText=function(heater,profile){var text=gettext("Set %(name)s (%(value)s)");var format=function(temp){if(temp===0||temp===undefined||temp===null){return gettext("Off");}else{return""+temp+"°C";}};var value;if(heater==="all"){value=gettext("Tool")+": %(extruder)s";if(self.hasBed()){value+="/"+gettext("Bed")+": %(bed)s";} +if(self.hasChamber()){value+="/"+gettext("Chamber")+": %(chamber)s";} +value=_.sprintf(value,{extruder:format(profile.extruder),bed:format(profile.bed),chamber:format(profile.chamber)});}else if(heater.key()==="bed"){value=format(profile.bed);}else if(heater.key()==="chamber"){value=format(profile.chamber);}else{value=format(profile.extruder);} +return _.sprintf(text,{name:_.escape(profile.name),value:_.escape(value)});};self.updatePlot=function(){var graph=$("#temperature-graph");if(!graph.length)return;if(!self.plot)return;var plotInfo=self._getPlotInfo();if(plotInfo===undefined)return;var newMax=Math.max(Math.max.apply(null,plotInfo.max)*1.1,310);if(newMax!==self.plot.getAxes().yaxis.max){self._initializePlot(true,plotInfo);}else{self.plot.setData(plotInfo.data);self.plot.setupGrid();self.updateLegend(self._replaceLegendLabel);self.plot.draw();}};self._drawMarkings=function(){var graph=$("#temperature-graph");if(!self.plot){return[];} +$(".temperature-mark-label").remove();if(!self.showStateMarks()){return[];} +var graphWidth=self.plot.width();var yAxisLabelWidth=40;var markingsLabelMargin=0;var lineWidth=2;var marks=self.markings.map(function(mark){var time=parseInt(mark.time*1000);var o=self.plot.pointOffset({x:time,y:self.plot.getAxes().yaxis.max});var markLabel=mark.type;if(mark.label){markLabel=gettext(mark.label);} +var label=$("
");label.html(markLabel);label.addClass("temperature-mark-label");label.addClass("temperature-mark-type-"+mark.type);if(o.left>yAxisLabelWidth){graph.append(label);if(o.left>graphWidth+ +yAxisLabelWidth- +label.outerHeight()- +markingsLabelMargin){label.css("left",o.left-label.outerHeight()-markingsLabelMargin+"px");label.css("border-radius","5px 0 0 0");}else{label.css("left",o.left+markingsLabelMargin+"px");label.css("border-radius","0 0 0 5px");} +label.css("top",o.top+label.outerWidth()+"px");} +return{color:label.css("background-color"),lineWidth:lineWidth,xaxis:{from:time,to:time}};});return marks;};[gettext("Start"),gettext("Done"),gettext("Cancel"),gettext("Pause"),gettext("Resume"),gettext("Connected"),gettext("Disconnected")];self._initializePlot=function(force,plotInfo){var graph=$("#temperature-graph");if(!graph.length)return;if(self.plot&&!force)return;plotInfo=plotInfo||self._getPlotInfo();if(plotInfo===undefined)return;var options={yaxis:{min:0,max:Math.max(Math.max.apply(null,plotInfo.max)*1.1,310),ticks:10,tickFormatter:(val,axis)=>{if(val===undefined||val===0)return"";return val+"°C";}},xaxis:{mode:"time",ticks:(axis)=>{if(axis.max===undefined||axis.min===undefined||axis.datamax===axis.datamin) +return[];const tickSize=5*60*1000;const ticks=[];let val=axis.max;while(val>axis.min){ticks.push(val);val-=tickSize;} +return ticks;},tickFormatter:(val,axis)=>{var timestampUtc=Date.now();var diff=timestampUtc-val;var diffInMins=Math.round(diff/(60*1000));if(diffInMins<0){return"";}else if(diffInMins===0){return gettext("now");}else{return"- "+diffInMins+" "+gettext("min");}}},legend:{position:"sw",noColumns:2,backgroundOpacity:0}};if(!OctoPrint.coreui.browser.mobile){options["crosshair"]={mode:"x"};options["grid"]={hoverable:true,autoHighlight:false,markings:self._drawMarkings};} +self.plot=$.plot(graph,plotInfo.data,options);};self._getPlotInfo=function(){var data=[];var heaterOptions=self.heaterOptions();if(!heaterOptions)return undefined;var maxTemps=[310/1.1];var now=Date.now();var showFahrenheit=self._shallShowFahrenheit();_.each(_.keys(heaterOptions),function(type){if(type==="bed"&&!self.hasBed()){return;} +var actuals=[];var targets=[];if(self.temperatures[type]){actuals=self.temperatures[type].actual;targets=self.temperatures[type].target;} +var actualTemp=actuals&&actuals.length?formatTemperature(actuals[actuals.length-1][1],showFahrenheit):"-";var targetTemp=targets&&targets.length?formatTemperature(targets[targets.length-1][1],showFahrenheit,1):"-";data.push({label:gettext("Actual")+" "+ +heaterOptions[type].name+": "+ +actualTemp,color:heaterOptions[type].color,data:actuals.length?actuals:[[now,undefined]]});data.push({label:gettext("Target")+" "+ +heaterOptions[type].name+": "+ +targetTemp,color:pusher.color(heaterOptions[type].color).tint(0.5).html(),data:targets.length?targets:[[now,undefined]],dashes:{show:true}});maxTemps.push(self.getMaxTemp(actuals,targets));});return{max:maxTemps,data:data};};self.updateLegend=function(replaceLegendLabel){self.plotLegendTimeout=undefined;var resetLegend=function(){_.each(dataset,function(series,index){var value=series.data&&series.data.length?series.data[series.data.length-1][1]:undefined;replaceLegendLabel(index,series,value);});};var pos=self.plotHoverPos;if(pos&&!OctoPrint.coreui.browser.mobile){var i;var axes=self.plot.getAxes();var dataset=self.plot.getData();if(pos.xaxes.xaxis.max||pos.yaxes.yaxis.max){resetLegend();}else{_.each(dataset,function(series,index){for(i=0;ipos.x){break;}} +var y;var p1=series.data[i-1];var p2=series.data[i];if(p1===undefined&&p2===undefined){y=undefined;}else if(p1===undefined){y=p2[1];}else if(p2===undefined){y=p1[1];}else{y=p1[1]+ +((p2[1]-p1[1])*(pos.x-p1[0]))/(p2[0]-p1[0]);} +replaceLegendLabel(index,series,y,true);});}}else{resetLegend();} +self.plot.setupGrid();};self.getMaxTemp=function(actuals,targets){var maxTemp=0;actuals.forEach(function(pair){if(pair[1]>maxTemp){maxTemp=pair[1];}});targets.forEach(function(pair){if(pair[1]>maxTemp){maxTemp=pair[1];}});return maxTemp;};self.incrementTarget=function(item){var value=item.newTarget();if(value===undefined||(typeof value==="string"&&value.trim()==="")){value=item.target();} +try{value=parseInt(value);if(value>999)return;item.newTarget(value+1);self.autosendTarget(item);}catch(ex){}};self.decrementTarget=function(item){var value=item.newTarget();if(value===undefined||(typeof value==="string"&&value.trim()==="")){value=item.target();} +try{value=parseInt(value);if(value<=0)return;item.newTarget(value-1);self.autosendTarget(item);}catch(ex){}};var _sendTimeout={};self.autosendTarget=function(item){if(!self.settingsViewModel.temperature_sendAutomatically())return;var delay=self.settingsViewModel.temperature_sendAutomaticallyAfter()*1000;var name=item.name();if(_sendTimeout[name]){window.clearTimeout(_sendTimeout[name]);} +_sendTimeout[name]=window.setTimeout(function(){self.setTarget(item);delete _sendTimeout[name];},delay);};self.clearAutosendTarget=function(item){var name=item.name();if(_sendTimeout[name]){window.clearTimeout(_sendTimeout[name]);delete _sendTimeout[name];}};self.setTarget=function(item,form){var value=item.newTarget();if(form!==undefined){$(form).find("input").blur();} +if(value===undefined||(typeof value==="string"&&value.trim()==="")) +return OctoPrintClient.createRejectedDeferred();self.clearAutosendTarget(item);return self.setTargetToValue(item,value);};self.setTargetsFromProfile=function(temperatureProfile){if(temperatureProfile===undefined){console.log("temperatureProfile is undefined!");return;} +if(self.hasBed()){self.setTargetFromProfile(self.bedTemp,temperatureProfile);} +if(self.hasChamber()){self.setTargetFromProfile(self.chamberTemp,temperatureProfile);} +self.tools().forEach(function(element){self.setTargetFromProfile(element,temperatureProfile);});};self.setTargetFromProfile=function(item,profile){if(!profile)return OctoPrintClient.createRejectedDeferred();self.clearAutosendTarget(item);var target;if(item.key()==="bed"){target=profile.bed;}else if(item.key()==="chamber"){target=profile.chamber;}else{target=profile.extruder;} +if(target===undefined)target=0;return self.setTargetToValue(item,target);};self.setTargetsToZero=function(){if(self.hasBed()){self.setTargetToZero(self.bedTemp);} +if(self.hasChamber()){self.setTargetToZero(self.chamberTemp);} +self.tools().forEach(function(element){self.setTargetToZero(element);});};self.setTargetToZero=function(item){self.clearAutosendTarget(item);return self.setTargetToValue(item,0);};self.setTargetToValue=function(item,value){self.clearAutosendTarget(item);try{value=parseInt(value);}catch(ex){return OctoPrintClient.createRejectedDeferred();} +if(value<0||value>999)return OctoPrintClient.createRejectedDeferred();var onSuccess=function(){item.target(value);item.newTarget("");};if(item.key()==="bed"){return self._setBedTemperature(value).done(onSuccess);}else if(item.key()==="chamber"){return self._setChamberTemperature(value).done(onSuccess);}else{return self._setToolTemperature(item.key(),value).done(onSuccess);}};self.changeOffset=function(item){self.changingOffset.item=item;self.changingOffset.name(item.name());self.changingOffset.offset(item.offset());self.changingOffset.newOffset(item.offset());self.changeOffsetDialog.modal("show");};self.incrementChangeOffset=function(){var value=self.changingOffset.newOffset();if(value===undefined||(typeof value==="string"&&value.trim()==="")) +value=self.changingOffset.offset();try{value=parseInt(value);if(value>=50)return;self.changingOffset.newOffset(value+1);}catch(ex){}};self.decrementChangeOffset=function(){var value=self.changingOffset.newOffset();if(value===undefined||(typeof value==="string"&&value.trim()==="")) +value=self.changingOffset.offset();try{value=parseInt(value);if(value<=-50)return;self.changingOffset.newOffset(value-1);}catch(ex){}};self.deleteChangeOffset=function(){self.changingOffset.newOffset(0);};self.confirmChangeOffset=function(){var item=self.changingOffset.item;item.newOffset(self.changingOffset.newOffset());self.setOffset(item).done(function(){self.changeOffsetDialog.modal("hide");self.changingOffset.offset(0);self.changingOffset.newOffset(0);self.changingOffset.name("");self.changingOffset.item=undefined;});};self.setOffset=function(item){var value=item.newOffset();if(value===undefined||(typeof value==="string"&&value.trim()==="")) +return OctoPrintClient.createRejectedDeferred();return self.setOffsetToValue(item,value);};self.setOffsetToZero=function(item){return self.setOffsetToValue(item,0);};self.setOffsetToValue=function(item,value){try{value=parseInt(value);}catch(ex){return OctoPrintClient.createRejectedDeferred();} +if(value<-50||value>50) +return OctoPrintClient.createRejectedDeferred();var onSuccess=function(){item.offset(value);item.newOffset("");};if(item.key()==="bed"){return self._setBedOffset(value).done(onSuccess);}else if(item.key()==="chamber"){return self._setChamberOffset(value).done(onSuccess);}else{return self._setToolOffset(item.key(),value).done(onSuccess);}};self._setToolTemperature=function(tool,temperature){var data={};data[tool]=parseInt(temperature);return OctoPrint.printer.setToolTargetTemperatures(data);};self._setToolOffset=function(tool,offset){var data={};data[tool]=parseInt(offset);return OctoPrint.printer.setToolTemperatureOffsets(data);};self._setBedTemperature=function(temperature){return OctoPrint.printer.setBedTargetTemperature(parseInt(temperature));};self._setBedOffset=function(offset){return OctoPrint.printer.setBedTemperatureOffset(parseInt(offset));};self._setChamberTemperature=function(temperature){return OctoPrint.printer.setChamberTargetTemperature(parseInt(temperature));};self._setChamberOffset=function(offset){return OctoPrint.printer.setChamberTemperatureOffset(parseInt(offset));};self._replaceLegendLabel=function(index,series,value,emph){var showFahrenheit=self._shallShowFahrenheit();var temp;if(index%2===0){temp=formatTemperature(value,showFahrenheit);}else{temp=formatTemperature(value,showFahrenheit,1);} +if(emph){temp=""+temp+"";} +series.label=series.label.replace(/:.*/,": "+temp);};self._shallShowFahrenheit=function(){return self.settingsViewModel.settings!==undefined?self.settingsViewModel.settings.appearance.showFahrenheitAlso():false;};self.handleEnter=function(event,type,item){if(event.keyCode===13){if(type==="target"){self.setTarget(item).done(function(){event.target.blur();});}else if(type==="offset"){self.confirmChangeOffset();}}};self.handleFocus=function(event,type,item){if(type==="target"){var value=item.newTarget();if(value===undefined||(typeof value==="string"&&value.trim()==="")){item.newTarget(item.target());} +window.setTimeout(function(){event.target.select();},0);}else if(type==="offset"){window.setTimeout(function(){event.target.select();},0);}};self.initOrUpdate=function(){if(OctoPrint.coreui.selectedTab!=="#temp"||!$("#temp").is(":visible")){return;} +if(!self.plot){self._initializePlot();}else{self.updatePlot();}};self.onAfterTabChange=function(){self.initOrUpdate();};self.onStartup=function(){var graph=$("#temperature-graph");if(graph.length&&!OctoPrint.coreui.browser.mobile){graph.bind("plothover",function(event,pos,item){self.plotHoverPos=pos;if(!self.plotLegendTimeout){self.plotLegendTimeout=window.setTimeout(function(){self.updateLegend(self._replaceLegendLabel);},50);}});} +self.changeOffsetDialog=$("#change_offset_dialog");self._graphUpdater=setInterval(()=>{if(self.printerState.isOperational())return;const now=Date.now()/1000;const entry={};_.each(_.keys(self.heaterOptions()),(type)=>{entry[type]={actual:undefined,target:undefined};});entry["time"]=now;self.temperatures=self._processTemperatureData(now,[entry],self.temperatures);self.updatePlot();},1000);};self.onStartupComplete=function(){self.initOrUpdate();self._printerProfileUpdated();};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){self.initOrUpdate();};} +OCTOPRINT_VIEWMODELS.push({construct:TemperatureViewModel,dependencies:["loginStateViewModel","settingsViewModel","accessViewModel","printerStateViewModel"],elements:["#temp","#temp_link","#change_offset_dialog"]});}); +; + +// source: js/app/viewmodels/terminal.js +$(function(){function TerminalViewModel(parameters){var self=this;self.loginState=parameters[0];self.settings=parameters[1];self.access=parameters[2];self.tabActive=false;self.previousScroll=undefined;self.log=ko.observableArray([]);self.log.extend({throttle:500});self.plainLogLines=ko.observableArray([]);self.plainLogLines.extend({throttle:500});self.buffer=ko.observable(300);self.upperLimit=ko.observable(1499);self.command=ko.observable(undefined);self.isErrorOrClosed=ko.observable(undefined);self.isOperational=ko.observable(undefined);self.isPrinting=ko.observable(undefined);self.isPaused=ko.observable(undefined);self.isError=ko.observable(undefined);self.isReady=ko.observable(undefined);self.isLoading=ko.observable(undefined);self.autoscrollEnabled=ko.observable(true);self.filters=self.settings.terminalFilters;self.filterRegex=ko.observable();self.cmdHistory=[];self.cmdHistoryIdx=-1;self.enableFancyFunctionality=ko.observable(true);self.disableTerminalLogDuringPrinting=ko.observable(false);self.acceptableFancyTime=500;self.acceptableUnfancyTime=300;self.reenableTimeout=5000;self.forceFancyFunctionality=ko.observable(false);self.forceTerminalLogDuringPrinting=ko.observable(false);self.fancyFunctionality=ko.pureComputed(function(){return self.enableFancyFunctionality()||self.forceFancyFunctionality();});self.terminalLogDuringPrinting=ko.pureComputed(function(){return(!self.disableTerminalLogDuringPrinting()||self.forceTerminalLogDuringPrinting());});self.displayedLines=ko.pureComputed(function(){if(!self.enableFancyFunctionality()){return self.log();} +var regex=self.filterRegex();var lineVisible=function(entry){return regex===undefined||!entry.line.match(regex);};var filtered=false;var result=[];var lines=self.log();_.each(lines,function(entry){if(lineVisible(entry)){result.push(entry);filtered=false;}else if(!filtered){result.push(self._toInternalFormat("[...]","filtered"));filtered=true;}});return result;});self.plainLogOutput=ko.pureComputed(function(){if(self.fancyFunctionality()){return;} +return self.plainLogLines().join("\n");});self.lineCount=ko.pureComputed(function(){if(!self.fancyFunctionality()){return;} +var regex=self.filterRegex();var lineVisible=function(entry){return regex===undefined||!entry.line.match(regex);};var lines=self.log();var total=lines.length;var displayed=_.filter(lines,lineVisible).length;var filtered=total-displayed;if(filtered>0){if(total>self.upperLimit()){return _.sprintf(gettext("showing %(displayed)d lines (%(filtered)d of %(total)d total lines filtered, buffer full)"),{displayed:displayed,total:total,filtered:filtered});}else{return _.sprintf(gettext("showing %(displayed)d lines (%(filtered)d of %(total)d total lines filtered)"),{displayed:displayed,total:total,filtered:filtered});}}else{if(total>self.upperLimit()){return _.sprintf(gettext("showing %(displayed)d lines (buffer full)"),{displayed:displayed});}else{return _.sprintf(gettext("showing %(displayed)d lines"),{displayed:displayed});}}});self.autoscrollEnabled.subscribe(function(newValue){if(newValue){self.log(self.log.slice(-self.buffer()));}});self.activeFilters=ko.observableArray([]);self.activeFilters.subscribe(function(e){self.updateFilterRegex();});self.blacklist=[];self.settings.feature_autoUppercaseBlacklist.subscribe(function(newValue){self.blacklist=splitTextToArray(newValue,",",true);});self._reenableFancyTimer=undefined;self._reenableUnfancyTimer=undefined;self._disableFancy=function(difference){if(self.enableFancyFunctionality()){log.warn("Terminal: Detected slow client (needed "+ +difference+"ms for processing new log data), disabling fancy terminal functionality");self.enableFancyFunctionality(false);} +if(self._reenableFancyTimer){window.clearTimeout(self._reenableFancyTimer);self._reenableFancyTimer=undefined;}};self._reenableFancy=function(difference){if(self._reenableFancyTimer)return;if(self.enableFancyFunctionality())return;self._reenableFancyTimer=window.setTimeout(function(){log.info("Terminal: Client speed recovered, enabling fancy terminal functionality");self.enableFancyFunctionality(true);},self.reenableTimeout);};self._disableUnfancy=function(difference){if(!self.disableTerminalLogDuringPrinting()){log.warn("Terminal: Detected very slow client (needed "+ +difference+"ms for processing new log data), completely disabling terminal output during printing");self.disableTerminalLogDuringPrinting(true);} +if(self._reenableUnfancyTimer){window.clearTimeout(self._reenableUnfancyTimer);self._reenableUnfancyTimer=undefined;}};self._reenableUnfancy=function(){if(self._reenableUnfancyTimer)return;if(!self.disableTerminalLogDuringPrinting())return;self._reenableUnfancyTimer=window.setTimeout(function(){log.info("Terminal: Client speed recovered, enabling terminal output during printing");self.disableTerminalLogDuringPrinting(false);},self.reenableTimeout);};self.fromCurrentData=function(data){self._processStateData(data.state);var start=new Date().getTime();self._processCurrentLogData(data.logs);var end=new Date().getTime();var difference=end-start;if(difference>=self.acceptableFancyTime){self._disableFancy(difference);}else if(difference>=self.acceptableUnfancyTime){self._disableUnfancy(difference);}else if(difference=self.upperLimit()){return;} +if(!self.terminalLogDuringPrinting()&&self.isPrinting()){var last=self.plainLogLines()[self.plainLogLines().length-1];var disabled="--- client too slow, log output disabled while printing ---";if(last!==disabled){self.plainLogLines.push(disabled);} +return;} +var newData=data.length+length>self.upperLimit()?data.slice(0,self.upperLimit()-length):data;if(!newData){return;} +if(!self.fancyFunctionality()){self.plainLogLines(self.plainLogLines().concat(newData).slice(-self.buffer()));self.updateOutput();return;} +var newLog=self.log().concat(_.map(newData,function(line){return self._toInternalFormat(line);}));if(newData.length!==data.length){var cutoff="--- too many lines to buffer, cut off ---";newLog.push(self._toInternalFormat(cutoff,"cut"));} +if(self.autoscrollEnabled()){newLog=newLog.slice(-self.buffer());} +self.log(newLog);self.updateOutput();};self._processHistoryLogData=function(data){if(!data)return;self.plainLogLines(data);self.log(_.map(data,self._toInternalFormat));self.updateOutput();};self._toInternalFormat=function(line,display,type){if(display===undefined){display="line";} +if(type===undefined||typeof type!="string"){if(line.startsWith("Recv:")){type="recv";}else if(line.startsWith("Send:")){type="send";}else if(line.startsWith("Warn:")){type="warn";}} +return{line:escapeUnprintableCharacters(line),display:display,type:type};};self._processStateData=function(data){self.isErrorOrClosed(data.flags.closedOrError);self.isOperational(data.flags.operational);self.isPaused(data.flags.paused);self.isPrinting(data.flags.printing);self.isError(data.flags.error);self.isReady(data.flags.ready);self.isLoading(data.flags.loading);};self.updateFilterRegex=function(){var filterRegexStr=self.activeFilters().join("|").trim();if(filterRegexStr===""){self.filterRegex(undefined);}else{self.filterRegex(new RegExp(filterRegexStr));} +self.updateOutput();};self.updateOutput=function(){if(self.tabActive&&OctoPrint.coreui.browserTabVisible&&self.autoscrollEnabled()){self.scrollToEnd();}};self.terminalScrollEvent=_.throttle(function(){var container=self.fancyFunctionality()?$("#terminal-output"):$("#terminal-output-lowfi");var pos=container.scrollTop();var scrollingUp=self.previousScroll!==undefined&&pos0&&self.cmdHistoryIdx>0){self.cmdHistoryIdx--;}else if(keyCode===40&&self.cmdHistoryIdx=0&&self.cmdHistoryIdx%(command)s was not sent "+"to the printer:")+"

%(message)s

";new PNotify({title:gettext("Suppressed command"),text:_.sprintf(text,payload),type:severity,hide:false});};self.onEventInvalidToolReported=function(payload){new PNotify({title:gettext("Invalid tool reported"),text:_.sprintf(gettext("Your printer reported tool T%(tool)d as invalid, "+"reverting back to T%(fallback)d"),payload),type:"error",hide:false});};} +OCTOPRINT_VIEWMODELS.push({construct:TerminalViewModel,dependencies:["loginStateViewModel","settingsViewModel","accessViewModel"],elements:["#term","#term_link"]});}); +; + +// source: js/app/viewmodels/timelapse.js +$(function(){function TimelapseViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.settings=parameters[2];self.renderProgressBar=undefined;self.timelapsePopup=undefined;self.defaultFps=25;self.defaultPostRoll=0;self.defaultInterval=10;self.defaultRetractionZHop=0;self.defaultMinDelay=5.0;self.timelapseType=ko.observable(undefined);self.timelapseTimedInterval=ko.observable(self.defaultInterval);self.timelapsePostRoll=ko.observable(self.defaultPostRoll);self.timelapseFps=ko.observable(self.defaultFps);self.timelapseRetractionZHop=ko.observable(self.defaultRetractionZHop);self.timelapseMinDelay=ko.observable(self.defaultMinDelay);self.snapshotWebcam=ko.pureComputed(function(){var snapshotWebcamName=self.settings.webcam_snapshotWebcam();return self.settings.webcam_webcams().find(function(w){return snapshotWebcamName==w.name;});});self.canSnapshot=ko.pureComputed(function(){if(!self.snapshotWebcam()){return false;}else{return self.snapshotWebcam().canSnapshot;}});self.snapshotDisplay=ko.pureComputed(function(){if(!self.snapshotWebcam()){return"";}else{return self.snapshotWebcam().snapshotDisplay;}});self.renderProgress=ko.observable();self.renderTarget=ko.observable();self.renderAnimation=ko.observable(false);self.renderProgressString=ko.pureComputed(function(){if(!self.renderTarget()){return 0;} +if(self.renderAnimation()){return 100;} +if(!self.renderProgress()){return 0;} +return self.renderProgress();});self.renderProgressBarString=ko.pureComputed(function(){if(!self.renderTarget()){return"";} +if(self.renderAnimation()){return _.sprintf(gettext("Rendering %(target)s..."),{target:self.renderTarget()});} +var progress=self.renderProgress();if(!progress){progress=0;} +return _.sprintf(gettext("Rendering %(target)s... (%(progress)d%%)"),{target:self.renderTarget(),progress:progress});});self.serverConfig=ko.observable();self.persist=ko.observable(false);self.isDirty=ko.observable(false);self.isErrorOrClosed=ko.observable(undefined);self.isOperational=ko.observable(undefined);self.isPrinting=ko.observable(undefined);self.isPaused=ko.observable(undefined);self.isError=ko.observable(undefined);self.isReady=ko.observable(undefined);self.isLoading=ko.observable(undefined);self.markedForFileDeletion=ko.observableArray([]);self.markedForUnrenderedDeletion=ko.observableArray([]);self.isTemporary=ko.pureComputed(function(){return self.isDirty()&&!self.persist();});self.isBusy=ko.pureComputed(function(){return self.isPrinting()||self.isPaused();});self.timelapseTypeSelected=ko.pureComputed(function(){return"off"!==self.timelapseType();});self.intervalInputEnabled=ko.pureComputed(function(){return"timed"===self.timelapseType();});self.saveButtonEnabled=ko.pureComputed(function(){return(self.loginState.hasPermission(self.access.permissions.TIMELAPSE_ADMIN)&&self.isDirty()&&!self.isPrinting());});self.resetButtonEnabled=ko.pureComputed(function(){return self.saveButtonEnabled()&&self.serverConfig()!==undefined;});self.timelapseType.subscribe(function(){self.isDirty(true);});self.timelapseTimedInterval.subscribe(function(){self.isDirty(true);});self.timelapsePostRoll.subscribe(function(){self.isDirty(true);});self.timelapseFps.subscribe(function(){self.isDirty(true);});self.timelapseRetractionZHop.subscribe(function(newValue){self.isDirty(true);});self.timelapseMinDelay.subscribe(function(){self.isDirty(true);});self.persist.subscribe(function(){self.isDirty(true);});self.listHelper=new ItemListHelper("timelapseFiles",{name:function(a,b){if(a["name"].toLocaleLowerCase()b["name"].toLocaleLowerCase()) +return 1;return 0;},date:function(a,b){if(a["date"]>b["date"])return-1;if(a["date"]b["bytes"])return-1;if(a["bytes"]b["name"].toLocaleLowerCase()) +return 1;return 0;},creation:function(a,b){if(a["date"]>b["date"])return-1;if(a["date"]b["bytes"])return-1;if(a["bytes"]0){self.timelapseTimedInterval(config.interval);}else{self.timelapseTimedInterval(self.defaultInterval);} +if(config.type==="zchange"&&config.retractionZHop!==undefined&&config.retractionZHop>0){self.timelapseRetractionZHop(config.retractionZHop);}else{self.timelapseRetractionZHop(self.defaultRetractionZHop);} +if(config.type==="zchange"&&config.minDelay!==undefined&&config.minDelay>=0){self.timelapseMinDelay(config.minDelay);}else{self.timelapseMinDelay(self.defaultMinDelay);} +if(config.postRoll!==undefined&&config.postRoll>=0){self.timelapsePostRoll(config.postRoll);}else{self.timelapsePostRoll(self.defaultPostRoll);} +if(config.fps!==undefined&&config.fps>0){self.timelapseFps(config.fps);}else{self.timelapseFps(self.defaultFps);} +self.persist(false);self.isDirty(false);};self.fromCurrentData=function(data){self._processStateData(data.state);};self.fromHistoryData=function(data){self._processStateData(data.state);};self._processStateData=function(data){self.isErrorOrClosed(data.flags.closedOrError);self.isOperational(data.flags.operational);self.isPaused(data.flags.paused);self.isPrinting(data.flags.printing);self.isError(data.flags.error);self.isReady(data.flags.ready);self.isLoading(data.flags.loading);};self.markFilesOnPage=function(){self.markedForFileDeletion(_.uniq(self.markedForFileDeletion().concat(_.map(self.listHelper.paginatedItems(),"name"))));};self.markAllFiles=function(){self.markedForFileDeletion(_.map(self.listHelper.allItems,"name"));};self.clearMarkedFiles=function(){self.markedForFileDeletion.removeAll();};self.isTimelapseViewable=function(data){var url=data.url;return(self.loginState.hasPermission(self.access.permissions.TIMELAPSE_DOWNLOAD)&&url.indexOf(".mp4")>=0);};self.showTimelapsePreview=function(data){if(!self.isTimelapseViewable(data))return;var url=data.url;var previewModal=$("#timelapsePreviewModal");previewModal.children("div.modal-body").children("video").attr("src",url);previewModal.off("hidden.bs.modal").on("hidden.bs.modal",function(){$(this).attr("src","");});previewModal.modal("show");};self.removeFile=function(filename){if(!self.loginState.hasPermission(self.access.permissions.TIMELAPSE_DELETE)) +return;var perform=function(){OctoPrint.timelapse.delete(filename).done(function(){self.markedForFileDeletion.remove(filename);self.requestData();}).fail(function(jqXHR){var html="

"+ +_.sprintf(gettext("Failed to remove timelapse %(name)s.

Please consult octoprint.log for details.

"),{name:_.escape(filename)});html+=pnotifyAdditionalInfo('
'+
+_.escape(jqXHR.responseText)+"
");new PNotify({title:gettext("Could not remove timelapse"),text:html,type:"error",hide:false});});};showConfirmationDialog(_.sprintf(gettext('You are about to delete timelapse file "%(name)s".'),{name:_.escape(filename)}),perform);};self.removeMarkedFiles=function(){if(!self.loginState.hasPermission(self.access.permissions.TIMELAPSE_DELETE)) +return;var perform=function(){self._bulkRemove(self.markedForFileDeletion(),"files").done(function(){self.markedForFileDeletion.removeAll();});};showConfirmationDialog(_.sprintf(gettext("You are about to delete %(count)d timelapse files."),{count:self.markedForFileDeletion().length}),perform);};self.enableBulkDownload=ko.pureComputed(function(){return(self.markedForFileDeletion().length&&!self.isBusy()&&!self.bulkDownloadUrlTooLong());});self.bulkDownloadUrlTooLong=ko.pureComputed(function(){return BASEURL.length+self.bulkDownloadUrl().length>=2000;});self.bulkDownloadButtonUrl=ko.pureComputed(function(){var files=self.markedForFileDeletion();if(!files.length||self.bulkDownloadUrlTooLong()){return"javascript:void(0)";} +return self.bulkDownloadUrl();});self.bulkDownloadUrl=function(){var files=self.markedForFileDeletion();return OctoPrint.timelapse.bulkDownloadUrl(files);};self.markUnrenderedOnPage=function(){self.markedForUnrenderedDeletion(_.uniq(self.markedForUnrenderedDeletion().concat(_.map(self.unrenderedListHelper.paginatedItems(),"name"))));};self.markAllUnrendered=function(){self.markedForUnrenderedDeletion(_.map(self.unrenderedListHelper.allItems,"name"));};self.clearMarkedUnrendered=function(){self.markedForUnrenderedDeletion.removeAll();};self.removeUnrendered=function(name){if(!self.loginState.hasPermission(self.access.permissions.TIMELAPSE_MANAGE_UNRENDERED)) +return;var perform=function(){OctoPrint.timelapse.deleteUnrendered(name).done(function(){self.markedForUnrenderedDeletion.remove(name);self.requestData();});};showConfirmationDialog(_.sprintf(gettext('You are about to delete unrendered timelapse "%(name)s".'),{name:_.escape(name)}),perform);};self.removeMarkedUnrendered=function(){if(!self.loginState.hasPermission(self.access.permissions.TIMELAPSE_MANAGE_UNRENDERED)) +return;var perform=function(){self._bulkRemove(self.markedForUnrenderedDeletion(),"unrendered").done(function(){self.markedForUnrenderedDeletion.removeAll();});};showConfirmationDialog(_.sprintf(gettext("You are about to delete %(count)d unrendered timelapses."),{count:self.markedForUnrenderedDeletion().length}),perform);};self._bulkRemove=function(files,type){var title,message,handler;if(type==="files"){title=gettext("Deleting timelapse files");message=_.sprintf(gettext("Deleting %(count)d timelapse files..."),{count:files.length});handler=function(filename){return OctoPrint.timelapse.delete(filename).done(function(){deferred.notify(_.sprintf(gettext("Deleted %(filename)s..."),{filename:_.escape(filename)}),true);}).fail(function(jqXHR){var short=_.sprintf(gettext("Deletion of %(filename)s failed, continuing..."),{filename:_.escape(filename)});var long=_.sprintf(gettext("Deletion of %(filename)s failed: %(error)s"),{filename:_.escape(filename),error:_.escape(jqXHR.responseText)});deferred.notify(short,long,false);});};}else if(type==="unrendered"){title=gettext("Deleting unrendered timelapses");message=_.sprintf(gettext("Deleting %(count)d unrendered timelapses..."),{count:files.length});handler=function(filename){return OctoPrint.timelapse.deleteUnrendered(filename).done(function(){deferred.notify(_.sprintf(gettext("Deleted %(filename)s..."),{filename:_.escape(filename)}),true);}).fail(function(){deferred.notify(_.sprintf(gettext("Deletion of %(filename)s failed, continuing..."),{filename:_.escape(filename)}),false);});};}else{return;} +var deferred=$.Deferred();var promise=deferred.promise();var options={title:title,message:message,max:files.length,output:true};showProgressModal(options,promise);var requests=[];_.each(files,function(filename){var request=handler(filename);requests.push(request);});$.when.apply($,_.map(requests,wrapPromiseWithAlways)).done(function(){deferred.resolve();self.requestData();});return promise;};self.renderUnrendered=function(name){if(!self.loginState.hasPermission(self.access.permissions.TIMELAPSE_ADMIN)) +return;OctoPrint.timelapse.renderUnrendered(name).done(self.requestData);};self.save=function(){if(!self.loginState.hasPermission(self.access.permissions.TIMELAPSE_ADMIN)) +return;var payload={type:self.timelapseType(),postRoll:self.timelapsePostRoll(),fps:self.timelapseFps(),save:self.persist()};if(self.timelapseType()==="timed"){payload["interval"]=self.timelapseTimedInterval();} +if(self.timelapseType()==="zchange"){payload["retractionZHop"]=self.timelapseRetractionZHop();payload["minDelay"]=self.timelapseMinDelay();} +OctoPrint.timelapse.saveConfig(payload).done(self.fromResponse);};self.reset=function(){if(self.serverConfig()===undefined)return;self.fromConfig(self.serverConfig());};self.displayTimelapsePopup=function(options){if(self.timelapsePopup!==undefined){self.timelapsePopup.remove();} +_.extend(options,{callbacks:{before_close:function(notice){if(self.timelapsePopup===notice){self.timelapsePopup=undefined;}}}});self.timelapsePopup=new PNotify(options);};self.onDataUpdaterReconnect=function(){self.requestData();};self.onEventPostRollStart=function(payload){var title=gettext("Capturing timelapse postroll");var text;if(!payload.postroll_duration){text=_.sprintf(gettext("Now capturing timelapse post roll, this will take only a moment..."));}else{var format={time:moment().add(payload.postroll_duration,"s").format("LT")};if(payload.postroll_duration>60){format.duration=_.sprintf(gettext("%(minutes)d min"),{minutes:payload.postroll_duration/60});text=_.sprintf(gettext("Now capturing timelapse post roll, this will take approximately %(duration)s (so until %(time)s)..."),format);}else{format.duration=_.sprintf(gettext("%(seconds)d sec"),{seconds:payload.postroll_duration});text=_.sprintf(gettext("Now capturing timelapse post roll, this will take approximately %(duration)s..."),format);}} +self.displayTimelapsePopup({title:title,text:text,hide:false});};self._warnAboutCaptureFailThreshold=3;self._warnAboutCaptureFailCounter=0;self._warnedAboutCaptureFail=false;self.onEventPrintStarted=function(payload){self._warnAboutCaptureFailCounter=0;self._warnedAboutCaptureFail=false;};self.onEventCaptureDone=function(payload){self._warnAboutCaptureFailCounter=0;self._warnedAboutCaptureFail=false;};self.onEventCaptureFailed=function(payload){self._warnAboutCaptureFailCounter++;if(self._warnedAboutCaptureFail||self._warnAboutCaptureFailCounter<=self._warnAboutCaptureFailThreshold){return;} +self._warnedAboutCaptureFail=true;var html="

"+ +gettext("Failed repeatedly to capture timelapse frame from webcam - is the snapshot webcam configured correctly and the camera on?");var additional="";if(payload.snapshotDisplay){additional+='Snapshot info:

'+
+payload.snapshotDisplay+"
";} +if(payload.webcamDisplay){additional+='Webcam:
'+
+payload.webcamDisplay+"
";} +if(payload.error){additional+='Error:
'+payload.error+"
";} +if(additional){html+=pnotifyAdditionalInfo(additional);} +new PNotify({title:gettext("Could not capture snapshots"),text:html,type:"error",hide:false});};self.onEventMovieRendering=function(payload){self.displayTimelapsePopup({title:gettext("Rendering timelapse"),text:_.sprintf(gettext("Now rendering timelapse %(movie_prefix)s. Due to performance reasons it is not recommended to start a print job while a movie is still rendering."),{movie_prefix:_.escape(payload.movie_prefix)}),hide:false});self.renderProgress(0);self.renderTarget(payload.movie_prefix);self.renderAnimation(true);};self.onRenderProgress=function(percentage){self.renderProgress(percentage);self.renderAnimation(false);};self.onEventMovieFailed=function(payload){var title,html;if(payload.reason==="no_frames"){title=gettext("Cannot render timelapse");html="

"+ +_.sprintf(gettext("Rendering of timelapse %(movie_prefix)s is not possible since no frames were captured. Is the snapshot webcam configured correctly?"),{movie_prefix:_.escape(payload.movie_prefix)})+"

";}else if((payload.reason="returncode")){title=gettext("Rendering timelapse failed");html="

"+ +_.sprintf(gettext("Rendering of timelapse %(movie_prefix)s failed with return code %(returncode)s"),{movie_prefix:_.escape(payload.movie_prefix),returncode:_.escape(payload.returncode)})+"

";html+=pnotifyAdditionalInfo('
'+payload.error+"
");}else{title=gettext("Rendering timelapse failed");html="

"+ +_.sprintf(gettext("Rendering of timelapse %(movie_prefix)s failed due to an unknown error, please consult the log file"),{movie_prefix:_.escape(payload.movie_prefix)})+"

";} +self.displayTimelapsePopup({title:title,text:html,type:"error",hide:false});self.renderProgress(0);self.renderTarget(undefined);self.renderAnimation(false);};self.onEventMovieDone=function(payload){self.displayTimelapsePopup({title:gettext("Timelapse ready"),text:_.sprintf(gettext("New timelapse %(movie_prefix)s is done rendering."),{movie_prefix:_.escape(payload.movie_prefix)}),type:"success",callbacks:{before_close:function(notice){if(self.timelapsePopup===notice){self.timelapsePopup=undefined;}}}});self.requestData();self.renderProgress(0);self.renderTarget(undefined);self.renderAnimation(false);};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){self.requestData();self.renderProgressBar=$("#render_progress");};} +OCTOPRINT_VIEWMODELS.push({construct:TimelapseViewModel,dependencies:["loginStateViewModel","accessViewModel","settingsViewModel"],elements:["#timelapse","#timelapse_link","#timelapsePreviewModal"]});}); +; + +// source: js/app/viewmodels/uistate.js +$(function(){function UiStateViewModel(parameters){var self=this;self.loading=ko.observable(CONFIG_LOADINGANIMATION);self.loading_error=ko.observable(false);self.visible=ko.pureComputed(function(){return!self.loading();});self.showLoadingError=function(error){log.error("Loading error: "+ +error+" Please check prior messages and 'octoprint.log' for possible reasons.");$("#page-container-loading-header").text("Loading failed");$("#page-container-loading-spinner").removeClass("fa-spinner fa-spin").addClass("fa-exclamation-triangle text-error");$("#page-container-loading-error").html(error+" "+ +_.sprintf("Please check your browser's error console and octoprint.log for possible reasons.Also make sure that the server is actually running by reloading this page.",{browser:"https://faq.octoprint.org/browser-console",octoprint:"https://faq.octoprint.org/logs"})).show();};} +OCTOPRINT_VIEWMODELS.push({construct:UiStateViewModel,elements:["#page-container-main","#page-container-loading"]});}); +; + +// source: js/app/viewmodels/users.js +$(function(){function UsersViewModel(parameters){var self=this;self.access=parameters[0];self.deprecatedUsersMethod=function(oldFct){var newFct=oldFct;if(arguments.length===2){newFct=arguments[1];} +OctoPrintClient.deprecatedMethod(self,"UsersViewModel",oldFct,"AccessViewModel.users",newFct,function(){self.access.users[newFct](this.arguments);});};self.deprecatedUsersVariable=function(oldVar){var newVar=oldVar;if(arguments.length===2){newVar=arguments[1];} +OctoPrintClient.deprecatedVariable(self,"UsersViewModel",oldVar,"AccessViewModel.users",newVar,function(){return self.access.users[newVar];},function(val){self.access.users[newVar]=val;});};self.deprecatedUsersVariable("listHelper");self.deprecatedUsersVariable("emptyUser");self.deprecatedUsersVariable("currentUser");self.deprecatedUsersVariable("editorUsername");self.deprecatedUsersVariable("editorGroups");self.deprecatedUsersVariable("editorPermissions");self.deprecatedUsersVariable("editorPassword");self.deprecatedUsersVariable("editorRepeatedPassword");self.deprecatedUsersVariable("editorApikey");self.deprecatedUsersVariable("editorActive");self.deprecatedUsersVariable("editorPasswordMismatch");self.deprecatedUsersMethod("requestData");self.deprecatedUsersMethod("fromResponse");self.deprecatedUsersMethod("showAddUserDialog");self.deprecatedUsersMethod("confirmAddUser");self.deprecatedUsersMethod("showEditUserDialog");self.deprecatedUsersMethod("confirmEditUser");self.deprecatedUsersMethod("showChangePasswordDialog");self.deprecatedUsersMethod("confirmChangePassword");self.deprecatedUsersMethod("confirmGenerateApikey");self.deprecatedUsersMethod("copyApikey");self.deprecatedUsersMethod("confirmDeleteApikey");self.deprecatedUsersMethod("_updateApikey");self.deprecatedUsersMethod("addUser");self.deprecatedUsersMethod("removeUser");self.deprecatedUsersMethod("updateUser");self.deprecatedUsersMethod("updatePassword");self.deprecatedUsersMethod("generateApikey");self.deprecatedUsersMethod("deleteApikey");} +OCTOPRINT_VIEWMODELS.push({construct:UsersViewModel,dependencies:["accessViewModel"]});}); +; + +// source: js/app/viewmodels/usersettings.js +$(function(){function UserSettingsViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.users=self.access.users;self.userSettingsDialog=undefined;var auto_locale={language:"_default",display:gettext("Site default"),english:undefined};self.locales=ko.observableArray([auto_locale].concat(_.sortBy(_.values(AVAILABLE_LOCALES),function(n){return n.display;})));self.locale_languages=_.keys(AVAILABLE_LOCALES);self.access_password=ko.observable(undefined);self.access_repeatedPassword=ko.observable(undefined);self.access_currentPassword=ko.observable(undefined);self.access_currentPasswordMismatch=ko.observable(false);self.access_apikey=ko.observable(undefined);self.interface_language=ko.observable(undefined);self.currentUser=ko.observable(undefined);self.currentUser.subscribe(function(newUser){self.access_password(undefined);self.access_repeatedPassword(undefined);self.access_currentPassword(undefined);self.access_currentPasswordMismatch(false);self.access_apikey(undefined);self.interface_language("_default");if(newUser!==undefined){self.access_apikey(newUser.apikey);if(newUser.settings.hasOwnProperty("interface")&&newUser.settings.interface.hasOwnProperty("language")){self.interface_language(newUser.settings.interface.language);}}});self.access_currentPassword.subscribe(function(){self.access_currentPasswordMismatch(false);});self.passwordMismatch=ko.pureComputed(function(){return self.access_password()!==self.access_repeatedPassword();});self.show=function(user){if(!CONFIG_ACCESS_CONTROL)return;if(user===undefined){user=self.loginState.currentUser();} +var process=function(user){self.currentUser(user);self.userSettingsDialog.modal("show");};OctoPrint.access.users.get(user.name).done(function(data){process(data);}).fail(function(){log.warn("Could not fetch current user data, proceeding with client side data copy");process(user);});};self.save=function(){if(!CONFIG_ACCESS_CONTROL)return;self.userSettingsDialog.trigger("beforeSave");function saveSettings(){var settings={interface:{language:self.interface_language()}};self.updateSettings(self.currentUser().name,settings).done(function(){self.currentUser(undefined);self.userSettingsDialog.modal("hide");self.loginState.reloadUser();});} +if(self.access_password()&&!self.passwordMismatch()){self.users.updatePassword(self.currentUser().name,self.access_password(),self.access_currentPassword()).done(function(){saveSettings();}).fail(function(xhr){if(xhr.status===403){self.access_currentPasswordMismatch(true);}});}else{saveSettings();}};self.copyApikey=function(){copyToClipboard(self.access_apikey());};self.generateApikey=function(){if(!CONFIG_ACCESS_CONTROL)return;var generate=function(){self.users.generateApikey(self.currentUser().name).done(function(response){self.access_apikey(response.apikey);});};if(self.access_apikey()){showConfirmationDialog(gettext("This will generate a new API Key. The old API Key will cease to function immediately."),generate);}else{generate();}};self.deleteApikey=function(){if(!CONFIG_ACCESS_CONTROL)return;if(!self.access_apikey())return;showConfirmationDialog(gettext("This will delete the API Key. It will cease to to function immediately."),function(){self.users.deleteApikey(self.currentUser().name).done(function(){self.access_apikey(undefined);});});};self.updateSettings=function(username,settings){return OctoPrint.access.users.saveSettings(username,settings);};self.saveEnabled=function(){return!self.passwordMismatch();};self.onStartup=function(){self.userSettingsDialog=$("#usersettings_dialog");};self.onAllBound=function(allViewModels){self.userSettingsDialog.on("show",function(){callViewModels(allViewModels,"onUserSettingsShown");});self.userSettingsDialog.on("hidden",function(){callViewModels(allViewModels,"onUserSettingsHidden");});self.userSettingsDialog.on("beforeSave",function(){callViewModels(allViewModels,"onUserSettingsBeforeSave");});};} +OCTOPRINT_VIEWMODELS.push({construct:UserSettingsViewModel,dependencies:["loginStateViewModel","accessViewModel"],elements:["#usersettings_dialog"]});}); +; + +// source: js/app/viewmodels/wizard.js +$(function(){function WizardViewModel(parameters){var self=this;self.loginState=parameters[0];self.settingsViewModel=parameters[1];self.wizardDialog=undefined;self.reloadOverlay=undefined;self.allViewModels=undefined;self.finishing=false;self.wizards=[];self.isDialogActive=function(){return self.wizardDialog.is(":visible");};self.showDialog=function(){if(!CONFIG_WIZARD||(!CONFIG_FIRST_RUN&&!self.loginState.isAdmin())) +return;self.getWizardDetails().done(function(response){callViewModels(self.allViewModels,"onWizardDetails",[response]);if(!self.isDialogActive()){self.wizardDialog.modal({minHeight:function(){return Math.max($.fn.modal.defaults.maxHeight()-80,250);}}).css({"margin-left":function(){return-($(this).width()/2);}});} +callViewModels(self.allViewModels,"onWizardShow");callViewModels(self.allViewModels,"onBeforeWizardTabChange",[OCTOPRINT_INITIAL_WIZARD,undefined]);callViewModels(self.allViewModels,"onAfterWizardTabChange",[OCTOPRINT_INITIAL_WIZARD]);});};self.closeDialog=function(){self.wizardDialog.modal("hide");};self.onStartup=function(){self.wizardDialog=$("#wizard_dialog");self.wizardDialog.on("show",function(event){OctoPrint.coreui.wizardOpen=true;});self.wizardDialog.on("hidden",function(event){OctoPrint.coreui.wizardOpen=false;});self.reloadOverlay=$("#reloadui_overlay");};self.onUserLoggedIn=function(){self.showDialog();};self.onAllBound=function(allViewModels){self.allViewModels=allViewModels;self.wizardDialog.bootstrapWizard({tabClass:"nav nav-list",nextSelector:".button-next",previousSelector:".button-previous",finishSelector:".button-finish",withVisible:false,onTabClick:function(){return false;},onTabShow:function(tab,navigation,index){if(index<0||tab.length==0){return true;} +var total=self.wizardDialog.bootstrapWizard("navigationLength");if(index==total){self.wizardDialog.find(".button-next").hide();self.wizardDialog.find(".button-finish").show().removeClass("disabled");}else{self.wizardDialog.find(".button-finish").hide();self.wizardDialog.find(".button-next").show();} +var active=tab[0].id;if(active!=undefined){callViewModels(allViewModels,"onAfterWizardTabChange",[active]);}},onTabChange:function(tab,navigation,index,nextTabIndex,nextTab){var current,next;if(index==undefined||index<0||nextTabIndex==undefined||nextTabIndex<0||index==nextTabIndex||tab.length==0||nextTab.length==0){return;} +current=tab[0].id;next=nextTab[0].id;if(current!=undefined&&next!=undefined){var result=true;callViewModels(allViewModels,"onBeforeWizardTabChange",function(method){result=method(next,current)!==false&&result;});callViewModels(allViewModels,"onWizardTabChange",function(method,viewModel){log.warn("View model",viewModel,'is using deprecated callback "onWizardTabChange", please change to "onBeforeWizardTabChange"');result=method(current,next)!==false&&result;});return result;}},onFinish:function(tab,navigation,index){var closeDialog=true;callViewModels(allViewModels,"onBeforeWizardFinish",function(method){closeDialog=closeDialog&&method()!==false;});if(closeDialog){var reload=false;callViewModels(allViewModels,"onWizardFinish",function(method){reload=method()=="reload"||reload;});self.finishWizard().done(function(){self.closeDialog();if(reload){self.reloadOverlay.show();} +callViewModels(allViewModels,"onAfterWizardFinish");});}}});self.showDialog();};self.getWizardDetails=function(){return OctoPrint.wizard.get().done(function(response){self.wizards=_.filter(_.keys(response),function(key){return(response[key]&&response[key]["required"]&&!response[key]["ignored"]);});});};self.finishWizard=function(){var deferred=$.Deferred();self.finishing=true;self.settingsViewModel.saveData().done(function(){OctoPrint.wizard.finish(self.wizards).done(function(){deferred.resolve(arguments);}).fail(function(){deferred.reject(arguments);}).always(function(){self.finishing=false;});}).fail(function(){deferred.reject(arguments);});return deferred;};self.onSettingsPreventRefresh=function(){return self.isDialogActive();};} +OCTOPRINT_VIEWMODELS.push({construct:WizardViewModel,dependencies:["loginStateViewModel","settingsViewModel"],elements:["#wizard_dialog"]});}); +; + +// source: js/app/viewmodels/about.js +$(function(){function AboutViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.aboutDialog=undefined;self.aboutContent=undefined;self.aboutTabs=undefined;self.systeminfo=ko.observableArray();self.devmode=getQueryParameterByName("devmode")!==null;self.getSystemInfo=function(){if(!self.loginState.hasPermission(self.access.permissions.SYSTEM))return;return OctoPrint.system.getInfo().done(self.fromSystemInfo);};self.fromSystemInfo=function(r){var systeminfo=[];_.forOwn(r.systeminfo,function(value,key){systeminfo.push({key:key,value:value});});self.systeminfo(systeminfo);};self.copySystemInfo=function(){var text="";_.each(self.systeminfo(),function(entry){text+=entry.key+": "+entry.value+"\r\n";});copyToClipboard(text);};self.show=function(tab){if(tab){$('a[href="#'+tab+'"]',self.aboutTabs).tab("show");}else{$("a:first",self.aboutTabs).tab("show");} +self.aboutContent.scrollTop(0);const maxHeight=$.fn.modal.defaults.maxHeight()-80-60;self.aboutDialog.modal({minHeight:function(){return Math.max(maxHeight,250);},maxHeight:maxHeight}).css({"margin-left":function(){return-($(this).width()/2);}});self.getSystemInfo();return false;};self.hide=function(){self.aboutDialog.modal("hide");};self.onStartup=function(){self.aboutDialog=$("#about_dialog");self.aboutTabs=$("#about_dialog_tabs");self.aboutContent=$("#about_dialog_content");$('a[data-toggle="tab"]',self.aboutTabs).on("show",function(){self.aboutContent.scrollTop(0);});};self.onAllBound=function(allViewModels){self.aboutDialog.on("show",function(){callViewModels(allViewModels,"onAboutShown");});self.aboutDialog.on("hidden",function(){callViewModels(allViewModels,"onAboutHidden");});};self.showTab=function(tab){$('a[href="#'+tab+'"]',self.aboutTabs).tab("show");};} +OCTOPRINT_VIEWMODELS.push({construct:AboutViewModel,elements:["#about_dialog","#footer_about","#footer_achievements","#footer_systeminfo"],dependencies:["loginStateViewModel","accessViewModel"]});}); +; + +// source: plugin/achievements/js/achievements.js +$(function(){function AchievementsViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.stats=undefined;self.statsFetched=ko.observable(false);self.dummy=ko.observable();self.achievements=ko.observableArray([]);self.hiddenAchievements=ko.observable();self.achievedAchievements=ko.observable();self.totalAchievements=ko.observable();self.collectingSince=ko.pureComputed(()=>{self.dummy();if(!self.statsFetched()){return"n/a";} +return`${formatDate(self.stats.created())} (${formatTimeAgo( + self.stats.created() + )})`;});self.collectionVersion=ko.pureComputed(()=>{if(!self.statsFetched()){return"n/a";} +return`OctoPrint ${self.stats.created_version()}`;});self.prints=ko.pureComputed(()=>{if(!self.statsFetched()){return"n/a";} +if(self.stats.prints_started()===0){return gettext("No prints yet");} +return _.sprintf(gettext("%(prints)s (%(finished)s finished)"),{prints:this.stats.prints_started(),finished:self.stats.prints_finished()});});self.duration=ko.pureComputed(()=>{if(!self.statsFetched()){return"n/a";} +if(!self.stats.print_duration_finished()){return _.sprintf(gettext("%(total)s"),{total:formatDuration(self.stats.print_duration_total())});}else{return _.sprintf(gettext("%(total)s (%(finished)s finished)"),{total:formatDuration(self.stats.print_duration_total()),finished:formatDuration(self.stats.print_duration_finished())});}});self.longestPrint=ko.pureComputed(()=>{self.dummy();if(!self.statsFetched()){return"n/a";} +return _.sprintf(gettext("%(duration)s (finished on %(date)s, %(timeSince)s)"),{duration:formatDuration(self.stats.longest_print_duration()),date:formatDate(self.stats.longest_print_date()),timeSince:formatTimeAgo(self.stats.longest_print_date())});});self.hiddenAchievementsText=ko.pureComputed(()=>{return _.sprintf(gettext("... and %(count)s hidden achievements!"),{count:self.hiddenAchievements()});});self.requestData=()=>{if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ACHIEVEMENTS_VIEW)){return;} +OctoPrint.plugins.achievements.get().done(self.fromResponse);};self.fromResponse=(response)=>{self.fromStatsResponse(response.stats);self.fromAchievementsResponse(response.achievements);const achieved=_.filter(self.achievements(),(achievement)=>achievement.achieved).length;self.achievedAchievements(achieved);self.hiddenAchievements(response.hidden_achievements);self.totalAchievements(response.achievements.length+response.hidden_achievements);};self.fromStatsResponse=(response)=>{if(self.stats===undefined){self.stats=ko.mapping.fromJS(response);self.statsFetched(true);}else{ko.mapping.fromJS(response,self.stats);}};self.fromAchievementsResponse=(response)=>{self.achievements(response);};self.CALLS_TO_ACTION=[gettext('Enjoying OctoPrint? Looks like it! It might be time to give something back then - thank you!'),gettext('Getting value from OctoPrint? Then please consider supporting its sole maintainer with a donation - thank you!'),gettext('Has OctoPrint helped you enjoy your printer more? Then please consider supporting its continued development - thank you!')];self.showAchievement=(achievement)=>{let html=`
${achievement.name}
${achievement.description}
`;if(achievement.nag){const idx=Math.floor(Math.random()*self.CALLS_TO_ACTION.length);const cta=self.CALLS_TO_ACTION[idx];html+="

"+ +_.sprintf(cta,{url:"https://octoprint.org/support-octoprint/?utm_source=octoprint&utm_medium=achievement_popup&utm_campaign=funding"})+"

";} +html+=``+ +gettext("Show all achievements...")+"";const options={title:gettext("Achievement unlocked!"),text:html,type:"success",icon:"icon-star",hide:false,addclass:"achievement-popup"};new PNotify(options);};self.triggerTestAchievement=(nag)=>{self.showAchievement({name:"Test Achievement",description:"I am a test achievement.",logo:"trophy",nag:!!nag});};self.onEventPluginAchievementsAchievementUnlocked=(payload)=>{if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ACHIEVEMENTS_VIEW)){return;} +self.showAchievement(payload);self.requestData();};self.onServerReconnect=self.onUserLoggedIn=()=>{if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ACHIEVEMENTS_VIEW)){return;} +self.requestData();};self.onAboutShown=()=>{self.dummy.notifySubscribers();};} +OCTOPRINT_VIEWMODELS.push({construct:AchievementsViewModel,dependencies:["loginStateViewModel","accessViewModel"],elements:["#about_plugin_achievements","#about_plugin_achievements_2"]});}); +; + +// source: plugin/action_command_notification/js/action_command_notification.js +$(function(){function ActionCommandNotificationViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.settings=parameters[2];self.notifications=ko.observableArray([]);self.sortDesc=ko.observable(false);self.sortDesc.subscribe(function(){self._toLocalStorage();});self.regexValid=function(){try{new RegExp(self.settings.settings.plugins.action_command_notification.filter());return true;}catch(e){return false;}};self.toDateTimeString=function(timestamp){return formatDate(timestamp);};self.requestData=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ACTION_COMMAND_NOTIFICATION_SHOW)) +return;OctoPrint.plugins.action_command_notification.get().done(self.fromResponse);};self.fromResponse=function(response){var notifications=response.notifications;if(self.sortDesc()){notifications.reverse();} +self.notifications(notifications);};self.clear=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ACTION_COMMAND_NOTIFICATION_CLEAR)) +return;OctoPrint.plugins.action_command_notification.clear();};self.toggleSorting=function(){self.sortDesc(!self.sortDesc());self.requestData();};self.onStartup=self.onUserLoggedIn=self.onUserLoggedOut=function(){self.requestData();};self.onDataUpdaterPluginMessage=function(plugin,data){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ACTION_COMMAND_NOTIFICATION_SHOW)) +return;if(plugin!=="action_command_notification"){return;} +self.requestData();if(data.message&&self.settings.settings.plugins.action_command_notification.enable_popups()){new PNotify({title:gettext("Printer Notification"),text:data.message,hide:false,icon:"fa fa-bell-o",buttons:{sticker:false,closer:true}});}};var optionsLocalStorageKey="plugin.action_command_notification.options";self._toLocalStorage=function(){saveToLocalStorage(optionsLocalStorageKey,{sortDesc:self.sortDesc()});};self._fromLocalStorage=function(){var data=loadFromLocalStorage(optionsLocalStorageKey);if(data["sortDesc"]!==undefined){self.sortDesc(!!data["sortDesc"]);}};self._fromLocalStorage();} +OCTOPRINT_VIEWMODELS.push({construct:ActionCommandNotificationViewModel,dependencies:["loginStateViewModel","accessViewModel","settingsViewModel"],elements:["#sidebar_plugin_action_command_notification_wrapper","#settings_plugin_action_command_notification"]});}); +; + +// source: plugin/action_command_prompt/js/action_command_prompt.js +$(function(){function ActionCommandPromptViewModel(parameters){var self=this;self.loginState=parameters[0];self.access=parameters[1];self.modal=ko.observable(undefined);self.text=ko.observable();self.buttons=ko.observableArray([]);self.active=ko.pureComputed(function(){return self.text()!==undefined;});self.visible=ko.pureComputed(function(){return self.modal()!==undefined;});self.requestData=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ACTION_COMMAND_PROMPT_INTERACT)) +return;OctoPrint.plugins.action_command_prompt.get().done(self.fromResponse);};self.fromResponse=function(data){if(data&&data.hasOwnProperty("text")&&data.hasOwnProperty("choices")){self.text(data.text);self.buttons(data.choices);self.showPrompt();}else{self.text(undefined);self.buttons([]);}};self.showPrompt=function(){var text=self.text();var buttons=self.buttons();var opts={title:gettext("Message from your printer"),message:text,selections:buttons,maycancel:true,onselect:function(index){if(index>-1){self._select(index);}},onclose:function(){self.modal(undefined);}};self.modal(showSelectionDialog(opts));};self._select=function(index){OctoPrint.plugins.action_command_prompt.select(index);};self._closePrompt=function(){var modal=self.modal();if(modal){modal.modal("hide");}};self.onStartupComplete=function(){self.requestData();};self.onDataUpdaterPluginMessage=function(plugin,data){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ACTION_COMMAND_PROMPT_INTERACT)) +return;if(plugin!=="action_command_prompt"){return;} +switch(data.action){case"show":{self.text(data.text);self.buttons(data.choices);self.showPrompt();break;} +case"close":{self.text(undefined);self.buttons([]);self._closePrompt();break;}}};} +OCTOPRINT_VIEWMODELS.push({construct:ActionCommandPromptViewModel,dependencies:["loginStateViewModel","accessViewModel"],elements:["#navbar_plugin_action_command_prompt"]});}); +; + +// source: plugin/announcements/js/announcements.js +$(function(){function AnnouncementsViewModel(parameters){var self=this;self.loginState=parameters[0];self.settings=parameters[1];self.access=parameters[2];self.channels=new ItemListHelper("plugin.announcements.channels",{channel:function(a,b){if(a["channel"].toLocaleLowerCase()b["channel"].toLocaleLowerCase()) +return 1;return 0;}},{},"name",[],[],5);self.unreadArticles=ko.observableArray([]);self.markingAllAsRead=ko.observable(false);self.unread=ko.observable(0);self.unreadText=ko.pureComputed(()=>self.unread()?(self.unread()>9?"∞":""+self.unread()):"");self.unreadSuffix=ko.pureComputed(()=>self.unread()?"("+self.unread()+")":"");self.hiddenChannels=[];self.channelNotifications={};self.announcementDialog=undefined;self.announcementDialogContent=undefined;self.announcementDialogTabs=undefined;self.setupTabLink=function(item){$("a[data-toggle='tab']",item).on("show",self.resetContentScroll);};self.resetContentScroll=function(){self.announcementDialogContent.scrollTop(0);};self.toggleButtonCss=function(data){var icon=data.enabled?"fa fa-toggle-on":"fa fa-toggle-off";var disabled=self.enableToggle(data)?"":" disabled";return icon+disabled;};self.toggleButtonTitle=function(data){return data.forced?gettext("Cannot be toggled"):data.enabled?gettext("Disable Channel"):gettext("Enable Channel");};self.enableToggle=function(data){return!data.forced;};self.cleanedLink=function(data){var link=data.link;if(!link)return link;var queryPos=link.indexOf("?");if(queryPos!==-1){link=link.substr(0,queryPos);} +return link;};self.markRead=function(channel,until,reload){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ANNOUNCEMENTS_READ)) +return;reload=!!reload;var url=PLUGIN_BASEURL+"announcements/channels/"+channel;var payload={command:"read",until:until};$.ajax({url:url,type:"POST",dataType:"json",data:JSON.stringify(payload),contentType:"application/json; charset=UTF-8",success:function(){if(reload){self.retrieveData();}}});};self.markAllRead=function(reload){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ANNOUNCEMENTS_READ)) +return;reload=!!reload;var url=PLUGIN_BASEURL+"announcements/channels";var payload={command:"read"};self.markingAllAsRead(true);$.ajax({url:url,type:"POST",dataType:"json",data:JSON.stringify(payload),contentType:"application/json; charset=UTF-8",success:function(){if(reload){self.retrieveData();}}}).always(()=>{self.markingAllAsRead(false);});};self.toggleChannel=function(channel){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ANNOUNCEMENTS_MANAGE)) +return;var url=PLUGIN_BASEURL+"announcements/channels/"+channel;var payload={command:"toggle"};$.ajax({url:url,type:"POST",dataType:"json",data:JSON.stringify(payload),contentType:"application/json; charset=UTF-8",success:function(){self.retrieveData();}});};self.refreshAnnouncements=function(){self.retrieveData(true);};self.retrieveData=function(force){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ANNOUNCEMENTS_READ)) +return;var url=PLUGIN_BASEURL+"announcements/channels";if(force){url+="?force=true";} +$.ajax({url:url,type:"GET",dataType:"json",success:function(data){self.fromResponse(data);}});};self.fromResponse=function(data){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ANNOUNCEMENTS_READ)) +return;var currentTab=$("li.active a",self.announcementDialogTabs).attr("href");var unread=0;var channels=[];var unreadArticles=[];_.each(data.channels,function(value){value.last=value.data.length?value.data[0].published:undefined;value.count=value.data.length;value.title=value.channel+(value.unread?" ("+value.unread+")":"");unread+=value.unread;if(value.unread){_.each(_.filter(value.data,(entry)=>!entry.read),(entry)=>{const extended={...entry};extended.channel=value.channel;unreadArticles.push(extended);});} +channels.push(value);});self.channels.updateItems(channels);self.unread(unread);unreadArticles.sort((a,b)=>a.published0){text=text.substr(0,firstNewlinePos).trim();} +return text;};var stripParagraphs=function(text){if(_.startsWith(text,"

")){text=text.substr("

".length);} +if(_.endsWith(text,"

")){text=text.substr(0,text.length-"

".length);} +return text.replace(/<\/p>\s*

/gi,"
");};_.each(channels,function(value){var key=value.key;var channel=value.channel;var priority=value.priority;var items=value.data;if(value.priority!==1){return;} +if($.inArray(key,self.hiddenChannels)>-1){return;} +var newItems=_.filter(items,(entry)=>!entry.read);if(newItems.length==0){return;} +var displayedItems;if(newItems.length>displayLimit){displayedItems=newItems.slice(0,displayLimit);}else{displayedItems=newItems;} +var rest=newItems.length-displayedItems.length;var text="

    ";_.each(displayedItems,function(item){var limitedSummary=stripParagraphs(item.summary_without_images.trim());if(limitedSummary.length>maxLength){limitedSummary=limitedSummary.substr(0,maxLength);limitedSummary=limitedSummary.substr(0,Math.min(limitedSummary.length,limitedSummary.lastIndexOf(" ")));limitedSummary+="...";} +text+="
  • "+ +cutAfterNewline(item.title)+"
    "+ +formatTimeAgo(item.published)+"

    "+ +limitedSummary+"

  • ";});text+="
";if(rest){text+="

"+ +gettext(_.sprintf("... and %(rest)d more.",{rest:rest}))+"

";} +text+=""+ +gettext("You can edit your announcement subscriptions under Settings > Announcements.")+"";var options={title:channel,text:text,hide:false,confirm:{confirm:true,buttons:[{text:gettext("Later"),click:function(notice){notice.remove();self.hiddenChannels.push(key);}},{text:gettext("Mark read"),click:function(notice){notice.remove();self.markRead(key,value.last);}},{text:gettext("Read..."),addClass:"btn-primary",click:function(notice){notice.remove();self.showAnnouncementDialog(key);self.markRead(key,value.last);}}]},buttons:{sticker:false,closer:false}};if(priority===1){options.type="error";} +if(self.channelNotifications[key]){self.channelNotifications[key].remove();} +self.channelNotifications[key]=new PNotify(options);});};self.hideAnnouncements=function(){_.each(self.channelNotifications,function(notification,key){notification.remove();});self.channelNotifications={};};self.configureAnnouncements=function(){self.settings.show("settings_plugin_announcements");};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){if(!self.loginState.hasPermission(self.access.permissions.PLUGIN_ANNOUNCEMENTS_READ)){self.hideAnnouncements();}else{self.retrieveData();}};self.onStartup=function(){self.announcementDialog=$("#plugin_announcements_dialog");self.announcementDialogContent=$("#plugin_announcements_dialog_content");self.announcementDialogTabs=$("#plugin_announcements_dialog_tabs");};self.onEventConnectivityChanged=function(payload){if(!payload||!payload.new)return;self.retrieveData();};} +OCTOPRINT_VIEWMODELS.push({construct:AnnouncementsViewModel,dependencies:["loginStateViewModel","settingsViewModel","accessViewModel"],elements:["#plugin_announcements_dialog","#settings_plugin_announcements","#navbar_plugin_announcements"]});}); +; + +// source: plugin/appkeys/js/appkeys.js +$(function(){function AppKeysDialogViewModel(parameters){var self=this;self.dialog=undefined;self.onStartup=function(){self.dialog=$("#plugin_appkeys_keygenerated");self.dialog.on("hidden",()=>{self.resetDialog();});};self.showDialog=function(title,data){if(self.dialog===undefined)return;var qrcode={text:data.api_key,size:180,fill:"#000",background:null,label:"",fontname:"sans",fontcolor:"#000",radius:0,ecLevel:"L"};self.dialog.find("#plugin_appkeys_keygenerated_title").text(title);self.dialog.find("#plugin_appkeys_keygenerated_user").text(data.user_id);self.dialog.find("#plugin_appkeys_keygenerated_app").text(data.app_id);self.dialog.find("#plugin_appkeys_keygenerated_key_text").text(data.api_key);self.dialog.find("#plugin_appkeys_keygenerated_key_copy").off().click(function(){copyToClipboard(data.api_key);});self.dialog.find("#plugin_appkeys_keygenerated_key_qrcode").empty().qrcode(qrcode);self.dialog.modal("show");};self.resetDialog=()=>{if(self.dialog===undefined)return;self.dialog.find("#plugin_appkeys_keygenerated_title").text("");self.dialog.find("#plugin_appkeys_keygenerated_user").text("");self.dialog.find("#plugin_appkeys_keygenerated_app").text("");self.dialog.find("#plugin_appkeys_keygenerated_key_text").text("");self.dialog.find("#plugin_appkeys_keygenerated_key_copy").off();self.dialog.find("#plugin_appkeys_keygenerated_key_qrcode").empty();};} +function UserAppKeysViewModel(parameters){var self=this;self.dialog=parameters[0];self.loginState=parameters[1];self.keys=new ItemListHelper("plugin.appkeys.userkeys",{app:function(a,b){if(a["app_id"].toLowerCase()b["app_id"].toLowerCase())return 1;return 0;}},{},"app",[],[],5);self.pending={};self.openRequests={};self.editorApp=ko.observable();self.requestData=function(){return OctoPrint.plugins.appkeys.getKeys().done(self.fromResponse);};self.fromResponse=function(response){self.keys.updateItems(response.keys);self.pending=response.pending;_.each(self.pending,function(data,token){self.openRequests[token]=self.promptForAccess(data.app_id,token);});};self.generateKey=function(){self.loginState.reauthenticateIfNecessary(()=>{OctoPrint.plugins.appkeys.generateKey(self.editorApp()).done(self.requestData).done(function(){self.editorApp("");});});};self.revokeKey=(data)=>{const app=data.app_id;self.loginState.reauthenticateIfNecessary(()=>{showConfirmationDialog(_.sprintf(gettext("You are about to revoke the application key for %(app)s."),{app:_.escape(app)}),()=>{OctoPrint.plugins.appkeys.revokeKeyForApp(app).done(self.requestData);});});};self.showKeyDetails=(data)=>{self.loginState.reauthenticateIfNecessary(()=>{OctoPrint.plugins.appkeys.getKey(data.app_id).done((response)=>{self.dialog.showDialog(gettext("Details"),response.key);});});};self.allowApp=function(token){return OctoPrint.plugins.appkeys.decide(token,true).done(self.requestData);};self.denyApp=function(token){return OctoPrint.plugins.appkeys.decide(token,false).done(self.requestData);};self.promptForAccess=function(app,token){var message=gettext('"%(app)s" has requested access to control OctoPrint through the API.');message=_.sprintf(message,{app:_.escape(app)});message="

"+ +message+"

"+ +gettext("Do you want to allow access to this application with your user account?")+"

";return new PNotify({title:gettext("Access Request"),text:message,hide:false,icon:"fa fa-key",confirm:{confirm:true,buttons:[{text:gettext("Allow"),click:function(notice){self.loginState.reauthenticateIfNecessary(()=>{self.allowApp(token);notice.remove();});}},{text:gettext("Deny"),click:function(notice){self.denyApp(token);notice.remove();}}]},buttons:{sticker:false,closer:false}});};self.onUserSettingsShown=function(){self.requestData();};self.onUserLoggedIn=function(){self.requestData();};self.onDataUpdaterPluginMessage=function(plugin,data){if(plugin!=="appkeys"){return;} +var app,token,user;if(data.type==="request_access"&&self.loginState.isUser()){app=data.app_name;token=data.user_token;user=data.user_id;if(user&&user!==self.loginState.username()){return;} +if(self.pending[token]!==undefined){return;} +self.openRequests[token]=self.promptForAccess(app,token);}else if(data.type==="end_request"){token=data.user_token;if(self.openRequests[token]!==undefined){if(self.openRequests[token].state!=="closed"){self.openRequests[token].remove();} +delete self.openRequests[token];}}};} +function AllAppKeysViewModel(parameters){var self=this;self.dialog=parameters[0];self.loginState=parameters[1];self.access=parameters[2];self.keys=new ItemListHelper("plugin.appkeys.allkeys",{user_app:function(a,b){if(a["user_id"]>b["user_id"])return 1;if(a["user_id"]b["app_id"].toLowerCase())return 1;if(a["app_id"].toLowerCase(){self.loginState.reauthenticateIfNecessary(()=>{OctoPrint.plugins.appkeys.getKey(data.app_id,data.user_id).done((response)=>{self.dialog.showDialog(gettext("Details"),response.key);});});};self.generateKey=function(){self.loginState.reauthenticateIfNecessary(()=>{OctoPrint.plugins.appkeys.generateKeyForUser(self.editorUser(),self.editorApp()).done(self.requestData).done(function(){self.editorUser(self.loginState.username());self.editorApp("");}).done(function(data){self.dialog.showDialog(gettext("New key generated!"),data);});});};self.revokeKey=function(data){const app=data.app_id;const user=data.user_id;showConfirmationDialog(_.sprintf(gettext("You are about to revoke the application key for %(app)s for user %(user)s."),{app:_.escape(app),user:_.escape(user)}),()=>{self.loginState.reauthenticateIfNecessary(()=>{OctoPrint.plugins.appkeys.revokeKeyForApp(app,user).done(self.requestData);});});};self.revokeMarked=function(){showConfirmationDialog(_.sprintf(gettext("You are about to revoke %(count)d application keys."),{count:self.markedForDeletion().length}),()=>{self.loginState.forceReauthentication(()=>{self._bulkRevoke(self.markedForDeletion()).done(()=>{self.markedForDeletion.removeAll();});});});};self.markAllOnPageForDeletion=function(){self.markedForDeletion(_.uniq(self.markedForDeletion().concat(_.map(self.keys.paginatedItems(),(item)=>`${item.user_id}:${item.app_id}`))));};self.markAllForDeletion=function(){self.markedForDeletion(_.uniq(_.map(self.keys.allItems,(item)=>`${item.user_id}:${item.app_id}`)));};self.markAllByUserForDeletion=function(user){self.markAllByFilterForDeletion(function(e){return e.user_id===user;});};self.markAllByAppForDeletion=function(app){self.markAllByFilterForDeletion(function(e){return e.app_id.toLowerCase()===app;});};self.markAllByFilterForDeletion=function(filter){self.markedForDeletion(_.uniq(self.markedForDeletion().concat(_.map(_.filter(self.keys.allItems,filter),(item)=>`${item.user_id}:${item.app_id}`))));};self.clearMarked=function(){self.markedForDeletion.removeAll();};self._bulkRevoke=function(keys){var title,message,handler;title=gettext("Revoking application keys");message=_.sprintf(gettext("Revoking %(count)d application keys..."),{count:keys.length});handler=function(id){const[user,app]=rsplit(id,":",1);return OctoPrint.plugins.appkeys.revokeKeyForApp(app,user).done(function(){deferred.notify(_.sprintf(gettext("Revoked %(app)s for %(user)s..."),{app:_.escape(app),user:_.escape(user)}),true);}).fail(function(jqXHR){var short=_.sprintf(gettext("Revocation of %(app)s for user %(user)s failed, continuing..."),{app:_.escape(app),user:_.escape(user)});var long=_.sprintf(gettext("Deletion of %(app)s for user %(user)s failed: %(error)s"),{app:_.escape(app),user:_.escape(user),error:_.escape(jqXHR.responseText)});deferred.notify(short,long,false);});};var deferred=$.Deferred();var promise=deferred.promise();var options={title:title,message:message,max:keys.length,output:true};showProgressModal(options,promise);var requests=[];_.each(keys,function(key){var request=handler(key);requests.push(request);});$.when.apply($,_.map(requests,wrapPromiseWithAlways)).done(function(){deferred.resolve();self.requestData();});return promise;};} +OCTOPRINT_VIEWMODELS.push([AppKeysDialogViewModel,[],[]]);OCTOPRINT_VIEWMODELS.push([UserAppKeysViewModel,["appKeysDialogViewModel","loginStateViewModel"],["#usersettings_plugin_appkeys"]]);OCTOPRINT_VIEWMODELS.push([AllAppKeysViewModel,["appKeysDialogViewModel","loginStateViewModel","accessViewModel"],["#settings_plugin_appkeys"]]);}); +; + +// source: plugin/backup/js/backup.js +$(function(){function BackupViewModel(parameters){var self=this;self.loginState=parameters[0];self.settings=parameters[1];self.backups=new ItemListHelper("plugin.backup.backups",{date:function(a,b){if(a["date"]>b["date"])return-1;if(a["date"]self.maxUploadSize();};const backupFileuploadOptionsFactory=(source)=>{return{dataType:"json",maxNumberOfFiles:1,autoUpload:false,add:(e,data)=>{if(data.files.length===0){return false;} +self.backupUploadName(data.files[0].name);self.backupUploadData=data;self.backupUploadSource=source;},done:(e,data)=>{self.backupUploadName(undefined);self.backupUploadData=undefined;self.backupUploadSource=undefined;}};};$("#settings-backup-upload").fileupload(backupFileuploadOptionsFactory("settings"));$("#wizard-backup-upload").fileupload(backupFileuploadOptionsFactory("wizard"));self.restoreInProgress=ko.observable(false);self.restoreTitle=ko.observable();self.restoreDialog=undefined;self.restoreOutput=undefined;self.unknownPlugins=ko.observableArray([]);self.loglines=ko.observableArray([]);self.requestData=function(){OctoPrint.plugins.backup.get().done(self.fromResponse);};self.fromResponse=function(response){self.backups.updateItems(response.backups);self.unknownPlugins(response.unknown_plugins);self.restoreSupported(response.restore_supported);self.maxUploadSize(response.max_upload_size);};self.reauthenticateDownload=(url)=>{self.loginState.reauthenticateIfNecessary(()=>{const link=document.createElement("a");link.href=url;link.download="";document.body.appendChild(link);link.click();document.body.removeChild(link);});};self.createBackup=function(){var excluded=self.excludeFromBackup();OctoPrint.plugins.backup.createBackup(excluded).done(function(){self.excludeFromBackup([]);});};self.removeBackup=function(backup){var perform=function(){OctoPrint.plugins.backup.deleteBackup(backup).done(function(){self.requestData();});};showConfirmationDialog(_.sprintf(gettext('You are about to delete backup file "%(name)s".'),{name:_.escape(backup)}),perform);};self.restoreBackup=function(backup){if(!self.restoreSupported())return;showConfirmationDialog(_.sprintf(gettext('You are about to restore the backup file "%(name)s". This cannot be undone.'),{name:_.escape(backup)}),()=>{self.loginState.reauthenticateIfNecessary(()=>{self.restoreInProgress(true);self.loglines.removeAll();self.loglines.push({line:"Preparing to restore...",stream:"message"});self.loglines.push({line:" ",stream:"message"});self.restoreDialog.modal({keyboard:false,backdrop:"static",show:true});OctoPrint.plugins.backup.restoreBackup(backup);});});};self.performRestoreFromUpload=function(){if(self.backupUploadData===undefined)return;const proceed=()=>{self.restoreInProgress(true);self.loglines.removeAll();self.loglines.push({line:"Uploading backup, this can take a while. Please wait...",stream:"message"});self.loglines.push({line:" ",stream:"message"});self.restoreDialog.modal({keyboard:false,backdrop:"static",show:true});self.backupUploadData.submit();};showConfirmationDialog(_.sprintf(gettext('You are about to upload and restore the backup file "%(name)s". This cannot be undone.'),{name:_.escape(self.backupUploadName())}),()=>{if(self.backupUploadSource==="wizard"){proceed();}else{self.loginState.reauthenticateIfNecessary(proceed);}});};self.deleteUnknownPluginRecord=function(){var perform=function(){OctoPrint.plugins.backup.deleteUnknownPlugins().done(function(){self.requestData();});};showConfirmationDialog(gettext("You are about to delete the record of plugins unknown during the last restore."),perform);};self.markFilesOnPage=function(){self.markedForBackupDeletion(_.uniq(self.markedForBackupDeletion().concat(_.map(self.backups.paginatedItems(),"name"))));};self.markAllFiles=function(){self.markedForBackupDeletion(_.map(self.backups.allItems,"name"));};self.clearMarkedFiles=function(){self.markedForBackupDeletion.removeAll();};self.removeMarkedFiles=function(){var perform=function(){self._bulkRemove(self.markedForBackupDeletion()).done(function(){self.markedForBackupDeletion.removeAll();});};showConfirmationDialog(_.sprintf(gettext("You are about to delete %(count)d backups."),{count:self.markedForBackupDeletion().length}),perform);};self.onStartup=function(){self.restoreDialog=$("#settings_plugin_backup_restoredialog");self.restoreOutput=$("#settings_plugin_backup_restoredialog_output");};self.onSettingsShown=function(){self.requestData();};self.onDataUpdaterPluginMessage=function(plugin,data){if(plugin!=="backup")return;if(data.type==="backup_done"){self.requestData();self.backupInProgress(false);new PNotify({title:gettext("Backup created successfully"),type:"success"});}else if(data.type==="backup_started"){self.backupInProgress(true);}else if(data.type==="backup_error"){self.requestData();self.backupInProgress(false);new PNotify({title:gettext("Creating the backup failed"),text:_.sprintf(gettext("OctoPrint could not create your backup. Please consult octoprint.log for details. Error: %(error)s"),{error:_.escape(data.error)}),type:"error",hide:false});}else if(data.type==="restore_started"){self.loglines.push({line:gettext("Restoring from backup..."),stream:"message"});self.loglines.push({line:" ",stream:"message"});}else if(data.type==="restore_failed"){self.loglines.push({line:" ",stream:"message"});self.loglines.push({line:gettext("Restore failed! Check the above output and octoprint.log for reasons as to why."),stream:"error"});self.restoreInProgress(false);}else if(data.type==="restore_done"){self.loglines.push({line:" ",stream:"message"});self.loglines.push({line:gettext("Restore successful! The server will now be restarted!"),stream:"message"});self.restoreInProgress(false);}else if(data.type==="installing_plugin"){self.loglines.push({line:" ",stream:"message"});self.loglines.push({line:_.sprintf(gettext('Installing plugin "%(plugin)s"...'),{plugin:_.escape(data.plugin)}),stream:"message"});}else if(data.type==="plugin_incompatible"){self.loglines.push({line:" ",stream:"message"});self.loglines.push({line:_.sprintf(gettext('Cannot install plugin "%(plugin)s" due to it being incompatible to this OctoPrint version and/or underlying operating system'),{plugin:_.escape(data.plugin.key)}),stream:"stderr"});}else if(data.type==="unknown_plugins"){if(data.plugins.length>0){self.loglines.push({line:" ",stream:"message"});self.loglines.push({line:_.sprintf(gettext("There are %(count)d plugins you'll need to install manually since they aren't registered on the repository:"),{count:data.plugins.length}),stream:"message"});_.each(data.plugins,function(plugin){self.loglines.push({line:plugin.name+": "+plugin.url,stream:"message"});});self.loglines.push({line:" ",stream:"message"});self.unknownPlugins(data.plugins);}}else if(data.type==="logline"){self.loglines.push(self._preprocessLine({line:data.line,stream:data.stream}));self._scrollRestoreOutputToEnd();}};self._scrollRestoreOutputToEnd=function(){self.restoreOutput.scrollTop(self.restoreOutput[0].scrollHeight-self.restoreOutput.height());};self._forcedStdoutLine=/You are using pip version .*?, however version .*? is available\.|You should consider upgrading via the '.*?' command\./;self._preprocessLine=function(line){if(line.stream==="stderr"&&line.line.match(self._forcedStdoutLine)){line.stream="stdout";} +return line;};self._bulkRemove=function(files){var title,message,handler;title=gettext("Deleting backups");message=_.sprintf(gettext("Deleting %(count)d backups..."),{count:files.length});handler=function(filename){return OctoPrint.plugins.backup.deleteBackup(filename).done(function(){deferred.notify(_.sprintf(gettext("Deleted %(filename)s..."),{filename:_.escape(filename)}),true);}).fail(function(jqXHR){var short=_.sprintf(gettext("Deletion of %(filename)s failed, continuing..."),{filename:_.escape(filename)});var long=_.sprintf(gettext("Deletion of %(filename)s failed: %(error)s"),{filename:_.escape(filename),error:_.escape(jqXHR.responseText)});deferred.notify(short,long,false);});};var deferred=$.Deferred();var promise=deferred.promise();var options={title:title,message:message,max:files.length,output:true};showProgressModal(options,promise);var requests=[];_.each(files,function(filename){var request=handler(filename);requests.push(request);});$.when.apply($,_.map(requests,wrapPromiseWithAlways)).done(function(){deferred.resolve();self.requestData();});return promise;};} +OCTOPRINT_VIEWMODELS.push({construct:BackupViewModel,dependencies:["loginStateViewModel","settingsViewModel"],elements:["#settings_plugin_backup","#wizard_plugin_backup"]});}); +; + +// source: plugin/classicwebcam/js/classicwebcam.js +$(function(){function ClassicWebcamViewModel(parameters){var self=this;self.loginState=parameters[0];self.settings=parameters[1];self.webcamStreamVisible=false;self.webcamDisableTimeout=undefined;self.webcamLoaded=ko.observable(false);self.webcamMjpgEnabled=ko.observable(false);self.webcamHlsEnabled=ko.observable(false);self.webcamWebRTCEnabled=ko.observable(false);self.webcamError=ko.observable(false);self.webcamMuted=ko.observable(true);self.webRTCPeerConnection=null;self.webcamElementHls=null;self.webcamElementWebrtc=null;self.webcamRatioClass=ko.pureComputed(function(){if(self.settings.streamRatio()=="4:3"){return"ratio43";}else{return"ratio169";}});self.webcamClass=ko.pureComputed(function(){if(self.settings.rotate90()){return"webcam_rotated "+self.webcamRatioClass();}else{return"webcam_unrotated "+self.webcamRatioClass();}});self.onBeforeBinding=function(){self.settings.rotate90.subscribe(function(){window.setTimeout(function(){self._updateVideoTagWebcamLayout();},1);});self.streamUrlEscaped=ko.pureComputed(function(){return encodeURI(self.settings.streamUrl());});self.webcamStreamType=ko.pureComputed(function(){try{return self.determineWebcamStreamType(self.streamUrlEscaped());}catch(e){console.error(e);self.webcamError(true);return"mjpg";}});self.webcamStreamValid=ko.pureComputed(function(){var url=self.streamUrlEscaped();return!url||validateWebcamUrl(url);});};self.onWebcamVisibilityChange=function(visible){self.webcamStreamVisible=visible;if(self.webcamStreamVisible){self._enableWebcam();}else{self._disableWebcam();}};self.onWebcamRefresh=function(){var streamType=self.webcamStreamType();if(streamType=="mjpg"){if(OctoPrint.coreui.browser.safari){return;} +$("#webcam_image").attr("src","");self._switchToMjpgWebcam();log.info("Triggered refresh of mjpg webcam stream");}};self.onEventSettingsUpdated=function(payload){self._enableWebcamIfVisible();};self._getActiveWebcamVideoElement=function(){if(self.webcamWebRTCEnabled()){return self.webcamElementWebrtc;}else{return self.webcamElementHls;}};self.launchWebcamPictureInPicture=function(){self._getActiveWebcamVideoElement().requestPictureInPicture();};self.launchWebcamFullscreen=function(){self._getActiveWebcamVideoElement().requestFullscreen();};self.toggleWebcamMute=function(){self.webcamMuted(!self.webcamMuted());self.webcamElementWebrtc.muted=self.webcamMuted();self.webcamElementHls.muted=self.webcamMuted();};self._disableWebcam=function(){if(OctoPrint.coreui.browser.safari){return;} +var timeout=self.settings.streamTimeout()||5;self.webcamDisableTimeout=setTimeout(function(){log.debug("Unloading webcam stream after",timeout,"seconds");$("#webcam_image").attr("src","");self.webcamLoaded(false);},timeout*1000);};self._enableWebcamIfVisible=function(){if(self.webcamStreamVisible){self._enableWebcam();}};self._enableWebcam=function(){if(self.webcamDisableTimeout!=undefined){clearTimeout(self.webcamDisableTimeout);} +if(self.settings.webcamEnabled()==false){console.log("Webcam not enabled");return;} +var streamType=self.webcamStreamType();if(streamType=="mjpg"){self._switchToMjpgWebcam();}else if(streamType=="hls"){self._switchToHlsWebcam();}else if(isWebRTCAvailable()&&streamType=="webrtc"){self._switchToWebRTCWebcam();}else{throw"Unknown stream type "+streamType;}};self.onWebcamLoaded=function(){if(self.webcamLoaded())return;log.debug("Webcam stream loaded");self.webcamLoaded(true);self.webcamError(false);};self.onWebcamErrored=function(){log.debug("Webcam stream failed to load/was unloaded");self.webcamLoaded(false);self.webcamError(true);};self.onUserPermissionsChanged=self.onUserLoggedIn=self.onUserLoggedOut=function(){self.syncWebcamElements();};self.syncWebcamElements=function(){self.webcamElementHls=document.getElementById("webcam_hls");self.webcamElementWebrtc=document.getElementById("webcam_webrtc");};self.onStartup=function(){self.syncWebcamElements();};self._switchToMjpgWebcam=function(){var webcamImage=$("#webcam_image");var currentSrc=webcamImage.attr("src");if(OctoPrint.coreui.browser.safari&¤tSrc!=undefined){return;} +var newSrc=self.streamUrlEscaped();if(currentSrc!=newSrc){if(self.settings.cacheBuster()){if(newSrc.lastIndexOf("?")>-1){newSrc+="&";}else{newSrc+="?";} +newSrc+=new Date().getTime();} +self.webcamLoaded(false);self.webcamError(false);webcamImage.attr("src",newSrc);self.webcamHlsEnabled(false);self.webcamMjpgEnabled(true);self.webcamWebRTCEnabled(false);}};self._switchToHlsWebcam=function(){var video=self.webcamElementHls;video.onresize=self._updateVideoTagWebcamLayout;if(self.webRTCPeerConnection!=null){self.webRTCPeerConnection.close();self.webRTCPeerConnection=null;} +if(video!=null&&typeof video.canPlayType!=undefined&&video.canPlayType("application/vnd.apple.mpegurl")=="probably"){video.src=self.streamUrlEscaped();}else if(Hls.isSupported()){self.hls=new Hls();self.hls.loadSource(self.streamUrlEscaped());self.hls.attachMedia(video);} +self.webcamMjpgEnabled(false);self.webcamHlsEnabled(true);self.webcamWebRTCEnabled(false);};self._switchToWebRTCWebcam=function(){if(!isWebRTCAvailable()){return;} +var video=self.webcamElementWebrtc;video.onresize=self._updateVideoTagWebcamLayout;if(self.hls!=null){self.webcamElementHls.src=null;self.hls.destroy();self.hls=null;} +if(self.webRTCPeerConnection!=null&&self.webRTCPeerConnection.connectionState!="connected"){self.webRTCPeerConnection.close();self.webRTCPeerConnection=null;} +if(self.webRTCPeerConnection==null){self.webRTCPeerConnection=startWebRTC(video,self.streamUrlEscaped(),self.settings.streamWebrtcIceServers());} +self.webcamMjpgEnabled(false);self.webcamHlsEnabled(false);self.webcamWebRTCEnabled(true);};self._updateVideoTagWebcamLayout=function(){var player=self._getActiveWebcamVideoElement();var rotationContainer=document.querySelector("#webcam_video_container .webcam_rotated");var rotationTarget=document.querySelector("#webcam_video_container .webcam_rotated .rotation_target");var unrotationContainer=document.querySelector("#webcam_video_container .webcam_unrotated");var unrotationTarget=document.querySelector("#webcam_video_container .webcam_unrotated .rotation_target");if(rotationContainer){var height=rotationContainer.offsetWidth;rotationContainer.style.height=height+"px";rotationTarget.style.height=rotationContainer.offsetWidth+"px";rotationTarget.style.width=rotationContainer.offsetHeight+"px";rotationContainer.style.paddingBottom=0;} +if(unrotationContainer){unrotationContainer.style.height=null;unrotationContainer.style.paddingBottom=0;unrotationTarget.style.height=null;unrotationTarget.style.width=null;}};self.determineWebcamStreamType=function(streamUrl){if(!streamUrl){throw"Empty streamUrl. Cannot determine stream type.";} +var parsed=validateWebcamUrl(streamUrl);if(!parsed){throw"Invalid streamUrl. Cannot determine stream type.";} +if(parsed.protocol==="webrtc:"||parsed.protocol==="webrtcs:"){return"webrtc";} +var lastDotPosition=parsed.pathname.lastIndexOf(".");if(lastDotPosition!==-1){var extension=parsed.pathname.substring(lastDotPosition+1);if(extension.toLowerCase()==="m3u8"){return"hls";}} +return"mjpg";};} +OCTOPRINT_VIEWMODELS.push({construct:ClassicWebcamViewModel,dependencies:["loginStateViewModel","classicWebcamSettingsViewModel"],elements:["#classicwebcam_container"]});}); +; + +// source: plugin/classicwebcam/js/classicwebcam_settings.js +$(function(){function ClassicWebcamSettingsViewModel(parameters){var self=this;self.loginState=parameters[0];self.settings=parameters[1];self._subscriptions=[];self.webRtcServersToText=function(list){self.streamWebrtcIceServersText(self.streamWebrtcIceServers().join(", "));};self.textToWebRtcServers=function(list){self.streamWebrtcIceServers(splitTextToArray(self.streamWebrtcIceServersText(),",",true));};self.onBeforeBinding=function(){self.snapshotUrl=self.settings.settings.plugins.classicwebcam.snapshot;self.snapshotTimeout=self.settings.settings.plugins.classicwebcam.snapshotTimeout;self.snapshotSslValidation=self.settings.settings.plugins.classicwebcam.snapshotSslValidation;self.flipH=self.settings.settings.plugins.classicwebcam.flipH;self.flipV=self.settings.settings.plugins.classicwebcam.flipV;self.rotate90=self.settings.settings.plugins.classicwebcam.rotate90;self.streamUrl=self.settings.settings.plugins.classicwebcam.stream;self.webcamEnabled=self.settings.settings.webcam.webcamEnabled;self.streamRatio=self.settings.settings.plugins.classicwebcam.streamRatio;self.streamTimeout=self.settings.settings.plugins.classicwebcam.streamTimeout;self.streamWebrtcIceServers=self.settings.settings.plugins.classicwebcam.streamWebrtcIceServers;self.streamWebrtcIceServersText=ko.observable("");self.cacheBuster=self.settings.settings.plugins.classicwebcam.cacheBuster;self.available_ratios=["16:9","4:3"];self.webRtcServersToText();self.streamWebrtcIceServers.subscribe(function(value){self.webRtcServersToText();});};self.onSettingsBeforeSave=function(){self.textToWebRtcServers();};self.onUserSettingsHidden=function(){self.webRtcServersToText();};self.streamUrlEscaped=ko.pureComputed(function(){return encodeURI(self.streamUrl());});self.streamType=ko.pureComputed(function(){try{return determineWebcamStreamType(self.streamUrlEscaped());}catch(e){return"";}});self.streamValid=ko.pureComputed(function(){var url=self.streamUrlEscaped();return!url||validateWebcamUrl(url);});self.testWebcamStreamUrlBusy=ko.observable(false);self.testWebcamStreamUrl=function(){var url=self.streamUrlEscaped();if(!url){return;} +if(self.testWebcamStreamUrlBusy()){return;} +var text=gettext("If you see your webcam stream below, the entered stream URL is ok.");var streamType;try{streamType=self.streamType();}catch(e){streamType="";} +var webcam_element;var webrtc_peer_connection;if(streamType==="mjpg"){webcam_element=$('');}else if(streamType==="hls"){webcam_element=$('