diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9063096..dce987f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,14 @@
# Restreamer-UI
+## v1.14.0 > v1.15.0
+
+- Add EarthCam publication service
+- Add other RTSP transport modes
+- Fix wetter.com category
+
## v1.13.0 > v1.14.0
-- Add wettercom service
+- Add wetter.com service
- Add option to select which channels will be displayed on the playersite ([#392](https://github.com/datarhei/restreamer/issues/392), [#800](https://github.com/datarhei/restreamer/issues/800))
- Mod updates public videojs >v8
- Fix erroneous filter setting
diff --git a/src/views/Publication/Services/EarthCam.js b/src/views/Publication/Services/EarthCam.js
new file mode 100644
index 0000000..76123f7
--- /dev/null
+++ b/src/views/Publication/Services/EarthCam.js
@@ -0,0 +1,102 @@
+import React from 'react';
+
+import { Trans } from '@lingui/macro';
+import Grid from '@mui/material/Grid';
+import Link from '@mui/material/Link';
+import TextField from '@mui/material/TextField';
+
+import Logo from './logos/earthcam.svg';
+import FormInlineButton from '../../../misc/FormInlineButton';
+
+const id = 'earthcam';
+const name = 'EarthCam';
+const version = '1.0';
+const stream_key_link = 'https://www.earthcam.com/myearthcam/settings.php';
+const description = (
+
+ Transmit your Livestream to an EarthCam RTMP service.{' '}
+
+ Here{' '}
+
+ you can find more details about the settings.
+
+);
+const image_copyright = Please get in touch with the operator of the service and check what happens.;
+const author = {
+ creator: {
+ name: 'datarhei',
+ link: 'https://github.com/datarhei',
+ },
+ maintainer: {
+ name: 'datarhei',
+ link: 'https://github.com/datarhei',
+ },
+};
+const category = 'platform';
+const requires = {
+ protocols: ['rtmp'],
+ formats: ['flv'],
+ codecs: {
+ audio: ['aac'],
+ video: ['h264'],
+ },
+};
+
+function ServiceIcon(props) {
+ return
;
+}
+
+function init(settings) {
+ const initSettings = {
+ server_url: 'rtmp://video1.earthcam.com/myearthcam',
+ stream_key: '',
+ ...settings,
+ };
+
+ return initSettings;
+}
+
+function Service({ settings = {}, skills = {}, metadata = {}, streams = [], onChange = function (output, settings) {} }) {
+ settings = init(settings);
+
+ const handleChange = (what) => (event) => {
+ const value = event.target.value;
+
+ settings[what] = value;
+
+ const output = createOutput(settings);
+
+ onChange([output], settings);
+ };
+
+ const createOutput = (settings) => {
+ const output = {
+ address: settings.server_url + '/' + settings.stream_key,
+ //options: ['-rtmp_playpath', settings.stream_key, '-f', 'flv'],
+ };
+
+ return output;
+ };
+
+ return (
+
+
+ Stream key}
+ value={settings.stream_key}
+ onChange={handleChange('stream_key')}
+ />
+
+
+
+ GET
+
+
+
+ );
+}
+
+export { id, name, version, stream_key_link, description, image_copyright, author, category, requires, ServiceIcon as icon, Service as component };
diff --git a/src/views/Publication/Services/index.js b/src/views/Publication/Services/index.js
index a570522..1b09e8c 100644
--- a/src/views/Publication/Services/index.js
+++ b/src/views/Publication/Services/index.js
@@ -7,6 +7,7 @@ import * as DaCast from './DaCast';
import * as Dailymotion from './Dailymotion';
import * as DASH from './DASH';
import * as DLive from './DLive';
+import * as EarthCam from './EarthCam';
import * as Facebook from './Facebook';
import * as Framebuffer from './Framebuffer';
import * as HLS from './HLS';
@@ -95,6 +96,7 @@ registry.Register(PeerTube);
registry.Register(MediaNetwork);
registry.Register(Livespotting);
registry.Register(Wettercom);
+registry.Register(EarthCam);
registry.Register(Azure);
registry.Register(Brightcove);
registry.Register(Akamai);
diff --git a/src/views/Publication/Services/logos/earthcam.svg b/src/views/Publication/Services/logos/earthcam.svg
new file mode 100644
index 0000000..8ff3e83
--- /dev/null
+++ b/src/views/Publication/Services/logos/earthcam.svg
@@ -0,0 +1,5 @@
+