-This is a rewrite of the original [Musare](https://github.com/Musare/MusareMeteor)
-in NodeJS, Express, SocketIO and VueJS. Everything is ran in it's own docker container, but you can also run it without Docker.
-The site is available at [https://musare.com](https://musare.com).
+Based off of the original [Musare](https://github.com/Musare/MusareMeteor), which utilized Meteor.
+
+MusareNode now uses NodeJS, Express, SocketIO and VueJS - among other technologies. We have also implemented the ability to host Musare in [Docker Containers](https://www.docker.com/).
+
+The master branch is available at [musare.com](https://musare.com)
+You can also find the staging branch at [musare.dev](https://musare.dev)
+
+## Contact
+
+Get in touch with us via email at [core@musare.com](mailto:core@musare.com) or join our [Discord Guild](https://discord.gg/Y5NxYGP).
+
+You can also find us on [Facebook](https://www.facebook.com/MusareMusic) and [Twitter](https://twitter.com/MusareApp).
### Our Stack
- * NodeJS
- * MongoDB
- * Redis
- * Nginx (not required)
- * VueJS
+- NodeJS
+- MongoDB
+- Redis
+- Nginx (not required)
+- VueJS
### Frontend
-The frontend is a [vue-cli](https://github.com/vuejs/vue-cli) generated,
-[vue-loader](https://github.com/vuejs/vue-loader) single page app, that's
-served over Nginx or express. The Nginx server not only serves the frontend, but
-also serves as a load balancer for requests going to the backend.
+
+The frontend is a [vue-cli](https://github.com/vuejs/vue-cli) generated, [vue-loader](https://github.com/vuejs/vue-loader) single page app, that's served over Nginx or Express. The Nginx server not only serves the frontend, but can also serve as a load balancer for requests going to the backend.
### Backend
-The backend is a scalable NodeJS / Redis / MongoDB app. Each backend
-server handles a group of SocketIO connections. User sessions are stored
-in a central Redis server. All data is stored in a central MongoDB server.
-The Redis and MongoDB servers are replicated to several secondary nodes,
-which can become the primary node if the current primary node goes down.
-We currently only have 1 backend, 1 MongoDB server and 1 Redis server running for production, though it is relatively easy to expand.
+The backend is a scalable NodeJS / Redis / MongoDB app. Each backend server handles a group of SocketIO connections. User sessions are stored in a central Redis server. All data is stored in a central MongoDB server. The Redis and MongoDB servers are replicated to several secondary nodes, which can become the primary node if the current primary node goes down.
+
+We currently only utilize 1 backend, 1 MongoDB server and 1 Redis server running for production, though it is relatively easy to expand.
## Requirements
-Option 1: (not recommended for Windows users)
- * [Docker](https://www.docker.com/)
+Installing with Docker: (not recommended for Windows users)
+ _ [node-gyp](https://github.com/nodejs/node-gyp#installation): `yarn global add node-gyp`
+- [Yarn (Windows)](https://yarnpkg.com/lang/en/docs/install/#windows-stable) [Yarn (Unix)](https://yarnpkg.com/lang/en/docs/install/#debian-stable) ([npm](https://www.npmjs.com/) can also be used)
+- [MongoDB](https://www.mongodb.com/download-center) Currently version 4.0
- The `secret` key can be whatever. It's used by express's session module.
- The `domain` should be the url where the site will be accessible from, usually `http://localhost` for non-Docker.
- The `serverDomain` should be the url where the backend will be accessible from, usually `http://localhost:8080` for non-Docker.
- The `serverPort` should be the port where the backend will listen on, usually `8080` for non-Docker.
- `isDocker` if you are using Docker or not.
- The `apis.youtube.key` value can be obtained by setting up a [YouTube API Key](https://developers.google.com/youtube/v3/getting-started).
- To set up a GitHub OAuth Application, you need to fill in some value's. The homepage is the homepage of frontend. The authorization callback url is the backend url with `/auth/github/authorize/callback` added at the end. For example `http://localhost:8080/auth/github/authorize/callback`.
- The `apis.recaptcha.secret` value can be obtained by setting up a [ReCaptcha Site](https://www.google.com/recaptcha/admin).
- The `apis.github` values can be obtained by setting up a [GitHub OAuth Application](https://github.com/settings/developers).
- The `apis.discord.token` is the token for the Discord bot.
- The `apis.discord.loggingServer` is the Discord logging server id.
- The `apis.discord.loggingChannel` is the Discord logging channel id.
- The `apis.mailgun` values can be obtained by setting up a [Mailgun account](http://www.mailgun.com/).
- The `redis.url` url should be left alone for Docker, and changed to `redis://localhost:6379/0` for non-Docker.
- The `redis.password` should be the Redis password you either put in your `startRedis.cmd` file for Windows, or `.env` for docker.
- The `mongo.url` needs to have the proper password for the MongoDB musare user, and for non-Docker you need to replace `@musare:27017` with `@localhost:27017`.
- The `cookie.domain` value should be the ip or address you use to access the site, without protocols (http/https), so for example `localhost`.
- The `cookie.secure` value should be `true` for SSL connections, and `false` for normal http connections.
+ Values:
+ The `mode` should be either "development" or "production". No more explanation needed.
+ The `secret` key can be whatever. It's used by express's session module.
+ The `domain` should be the url where the site will be accessible from, usually `http://localhost` for non-Docker.
+ The `serverDomain` should be the url where the backend will be accessible from, usually `http://localhost:8080` for non-Docker.
+ The `serverPort` should be the port where the backend will listen on, should always be `8080` for Docker, and is recommended for non-Docker.
+ `isDocker` if you are using Docker or not.
+ The `apis.youtube.key` value can be obtained by setting up a [YouTube API Key](https://developers.google.com/youtube/v3/getting-started). You need to use the YouTube Data API v3, and create an API key.
+ The `apis.recaptcha.secret` value can be obtained by setting up a [ReCaptcha Site (v3)](https://www.google.com/recaptcha/admin).
+ The `apis.github` values can be obtained by setting up a [GitHub OAuth Application](https://github.com/settings/developers). You need to fill in some values to create the OAuth application. The homepage is the homepage of frontend. The authorization callback url is the backend url with `/auth/github/authorize/callback` added at the end. For example `http://localhost:8080/auth/github/authorize/callback`.
+ The `apis.discord.token` is the token for the Discord bot.
+ The `apis.discord.loggingServer` is the Discord logging server id.
+ The `apis.discord.loggingChannel` is the Discord logging channel id.
+ The `apis.mailgun` values can be obtained by setting up a [Mailgun account](http://www.mailgun.com/), or you can disable it.
+ The `apis.spotify` values can be obtained by setting up a [Spotify client id](https://developer.spotify.com/dashboard/applications), or you can disable it.
+ The `redis.url` url should be left alone for Docker, and changed to `redis://localhost:6379/0` for non-Docker.
+ The `redis.password` should be the Redis password you either put in your `startRedis.cmd` file for Windows, or `.env` for docker.
+ The `mongo.url` needs to have the proper password for the MongoDB musare user, and for non-Docker you need to replace `@musare:27017` with `@localhost:27017`.
+ The `cookie.domain` value should be the ip or address you use to access the site, without protocols (http/https), so for example `localhost`.
+ The `cookie.secure` value should be `true` for SSL connections, and `false` for normal http connections.
- The `serverDomain` should be the url where the backend will be accessible from, usually `http://localhost:8080` for non-Docker.
- The `recaptcha.key` value can be obtained by setting up a [ReCaptcha Site](https://www.google.com/recaptcha/admin).
- The `cookie.domain` value should be the ip or address you use to access the site, without protocols (http/https), so for example `localhost`.
- The `cookie.secure` value should be `true` for SSL connections, and `false` for normal http connections.
+ Values:
+ The `serverDomain` should be the url where the backend will be accessible from, usually `http://localhost:8080` for non-Docker.
+ The `frontendDomain` should be the url where the frontend will be accessible from, usually `http://localhost` for docker or `http://localhost:80` for non-Docker.
+ The `frontendPort` should be the port where the frontend will be accessible from, should always be port `81` for Docker, and is recommended to be port `80` for non-Docker.
+ The `recaptcha.key` value can be obtained by setting up a [ReCaptcha Site (v3)](https://www.google.com/recaptcha/admin).
+ The `cookie.domain` value should be the ip or address you use to access the site, without protocols (http/https), so for example `localhost`.
+ The `cookie.secure` value should be `true` for SSL connections, and `false` for normal http connections.
+ The `siteSettings.logo` should be the path to the logo image, by default it is `/assets/wordmark.png`.
+ The `siteSettings.siteName` should be the name of the site.
+ The `siteSettings.socialLinks.` `github`,`twitter`,`facebook` and `github` are set to the official Musare accounts by default but can be changed.
Now you have different paths here.
-####Docker
+### Installing with Docker
+
+_Configuration_
+
+To configure docker simply `cp .env.example .env` and configure the .env file to match your settings in `backend/config/default.json`.
+The configurable ports will be how you access the services on your machine, or what ports you will need to specify in your nginx files when using proxy_pass.
+`COMPOSE_PROJECT_NAME` should be a unique name for this installation, especially if you have multiple instances of Musare on the same machine.
+`FRONTEND_MODE` should be either `dev` or `prod` (self-explanatory).
1. Build the backend and frontend Docker images (from the main folder)
@@ -85,105 +107,91 @@ Now you have different paths here.
2. Set up the MongoDB database
- 1. Disable auth
-
- In `docker-compose.yml` remove `--auth` from the line `command: "--auth"` for mongo.
- In `startMongo.cmd` add ` --auth` at the end of the first line
-
-4. In the folder where you installed Redis, edit the `redis.windows.conf` file. In there, look for the property `notify-keyspace-events`. Make sure that property is uncommented and has the value `Ex`. It should look like `notify-keyspace-events Ex` when done.
-
-5. Create a file called `startRedis.cmd` in the main folder with the contents:
+ In `startMongo.cmd` add `--auth` at the end of the first line
+
+4. In the folder where you installed Redis, edit the `redis.windows.conf` file. In there, look for the property `notify-keyspace-events`. Make sure that property is uncommented and has the value `Ex`. It should look like `notify-keyspace-events Ex` when done.
+
+5. Create a file called `startRedis.cmd` in the main folder with the contents:
-4. Restart the docker machine so that it uses the new shared folder
+1. Restart the docker machine so that it uses the new shared folder
`docker-machine restart default`
-5. You now should be good to go!
+1. You now should be good to go!
### Fixing the "couldn't connect to docker daemon" error
@@ -249,17 +258,17 @@ Run this command in your shell. You will have to do this command for every shell
2. Install nodemon globally
- `npm install nodemon -g`
+ `yarn global add nodemon`
3. Install webpack globally
- `npm install webpack -g`
+ `yarn global add webpack`
4. Install node-gyp globally (first check out https://github.com/nodejs/node-gyp#installation)
- `npm install node-gyp -g`.
+ `yarn global add node-gyp`.
-5. In both `frontend` and `backend` folders, do `npm install`.
+5. In both `frontend` and `backend` folders, do `yarn install`.
6. `nodemon backend/index.js`
@@ -268,12 +277,17 @@ Run this command in your shell. You will have to do this command for every shell
You can call Toasts using our custom package, [`vue-roaster`](https://github.com/atjonathan/vue-roaster), using the following code:
```js
-import { Toast } from 'vue-roaster';
-Toast.methods.addToast('', 0);
+import { Toast } from "vue-roaster";
+Toast.methods.addToast("", 0);
```
-## Contact
+### Set user role
+
+When setting up you will need to grant yourself the admin role, using the following commands:
-There are multiple ways to contact us. You can send an email to [musaremusic@gmail.com](musaremusic@gmail.com) or [krisvos130@gmail.com](krisvos130@gmail.com).
+```
+docker-compose exec mongo mongo admin
-You can also message us on [Facebook](https://www.facebook.com/MusareMusic), [Twitter](https://twitter.com/MusareApp) or on our [Discord](https://discord.gg/Y5NxYGP).
+ discord.sendAdminAlertMessage(message, "#FF0000", message, true, [{name: "Error:", value: err, inline: false}, {name: "Component:", value: component, inline: true}]); //TODO Maybe due to lockdown this won't work, and what if the Discord module was the one that failed?
+}
+
+function moduleStartFunction() {
+ logger.info("MODULE_START", `Starting to initialize component '${currentComponent}'`);
+ logger.success("STATIONS_UPDATE_BLACKLISTED_GENRES", `Updated station "${stationId}" blacklisted genres to "${newBlacklistedGenres}" successfully.`);
+ return cb({'status': 'success', 'message': 'Successfully updated the blacklisted genres.'});
+ });
+ }),
+
/**
* Updates a station's party mode
*
@@ -682,7 +741,7 @@ module.exports = {
(station, next) => {
if (!station) return next('Station not found.');
if (station.partyMode === newPartyMode) return next('The party mode was already ' + ((newPartyMode) ? 'enabled.' : 'disabled.'));
if (station.type === 'community' && station.partyMode && station.queue.length === 0) return next(null, null, -11, station); // Community station with party mode enabled and no songs in the queue
if (station.type === 'community' && station.partyMode && station.queue.length > 0) { // Community station with party mode enabled and songs in the queue
- if (!validation.isLength(username, 2, 32)) return Toast.methods.addToast('Username must have between 2 and 32 characters.', 8000);
- if (!validation.regex.azAZ09_.test(username)) return Toast.methods.addToast('Invalid username format. Allowed characters: a-z, A-Z, 0-9 and _.', 8000);
-
-
- if (!validation.isLength(password, 6, 200)) return Toast.methods.addToast('Password must have between 6 and 200 characters.', 8000);
- if (!validation.regex.password.test(password)) return Toast.methods.addToast('Invalid password format. Must have one lowercase letter, one uppercase letter, one number and one special character.', 8000);
-
- this.socket.emit('users.register', username, email, password, grecaptcha.getResponse(recaptchaId), result => {
- if (result.status === 'success') {
- Toast.methods.addToast(`You have successfully registered.`, 4000);
+ "Duration can't be higher than the length of the video",
+ 8000
+ );
}
- },
- methods: {
- save: function (song, close) {
- let _this = this;
-
- if (!song.title) return Toast.methods.addToast('Please fill in all fields', 8000);
- if (!song.thumbnail) return Toast.methods.addToast('Please fill in all fields', 8000);
-
-
- // Title
- if (!validation.isLength(song.title, 1, 64)) return Toast.methods.addToast('Title must have between 1 and 64 characters.', 8000);
- if (!validation.regex.ascii.test(song.title)) return Toast.methods.addToast('Invalid title format. Only ascii characters are allowed.', 8000);
-
-
- // Artists
- if (song.artists.length < 1 || song.artists.length > 10) return Toast.methods.addToast('Invalid artists. You must have at least 1 artist and a maximum of 10 artists.', 8000);
- let error;
- song.artists.forEach((artist) => {
- if (!validation.isLength(artist, 1, 32)) return error = 'Artist must have between 1 and 32 characters.';
- if (!validation.regex.ascii.test(artist)) return error = 'Invalid artist format. Only ascii characters are allowed.';
- if (artist === 'NONE') return error = 'Invalid artist format. Artists are not allowed to be named "NONE".';
- });
- if (error) return Toast.methods.addToast(error, 8000);
-
- // Genres
- error = undefined;
- song.genres.forEach((genre) => {
- if (!validation.isLength(genre, 1, 16)) return error = 'Genre must have between 1 and 16 characters.';
- if (!validation.regex.az09_.test(genre)) return error = 'Invalid genre format. Only ascii characters are allowed.';
- });
- if (error) return Toast.methods.addToast(error, 8000);
+ // Title
+ if (!validation.isLength(song.title, 1, 100))
+ return Toast.methods.addToast(
+ "Title must have between 1 and 100 characters.",
+ 8000
+ );
+ /* if (!validation.regex.ascii.test(song.title))
+ return Toast.methods.addToast(
+ "Invalid title format. Only ascii characters are allowed.",
+ 8000
+ ); */
+
+ // Artists
+ if (song.artists.length < 1 || song.artists.length > 10)
+ return Toast.methods.addToast(
+ "Invalid artists. You must have at least 1 artist and a maximum of 10 artists.",
+ 8000
+ );
+ let error;
+ song.artists.forEach(artist => {
+ if (!validation.isLength(artist, 1, 32)) {
+ error = "Artist must have between 1 and 32 characters.";
+ return error;
+ }
+ if (!validation.regex.ascii.test(artist)) {
+ error =
+ "Invalid artist format. Only ascii characters are allowed.";
+ return error;
+ }
+ if (artist === "NONE") {
+ error =
+ 'Invalid artist format. Artists are not allowed to be named "NONE".';
+ return error;
+ }
+ return false;
+ });
+ if (error) return Toast.methods.addToast(error, 8000);
+
+ // Genres
+ error = undefined;
+ song.genres.forEach(genre => {
+ if (!validation.isLength(genre, 1, 16)) {
+ error = "Genre must have between 1 and 16 characters.";
+ return error;
+ }
+ if (!validation.regex.az09_.test(genre)) {
+ error =
+ "Invalid genre format. Only ascii characters are allowed.";
+ return error;
+ }
- // Thumbnail
- if (!validation.isLength(song.thumbnail, 8, 256)) return Toast.methods.addToast('Thumbnail must have between 8 and 256 characters.', 8000);
- if (song.thumbnail.indexOf('https://') !== 0) return Toast.methods.addToast('Thumbnail must start with "https://".', 8000);
+ return false;
+ });
+ if (error) return Toast.methods.addToast(error, 8000);
+
+ // Thumbnail
+ if (!validation.isLength(song.thumbnail, 8, 256))
+ return Toast.methods.addToast(
+ "Thumbnail must have between 8 and 256 characters.",
+ 8000
+ );
+ if (this.useHTTPS && song.thumbnail.indexOf("https://") !== 0) {
+ return Toast.methods.addToast(
+ 'Thumbnail must start with "https://".',
+ 8000
+ );
+ }
+ if (!this.useHTTPS && song.thumbnail.indexOf("http://") !== 0) {
+ return Toast.methods.addToast(
+ 'Thumbnail must start with "http://".',
+ 8000
+ );
+ }
- this.socket.emit(`${_this.editing.type}.update`, song._id, song, res => {
- <small>With party mode enabled, people can add songs to a queue that plays. With party mode disabled you can play a private playlist on loop.</small><br>
- <div v-if="$parent.station.partyMode">
- <br>
- <br>
- <label class='label'>Queue lock</label>
- <small v-if="$parent.station.partyMode">With the queue locked, only owners (you) can add songs to the queue.</small><br>
- <button class='button is-danger' v-if='!$parent.station.locked' @click="$parent.toggleLock()">Lock the queue</button>
- <button class='button is-success' v-if='$parent.station.locked' @click="$parent.toggleLock()">Unlock the queue</button>
- <a href='#' class='no-song' @click='sidebars.playlist = true'>Play a private playlist</a>
- </h4>
- <h1 v-if='type === "community" && !station.partyMode && $parent.userId === station.owner && station.privatePlaylist'>Maybe you can add some songs to your selected private playlist and then press the skip button</h1>
- if (!validation.isLength(newPassword, 6, 200)) return Toast.methods.addToast('Password must have between 6 and 200 characters.', 8000);
- if (!validation.regex.password.test(newPassword)) return Toast.methods.addToast('Invalid password format. Must have one lowercase letter, one uppercase letter, one number and one special character.', 8000);
-
-
- this.socket.emit('users.updatePassword', newPassword, res => {
- if (res.status !== 'success') Toast.methods.addToast(res.message, 8000);
- this.socket.emit('users.requestPassword', res => {
- Toast.methods.addToast(res.message, 8000);
- if (res.status === 'success') {
- this.passwordStep = 2;
- }
- });
- },
- verifyCode: function () {
- if (!this.passwordCode) return Toast.methods.addToast('Code cannot be empty', 8000);
- this.socket.emit('users.verifyPasswordCode', this.passwordCode, res => {
+ verifyCode() {
+ if (!this.passwordCode)
+ return Toast.methods.addToast("Code cannot be empty", 8000);
+ return this.socket.emit(
+ "users.verifyPasswordCode",
+ this.passwordCode,
+ res => {
Toast.methods.addToast(res.message, 8000);
- if (res.status === 'success') {
+ if (res.status === "success") {
this.passwordStep = 3;
}
- });
- },
- setPassword: function () {
- const newPassword = this.setNewPassword;
- if (!validation.isLength(newPassword, 6, 200)) return Toast.methods.addToast('Password must have between 6 and 200 characters.', 8000);
- if (!validation.regex.password.test(newPassword)) return Toast.methods.addToast('Invalid password format. Must have one lowercase letter, one uppercase letter, one number and one special character.', 8000);
-
+ }
+ );
+ },
+ setPassword() {
+ const newPassword = this.setNewPassword;
+ if (!validation.isLength(newPassword, 6, 200))
+ return Toast.methods.addToast(
+ "Password must have between 6 and 200 characters.",
+ 8000
+ );
+ if (!validation.regex.password.test(newPassword))
+ return Toast.methods.addToast(
+ "Invalid password format. Must have one lowercase letter, one uppercase letter, one number and one special character.",
+ 8000
+ );
- this.socket.emit('users.changePasswordWithCode', this.passwordCode, newPassword, res => {
+ return this.socket.emit(
+ "users.changePasswordWithCode",
+ this.passwordCode,
+ newPassword,
+ res => {
Toast.methods.addToast(res.message, 8000);
- });
- },
- unlinkPassword: function () {
- this.socket.emit('users.unlinkPassword', res => {
- Toast.methods.addToast(res.message, 8000);
- });
- },
- unlinkGitHub: function () {
- this.socket.emit('users.unlinkGitHub', res => {
- Toast.methods.addToast(res.message, 8000);
- });
- },
- removeSessions: function () {
- this.socket.emit(`users.removeSessions`, this.$parent.userId, res => {
- Toast.methods.addToast(res.message, 4000);
- });
- }
+ }
+ );
+ },
+ unlinkPassword() {
+ this.socket.emit("users.unlinkPassword", res => {
- Musare is an open-source music website where you can listen to real-time genre specific music stations, or join community stations created by users.
+ Musare is an open-source music website where you can
+ listen to real-time genre specific music stations,
+ or join community stations created by users.
</p>
</div>
</div>
</div>
- <div class='card is-fullwidth'>
- <header class='card-header'>
- <p class='card-header-title'>
+ <div class="card is-fullwidth">
+ <header class="card-header">
+ <p class="card-header-title">
How you can help
</p>
</header>
- <div class='card-content'>
- <div class='content'>
- <p>
+ <div class="card-content">
+ <div class="content">
+ <span>
There are multiple ways you can help us:
<ol>
<li>
- Reporting bugs. No website is perfect, but we try to eliminate as many bugs as possible.
- If you find a bug, we would highly appreciate it if you could create an issue on the GitHub project with steps to reproduce the issue, so we can fix it as soon as possible.
+ Reporting bugs. No website is perfect, but
+ we try to eliminate as many bugs as
+ possible. If you find a bug, we would highly
+ appreciate it if you could create an issue
+ on the GitHub project with steps to
+ reproduce the issue, so we can fix it as
+ soon as possible.
</li>
<li>
- Sending us feedback. Your comments and/or suggestions are extremely valuable to us. In order to improve
- we need to know what you like, don't like and what you might want on the website.
+ Sending us feedback. Your comments and/or
+ suggestions are extremely valuable to us. In
+ order to improve we need to know what you
+ like, don't like and what you might want on
+ the website.
</li>
<li>
- Sharing the joy. The more people enjoying Musare, the better.
- Telling your friends or relatives about Musare would increase the amount of users we have, which would motivate us and cause Musare to grow faster.
- Musare.com respects your privacy and the security of your personal information, and we want to do as much as we can to protect it. Because of this, we have created this Privacy Policy to govern how we deal with your personal information. Since our Site is built off of Content that you provide, including shared information from third party sites, it is important that you read and understand their information sharing policies as well. Please check back often, as we will update this Privacy Policy as we grow.
+ Musare.com respects your privacy and the security of your personal
+ information, and we want to do as much as we can to protect it.
+ Because of this, we have created this Privacy Policy to govern how
+ we deal with your personal information. Since our Site is built off
+ of Content that you provide, including shared information from third
+ party sites, it is important that you read and understand their
+ information sharing policies as well. Please check back often, as we
+ will update this Privacy Policy as we grow.
<h4>2. Personal Information We Collect</h4>
- <p>In order for you to sign up for our service, we may ask for personal information from you including your name, e-mail address, mailing address, phone number, photo, username from other social media sites, gender, date of birth, or other relevant information. In addition, we utilize third party API’s like GitHub Authentication, and other API’s that allow you to transfer your profile information from those Sites to ours depending on your settings on those Sites. We are not responsible for any information that does not transfer or if any information is inaccurate.</p>
-
- <p>Your use of any of the video or chat features may be recorded or logged by our servers. We may use this data to improve our Site or Platform, or to determine how best to provide marketing opportunities to you.</p>
-
- <p>We use the above referenced information to contact you regarding your account, assist in customer service and support, and to improve our Site and the musare.com platform. We also use the information we collect to send periodic communications to you regarding updates to our Site, new features, and marketing opportunities that we think you may find interesting.</p>
-
- <p>We may send you periodic emails that concern updates or features. We make sure to comply with CAN-SPAM Act of 2003, 15 U.S.C. 7701 whenever we send you these goodies. If you feel that you are receiving unwanted messages from us (which we hope isn’t the case!) then please use the unsubscribe button or email us at musaremusic@gmail.com to remove yourself from our list. Please allow for up to ten (10) business days to process the removal.</p>
+ <p>
+ In order for you to sign up for our service, we may ask for
+ personal information from you including your name, e-mail
+ address, mailing address, phone number, photo, username from
+ other social media sites, gender, date of birth, or other
+ relevant information. In addition, we utilize third party API’s
+ like GitHub Authentication, and other API’s that allow you to
+ transfer your profile information from those Sites to ours
+ depending on your settings on those Sites. We are not
+ responsible for any information that does not transfer or if any
+ information is inaccurate.
+ </p>
+
+ <p>
+ Your use of any of the video or chat features may be recorded or
+ logged by our servers. We may use this data to improve our Site
+ or Platform, or to determine how best to provide marketing
+ opportunities to you.
+ </p>
+
+ <p>
+ We use the above referenced information to contact you regarding
+ your account, assist in customer service and support, and to
+ improve our Site and the musare.com platform. We also use the
+ information we collect to send periodic communications to you
+ regarding updates to our Site, new features, and marketing
+ opportunities that we think you may find interesting.
+ </p>
+
+ <p>
+ We may send you periodic emails that concern updates or
+ features. We make sure to comply with CAN-SPAM Act of 2003, 15
+ U.S.C. 7701 whenever we send you these goodies. If you feel that
+ you are receiving unwanted messages from us (which we hope isn’t
+ the case!) then please use the unsubscribe button or email us at
+ musaremusic@gmail.com to remove yourself from our list. Please
+ allow for up to ten (10) business days to process the removal.
+ </p>
<h4>3. Non-Personal Information</h4>
- <p>We may collect information about you that we consider to be less sensitive. When you access our website, we may collect such things as your IP address, browser, operating system, and other information that helps us know about the general nature of our visitors. We use this information to improve our Site and the musare.com platform.</p>
+ <p>
+ We may collect information about you that we consider to be less
+ sensitive. When you access our website, we may collect such
+ things as your IP address, browser, operating system, and other
+ information that helps us know about the general nature of our
+ visitors. We use this information to improve our Site and the
+ musare.com platform.
+ </p>
<h4>4. Cookies</h4>
- <p>We use tracking cookies to distinguish you from other users to help prevent one user from unwittingly logging into another user’s account on the same computer or network. In conjunction with third party API’s, we also allow you to login using your credentials on those third party sites. These Sites may use cookies to track your web browsing, and have separate privacy policies that you must read. In addition, any time you share Content with others those third party Sites may collect information about people who view or share that Content. You must also read their privacy policies.</p>
-
- <p>We also may use tracking cookies to help ourselves or third party advertisers increase the effectiveness and quality of, and interest in, our marketing programs, or for other advertising or marketing purposes.</p>
-
- <p>Any advertisements served by Google, Inc., and affiliated companies may be controlled using cookies. These cookies allow Google to display ads based on your visits to this site and other sites that use Google advertising services. Learn how to opt out of Google’s cookie usage. As mentioned above, any tracking done by Google through cookies and other mechanisms is subject to Google’s own privacy policies.</p>
-
- <p>Your use of the Site may require that you have cookies turned on, depending on your login preferences.</p>
+ <p>
+ We use tracking cookies to distinguish you from other users to
+ help prevent one user from unwittingly logging into another
+ user’s account on the same computer or network. In conjunction
+ with third party API’s, we also allow you to login using your
+ credentials on those third party sites. These Sites may use
+ cookies to track your web browsing, and have separate privacy
+ policies that you must read. In addition, any time you share
+ Content with others those third party Sites may collect
+ information about people who view or share that Content. You
+ must also read their privacy policies.
+ </p>
+
+ <p>
+ We also may use tracking cookies to help ourselves or third
+ party advertisers increase the effectiveness and quality of, and
+ interest in, our marketing programs, or for other advertising or
+ marketing purposes.
+ </p>
+
+ <p>
+ Any advertisements served by Google, Inc., and affiliated
+ companies may be controlled using cookies. These cookies allow
+ Google to display ads based on your visits to this site and
+ other sites that use Google advertising services. Learn how to
+ opt out of Google’s cookie usage. As mentioned above, any
+ tracking done by Google through cookies and other mechanisms is
+ subject to Google’s own privacy policies.
+ </p>
+
+ <p>
+ Your use of the Site may require that you have cookies turned
+ on, depending on your login preferences.
+ </p>
<h4>5. User Content</h4>
- <p>We may allow you to post Content to our website, including videos and music. This content, once posted, is available for anyone to see and you are granting us the limited license for our use in accordance with our Terms of Service. As such, you must make sure you do not post anything that you do not have the rights to distribute. Please engage your brain when posting content.</p>
+ <p>
+ We may allow you to post Content to our website, including
+ videos and music. This content, once posted, is available for
+ anyone to see and you are granting us the limited license for
+ our use in accordance with our Terms of Service. As such, you
+ must make sure you do not post anything that you do not have the
+ rights to distribute. Please engage your brain when posting
+ content.
+ </p>
<h4>6. Third Party Sites</h4>
- <p>Since our Site is built off of Content and sharing, you can be sure that you will encounter links to third party sites or Content that is being displayed from a third party site. Anytime you encounter a link to a website outside of musare.com, you should know that we have no control over that Site. We recommend that you consult those websites privacy policies, terms of service, and other similar documents when using them.</p>
-
- <p>You may also have the ability to interface, through the use of APIs, with third party websites such as social websites like Facebook, GitHub and Twitter. Be advised that we cannot be responsible for any breaches of privacy that may arise from the use of these third party websites.</p>
+ <p>
+ Since our Site is built off of Content and sharing, you can be
+ sure that you will encounter links to third party sites or
+ Content that is being displayed from a third party site. Anytime
+ you encounter a link to a website outside of musare.com, you
+ should know that we have no control over that Site. We recommend
+ that you consult those websites privacy policies, terms of
+ service, and other similar documents when using them.
+ </p>
+
+ <p>
+ You may also have the ability to interface, through the use of
+ APIs, with third party websites such as social websites like
+ Facebook, GitHub and Twitter. Be advised that we cannot be
+ responsible for any breaches of privacy that may arise from the
+ use of these third party websites.
+ </p>
<h4>7. Access to Information and Data Storage</h4>
- <p>We may host data with third parties and allow third parties to access, maintain, or otherwise use your information for purposes that we deem conducive to improving our business and service. We will strive to always deal with reputable providers, but we cannot make any guarantees. As such, you hereby agree that we are not liable for any privacy breaches that may occur as a result of the actions of third parties. In addition, how you interact with our Site may be shared with the third party service that you used to login, which means you are also storing information on their servers, which is governed by their own agreements.</p>
+ <p>
+ We may host data with third parties and allow third parties to
+ access, maintain, or otherwise use your information for purposes
+ that we deem conducive to improving our business and service. We
+ will strive to always deal with reputable providers, but we
+ cannot make any guarantees. As such, you hereby agree that we
+ are not liable for any privacy breaches that may occur as a
+ result of the actions of third parties. In addition, how you
+ interact with our Site may be shared with the third party
+ service that you used to login, which means you are also storing
+ information on their servers, which is governed by their own
+ agreements.
+ </p>
<h4>8. Law Enforcement</h4>
- <p>We may disclose your information to a third party where we believe, in good faith that we are required to for legal purposes. The disclosure may be due to a criminal investigation, or a civil subpoena. If we receive such a request we may, but are not required to, notify you of such request and give you an opportunity to respond.</p>
+ <p>
+ We may disclose your information to a third party where we
+ believe, in good faith that we are required to for legal
+ purposes. The disclosure may be due to a criminal investigation,
+ or a civil subpoena. If we receive such a request we may, but
+ are not required to, notify you of such request and give you an
- <p>We do not allow users on our website who are under the age of thirteen years old. If you become aware of such a user, please notify us immediately. If you are reported as being in violation of our age policy, we may freeze your account and require that you submit satisfactory proof of age before you may continue using our service.</p>
+ <p>
+ We do not allow users on our website who are under the age of
+ thirteen years old. If you become aware of such a user, please
+ notify us immediately. If you are reported as being in violation
+ of our age policy, we may freeze your account and require that
+ you submit satisfactory proof of age before you may continue
+ using our service.
+ </p>
<h4>10. Amendments</h4>
- <p>We may amend this Privacy Policy under the same conditions as our Terms of Service. Your responsibility to keep yourself updated as to changes to this Privacy Policy is the same as in our “Amendments” section in our Terms of Service.</p>
+ <p>
+ We may amend this Privacy Policy under the same conditions as
+ our Terms of Service. Your responsibility to keep yourself
+ updated as to changes to this Privacy Policy is the same as in
+ our “Amendments” section in our Terms of Service.
+ </p>
<h4>11. Users from outside the United States</h4>
- <p>We may have users who are from outside the United States. If you are, you are acknowledging that your information is being transferred from your country to ours. To the extent we are required, we maintain our Site and information collection practices in a way that conforms with most laws. If you are from a jurisdiction who's information collection practices differ from ours, please notify us so that we may take necessary action. This may include terminating your account and deleting your information. We are committed to resolving those issues, so if you have any questions about how we collect or use your information you may email us at musaremusic@gmail.com.</p>
+ <p>
+ We may have users who are from outside the United States. If you
+ are, you are acknowledging that your information is being
+ transferred from your country to ours. To the extent we are
+ required, we maintain our Site and information collection
+ practices in a way that conforms with most laws. If you are from
+ a jurisdiction who's information collection practices differ
+ from ours, please notify us so that we may take necessary
+ action. This may include terminating your account and deleting
+ your information. We are committed to resolving those issues, so
+ if you have any questions about how we collect or use your
+ information you may email us at musaremusic@gmail.com.
+ </p>
<h4>12. Deactivating your account</h4>
- <p>You may deactivate your account at any time by accessing your account settings, or send us a mail at musaremusic@gmail.com. When submitting your request, please let us know what led you to deactivate your account. Your feedback is greatly appreciated, and will help us to better accommodate members of the community.</p>
+ <p>
+ You may deactivate your account at any time by accessing your
+ account settings, or send us a mail at musaremusic@gmail.com.
+ When submitting your request, please let us know what led you to
+ deactivate your account. Your feedback is greatly appreciated,
+ and will help us to better accommodate members of the community.