Compare commits

..

2451 Commits

Author SHA1 Message Date
dependabot[bot]
fef8ad5215 Bump mongoose from 5.4.18 to 5.7.5
Bumps [mongoose](https://github.com/Automattic/mongoose) from 5.4.18 to 5.7.5.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/History.md)
- [Commits](https://github.com/Automattic/mongoose/compare/5.4.18...5.7.5)

Signed-off-by: dependabot[bot] <support@github.com>
2019-10-29 13:42:02 +00:00
Kasper Rynning-Tønnesen
938dac703e Added sponsor-button 2019-10-19 17:42:13 +02:00
Kasper Rynning-Tønnesen
8ca0b2b4dd Create FUNDING.yml 2019-10-19 17:31:02 +02:00
Kasper Rynning-Tønnesen
49fceb761c Fixed local-mode issue with encoded channel-names 2019-10-07 16:38:19 +02:00
Kasper Rynning-Tønnesen
bc3328db2b including the necessary things 2019-10-07 16:26:57 +02:00
Kasper Rynning-Tønnesen
9d9c783244 Built from base 2019-10-07 16:25:17 +02:00
Kasper Rynning-Tønnesen
ad96e147b1 Revert again 2019-10-07 16:18:27 +02:00
Kasper Rynning-Tønnesen
eb0cd96995 Trying farmhash again 2019-10-07 16:17:12 +02:00
Kasper Rynning-Tønnesen
41a2964533 Reverting 2019-10-07 16:14:04 +02:00
Kasper Rynning-Tønnesen
dcf581bb06 SYNTAX 2019-10-07 16:08:26 +02:00
Kasper Rynning-Tønnesen
5e938e8bb2 Testing out farmhash.. again 2019-10-07 16:07:26 +02:00
Kasper Rynning-Tønnesen
612a76ebf6 Input-field update 2019-10-01 15:16:13 +02:00
Kasper Rynning-Tønnesen
d228cf223d Removing titles on tooltips, and changed font-weight on frontpage a bit 2019-10-01 15:12:03 +02:00
Kasper Rynning-Tønnesen
f5d9272a42 Added silent-join 2019-09-17 23:00:25 +02:00
Kasper Rynning-Tønnesen
50694e32db Pm2 thing 2019-09-16 12:55:44 +02:00
Kasper Rynning-Tønnesen
ff37946397 Merge branch 'master' of github.com:zoff-music/zoff 2019-09-16 12:14:03 +02:00
Kasper Rynning-Tønnesen
df353968a6 Pm2 stuff 2019-09-16 12:11:14 +02:00
Kasper Rynning-Tønnesen
dc7435b4c1 Update main.handlebars 2019-08-12 12:04:06 +02:00
Kasper Rynning-Tønnesen
82f6e5ed12 Update globals.css 2019-08-12 12:00:49 +02:00
Kasper Rynning-Tønnesen
29c8d2c84b Update not_authenticated.handlebars 2019-08-12 12:00:15 +02:00
Kasper Rynning-Tønnesen
b47e38dce4 ITS 2019 BOYS 2019-08-08 09:26:02 +02:00
Kasper Rynning-Tønnesen
89c4a59ca4 Merge pull request #524 from zoff-music/feat/no-seek-on-minor-difference
Nicer transitions. Closes #518
2019-08-07 16:25:22 +02:00
Kasper Rynning-Tønnesen
116cb3f68d Nicer transitions. Closes #518 2019-08-07 16:24:52 +02:00
Kasper Rynning-Tønnesen
13bc8cb0ba Merge pull request #523 from zoff-music/feat/added-by-suggest
Added by on suggested songs
2019-08-07 16:13:18 +02:00
Kasper Rynning-Tønnesen
9ed72c0cc0 Added by on suggested songs 2019-08-07 16:12:56 +02:00
Kasper Rynning-Tønnesen
ad8bc0c05b Fixed remote issue 2019-08-05 12:24:59 +02:00
Kasper Rynning-Tønnesen
9993a377b8 Merge pull request #522 from zoff-music/fix/520
Other channel is the counter and deciding part
2019-07-31 13:18:39 +02:00
Kasper Rynning-Tønnesen
0213c5fe0a Other channel is the counter and deciding part 2019-07-31 13:18:17 +02:00
Kasper Rynning-Tønnesen
d820b2daba Merge pull request #521 from zoff-music/fix/520
Closes #520
2019-07-31 13:03:12 +02:00
Kasper Rynning-Tønnesen
3739a15049 Closes #520 2019-07-31 13:02:41 +02:00
Kasper Rynning-Tønnesen
cba874510b Merge pull request #517 from zoff-music/fix/404
Fix/404
2019-07-29 15:56:07 +02:00
Kasper Rynning-Tønnesen
b3a7b95fd6 Removed some commented code 2019-07-29 15:54:41 +02:00
Kasper Rynning-Tønnesen
f9b05c11e0 Fix for 404 not routing to 404 page 2019-07-29 15:52:27 +02:00
Kasper Rynning-Tønnesen
e8d49c77df Merge pull request #516 from zoff-music/fix/viewcount
Fix for view-count
2019-07-26 13:12:55 +02:00
Kasper Rynning-Tønnesen
bd9815927b Fix for view-count 2019-07-26 13:12:35 +02:00
Kasper Rynning-Tønnesen
07164153b0 Merge pull request #515 from zoff-music/refactor/prettifier
Styling-fixes
2019-07-26 10:46:00 +02:00
Kasper Rynning-Tønnesen
116a1e8905 Styling-fixes 2019-07-26 10:45:39 +02:00
Kasper Rynning-Tønnesen
206321a46f Merge pull request #514 from zoff-music/refactor/prettifier
Refactor/prettifier
2019-07-26 10:27:18 +02:00
Kasper Rynning-Tønnesen
4b0680e366 MOved some more elements around 2019-07-26 10:26:50 +02:00
Kasper Rynning-Tønnesen
bcb5641f90 Somewhat prettier css 2019-07-26 10:23:55 +02:00
Kasper Rynning-Tønnesen
460d0138f0 Merge pull request #512 from zoff-music/refactor/prettifier
More prettier missing files
2019-07-26 08:51:06 +02:00
Kasper Rynning-Tønnesen
6289f73844 More prettier missing files 2019-07-26 08:50:35 +02:00
Kasper Rynning-Tønnesen
4d96763545 Merge pull request #511 from zoff-music/refactor/prettifier
Prettified som more files and fixed some logging of missing files so …
2019-07-26 08:46:42 +02:00
Kasper Rynning-Tønnesen
6ed67ffee6 Prettified som more files and fixed some logging of missing files so they are more similar in fashion 2019-07-26 08:46:03 +02:00
Kasper Rynning-Tønnesen
d3e72202ce Merge pull request #510 from zoff-music/fix/audit
Removed gulp-util and lodash-template
2019-07-25 16:54:42 +02:00
Kasper Rynning-Tønnesen
6369c55252 Removed gulp-util and lodash-template 2019-07-25 16:54:12 +02:00
Kasper Rynning-Tønnesen
74b18b99a0 Merge pull request #509 from zoff-music/refactor/audit-fixes
Refactor/audit fixes
2019-07-25 16:51:25 +02:00
Kasper Rynning-Tønnesen
c144119395 Removed unused npm packages 2019-07-25 16:50:59 +02:00
Kasper Rynning-Tønnesen
384d3bb6c6 Removed a log 2019-07-25 16:50:10 +02:00
Kasper Rynning-Tønnesen
d65fa07ce1 Merge pull request #508 from zoff-music/refactor/audit-fixes
Fixed some audit-issues, and started using prettify
2019-07-25 16:48:06 +02:00
Kasper Rynning-Tønnesen
1594bafb60 Fixed some audit-issues, and started using prettify 2019-07-25 16:47:01 +02:00
Kasper Rynning-Tønnesen
9d6a07dbec log 2019-07-09 12:48:04 +02:00
Kasper Rynning-Tønnesen
5a769810c0 Fix for handlebars vulnerability 2019-06-14 18:34:31 +02:00
Kasper Rynning-Tønnesen
9e6f302d45 Pride thingy 2019-06-14 18:33:22 +02:00
Kasper Rynning-Tønnesen
ba98375bf9 Aborting sending info if not updated 2019-05-15 23:00:41 +02:00
Kasper Rynning-Tønnesen
17a998fcbc Added song_change update for local-mode also 2019-05-15 22:53:17 +02:00
Kasper Rynning-Tønnesen
6cfab8aebc Fix for error on video not always skipping 2019-05-15 22:46:44 +02:00
Kasper Rynning-Tønnesen
7b002c528e Error testing 2019-05-15 21:58:31 +02:00
Kasper Rynning-Tønnesen
684c49c7c6 Licensed/copyright 2019-05-15 21:44:35 +02:00
Kasper Rynning-Tønnesen
d7d1416c9c Update list.js 2019-05-03 15:12:25 +02:00
Kasper Rynning-Tønnesen
4301c989f0 Update search.js 2019-04-27 13:04:48 +02:00
Kasper Rynning-Tønnesen
725c8e5385 trying a fix for import not working corectly 2019-04-27 12:59:11 +02:00
Kasper Rynning-Tønnesen
a5174c9b92 Update main.js 2019-04-23 16:01:52 +02:00
Kasper Rynning-Tønnesen
702c585bb8 Update channel.js 2019-04-23 16:01:47 +02:00
Kasper Rynning-Tønnesen
0b3357e752 Update frontpage.js 2019-04-23 16:01:43 +02:00
Kasper Rynning-Tønnesen
e59f332689 Update embed.js 2019-04-23 16:01:39 +02:00
Kasper Rynning-Tønnesen
72cfbe26c1 Update remotecontroller.js 2019-04-23 16:01:34 +02:00
Kasper Rynning-Tønnesen
39d10745a1 Fix for error-video in list not being updated when replaced 2019-04-06 17:50:45 +02:00
Kasper Rynning-Tønnesen
632bcef2ef Moved some names around 2019-04-06 15:48:04 +02:00
Kasper Rynning-Tønnesen
4106b30ac4 Merge pull request #506 from zoff-music/fix/502
Fix for suggested videos not correctly being added. Closes #502
2019-04-06 15:28:55 +02:00
Kasper Rynning-Tønnesen
7941614ae7 Merge pull request #505 from zoff-music/feature/501
Closes #501
2019-04-06 15:28:33 +02:00
Kasper Rynning-Tønnesen
cfd0dc88fd Fix for suggested videos not correctly being added. Closes #502 2019-04-06 15:28:06 +02:00
Kasper Rynning-Tønnesen
76dea850a6 Closes #501 2019-04-06 15:20:10 +02:00
Kasper Rynning-Tønnesen
1e7153b995 FIx for status-error crashing on routingFunction in app.js 2019-04-06 15:11:06 +02:00
Kasper Rynning-Tønnesen
80db2f7068 Merge pull request #504 from zoff-music/fix/better-error-skip
Fix/better error skip
2019-04-06 14:37:48 +02:00
Kasper Rynning-Tønnesen
7bab1fac16 Correctly fetching video-info on error for youtube 2019-04-06 14:37:03 +02:00
Kasper Rynning-Tønnesen
50704be17b Better handling of errors in videos, only removing if an error is found, else a regular skip is performed 2019-04-06 14:28:18 +02:00
Kasper Rynning-Tønnesen
9725f1d7f1 Merge pull request #500 from zoff-music/fix/admin-name-xss
Escape characters in admin-module also
2019-03-22 18:10:17 +01:00
Kasper Rynning-Tønnesen
580ab99a72 Escape characters in admin-module also 2019-03-22 18:09:47 +01:00
Kasper Rynning-Tønnesen
b3c8540bd6 Merge pull request #499 from zoff-music/fix/495
Fix for sizing in channelsettings
2019-03-22 18:05:33 +01:00
Kasper Rynning-Tønnesen
7b0e6a0fdf Fix for sizing in channelsettings 2019-03-22 18:05:08 +01:00
Kasper Rynning-Tønnesen
54c7009fda Merge pull request #498 from zoff-music/fix/xss-local
Fix for issue #496 and #497
2019-03-22 18:02:29 +01:00
Kasper Rynning-Tønnesen
4fab433f61 Fix for issue #496 and #497 2019-03-22 18:01:56 +01:00
Kasper Rynning-Tønnesen
e2b2801728 Merge pull request #494 from zoff-music/feature/cool
Feature/cool
2019-03-22 06:19:11 +01:00
Kasper Rynning-Tønnesen
212eeedf02 Merge pull request #493 from zoff-music/fix/positioning-remote-logo
Fix positioning of icon on remote-page
2019-03-22 06:18:32 +01:00
Kasper Rynning-Tønnesen
9e8eed8dab Merge pull request #491 from zoff-music/fix/host-mode-resizing
Fix for host-mode not correctly resizing
2019-03-22 06:17:06 +01:00
Kasper Rynning-Tønnesen
449e7cc8d1 Cooler hidden feature 2019-03-21 21:32:47 +01:00
Kasper Rynning-Tønnesen
86fe2ba6c9 Fix positioning of icon on remote-page 2019-03-21 21:26:28 +01:00
Kasper Rynning-Tønnesen
a97aa6d3e3 Closes #489 2019-03-21 21:01:30 +01:00
Kasper Rynning-Tønnesen
4c3bb9b436 Forcing pause icon to be active on play 2019-03-21 20:54:45 +01:00
Kasper Rynning-Tønnesen
d95ce57910 Added a function to log last logs, in case of any crashes 2019-03-21 20:53:44 +01:00
Kasper Rynning-Tønnesen
f3547cc028 Fix for addd from other playlist crashing 2019-03-21 20:26:27 +01:00
Kasper Rynning-Tønnesen
8123c71185 Merge pull request #490 from zoff-music/feature/security-headers
Feature/security headers
2019-03-21 20:17:06 +01:00
Kasper Rynning-Tønnesen
dc3bd12f69 Better headers 2019-03-21 20:16:39 +01:00
Kasper Rynning-Tønnesen
c8614bef52 Testing feature-police 2019-03-21 20:11:42 +01:00
Kasper Rynning-Tønnesen
dfc49156f5 No crash 2019-03-21 20:03:26 +01:00
Kasper Rynning-Tønnesen
7c57dfaf98 Added more security headers 2019-03-21 20:01:56 +01:00
Kasper Rynning-Tønnesen
017ecc0b94 Merge pull request #487 from zoff-music/fix/security-alerts
Update install-script
2019-03-10 22:28:35 +01:00
Kasper Rynning-Tønnesen
1ea1221a76 Update install-script 2019-03-10 22:27:49 +01:00
Kasper Rynning-Tønnesen
2f3edfb64c Merge pull request #486 from zoff-music/fix/security-alerts
Fix for issues
2019-03-10 22:20:52 +01:00
Kasper Rynning-Tønnesen
a8363ebbd2 Fix for issues 2019-03-10 22:19:52 +01:00
Kasper Rynning-Tønnesen
55a0b678d6 Merge pull request #485 from zoff-music/fix/483
Fix and close #483
2019-03-10 21:51:24 +01:00
Kasper Rynning-Tønnesen
b703a6ae76 Fix and close #483 2019-03-10 21:50:49 +01:00
Kasper Rynning-Tønnesen
bdcd8a197c Merge pull request #484 from zoff-music/feature/title-filter-advanced
Add advanced title filter
2019-03-10 21:42:22 +01:00
Kasper Rynning-Tønnesen
e58f569f80 Add advanced title filter
- Timeout filter-requests based on computer instead of api
2019-03-10 21:40:58 +01:00
Kasper Rynning-Tønnesen
cff3faf820 Merge pull request #481 from zoff-music/feature/tags
Dont pasue on space in field
2019-03-02 18:29:21 +01:00
Kasper Rynning-Tønnesen
d5c39b467e Dont pasue on space in field 2019-03-02 18:28:46 +01:00
Kasper Rynning-Tønnesen
ad06f3c9d7 Merge pull request #477 from zoff-music/feature/tags
Feature/tags
2019-03-02 13:34:43 +01:00
Kasper Rynning-Tønnesen
c22a7cf32b Buttons top and bottom for filtering pagination 2019-03-02 13:34:18 +01:00
Kasper Rynning-Tønnesen
1c05a1c3b2 Previous/next pagination working 2019-03-02 13:23:57 +01:00
Kasper Rynning-Tønnesen
af92dd0e3a Better sizing on filtering field and button, and search-button in list positioning 2019-03-01 08:25:05 +01:00
Kasper Rynning-Tønnesen
73b971cab2 Add GA event for opening advanced filtering 2019-02-28 23:19:11 +01:00
Kasper Rynning-Tønnesen
ba7c5f4f54 Focus and blur modal-input for advanced filtering 2019-02-28 23:08:02 +01:00
Kasper Rynning-Tønnesen
1921090255 Add check for point at first or last element 2019-02-28 22:58:19 +01:00
Kasper Rynning-Tønnesen
23954faa86 Merge branch 'master' into feature/tags 2019-02-28 22:51:39 +01:00
Kasper Rynning-Tønnesen
066480458d Tags functionality 2019-02-28 22:51:22 +01:00
Kasper Rynning-Tønnesen
4ba9d0bca3 Update list_change.js 2019-02-28 17:02:20 +01:00
Kasper Rynning-Tønnesen
f5a992dde0 Update list_change.js 2019-02-27 17:07:53 +01:00
Kasper Rynning-Tønnesen
db89a5c55b Merge pull request #478 from zoff-music/fix/strict-skip-error
Fix for strict-skip errors not working correctly
2019-02-26 21:49:13 +01:00
Kasper Rynning-Tønnesen
b3dc00abb1 Fix for strict-skip errors not working correctly 2019-02-26 21:48:45 +01:00
Kasper Rynning-Tønnesen
c3bfac72c6 Modal and filter somewhat working 2019-02-26 21:42:30 +01:00
Kasper Rynning-Tønnesen
1a66320029 More correct error message on no video find with those tags 2019-02-25 00:01:04 +01:00
Kasper Rynning-Tønnesen
6c0c110b68 Added search-endpoint for fetching by category 2019-02-24 23:59:00 +01:00
Kasper Rynning-Tønnesen
c66d6efa76 Tags add for add songs and in api 2019-02-24 23:39:36 +01:00
Kasper Rynning-Tønnesen
46f0882a63 Merge branch 'master' into feature/tags 2019-02-24 23:02:36 +01:00
Kasper Rynning-Tønnesen
e111c9e2ca Merge pull request #473 from zoff-music/fix/suggested-soundcloud
Fix for suggestions not correctly work for soundcloud
2019-02-24 23:02:26 +01:00
Kasper Rynning-Tønnesen
c8fec1894b Fix for suggestions not correctly work for soundcloud 2019-02-24 23:01:42 +01:00
Kasper Rynning-Tønnesen
8970092017 Started tags work 2019-02-24 22:44:59 +01:00
Kasper Rynning-Tønnesen
a6e064072c Merge pull request #472 from zoff-music/feature/playlist-search-button
Added button for searching in channel
2019-02-24 22:17:52 +01:00
Kasper Rynning-Tønnesen
991b8f9ef2 Added button for searching in channel 2019-02-24 22:14:54 +01:00
Kasper Rynning-Tønnesen
903532b2fd etter response on empty-list skip-try, and add log for debugging when server crashes on change_song 2019-01-30 19:45:21 +01:00
Kasper Rynning-Tønnesen
4589299f52 Validating that there actually is songs in the channel 2019-01-30 13:42:18 +01:00
Kasper Rynning-Tønnesen
b7eeefa634 Merge pull request #470 from zoff-music/fix/intelligent-mobile
Fix for mobile intelligent list
2019-01-22 18:21:16 +01:00
Kasper Rynning-Tønnesen
436732dd39 Fix for mobile not correctly handling intelligent lists on joining from frontpage 2019-01-22 18:20:11 +01:00
Kasper Rynning-Tønnesen
9b79242246 Add focus on add to other list button click 2019-01-22 17:56:22 +01:00
Kasper Rynning-Tønnesen
d359c8e0c2 Fixed issue with add to other list form not correctly handling variables 2019-01-22 17:52:12 +01:00
Kasper Rynning-Tønnesen
9bd4fcdf32 Update listeners.js 2019-01-22 16:01:16 +01:00
Kasper Rynning-Tønnesen
e830a4143b Forcing intelligent to be set when changed on mobile 2019-01-22 06:23:00 +01:00
Kasper Rynning-Tønnesen
8bd3f123a5 Merge pull request #468 from zoff-music/feature/add-song-to-other-list
Feature/add song to other list
2019-01-21 17:43:22 +01:00
Kasper Rynning-Tønnesen
3dcae3f2fd Merge pull request #469 from zoff-music/feature/intelligent-mobile
Added intelligent playlist on mobile also
2019-01-21 17:43:07 +01:00
Kasper Rynning-Tønnesen
b9113a905d Added intelligent playlist on mobile also 2019-01-21 17:42:09 +01:00
Kasper Rynning-Tønnesen
57b1f3b818 Better styling and a header 2019-01-21 17:30:54 +01:00
Kasper Rynning-Tønnesen
ab6f1648e6 Working on mobile and desktop 2019-01-20 13:01:58 +01:00
Kasper Rynning-Tønnesen
dd9a58f810 Added add song to other list from one list button in the controls bar 2019-01-19 16:58:42 +01:00
Kasper Rynning-Tønnesen
3f8f6fc12e Merge pull request #467 from zoff-music/feature/less-notifs
Hidden some notifictions
2019-01-19 13:12:57 +01:00
Kasper Rynning-Tønnesen
61aec92617 Hidden some notifictions 2019-01-19 13:12:23 +01:00
Kasper Rynning-Tønnesen
5f3c7890a0 Added button to add song to other playlist 2019-01-19 13:08:59 +01:00
Kasper Rynning-Tønnesen
6e4d5d0249 Merge pull request #466 from zoff-music/feature/strict-skip-api
Feature/strict skip api
2019-01-19 12:58:21 +01:00
Kasper Rynning-Tønnesen
34bb46c4af Fixed issue with people being able to skip multiple times 2019-01-19 12:47:13 +01:00
Kasper Rynning-Tønnesen
49ddf5d2c0 Working api-endpoint for strict-skipping 2019-01-19 12:24:55 +01:00
Kasper Rynning-Tønnesen
07e44ec947 Started preliminary testing with local api-key. So far working.
- Need to fix response statuscodes
- Need to test when strict not enabled
- Need to test why sIO is not working
- Need to test with userpassword
- Need to add a secret way of storing allowed api-key
2019-01-18 17:35:33 +01:00
Kasper Rynning-Tønnesen
6385971d3b Adding switch for chromecast info being hidden or not (#463) 2019-01-18 17:03:38 +01:00
Kasper Rynning-Tønnesen
1ff0de31bc Started api 2019-01-18 17:02:28 +01:00
Kasper Rynning-Tønnesen
770e25a88a Added some info for the strict skipping 2019-01-17 22:31:33 +01:00
Kasper Rynning-Tønnesen
21988a2883 Started functionality for strict-skipping 2019-01-17 21:52:17 +01:00
Kasper Rynning-Tønnesen
b9b71ff7db Fix for adding playlists not working 2019-01-17 20:02:10 +01:00
Kasper Rynning-Tønnesen
d28e14448a Updated placeholder 2019-01-17 08:24:46 +01:00
Kasper Rynning-Tønnesen
bcd00aa93e Fix for empty list import (#459)
* Fix for empty list import

* Flex on enable also
2019-01-15 21:11:16 +01:00
Kasper Rynning-Tønnesen
03ca6a9f77 Fix/total listeners disabled chat (#458)
* Testing some leavers

* Logging before and after namechange

* Testing callback even on chat disabled

* Fixed issue with channels with disabled chat not adding to total listeners

* Fixed potential issue with joining a channel with disabled chat broadcasts it
2019-01-15 19:04:08 +01:00
Kasper Rynning-Tønnesen
b2e9050960 Merge pull request #457 from zoff-music/fix/skip-playlist-mover
Fixing an issue with skipping a song sometimes changes the pagination
2019-01-14 19:22:06 +01:00
Kasper Rynning-Tønnesen
697c7fa88f Fixing an issue with skipping a song sometimes changes the pagination 2019-01-14 19:21:31 +01:00
Kasper Rynning-Tønnesen
b0e3532845 Merge pull request #456 from zoff-music/fix/user-ban
Fixes banning users
2019-01-04 11:53:39 +01:00
Kasper Rynning-Tønnesen
d1bcf3ec14 Fixes banning users, Closes #454 2019-01-04 11:53:07 +01:00
Kasper Rynning-Tønnesen
5086fb56e6 Update functions.js 2018-12-28 22:45:51 +01:00
Kasper Rynning-Tønnesen
f3aabc3db1 Update main.js 2018-12-28 22:43:18 +01:00
Kasper Rynning-Tønnesen
9051b5b99f Update helpers.js 2018-12-28 22:39:41 +01:00
Kasper Rynning-Tønnesen
d8bf064c50 Merge pull request #452 from zoff-music/fix/fireplace-and-host-size
Updated QR-code size in hostmode and fullscreen fireplace player when…
2018-12-09 15:41:56 +01:00
Kasper Rynning-Tønnesen
3f63b580ed Updated QR-code size in hostmode and fullscreen fireplace player when enabled on fullscreen 2018-12-09 15:41:10 +01:00
Kasper Rynning-Tønnesen
2a06329235 Merge pull request #451 from zoff-music/fix/embed-size
Fixed issue with title in embedded player and preview-player
2018-12-05 14:47:01 +01:00
Kasper Rynning-Tønnesen
69c2dc6a33 Fixed issue with title in embedded player
- And issue with embedded preview re-appearing when changing values even though the user clicked stop
2018-12-05 14:46:11 +01:00
Kasper Rynning-Tønnesen
dbee7398bb Merge pull request #450 from zoff-music/fix/encoding
Fixed encoding issue on autocomplete and input send
2018-12-04 12:51:03 +01:00
Kasper Rynning-Tønnesen
9a1a341bfa Fixed encoding issue on autocomplete and input send 2018-12-04 12:50:27 +01:00
Kasper Rynning-Tønnesen
664a5de46d Merge pull request #449 from zoff-music/fix/encoding
Trying a fix for encoding issues occuring from time to time
2018-12-04 12:40:28 +01:00
Kasper Rynning-Tønnesen
cad2292269 Trying a fix for encoding issues occuring from time to time 2018-12-04 12:40:06 +01:00
Kasper Rynning-Tønnesen
14d8ef51bb Merge pull request #448 from zoff-music/fix/client
Fixed issue with client.zoff.me not working correctly
2018-12-02 15:25:31 +01:00
Kasper Rynning-Tønnesen
ef1fed0410 Fixed issue with client.zoff.me not working correctly 2018-12-02 15:25:01 +01:00
Kasper Rynning-Tønnesen
ddb55baa3b Removing adds since Google don't like our site 2018-11-30 18:01:49 +01:00
Kasper Rynning-Tønnesen
a88da7ccf2 Update suggested video by users to send correct parameters 2018-11-28 17:06:44 +01:00
Kasper Rynning-Tønnesen
69f0007e6d Merge pull request #447 from zoff-music/feature/ads
Testing adsense fix
2018-11-27 12:44:38 +01:00
Kasper Rynning-Tønnesen
932bd6b9f2 Testing adsense fix 2018-11-27 12:40:59 +01:00
Kasper Rynning-Tønnesen
be4a3dcdc7 Merge pull request #446 from zoff-music/feature/ads
Feature/ads
2018-11-27 08:58:53 +01:00
Kasper Rynning-Tønnesen
1849727ff8 Correct syntax 2018-11-27 08:58:31 +01:00
Kasper Rynning-Tønnesen
10f9ff87da Not including our adcode 2018-11-27 08:57:55 +01:00
Kasper Rynning-Tønnesen
e21865422d Added examplefile 2018-11-27 08:57:03 +01:00
Kasper Rynning-Tønnesen
e4ca2bb8cf Trying adsense to help serverbills 2018-11-27 08:56:13 +01:00
Kasper Rynning-Tønnesen
77d215f89f Adding dash to pageview for prettier google-analytics listing 2018-11-23 12:43:26 +01:00
Kasper Rynning-Tønnesen
810c2fe24b Added inherit on backgroundcolor of title/search to avoid previous rule be triggered 2018-11-23 12:38:49 +01:00
Kasper Rynning-Tønnesen
ae17ae92be Hover only affecting title/search instead all nav ul li elements 2018-11-23 12:36:37 +01:00
Kasper Rynning-Tønnesen
c679a3ae42 Removed update affecting settings and unintended elements 2018-11-23 12:34:33 +01:00
Kasper Rynning-Tønnesen
cbba57ba05 Updated how title is darkened on hover 2018-11-23 12:30:39 +01:00
Kasper Rynning-Tønnesen
f8ca3ce2a5 Not updating title on empty title 2018-11-20 15:33:30 +01:00
Kasper Rynning-Tønnesen
39449c5f48 Showing title by default on load 2018-11-20 15:30:21 +01:00
Kasper Rynning-Tønnesen
e8ca18d98e modified open-graph type depending on url 2018-11-20 13:36:27 +01:00
Kasper Rynning-Tønnesen
866d6a9b26 Merge branch 'master' of github.com:zoff-music/zoff 2018-11-20 11:40:07 +01:00
Kasper Rynning-Tønnesen
7ec8884fce Updated embedded player with title at top 2018-11-20 11:39:56 +01:00
Kasper Rynning-Tønnesen
e85c2ce390 Backgroundcolor -> Background 2018-11-16 10:52:13 +01:00
Kasper Rynning-Tønnesen
496c1cdeb2 Added ga event for import/exporting soundcloud and zoff 2018-11-07 11:39:26 +01:00
Kasper Rynning-Tønnesen
98f6f9b6fb Merge pull request #443 from zoff-music/feature/static-color
Adding GA-tracker on switching between static and dynamic backgroundc…
2018-11-07 09:26:23 +01:00
Kasper Rynning-Tønnesen
03935eb958 Adding GA-tracker on switching between static and dynamic backgroundcolor 2018-11-07 09:26:02 +01:00
Kasper Rynning-Tønnesen
949de761a3 Merge pull request #442 from zoff-music/feature/static-color
Feature/static color
2018-11-06 13:57:41 +01:00
Kasper Rynning-Tønnesen
e16135d616 Added missing settings-file 2018-11-06 13:57:21 +01:00
Kasper Rynning-Tønnesen
be9d74d271 Allowing users to define their player's colors 2018-11-06 13:53:37 +01:00
Kasper Rynning-Tønnesen
2003383967 Not including suggested songs in fetching of playlist 2018-11-05 14:50:06 +01:00
Kasper Rynning-Tønnesen
22ee6b6fcf Update about.handlebars 2018-11-05 13:31:28 +01:00
Kasper Rynning-Tønnesen
6ba4c86ccf Merge pull request #441 from zoff-music/fix/pip-close
Removing PiP-player fully on close player
2018-10-29 15:06:49 +01:00
Kasper Rynning-Tønnesen
59dce08075 Removing PiP-player fully on close player 2018-10-29 15:06:28 +01:00
Kasper Rynning-Tønnesen
8aeb80dfe5 Merge pull request #440 from zoff-music/feature/client-settings
Moved some settings to a separate accordion to gather stuff more
2018-10-29 15:01:04 +01:00
Kasper Rynning-Tønnesen
d684efe405 Removed enable remote from enable remote switch 2018-10-29 14:59:26 +01:00
Kasper Rynning-Tønnesen
f0fc0ed424 Merge pull request #439 from zoff-music/refactor/ajax-client-load
Fixed ajax-crash on userpass-protected lists
2018-10-29 14:57:52 +01:00
Kasper Rynning-Tønnesen
d4628c6e8f Fixed ajax-crash on userpass-protected lists 2018-10-29 14:57:25 +01:00
Kasper Rynning-Tønnesen
dde0586ca3 Moved some settings to a separate accordion to gather stuff mroe 2018-10-29 14:47:58 +01:00
Kasper Rynning-Tønnesen
3998817b62 Merge pull request #438 from zoff-music/feature/intelligent-list
Intelligent list
2018-10-29 14:31:55 +01:00
Kasper Rynning-Tønnesen
d315851667 Updated info-text about intelligent some 2018-10-29 14:31:43 +01:00
Kasper Rynning-Tønnesen
73cec39de0 Changed so accordion for intelligent-playlist is not hidden on small player on desktops 2018-10-29 14:29:41 +01:00
Kasper Rynning-Tønnesen
6443974c7a Added functionality for intelligent playlist, making voting and such easier on many listeners 2018-10-29 14:19:59 +01:00
Kasper Rynning-Tønnesen
6cbf7a211e Started intelligent-list feature 2018-10-29 12:30:43 +01:00
Kasper Rynning-Tønnesen
4dcd03d042 fixed issue with copying suggested song-link 2018-10-25 11:43:28 +02:00
Kasper Rynning-Tønnesen
bb4b21581d Revert last update 2018-10-25 11:34:02 +02:00
Kasper Rynning-Tønnesen
d53beee004 Added load-indicator for adminpanel 2018-10-25 11:32:23 +02:00
Kasper Rynning-Tønnesen
c4211bcab5 Fixed resize-function triggering too often 2018-10-25 11:21:52 +02:00
Kasper Rynning-Tønnesen
0aa6910f25 Updating preview-element on refresh of variables, and updated preview-button 2018-10-25 10:36:23 +02:00
Kasper Rynning-Tønnesen
1a7ff97e7e better placement of song title on embedded player 2018-10-24 19:41:53 +02:00
Kasper Rynning-Tønnesen
a898f418a7 Showing title 2018-10-24 18:32:13 +02:00
Kasper Rynning-Tønnesen
dbce64547f Forcing a padding to not hide any button-elements 2018-10-24 15:45:17 +02:00
Kasper Rynning-Tønnesen
c81fde167f Correct placement 2018-10-24 15:41:36 +02:00
Kasper Rynning-Tønnesen
cef50a07ef Embed playlist navigate buttons 2018-10-24 15:39:42 +02:00
Kasper Rynning-Tønnesen
269c1cadb7 Merge pull request #437 from zoff-music/feature/preview-embed
Added option to preview embedded element
2018-10-24 13:11:26 +02:00
Kasper Rynning-Tønnesen
67b98d12ad Added option to preview embedded element 2018-10-24 13:10:56 +02:00
Kasper Rynning-Tønnesen
5a352a875e Merge pull request #436 from zoff-music/feature/better-embed-player
limiting number of elements showed on small embedded player
2018-10-24 12:51:41 +02:00
Kasper Rynning-Tønnesen
9229fc07cf limiting number of elements showed on small embedded player 2018-10-24 12:51:16 +02:00
Kasper Rynning-Tønnesen
9b0f84fbe4 Merge pull request #435 from zoff-music/feature/better-embed-player
Feature/better embed player
2018-10-24 12:46:15 +02:00
Kasper Rynning-Tønnesen
082282dd23 Removed logs 2018-10-24 12:45:46 +02:00
Kasper Rynning-Tønnesen
8e1e28f219 Small screen support small playlist-elements better 2018-10-24 12:45:21 +02:00
Kasper Rynning-Tønnesen
f80dbb9d80 Merge pull request #434 from zoff-music/feature/better-embed-player
better embed player on small screens
2018-10-24 12:41:27 +02:00
Kasper Rynning-Tønnesen
8376148195 better embed player on small screens 2018-10-24 12:40:47 +02:00
Kasper Rynning-Tønnesen
4b571b65f0 Style-fixes for export/import from soundcloud 2018-10-23 14:17:37 +02:00
Kasper Rynning-Tønnesen
a649f3835a Update README.md 2018-10-23 13:36:22 +02:00
Kasper Rynning-Tønnesen
112eb1e939 Update README.md 2018-10-23 13:36:06 +02:00
Kasper Rynning-Tønnesen
d44f93faa8 Merge pull request #433 from zoff-music/feature/export-soundcloud
Feature/export soundcloud
2018-10-23 13:33:16 +02:00
Kasper Rynning-Tønnesen
8d7ce5b7c1 Removed unused code 2018-10-23 13:31:04 +02:00
Kasper Rynning-Tønnesen
20e7dbb4fc Adding decription on export 2018-10-23 13:28:45 +02:00
Kasper Rynning-Tønnesen
4f26163cdf Better colors for export-buttons 2018-10-23 13:26:03 +02:00
Kasper Rynning-Tønnesen
fcea76fd01 Logging number of tracks found 2018-10-23 13:21:35 +02:00
Kasper Rynning-Tønnesen
e2de81e412 logging correctly 2018-10-23 13:19:18 +02:00
Kasper Rynning-Tønnesen
d7b4cbcbd1 Logging if debug enabled 2018-10-23 13:17:04 +02:00
Kasper Rynning-Tønnesen
10cca16415 Avoid changing local variables used in list 2018-10-23 13:14:45 +02:00
Kasper Rynning-Tønnesen
f0e1e26cc3 Added not found and logging 2018-10-23 13:10:11 +02:00
Kasper Rynning-Tønnesen
ceb70a0996 Testing issues where SC_player not initialized correctly 2018-10-23 13:06:24 +02:00
Kasper Rynning-Tønnesen
8f09eb8d66 Typo 2018-10-23 13:02:56 +02:00
Kasper Rynning-Tønnesen
d74a6694a8 Visual loop and not exported elements 2018-10-23 13:02:16 +02:00
Kasper Rynning-Tønnesen
a6e49995e6 Trying with another name for the list 2018-10-23 12:53:52 +02:00
Kasper Rynning-Tønnesen
57674c17e7 Trying to create new list for test purposes 2018-10-23 12:52:12 +02:00
Kasper Rynning-Tønnesen
00a2740406 Not looping higher than list 2018-10-23 12:49:27 +02:00
Kasper Rynning-Tønnesen
2b020ad4c2 Looping through whole list 2018-10-23 12:48:01 +02:00
Kasper Rynning-Tønnesen
2f62b40ce4 Parsing to int 2018-10-23 12:47:10 +02:00
Kasper Rynning-Tønnesen
351daf74c5 Logging more data 2018-10-23 12:45:44 +02:00
Kasper Rynning-Tønnesen
e41b98fbdb Stopping at full loop for exporting 2018-10-23 12:43:22 +02:00
Kasper Rynning-Tønnesen
74d5f958e5 Correct soundcloud-player reference 2018-10-23 12:38:23 +02:00
Kasper Rynning-Tønnesen
8f985d5da0 Enabled importing again 2018-10-23 12:35:58 +02:00
Kasper Rynning-Tønnesen
71f1826435 Exporting to soundcloud tests 2018-10-23 12:33:27 +02:00
Kasper Rynning-Tønnesen
8f46eabbaf merged 2018-10-23 12:05:51 +02:00
Kasper Rynning-Tønnesen
03f68d3131 Catch for function not existing 2018-10-23 12:03:28 +02:00
Kasper Rynning-Tønnesen
fb4e190b6e Merge pull request #432 from zoff-music/feature/soundcloud-api-import
Feature/soundcloud api import
2018-10-22 14:34:46 +02:00
Kasper Rynning-Tønnesen
32a741b147 Updated panel some 2018-10-22 14:33:54 +02:00
Kasper Rynning-Tønnesen
88bb45f390 Fixed callback code to reflect search also 2018-10-22 13:35:04 +02:00
Kasper Rynning-Tønnesen
a42e340819 Printing data back 2018-10-22 13:33:26 +02:00
Kasper Rynning-Tønnesen
7ef4ea7079 Soundcloud updates for private lists testing 2018-10-22 13:32:00 +02:00
Kasper Rynning-Tønnesen
00641806c8 Merge pull request #431 from zoff-music/feature/better-embed-oauth-link
Fixed issue with allow autoplay not being included
2018-10-07 12:55:23 +02:00
Kasper Rynning-Tønnesen
048255cb1d Fixed issue with allow autoplay not being included 2018-10-07 12:54:39 +02:00
Kasper Rynning-Tønnesen
3c1a485f83 Merge pull request #430 from zoff-music/feature/better-embed-oauth-link
Moved oauth callback to /api/oauth and embed to /api/embed, with util…
2018-10-07 12:51:26 +02:00
Kasper Rynning-Tønnesen
2e8da96706 Moved oauth callback to /api/oauth and embed to /api/embed, with utilizing the search in url 2018-10-07 12:48:41 +02:00
Kasper Rynning-Tønnesen
5333b4bc13 Fixed issue with player on frontpage on smaller windows overlapped where it shouldn't 2018-10-05 12:37:55 +02:00
Kasper Rynning-Tønnesen
f3c079726a updated donate text thingy 2018-10-03 16:31:40 +02:00
Kasper Rynning-Tønnesen
8e3a3f679e Fixed issue with adding to the end of string on 429 error 2018-10-02 15:35:20 +02:00
Kasper Rynning-Tønnesen
90538377fb Creating local variable for error sent when too meny requests performed without api-key 2018-10-02 15:27:01 +02:00
Kasper Rynning-Tønnesen
f34ac9699e Merge pull request #429 from zoff-music/feature/api-updates
Adding timeout for usual get-requests when not authenticated with a t…
2018-10-02 15:10:23 +02:00
Kasper Rynning-Tønnesen
b802a0af3d Only adding info on where to get api-token if not authorized with an api-token 2018-10-02 15:10:08 +02:00
Kasper Rynning-Tønnesen
7ca8d91a0e added info on where to get api-key 2018-10-02 15:08:20 +02:00
Kasper Rynning-Tønnesen
aa74a10305 Adding timeout for usual get-requests when not authenticated with a token 2018-10-02 15:03:27 +02:00
Kasper Rynning-Tønnesen
b537aa1af6 Prettier hover on small player for titles 2018-10-01 15:53:50 +02:00
Kasper Rynning-Tønnesen
bed3febcfa Sizing of container for remote-control-id on mobile in channel 2018-10-01 15:36:01 +02:00
Kasper Rynning-Tønnesen
a57b3eb8be Included projects in list_settings.js 2018-10-01 13:53:25 +02:00
Kasper Rynning-Tønnesen
cb8ae6ba2c Added second sort-field for title on api 2018-10-01 13:51:53 +02:00
Kasper Rynning-Tønnesen
ee2eea789c Merge pull request #428 from zoff-music/feature/small-player-frontpage
Fixed following issues caused
2018-09-29 17:01:09 +02:00
Kasper Rynning-Tønnesen
645edee211 Fixed following issues caused 2018-09-29 17:00:29 +02:00
Kasper Rynning-Tønnesen
a08ad36d86 Merge pull request #427 from zoff-music/feature/small-player-frontpage
Prettier small player on frontpage when playing soundcloud
2018-09-29 15:56:43 +02:00
Kasper Rynning-Tønnesen
81dd783609 Prettier small player on frontpage when playing soundcloud 2018-09-29 15:56:17 +02:00
Kasper Rynning-Tønnesen
ab8e53d1e0 I am getting many commits because i forget what im doing 2018-09-29 14:19:33 +02:00
Kasper Rynning-Tønnesen
7e75af57eb CHanged default embed-code-color to zoff-color 2018-09-29 14:17:58 +02:00
Kasper Rynning-Tønnesen
8faac03fb4 Visual improvements to page-buttons on embedded 2018-09-29 14:08:21 +02:00
Kasper Rynning-Tønnesen
d5a1858765 Added screenshot of embedded/iframed player 2018-09-29 13:48:11 +02:00
Kasper Rynning-Tønnesen
106eff4f24 Prettifyied embedded player somewhat 2018-09-29 13:45:27 +02:00
Kasper Rynning-Tønnesen
8f1a67a513 Undone error with soundcloud on load in embedded mode 2018-09-29 13:15:19 +02:00
Kasper Rynning-Tønnesen
0ccdcd2845 Merge pull request #426 from zoff-music/fix/embedded-next
Fix/embedded next
2018-09-29 13:05:12 +02:00
Kasper Rynning-Tønnesen
d3d03fdb15 Forgot to send the current video on next song 2018-09-29 13:04:50 +02:00
Kasper Rynning-Tønnesen
642f8c273d Trying fix for sending next song 2018-09-29 12:46:17 +02:00
Kasper Rynning-Tønnesen
ac5ed63cb9 Added a prettier loader to embedded players 2018-09-29 11:34:35 +02:00
Kasper Rynning-Tønnesen
695a4f3648 Reword skipping in channel, allowing the whole channel to be skipped each second 2018-09-29 10:36:44 +02:00
Kasper Rynning-Tønnesen
ae05344aa1 Skip timeout not on channel but on user 2018-09-28 13:58:10 +02:00
Kasper Rynning-Tønnesen
2563b3c4f1 Added timeout for skips for 1 second 2018-09-28 13:56:05 +02:00
Kasper Rynning-Tønnesen
b3825bd093 Linking soundcloud without client-id, but it wont work 2018-09-28 13:10:45 +02:00
Kasper Rynning-Tønnesen
3053e61985 Somewhat better copy-link for soundcloud, still needs work 2018-09-28 13:09:13 +02:00
Kasper Rynning-Tønnesen
1ad6272331 Merge pull request #425 from zoff-music/feature/timeout-update
Updated index for timeout-api and timing out connections, not cookies
2018-09-28 12:38:01 +02:00
Kasper Rynning-Tønnesen
ea6ba9e1c1 Updated index for timeout-api and timing out connections, not cookies 2018-09-28 12:36:42 +02:00
Kasper Rynning-Tønnesen
b792f48523 Merge pull request #424 from zoff-music/feature/timeout-playlist-add
Added function for timing out playlist adds when not logged in
2018-09-28 12:26:33 +02:00
Kasper Rynning-Tønnesen
5ab5f0f079 Added function for timing out playlist adds when not logged in 2018-09-28 12:24:37 +02:00
Kasper Rynning-Tønnesen
c0abda2e73 Fixed search-tabs hiding but not the results on empty search 2018-09-28 11:35:09 +02:00
Kasper Rynning-Tønnesen
de619211fc Merge pull request #423 from zoff-music/refactor/aggregates
Added a own aggregates file
2018-09-28 11:14:14 +02:00
Kasper Rynning-Tønnesen
693e30f273 Added a own aggregates file
- Aggregate and project missing fields
- Updated how channels are created, to add the new fields
2018-09-28 11:13:49 +02:00
Kasper Rynning-Tønnesen
3102893e15 Adding thumbnail/description and rules in api requests 2018-09-28 10:54:41 +02:00
Kasper Rynning-Tønnesen
0a11ff09d9 Added preview of rules/description 2018-09-28 10:46:42 +02:00
Kasper Rynning-Tønnesen
0c86b0e9ee Fixing issue where change-info button was visible before it was supposed to 2018-09-28 10:36:04 +02:00
Kasper Rynning-Tønnesen
e26d277460 Merge pull request #422 from zoff-music/refactor/materialize-1.0
Updated to use materializecss 1.0.0 instead of -rc2.0
2018-09-28 10:29:03 +02:00
Kasper Rynning-Tønnesen
4aff6360c0 Merge pull request #421 from zoff-music/feature/rules
Added function for rules
2018-09-28 10:27:40 +02:00
Kasper Rynning-Tønnesen
a52d355456 Updating lists when rules/description and thumbnail is updated 2018-09-28 10:27:14 +02:00
Kasper Rynning-Tønnesen
b152209f05 Updated to use materializecss 1.0.0 instead of -rc2.0 2018-09-27 22:07:41 +02:00
Kasper Rynning-Tønnesen
0b3e7177b1 Added function for rules, and moved thumbnail/data somewhat around for better readability 2018-09-27 22:03:23 +02:00
Kasper Rynning-Tønnesen
5a84a4bc70 Added endpoint for deleting chat-users and UI for it on admin-panel 2018-09-27 14:46:59 +02:00
Kasper Rynning-Tønnesen
1f3c98a91b Merge pull request #419 from zoff-music/fix/updated-packages
Updated packages
2018-09-27 13:34:55 +02:00
Kasper Rynning-Tønnesen
f8d06c1744 Updated packages 2018-09-27 13:34:20 +02:00
Kasper Rynning-Tønnesen
473dde44f1 Fixed issue with soundcloud player not hiding on small device on pausing 2018-09-27 13:18:05 +02:00
Kasper Rynning-Tønnesen
fe727c075f Merge pull request #418 from zoff-music/feature/disable-chat
Fallback for channels without togglechat settings
2018-09-27 13:02:08 +02:00
Kasper Rynning-Tønnesen
6996472854 Fallback for channels without togglechat settings 2018-09-27 13:01:33 +02:00
Kasper Rynning-Tønnesen
34616c2d53 Merge pull request #416 from zoff-music/feature/disable-chat
Added settings for disabling chat in a channel
2018-09-27 12:58:08 +02:00
Kasper Rynning-Tønnesen
2686074b66 Fixed prefix-positioning on firefox 2018-09-27 12:55:13 +02:00
Kasper Rynning-Tønnesen
5878f57b64 Merge branch 'master' into feature/disable-chat 2018-09-27 12:48:04 +02:00
Kasper Rynning-Tønnesen
de9a43c653 Merge pull request #417 from zoff-music/feature/kick-ban-in-chat
Added ban/unban functionality in chat
2018-09-27 12:30:18 +02:00
Kasper Rynning-Tønnesen
c0d36b368c Merge branch 'master' into feature/kick-ban-in-chat 2018-09-27 12:29:26 +02:00
Kasper Rynning-Tønnesen
2117f839ac Merge branch 'master' into feature/disable-chat 2018-09-27 12:08:20 +02:00
Kasper Rynning-Tønnesen
c0864b3311 Merge pull request #415 from zoff-music/security/improved-security
Better hiding of passwords, hiding cookie-logins better
2018-09-27 11:45:36 +02:00
Kasper Rynning-Tønnesen
510ba13b32 Added settings handlebars 2018-09-27 11:44:50 +02:00
Kasper Rynning-Tønnesen
e1781c4f11 Added ban/unban functionality in chat 2018-09-27 11:43:00 +02:00
Kasper Rynning-Tønnesen
24ca0832ba Hiding chat-settings if not logged in as admin 2018-09-27 10:29:07 +02:00
Kasper Rynning-Tønnesen
6740da6d5c Only setting chat settings if it is sent 2018-09-27 10:25:03 +02:00
Kasper Rynning-Tønnesen
c12e633729 Added settings for disabling chat in a channel 2018-09-26 23:29:36 +02:00
Kasper Rynning-Tønnesen
d501e645f6 Removing userpass if userpass isnt needed on login on channel 2018-09-26 22:50:58 +02:00
Kasper Rynning-Tønnesen
c136199269 Better hiding of passwords, hiding cookie-logins better 2018-09-26 22:33:33 +02:00
Kasper Rynning-Tønnesen
7ab5d4f399 Removed logging after finding issue with channels and leaves 2018-09-26 20:09:54 +02:00
Kasper Rynning-Tønnesen
f19992060e More data 2018-09-26 19:57:51 +02:00
Kasper Rynning-Tønnesen
8d3dd93436 Logging left-channel also 2018-09-26 19:56:28 +02:00
Kasper Rynning-Tønnesen
16dd0e34ad Sending and logging end object also 2018-09-26 19:53:02 +02:00
Kasper Rynning-Tønnesen
4a79ae1b7d Trying end-video fix 2018-09-26 19:52:37 +02:00
Kasper Rynning-Tønnesen
f08f63edfc Updated a small part for logging 2018-09-26 19:42:17 +02:00
Kasper Rynning-Tønnesen
58bc3d138f More specific number of dollaass 2018-09-26 14:07:43 +02:00
Kasper Rynning-Tønnesen
0bef149269 more ensurance id is string 2018-09-26 11:30:05 +02:00
Kasper Rynning-Tønnesen
4e874b79fb Fixed issue with some songs being added as integer ids 2018-09-26 10:47:42 +02:00
Kasper Rynning-Tønnesen
9e18b85218 Added help-button in chat 2018-09-26 10:31:17 +02:00
Kasper Rynning-Tønnesen
f1b3ccad98 Update README.md 2018-09-25 23:59:18 +02:00
Kasper Rynning-Tønnesen
d843ee0993 Merge pull request #411 from zoff-music/fix/better-widget-soundcloud-load
Fix/better widget soundcloud load
2018-09-25 22:59:12 +02:00
Kasper Rynning-Tønnesen
0965060ce3 Added fix for embedded also 2018-09-25 22:58:49 +02:00
Kasper Rynning-Tønnesen
751b5008fb Better loading of iframe/soundcloud sdk
- Mitigates some errors on load
2018-09-25 22:57:04 +02:00
Kasper Rynning-Tønnesen
c86509b899 Correctly importing with https 2018-09-25 20:30:31 +02:00
Kasper Rynning-Tønnesen
6f1689ccb0 Merge pull request #410 from zoff-music/feature/less-intrusive-iframe
Made the iframed less intrusive
2018-09-25 20:25:39 +02:00
Kasper Rynning-Tønnesen
ce3ed5f191 Made the iframed less intrusive 2018-09-25 20:25:15 +02:00
Kasper Rynning-Tønnesen
7ced63c98d Merge pull request #409 from zoff-music/fix/soundcloud_load
Fixing issues with soundcloudplayer not understanding it is loaded
2018-09-25 18:17:25 +02:00
Kasper Rynning-Tønnesen
e24711ea1c Merge pull request #408 from zoff-music/fix/viewcount-crash
Statistics-crash-mitigation
2018-09-25 18:17:04 +02:00
Kasper Rynning-Tønnesen
742ecfaa1d Fixing issues with soundcloudplayer not understanding it is loaded 2018-09-25 18:15:43 +02:00
Kasper Rynning-Tønnesen
82c6910e62 Statistics-crash-mitigation 2018-09-25 17:57:06 +02:00
Kasper Rynning-Tønnesen
9d0c5173c4 Merge pull request #407 from zoff-music/feature/fallback-soundcloud-player
Fallback with iframed soundcloud player for rate-limit reached
2018-09-25 17:51:05 +02:00
Kasper Rynning-Tønnesen
39a2fc6532 Fallback with iframed soundcloud player for rate-limit reached
- Messes up history of current tab, but it's better than not playing any music
2018-09-25 17:49:49 +02:00
Kasper Rynning-Tønnesen
e5221ad88b Added skip for rate-limit reached on soundcloud 2018-09-25 13:25:45 +02:00
Kasper Rynning-Tønnesen
e050e19c5f Merge branch 'master' of github.com:zoff-music/zoff 2018-09-25 12:56:22 +02:00
Kasper Rynning-Tønnesen
febbc0cfdc Removed debug-log 2018-09-25 12:28:23 +02:00
Kasper Rynning-Tønnesen
9cb1ec72db Removed debug-log 2018-09-25 12:28:23 +02:00
Kasper Rynning-Tønnesen
ec90e9332c Merge pull request #405 from zoff-music/refactor/crash-start-clustered
Better nice-fail if files are missing, and more correctly start non-c…
2018-09-25 12:27:23 +02:00
Kasper Rynning-Tønnesen
83bb97b2f3 Merge pull request #405 from zoff-music/refactor/crash-start-clustered
Better nice-fail if files are missing, and more correctly start non-c…
2018-09-25 12:27:23 +02:00
Kasper Rynning-Tønnesen
3e3ef4d6d2 Better nice-fail if files are missing, and more correctly start non-clustered run 2018-09-25 12:26:55 +02:00
Kasper Rynning-Tønnesen
c32ccc63eb Better nice-fail if files are missing, and more correctly start non-clustered run 2018-09-25 12:26:55 +02:00
Kasper Rynning-Tønnesen
ef30540756 Merge pull request #404 from zoff-music/fix/find-div-width
fixed width of find-div
2018-09-25 11:12:40 +02:00
Kasper Rynning-Tønnesen
dd5f8b6a4b Merge pull request #404 from zoff-music/fix/find-div-width
fixed width of find-div
2018-09-25 11:12:40 +02:00
Kasper Rynning-Tønnesen
12d3e0ddc9 fixed width of find-div 2018-09-25 11:09:52 +02:00
Kasper Rynning-Tønnesen
82b69350c7 fixed width of find-div 2018-09-25 11:09:52 +02:00
Kasper Rynning-Tønnesen
db9a63be48 Hiding settings in iframed player 2018-09-24 00:09:54 +02:00
Kasper Rynning-Tønnesen
54a9a0ed4f Hiding settings in iframed player 2018-09-24 00:09:54 +02:00
Kasper Rynning-Tønnesen
e92d4ed61a Removing some functions from iframed-player 2018-09-24 00:09:05 +02:00
Kasper Rynning-Tønnesen
38b1a1330c Removing some functions from iframed-player 2018-09-24 00:09:05 +02:00
Kasper Rynning-Tønnesen
498e8e4676 Delete rewrite.js 2018-09-23 23:23:48 +02:00
Kasper Rynning-Tønnesen
0b197dca64 Delete rewrite.js 2018-09-23 23:23:48 +02:00
Kasper Rynning-Tønnesen
a499fa9001 Delete addtype.js 2018-09-23 23:23:33 +02:00
Kasper Rynning-Tønnesen
26bfca1bb9 Delete addtype.js 2018-09-23 23:23:33 +02:00
Kasper Rynning-Tønnesen
eb379e6f5c Disabled samesite value for now for avoiding cookies not being removed on iframe-load 2018-09-23 21:48:25 +02:00
Kasper Rynning-Tønnesen
06f960e3d4 Disabled samesite value for now for avoiding cookies not being removed on iframe-load 2018-09-23 21:48:25 +02:00
Kasper Rynning-Tønnesen
ced5e52223 Open modal always when small player/iframed, close after 5 seconds 2018-09-23 21:37:19 +02:00
Kasper Rynning-Tønnesen
aa871e80e2 Open modal always when small player/iframed, close after 5 seconds 2018-09-23 21:37:19 +02:00
Kasper Rynning-Tønnesen
b121151240 Removed copythingy from iframed element 2018-09-23 21:32:57 +02:00
Kasper Rynning-Tønnesen
990966b18e Removed copythingy from iframed element 2018-09-23 21:32:57 +02:00
Kasper Rynning-Tønnesen
58e5def473 Added modal for mobile automatically open in iframe 2018-09-23 21:30:13 +02:00
Kasper Rynning-Tønnesen
fa189967e7 Added modal for mobile automatically open in iframe 2018-09-23 21:30:13 +02:00
Kasper Rynning-Tønnesen
1fef8a9831 Added join-link for iframes 2018-09-23 21:15:10 +02:00
Kasper Rynning-Tønnesen
df2bb4809e Added join-link for iframes 2018-09-23 21:15:10 +02:00
Kasper Rynning-Tønnesen
1d061e213f Merge branch 'master' of github.com:zoff-music/zoff 2018-09-23 19:57:42 +02:00
Kasper Rynning-Tønnesen
f5e9424161 Merge branch 'master' of github.com:zoff-music/zoff 2018-09-23 19:57:42 +02:00
Kasper Rynning-Tønnesen
5593c5272a Fix for functions not existing in functions file 2018-09-23 19:57:14 +02:00
Kasper Rynning-Tønnesen
ce7c821082 Fix for functions not existing in functions file 2018-09-23 19:57:14 +02:00
Kasper Rynning-Tønnesen
9e6d8be32e Merge pull request #403 from zoff-music/fix/embed-code-generation
Fixed issue with embed-code generating faulty
2018-09-23 13:13:14 +02:00
Kasper Rynning-Tønnesen
a107a740fe Merge pull request #403 from zoff-music/fix/embed-code-generation
Fixed issue with embed-code generating faulty
2018-09-23 13:13:14 +02:00
Kasper Rynning-Tønnesen
8e714c838f Fixed issue with embed-code generating faulty 2018-09-23 13:12:50 +02:00
Kasper Rynning-Tønnesen
40e40ad298 Fixed issue with embed-code generating faulty 2018-09-23 13:12:50 +02:00
Kasper Rynning-Tønnesen
47e40ccb13 Merge pull request #402 from zoff-music/fix/youtube-export
Fixed issues with youtube-exporting
2018-09-23 12:11:30 +02:00
Kasper Rynning-Tønnesen
07bce2c87b Merge pull request #402 from zoff-music/fix/youtube-export
Fixed issues with youtube-exporting
2018-09-23 12:11:30 +02:00
Kasper Rynning-Tønnesen
d791273b15 Fixed issues with youtube-exporting 2018-09-23 12:11:03 +02:00
Kasper Rynning-Tønnesen
c133b60f19 Fixed issues with youtube-exporting 2018-09-23 12:11:03 +02:00
Kasper Rynning-Tønnesen
f629c4b362 Merge pull request #401 from zoff-music/fix/soundcloud-not-end
Fixed issue where soundcloud couldn't end song
2018-09-23 11:56:57 +02:00
Kasper Rynning-Tønnesen
5eade73f54 Merge pull request #401 from zoff-music/fix/soundcloud-not-end
Fixed issue where soundcloud couldn't end song
2018-09-23 11:56:57 +02:00
Kasper Rynning-Tønnesen
4e9b9d63c3 Fixed issue where soundcloud couldn't end song 2018-09-23 11:56:30 +02:00
Kasper Rynning-Tønnesen
5aa5c2b572 Fixed issue where soundcloud couldn't end song 2018-09-23 11:56:30 +02:00
Kasper Rynning-Tønnesen
21ff54c070 Also setting opacity to 1 on bufering when not mobile 2018-09-22 20:55:00 +02:00
Kasper Rynning-Tønnesen
7f729c22fd Also setting opacity to 1 on bufering when not mobile 2018-09-22 20:55:00 +02:00
Kasper Rynning-Tønnesen
31f53e6e32 Merge pull request #400 from zoff-music/fix/session-guid
Sending GUID/session based on connection if no cookie exists for socket.io
2018-09-22 18:25:58 +02:00
Kasper Rynning-Tønnesen
6f5532c37e Merge pull request #400 from zoff-music/fix/session-guid
Sending GUID/session based on connection if no cookie exists for socket.io
2018-09-22 18:25:58 +02:00
Kasper Rynning-Tønnesen
0a205ed714 Sending GUID/session based on connection if no cookie exists for socket.io 2018-09-22 18:25:18 +02:00
Kasper Rynning-Tønnesen
a426cd4ea5 Sending GUID/session based on connection if no cookie exists for socket.io 2018-09-22 18:25:18 +02:00
Kasper Rynning-Tønnesen
9f1e7ca347 Not logging debug-messages for forcing chat-name 2018-09-22 17:25:03 +02:00
Kasper Rynning-Tønnesen
dde755a2a7 Not logging debug-messages for forcing chat-name 2018-09-22 17:25:03 +02:00
Kasper Rynning-Tønnesen
0c3ced98f2 Merge branch 'master' of github.com:zoff-music/zoff 2018-09-22 17:13:53 +02:00
Kasper Rynning-Tønnesen
c3bb5c133e Merge branch 'master' of github.com:zoff-music/zoff 2018-09-22 17:13:53 +02:00
Kasper Rynning-Tønnesen
0cfa24af2f Prettyer close-icon for PiP mode 2018-09-22 17:13:44 +02:00
Kasper Rynning-Tønnesen
99a03d2314 Prettyer close-icon for PiP mode 2018-09-22 17:13:44 +02:00
Kasper Rynning-Tønnesen
4b7bb87ebf Added logging for testing why/what urls crash the cookies 2018-09-22 17:01:36 +02:00
Kasper Rynning-Tønnesen
ee5337be3d Added logging for testing why/what urls crash the cookies 2018-09-22 17:01:36 +02:00
Kasper Rynning-Tønnesen
2572b42294 Merge pull request #399 from zoff-music/feature/iframe-small
Automatically assuming small player if in iframe
2018-09-22 16:46:28 +02:00
Kasper Rynning-Tønnesen
05c4f4b920 Merge pull request #399 from zoff-music/feature/iframe-small
Automatically assuming small player if in iframe
2018-09-22 16:46:28 +02:00
Kasper Rynning-Tønnesen
0a7ea9f0b2 Automatically assuming small player if in iframe 2018-09-22 16:45:44 +02:00
Kasper Rynning-Tønnesen
297cc10691 Automatically assuming small player if in iframe 2018-09-22 16:45:44 +02:00
Kasper Rynning-Tønnesen
62ae1ee802 Merge pull request #398 from zoff-music/fix/opacity-load
Opacity for a load
2018-09-22 16:34:03 +02:00
Kasper Rynning-Tønnesen
25c7f85203 Merge pull request #398 from zoff-music/fix/opacity-load
Opacity for a load
2018-09-22 16:34:03 +02:00
Kasper Rynning-Tønnesen
ffc1725535 Opacity for a load 2018-09-22 16:27:09 +02:00
Kasper Rynning-Tønnesen
09f3214ad6 Opacity for a load 2018-09-22 16:27:09 +02:00
Kasper Rynning-Tønnesen
2255ce861c Merge pull request #396 from zoff-music/feature/small-iframe-hash
By adding #small to the end of the link, the footer is gone and navig…
2018-09-22 16:14:46 +02:00
Kasper Rynning-Tønnesen
2244c45be3 Merge pull request #396 from zoff-music/feature/small-iframe-hash
By adding #small to the end of the link, the footer is gone and navig…
2018-09-22 16:14:46 +02:00
Kasper Rynning-Tønnesen
77da0ca1d8 Merge pull request #397 from zoff-music/feature/soundcloud-import
Soundcloud import now works, but not on private songs
2018-09-22 16:14:36 +02:00
Kasper Rynning-Tønnesen
7fdcbfe9ff Merge pull request #397 from zoff-music/feature/soundcloud-import
Soundcloud import now works, but not on private songs
2018-09-22 16:14:36 +02:00
Kasper Rynning-Tønnesen
e7bb000d47 Soundcloud import now works, but not on private songs 2018-09-22 13:04:16 +02:00
Kasper Rynning-Tønnesen
b172e39097 Soundcloud import now works, but not on private songs 2018-09-22 13:04:16 +02:00
Kasper Rynning-Tønnesen
ea01cc082a By adding #small to the end of the link, the footer is gone and navigating out is disabled 2018-09-22 11:40:13 +02:00
Kasper Rynning-Tønnesen
3f9c989b6a By adding #small to the end of the link, the footer is gone and navigating out is disabled 2018-09-22 11:40:13 +02:00
Kasper Rynning-Tønnesen
36175fbdf9 Merge pull request #395 from zoff-music/fix/name-chat-leave
Fixed issue with names on leave remaining for some reason and trying …
2018-09-21 15:54:56 +02:00
Kasper Rynning-Tønnesen
a9dd4e512b Merge pull request #395 from zoff-music/fix/name-chat-leave
Fixed issue with names on leave remaining for some reason and trying …
2018-09-21 15:54:56 +02:00
Kasper Rynning-Tønnesen
e17d3a5bf3 Fixed issue with names on leave remaining for some reason and trying fix for users without name 2018-09-21 15:52:52 +02:00
Kasper Rynning-Tønnesen
fbecb2ccd2 Fixed issue with names on leave remaining for some reason and trying fix for users without name 2018-09-21 15:52:52 +02:00
Kasper Rynning-Tønnesen
2add5d4aae Better word-break on card-reveal 2018-09-21 14:29:27 +02:00
Kasper Rynning-Tønnesen
c26c490e4e Better word-break on card-reveal 2018-09-21 14:29:27 +02:00
Kasper Rynning-Tønnesen
0c6a871a46 Search-extra buttons positioning 2018-09-21 12:15:26 +02:00
Kasper Rynning-Tønnesen
48dfd24400 Search-extra buttons positioning 2018-09-21 12:15:26 +02:00
Kasper Rynning-Tønnesen
90c62505a6 Merge pull request #394 from zoff-music/fix/correct-errors
Fixed some results errors
2018-09-21 12:12:39 +02:00
Kasper Rynning-Tønnesen
7b6b54e0c9 Merge pull request #394 from zoff-music/fix/correct-errors
Fixed some results errors
2018-09-21 12:12:39 +02:00
Kasper Rynning-Tønnesen
5018c509a3 Fixed some results errors 2018-09-20 20:18:53 +02:00
Kasper Rynning-Tønnesen
555d0dbe1c Fixed some results errors 2018-09-20 20:18:53 +02:00
Kasper Rynning-Tønnesen
f89dd49b4b Merge pull request #393 from zoff-music/fix/api-admin-update
API-elements are correctly removed on refresh
2018-09-20 17:50:35 +02:00
Kasper Rynning-Tønnesen
6ef1a5e064 Merge pull request #393 from zoff-music/fix/api-admin-update
API-elements are correctly removed on refresh
2018-09-20 17:50:35 +02:00
Kasper Rynning-Tønnesen
12efbbcd99 API-elements are correctly removed on refresh 2018-09-20 17:49:28 +02:00
Kasper Rynning-Tønnesen
d50dacdc76 API-elements are correctly removed on refresh 2018-09-20 17:49:28 +02:00
Kasper Rynning-Tønnesen
b1412d9fc3 Re-implemented color-generating of System 2018-09-20 17:09:46 +02:00
Kasper Rynning-Tønnesen
e80ce8bdc9 Re-implemented color-generating of System 2018-09-20 17:09:46 +02:00
Kasper Rynning-Tønnesen
0dd5496b71 Added failsafe for /name so noone sends their password wrongly after the /login update 2018-09-20 16:54:02 +02:00
Kasper Rynning-Tønnesen
74f7b51742 Added failsafe for /name so noone sends their password wrongly after the /login update 2018-09-20 16:54:02 +02:00
Kasper Rynning-Tønnesen
7646f5183b Fixed newly created issue of timestamps of chat 2018-09-20 16:48:42 +02:00
Kasper Rynning-Tønnesen
0fd4c43ba5 Fixed newly created issue of timestamps of chat 2018-09-20 16:48:42 +02:00
Kasper Rynning-Tønnesen
836f96f7b2 Visual improvements for chat 2018-09-20 16:47:12 +02:00
Kasper Rynning-Tønnesen
dec569d50d Visual improvements for chat 2018-09-20 16:47:12 +02:00
Kasper Rynning-Tønnesen
3055d53f27 Merge pull request #392 from zoff-music/feature/who-chat
Feature of /who and seeing the people in the channel
2018-09-20 16:33:40 +02:00
Kasper Rynning-Tønnesen
d7a2595cf5 Merge pull request #392 from zoff-music/feature/who-chat
Feature of /who and seeing the people in the channel
2018-09-20 16:33:40 +02:00
Kasper Rynning-Tønnesen
8c1985bb1a Merge pull request #391 from zoff-music/fix/no-localstorage-error
Fix for localstorage not being existing crashes the player
2018-09-20 16:32:38 +02:00
Kasper Rynning-Tønnesen
690b8f789a Merge pull request #391 from zoff-music/fix/no-localstorage-error
Fix for localstorage not being existing crashes the player
2018-09-20 16:32:38 +02:00
Kasper Rynning-Tønnesen
52fedde073 Fix for localstorage not being existing crashes the player 2018-09-20 16:32:09 +02:00
Kasper Rynning-Tønnesen
845ef64805 Fix for localstorage not being existing crashes the player 2018-09-20 16:32:09 +02:00
Kasper Rynning-Tønnesen
0f8f175aa0 Feature of /who and seeing the people in the channel 2018-09-20 16:31:14 +02:00
Kasper Rynning-Tønnesen
4048b1346b Feature of /who and seeing the people in the channel 2018-09-20 16:31:14 +02:00
Kasper Rynning-Tønnesen
410b255874 Merge pull request #390 from zoff-music/feature/icon-leave-chat
Moved left_channel function to functions file, and sending icon for l…
2018-09-20 15:52:44 +02:00
Kasper Rynning-Tønnesen
9d24d389e3 Merge pull request #390 from zoff-music/feature/icon-leave-chat
Moved left_channel function to functions file, and sending icon for l…
2018-09-20 15:52:44 +02:00
Kasper Rynning-Tønnesen
7466ef7f61 Moved left_channel function to functions file, and sending icon for leaving/joining channel also 2018-09-20 15:31:37 +02:00
Kasper Rynning-Tønnesen
f75a2f0104 Moved left_channel function to functions file, and sending icon for leaving/joining channel also 2018-09-20 15:31:37 +02:00
Kasper Rynning-Tønnesen
ef369f6ca6 Merge pull request #389 from zoff-music/fix/soundcloud-switching
Fixed issue where switching from one channel sometimes didnt switch the song
2018-09-20 14:28:45 +02:00
Kasper Rynning-Tønnesen
e7517b810e Merge pull request #389 from zoff-music/fix/soundcloud-switching
Fixed issue where switching from one channel sometimes didnt switch the song
2018-09-20 14:28:45 +02:00
Kasper Rynning-Tønnesen
1a735e6557 Fixed issue where switching from one channel sometimes didnt switch the song 2018-09-20 14:27:43 +02:00
Kasper Rynning-Tønnesen
3c44a9a879 Fixed issue where switching from one channel sometimes didnt switch the song 2018-09-20 14:27:43 +02:00
Kasper Rynning-Tønnesen
f39a063037 Merge pull request #388 from zoff-music/fix/pause-skip
Fixed and Closes #383
2018-09-20 14:15:52 +02:00
Kasper Rynning-Tønnesen
c21cdb6046 Merge pull request #388 from zoff-music/fix/pause-skip
Fixed and Closes #383
2018-09-20 14:15:52 +02:00
Kasper Rynning-Tønnesen
1b86ae514b Fixed and Closes #383 2018-09-20 14:15:26 +02:00
Kasper Rynning-Tønnesen
424e4e374c Fixed and Closes #383 2018-09-20 14:15:26 +02:00
Kasper Rynning-Tønnesen
4a23770fe3 Merge pull request #387 from zoff-music/feature/no-cookies-allow
Fixed so users that has blocked cookies still are able to play
2018-09-20 13:58:14 +02:00
Kasper Rynning-Tønnesen
2a8c5fa825 Merge pull request #387 from zoff-music/feature/no-cookies-allow
Fixed so users that has blocked cookies still are able to play
2018-09-20 13:58:14 +02:00
Kasper Rynning-Tønnesen
2d3ca3acc7 Merge pull request #386 from zoff-music/fix/list-height-embed
Fixed visual bug with list-items
2018-09-19 23:15:04 +02:00
Kasper Rynning-Tønnesen
cec9575dcc Merge pull request #386 from zoff-music/fix/list-height-embed
Fixed visual bug with list-items
2018-09-19 23:15:04 +02:00
Kasper Rynning-Tønnesen
4874d468fe Fixed visual bug where playlist-items had too little height in embedded mode 2018-09-19 23:01:06 +02:00
Kasper Rynning-Tønnesen
82be3a6425 Fixed visual bug where playlist-items had too little height in embedded mode 2018-09-19 23:01:06 +02:00
Kasper Rynning-Tønnesen
cc84a02cd2 Fixed so users that has blocked cookies still are able to play 2018-09-19 22:58:51 +02:00
Kasper Rynning-Tønnesen
8cd9f8fa5d Fixed so users that has blocked cookies still are able to play 2018-09-19 22:58:51 +02:00
Kasper Rynning-Tønnesen
c0bd3de5af guid undefined fallback 2018-09-19 22:28:56 +02:00
Kasper Rynning-Tønnesen
5dc5590c67 guid undefined fallback 2018-09-19 22:28:56 +02:00
Kasper Rynning-Tønnesen
d661d99776 Trying to mitigate song-change-error 2018-09-19 11:08:22 +02:00
Kasper Rynning-Tønnesen
8a68f798a7 Trying to mitigate song-change-error 2018-09-19 11:08:22 +02:00
Kasper Rynning-Tønnesen
3101792420 Fixed small API-error with postvariables 2018-09-17 14:51:47 +02:00
Kasper Rynning-Tønnesen
b3ef5834c8 Fixed small API-error with postvariables 2018-09-17 14:51:47 +02:00
Kasper Rynning-Tønnesen
e2dc9888ba Merge pull request #385 from zoff-music/feature/suggested-info
Moved suggested specific code to suggested file, and fixed issue wher…
2018-09-11 14:58:22 +02:00
Kasper Rynning-Tønnesen
c84af5dfc7 Merge pull request #385 from zoff-music/feature/suggested-info
Moved suggested specific code to suggested file, and fixed issue wher…
2018-09-11 14:58:22 +02:00
Kasper Rynning-Tønnesen
950455a688 Moved suggested specific code to suggested file, and fixed issue where suggested sometimes dissapear 2018-09-11 14:57:43 +02:00
Kasper Rynning-Tønnesen
ba8eade984 Moved suggested specific code to suggested file, and fixed issue where suggested sometimes dissapear 2018-09-11 14:57:43 +02:00
Kasper Rynning-Tønnesen
6cf484fa4e Merge pull request #384 from zoff-music/feature/suggested-info
More info on suggested songs
2018-09-11 14:00:20 +02:00
Kasper Rynning-Tønnesen
d7a5b96274 Merge pull request #384 from zoff-music/feature/suggested-info
More info on suggested songs
2018-09-11 14:00:20 +02:00
Kasper Rynning-Tønnesen
d86e403222 More info on suggested songs 2018-09-11 13:59:46 +02:00
Kasper Rynning-Tønnesen
d060a1c955 More info on suggested songs 2018-09-11 13:59:46 +02:00
Kasper Rynning-Tønnesen
d6cd183db3 Added fix for total_viewers count error 2018-09-04 12:45:16 +02:00
Kasper Rynning-Tønnesen
1a0abe9cfe Added fix for total_viewers count error 2018-09-04 12:45:16 +02:00
Kasper Rynning-Tønnesen
4c73b411d3 Added a padding to pagebuttons instead 2018-09-02 13:44:27 +02:00
Kasper Rynning-Tønnesen
fc272a56b8 Added a padding to pagebuttons instead 2018-09-02 13:44:27 +02:00
Kasper Rynning-Tønnesen
ce15d4e0f3 Moved pagebuttons a little way down 2018-09-02 13:41:45 +02:00
Kasper Rynning-Tønnesen
5ffe816106 Moved pagebuttons a little way down 2018-09-02 13:41:45 +02:00
Kasper Rynning-Tønnesen
f66611780d Fixed issue with pagebuttons transparent 2018-09-02 13:38:28 +02:00
Kasper Rynning-Tønnesen
41814af41b Fixed issue with pagebuttons transparent 2018-09-02 13:38:28 +02:00
Kasper Rynning-Tønnesen
cbbbd14c18 Absolute position on contextmenu 2018-09-02 13:21:22 +02:00
Kasper Rynning-Tønnesen
a6c525cf18 Absolute position on contextmenu 2018-09-02 13:21:22 +02:00
Kasper Rynning-Tønnesen
aade371c56 Fixed some styling for mobile
- Search-result height on mobile
- Pagebutton background on mobile
- Pagebutton-width/position
2018-09-02 13:19:03 +02:00
Kasper Rynning-Tønnesen
9d2590e10c Fixed some styling for mobile
- Search-result height on mobile
- Pagebutton background on mobile
- Pagebutton-width/position
2018-09-02 13:19:03 +02:00
Kasper Rynning-Tønnesen
f3e23bb2cc Merge pull request #381 from zoff-music/refactor/name-generate
Improved how naming works on join
2018-09-01 13:06:01 +02:00
Kasper Rynning-Tønnesen
e567fe127b Merge pull request #381 from zoff-music/refactor/name-generate
Improved how naming works on join
2018-09-01 13:06:01 +02:00
Kasper Rynning-Tønnesen
47e45c5b19 Improved how naming works on join
- XXXX changed name to YYYY doesn't happen if the user already is signed in
- Signs automatically in on frontpage join
2018-09-01 13:04:40 +02:00
Kasper Rynning-Tønnesen
59576d6246 Improved how naming works on join
- XXXX changed name to YYYY doesn't happen if the user already is signed in
- Signs automatically in on frontpage join
2018-09-01 13:04:40 +02:00
Kasper Rynning-Tønnesen
6d361db3ad Added dragging om mobilesidenavn and scrolling to top on switching to chat-tab 2018-09-01 12:37:22 +02:00
Kasper Rynning-Tønnesen
10198225f1 Added dragging om mobilesidenavn and scrolling to top on switching to chat-tab 2018-09-01 12:37:22 +02:00
Kasper Rynning-Tønnesen
05d009c1ce Merge pull request #379 from zoff-music/fix/play-pause-video-hide
Fixed issue with player on mobile
2018-08-31 12:06:50 +02:00
Kasper Rynning-Tønnesen
5568936996 Merge pull request #379 from zoff-music/fix/play-pause-video-hide
Fixed issue with player on mobile
2018-08-31 12:06:50 +02:00
Kasper Rynning-Tønnesen
cb111fa9f8 Merge pull request #380 from zoff-music/fix/similar-search
Fixed issue with similar search not opening
2018-08-31 12:05:39 +02:00
Kasper Rynning-Tønnesen
08017634f9 Merge pull request #380 from zoff-music/fix/similar-search
Fixed issue with similar search not opening
2018-08-31 12:05:39 +02:00
Kasper Rynning-Tønnesen
f36a6b23ee Fixed issue with similar search not opening 2018-08-31 12:05:02 +02:00
Kasper Rynning-Tønnesen
f5064fe843 Fixed issue with similar search not opening 2018-08-31 12:05:02 +02:00
Kasper Rynning-Tønnesen
5f07a8e751 Fixed issue where clicking the video-container on mobile did not hide the player 2018-08-31 11:43:44 +02:00
Kasper Rynning-Tønnesen
02d749e089 Fixed issue where clicking the video-container on mobile did not hide the player 2018-08-31 11:43:44 +02:00
Kasper Rynning-Tønnesen
fe55b4dd63 Merge pull request #377 from zoff-music/fix/name-correctly-removed
Correctly remove name from users online on leave
2018-08-30 14:56:29 +02:00
Kasper Rynning-Tønnesen
88da20eb18 Merge pull request #377 from zoff-music/fix/name-correctly-removed
Correctly remove name from users online on leave
2018-08-30 14:56:29 +02:00
Kasper Rynning-Tønnesen
327e69076c Correctly remove name from users online on leave 2018-08-30 14:54:46 +02:00
Kasper Rynning-Tønnesen
0c738ffd12 Correctly remove name from users online on leave 2018-08-30 14:54:46 +02:00
Kasper Rynning-Tønnesen
2fe0410645 Merge pull request #376 from zoff-music/fix/more-info-button
Fixed switch error on song start-end button for mobile
2018-08-30 13:39:00 +02:00
Kasper Rynning-Tønnesen
dfaa2c7bb3 Merge pull request #376 from zoff-music/fix/more-info-button
Fixed switch error on song start-end button for mobile
2018-08-30 13:39:00 +02:00
Kasper Rynning-Tønnesen
5895352240 Fixed switch error on song start-end button for mobile 2018-08-30 13:35:48 +02:00
Kasper Rynning-Tønnesen
8d4b01b4a5 Fixed switch error on song start-end button for mobile 2018-08-30 13:35:48 +02:00
Kasper Rynning-Tønnesen
6de4927298 Merge pull request #375 from zoff-music/fix/listeners-out
Trying some performance-enhancing stuff
2018-08-30 13:18:12 +02:00
Kasper Rynning-Tønnesen
ebf15bc59c Merge pull request #375 from zoff-music/fix/listeners-out
Trying some performance-enhancing stuff
2018-08-30 13:18:12 +02:00
Kasper Rynning-Tønnesen
e5696fcc49 Moved adding of listeners to a function, to be done after DOMContentLoadedEvent 2018-08-30 13:05:25 +02:00
Kasper Rynning-Tønnesen
78387fc475 Moved adding of listeners to a function, to be done after DOMContentLoadedEvent 2018-08-30 13:05:25 +02:00
Kasper Rynning-Tønnesen
a3b794c7bf Merge pull request #374 from zoff-music/feature/embedded-local
Added localmode for embedded players, configurable on embed-code create
2018-08-30 12:28:05 +02:00
Kasper Rynning-Tønnesen
82dbc33142 Merge pull request #374 from zoff-music/feature/embedded-local
Added localmode for embedded players, configurable on embed-code create
2018-08-30 12:28:05 +02:00
Kasper Rynning-Tønnesen
35ef8a54b0 Added localmode for embedded players, configurable on embed-code create 2018-08-30 12:26:59 +02:00
Kasper Rynning-Tønnesen
a7f25ab4a5 Added localmode for embedded players, configurable on embed-code create 2018-08-30 12:26:59 +02:00
Kasper Rynning-Tønnesen
19a38162be Fixed small chat-generate crash issue 2018-08-30 11:13:34 +02:00
Kasper Rynning-Tønnesen
752472547e Fixed small chat-generate crash issue 2018-08-30 11:13:34 +02:00
Kasper Rynning-Tønnesen
20b745d78e Commented out own error-handler for now 2018-08-30 10:14:58 +02:00
Kasper Rynning-Tønnesen
fc6a58ebb5 Commented out own error-handler for now 2018-08-30 10:14:58 +02:00
Kasper Rynning-Tønnesen
49f6c7218d Added an error-test 2018-08-29 17:54:43 +02:00
Kasper Rynning-Tønnesen
5610382c01 Added an error-test 2018-08-29 17:54:43 +02:00
Kasper Rynning-Tønnesen
b43527a6af Uncommented Windows-internet-code 2018-08-29 13:55:43 +02:00
Kasper Rynning-Tønnesen
1c0294bfb6 Uncommented Windows-internet-code 2018-08-29 13:55:43 +02:00
Kasper Rynning-Tønnesen
85de9944a5 Adding a failsafe for rndName and how seeding works on crash 2018-08-29 13:49:34 +02:00
Kasper Rynning-Tønnesen
249855e09b Adding a failsafe for rndName and how seeding works on crash 2018-08-29 13:49:34 +02:00
Kasper Rynning-Tønnesen
4c11618087 Merge pull request #372 from zoff-music/fix/soundcloud-load
Better soundcloud loader
2018-08-29 12:16:39 +02:00
Kasper Rynning-Tønnesen
fa51a5f3b6 Merge pull request #372 from zoff-music/fix/soundcloud-load
Better soundcloud loader
2018-08-29 12:16:39 +02:00
Kasper Rynning-Tønnesen
b8470dcba8 Better soundcloud loader 2018-08-29 12:16:12 +02:00
Kasper Rynning-Tønnesen
7a6d34677d Better soundcloud loader 2018-08-29 12:16:12 +02:00
Kasper Rynning-Tønnesen
c07dadadfa Merge pull request #371 from zoff-music/fix/pagespeed-error
Better error-handler for pagespeed unexpected error
2018-08-28 21:47:38 +02:00
Kasper Rynning-Tønnesen
a14053c7fc Merge pull request #371 from zoff-music/fix/pagespeed-error
Better error-handler for pagespeed unexpected error
2018-08-28 21:47:38 +02:00
Kasper Rynning-Tønnesen
185d5ef0b6 Merge pull request #370 from zoff-music/feature/prefix-positioning
Better prefix-positioning
2018-08-28 21:47:24 +02:00
Kasper Rynning-Tønnesen
566decfaea Merge pull request #370 from zoff-music/feature/prefix-positioning
Better prefix-positioning
2018-08-28 21:47:24 +02:00
Kasper Rynning-Tønnesen
9f35001bde Better error-handler for pagespeed unexpected error 2018-08-28 21:46:56 +02:00
Kasper Rynning-Tønnesen
207b2d9bb3 Better error-handler for pagespeed unexpected error 2018-08-28 21:46:56 +02:00
Kasper Rynning-Tønnesen
d98121b47e Better prefix-positioning 2018-08-28 21:46:02 +02:00
Kasper Rynning-Tønnesen
2e55bb0fdf Better prefix-positioning 2018-08-28 21:46:02 +02:00
Kasper Rynning-Tønnesen
1a4ba7ee1c Update README.md 2018-08-28 20:44:25 +02:00
Kasper Rynning-Tønnesen
b9fd06f072 Update README.md 2018-08-28 20:44:25 +02:00
Kasper Rynning-Tønnesen
45fa9ce233 prettier readme? 2018-08-28 20:41:40 +02:00
Kasper Rynning-Tønnesen
5898c7fbb8 prettier readme? 2018-08-28 20:41:40 +02:00
Kasper Rynning-Tønnesen
f35802e55b Merge pull request #369 from zoff-music/feature/cookie-info
Changed cookie-toast and added a cookie-modal
2018-08-28 19:20:24 +02:00
Kasper Rynning-Tønnesen
83943c4f73 Merge pull request #369 from zoff-music/feature/cookie-info
Changed cookie-toast and added a cookie-modal
2018-08-28 19:20:24 +02:00
Kasper Rynning-Tønnesen
f290812f6d Changed cookie-toast and added a cookie-modal 2018-08-28 19:19:59 +02:00
Kasper Rynning-Tønnesen
e3a220243c Changed cookie-toast and added a cookie-modal 2018-08-28 19:19:59 +02:00
Kasper Rynning-Tønnesen
ce27b65991 Merge pull request #368 from zoff-music/feature/guid-more-unique
Making guid somewhat more unique
2018-08-28 14:49:27 +02:00
Kasper Rynning-Tønnesen
78319c2072 Merge pull request #368 from zoff-music/feature/guid-more-unique
Making guid somewhat more unique
2018-08-28 14:49:27 +02:00
Kasper Rynning-Tønnesen
8e9a76eb48 Making guid somewhat more unique, and not using connection, but cookie instead 2018-08-28 14:46:39 +02:00
Kasper Rynning-Tønnesen
c20dfef95f Making guid somewhat more unique, and not using connection, but cookie instead 2018-08-28 14:46:39 +02:00
Kasper Rynning-Tønnesen
6e09c6d59f Merge pull request #367 from zoff-music/feature/chat-name-persist
More persistent chat-names, and server handling of chat-names instead…
2018-08-28 14:34:11 +02:00
Kasper Rynning-Tønnesen
236d4cd1ec Merge pull request #367 from zoff-music/feature/chat-name-persist
More persistent chat-names, and server handling of chat-names instead…
2018-08-28 14:34:11 +02:00
Kasper Rynning-Tønnesen
b66f70415c More persistent chat-names, and server handling of chat-names instead of client sending empty namechange request on join 2018-08-28 14:33:01 +02:00
Kasper Rynning-Tønnesen
8a5c425579 More persistent chat-names, and server handling of chat-names instead of client sending empty namechange request on join 2018-08-28 14:33:01 +02:00
Kasper Rynning-Tønnesen
b135c1390c More clever way of detecting if a name should be removed when user leaves 2018-08-28 13:18:22 +02:00
Kasper Rynning-Tønnesen
e885640156 More clever way of detecting if a name should be removed when user leaves 2018-08-28 13:18:22 +02:00
Kasper Rynning-Tønnesen
46996881cb Added more error-message on error fetching song-data 2018-08-28 12:54:43 +02:00
Kasper Rynning-Tønnesen
861580b383 Added more error-message on error fetching song-data 2018-08-28 12:54:43 +02:00
Kasper Rynning-Tønnesen
9852da491b Updated so username won't overflow. Removing username on general leave 2018-08-28 12:50:45 +02:00
Kasper Rynning-Tønnesen
51876479a3 Updated so username won't overflow. Removing username on general leave 2018-08-28 12:50:45 +02:00
Kasper Rynning-Tønnesen
f9a2169f51 Fixed thumbnail issue 2018-08-21 16:38:08 +02:00
Kasper Rynning-Tønnesen
0b33129851 Fixed thumbnail issue 2018-08-21 16:38:08 +02:00
Kasper Rynning-Tønnesen
0dd8155447 Trying to get friendly-name working again 2018-08-21 15:54:59 +02:00
Kasper Rynning-Tønnesen
e654390e6d Trying to get friendly-name working again 2018-08-21 15:54:59 +02:00
Kasper Rynning-Tønnesen
f8711c78d1 Forgot where the code should be moved 2018-08-16 15:03:39 +02:00
Kasper Rynning-Tønnesen
8fa1df9c0a Forgot where the code should be moved 2018-08-16 15:03:39 +02:00
Kasper Rynning-Tønnesen
a205972fff Got chromecasting working again with the new channel-names 2018-08-16 14:48:13 +02:00
Kasper Rynning-Tønnesen
d3dfd0fb82 Got chromecasting working again with the new channel-names 2018-08-16 14:48:13 +02:00
Kasper Rynning-Tønnesen
1a21297cd3 Autoplay position fix 2018-08-16 12:56:52 +02:00
Kasper Rynning-Tønnesen
ef337e9634 Autoplay position fix 2018-08-16 12:56:52 +02:00
Kasper Rynning-Tønnesen
c6232aa407 Fixed player-issue in embed 2018-08-16 12:54:00 +02:00
Kasper Rynning-Tønnesen
8227c5a7e3 Fixed player-issue in embed 2018-08-16 12:54:00 +02:00
Kasper Rynning-Tønnesen
171165e0d3 Merge pull request #366 from zoff-music/refactor/jquery-less-admin
Refactor/jquery less admin
2018-08-13 13:20:29 +02:00
Kasper Rynning-Tønnesen
27f030661b Merge pull request #366 from zoff-music/refactor/jquery-less-admin
Refactor/jquery less admin
2018-08-13 13:20:29 +02:00
Kasper Rynning-Tønnesen
44b065672d No more jquery in adminpanel 2018-08-13 13:19:24 +02:00
Kasper Rynning-Tønnesen
049a91ad40 No more jquery in adminpanel 2018-08-13 13:19:24 +02:00
Kasper Rynning-Tønnesen
c699db6769 Started refactoring 2018-08-13 12:40:05 +02:00
Kasper Rynning-Tønnesen
2d3929b999 Started refactoring 2018-08-13 12:40:05 +02:00
Kasper Rynning-Tønnesen
cc60c48cc4 Fixed search crashing in client-mode 2018-08-12 14:41:11 +02:00
Kasper Rynning-Tønnesen
d4957b52f0 Fixed search crashing in client-mode 2018-08-12 14:41:11 +02:00
Kasper Rynning-Tønnesen
0a8194263a Update README.md 2018-08-12 14:21:54 +02:00
Kasper Rynning-Tønnesen
a5048f13a0 Update README.md 2018-08-12 14:21:54 +02:00
Kasper Rynning-Tønnesen
643fa6bd9b added appstore images in readme 2018-08-12 14:18:13 +02:00
Kasper Rynning-Tønnesen
ee1c9620ad added appstore images in readme 2018-08-12 14:18:13 +02:00
Kasper Rynning-Tønnesen
f0afa0dd5d Update README.md 2018-08-12 14:09:01 +02:00
Kasper Rynning-Tønnesen
5d54e97adf Update README.md 2018-08-12 14:09:01 +02:00
Kasper Rynning-Tønnesen
0bd654364a Fixed encoding-issue with channelnames 2018-08-12 13:55:48 +02:00
Kasper Rynning-Tønnesen
6fc4db03f6 Fixed encoding-issue with channelnames 2018-08-12 13:55:48 +02:00
Kasper Rynning-Tønnesen
29cb942630 Fixed issue with accessed sorting 2018-08-11 20:14:08 +02:00
Kasper Rynning-Tønnesen
096a5acd98 Fixed issue with accessed sorting 2018-08-11 20:14:08 +02:00
Kasper Rynning-Tønnesen
be4c48f0ab Not showing card-reveal when list has no description 2018-08-10 12:42:57 +02:00
Kasper Rynning-Tønnesen
2dcc69d367 Not showing card-reveal when list has no description 2018-08-10 12:42:57 +02:00
Kasper Rynning-Tønnesen
9a1d39ea24 Fixed JSON.parse issue with new lists on navigating 2018-08-10 12:01:29 +02:00
Kasper Rynning-Tønnesen
606e283a05 Fixed JSON.parse issue with new lists on navigating 2018-08-10 12:01:29 +02:00
Kasper Rynning-Tønnesen
0337a17168 Fixed frontpage-sorting issue 2018-08-10 11:59:49 +02:00
Kasper Rynning-Tønnesen
589c690871 Fixed frontpage-sorting issue 2018-08-10 11:59:49 +02:00
Kasper Rynning-Tønnesen
c20da5db3b Merge pull request #365 from zoff-music/feature/instant-frontpages
Feature/instant frontpages
2018-08-10 11:51:57 +02:00
Kasper Rynning-Tønnesen
458226c7cf Merge pull request #365 from zoff-music/feature/instant-frontpages
Feature/instant frontpages
2018-08-10 11:51:57 +02:00
Kasper Rynning-Tønnesen
6d0acaefcb More instant frontpage-loading, and sorting frontpages on the backend for consistency 2018-08-10 11:51:28 +02:00
Kasper Rynning-Tønnesen
dfbce195a0 More instant frontpage-loading, and sorting frontpages on the backend for consistency 2018-08-10 11:51:28 +02:00
Kasper Rynning-Tønnesen
8c29c31449 Working updating of playlist and populating 2018-08-08 22:54:41 +02:00
Kasper Rynning-Tønnesen
7d6a54ae10 Working updating of playlist and populating 2018-08-08 22:54:41 +02:00
Kasper Rynning-Tønnesen
689bc85a62 Started work on fetching frontpage-lists at the same time as sending the html 2018-08-08 22:21:53 +02:00
Kasper Rynning-Tønnesen
1255940682 Started work on fetching frontpage-lists at the same time as sending the html 2018-08-08 22:21:53 +02:00
Kasper Rynning-Tønnesen
5cd8cd5864 Minify-css and remove spectrum css 2018-08-08 21:24:02 +02:00
Kasper Rynning-Tønnesen
b79b0cc168 Minify-css and remove spectrum css 2018-08-08 21:24:02 +02:00
Kasper Rynning-Tønnesen
08055bca72 Merge pull request #364 from zoff-music/revert-363-feature/load
Revert "Added a load-screen"
2018-08-08 16:32:47 +02:00
Kasper Rynning-Tønnesen
3f207e3038 Merge pull request #364 from zoff-music/revert-363-feature/load
Revert "Added a load-screen"
2018-08-08 16:32:47 +02:00
Kasper Rynning-Tønnesen
debcd787f9 Revert "Added a load-screen" 2018-08-08 16:32:22 +02:00
Kasper Rynning-Tønnesen
836ad10500 Revert "Added a load-screen" 2018-08-08 16:32:22 +02:00
Kasper Rynning-Tønnesen
09f9072ec1 Merge pull request #363 from zoff-music/feature/load
Added a load-screen
2018-08-08 16:30:30 +02:00
Kasper Rynning-Tønnesen
caeed28433 Merge pull request #363 from zoff-music/feature/load
Added a load-screen
2018-08-08 16:30:30 +02:00
Kasper Rynning-Tønnesen
9f641c4c96 Removed gulp-sourcemaps for now because of vulnerability 2018-08-08 16:23:12 +02:00
Kasper Rynning-Tønnesen
6b7bf9f58a Removed gulp-sourcemaps for now because of vulnerability 2018-08-08 16:23:12 +02:00
Kasper Rynning-Tønnesen
5af081dc9f Removed some minor logs 2018-08-08 16:21:39 +02:00
Kasper Rynning-Tønnesen
67356b62d9 Removed some minor logs 2018-08-08 16:21:39 +02:00
Kasper Rynning-Tønnesen
1a27945752 Added a load-screen, will test for some time and see if it helps any 2018-08-08 16:20:23 +02:00
Kasper Rynning-Tønnesen
5c12c2f261 Added a load-screen, will test for some time and see if it helps any 2018-08-08 16:20:23 +02:00
Kasper Rynning-Tønnesen
5fd67867de Fixed soundcloud loading-issue on initial channel-load 2018-08-08 16:12:54 +02:00
Kasper Rynning-Tønnesen
795146af88 Fixed soundcloud loading-issue on initial channel-load 2018-08-08 16:12:54 +02:00
Kasper Rynning-Tønnesen
8e3149c2ee Fixed some loading-perforamance for soundcloud player 2018-08-08 15:37:01 +02:00
Kasper Rynning-Tønnesen
f03c53ce2a Fixed some loading-perforamance for soundcloud player 2018-08-08 15:37:01 +02:00
Kasper Rynning-Tønnesen
f527f4fa83 Fixed scaling-issue when showing playlist after having it 100% width 2018-08-01 19:05:19 +02:00
Kasper Rynning-Tønnesen
1aafdf2d86 Fixed scaling-issue when showing playlist after having it 100% width 2018-08-01 19:05:19 +02:00
Kasper Rynning-Tønnesen
7f22ff2b1d Moved SoundCloud api-key out to different config file and fixed some list-naming issues that was caused with filter.clean was performed after list-name was encoded. Closes #362 2018-08-01 16:53:26 +02:00
Kasper Rynning-Tønnesen
65698b02a0 Moved SoundCloud api-key out to different config file and fixed some list-naming issues that was caused with filter.clean was performed after list-name was encoded. Closes #362 2018-08-01 16:53:26 +02:00
Kasper Rynning-Tønnesen
f4dfdb32df Fixed width-issue on mobile and color-issue of title on mobile 2018-07-28 15:23:17 +02:00
Kasper Rynning-Tønnesen
a190e66c23 Fixed width-issue on mobile and color-issue of title on mobile 2018-07-28 15:23:17 +02:00
Kasper Rynning-Tønnesen
c7de4bd5e3 Scaling fixes for whole site, and prettier search-loader 2018-07-27 15:56:03 +02:00
Kasper Rynning-Tønnesen
96a56c158d Scaling fixes for whole site, and prettier search-loader 2018-07-27 15:56:03 +02:00
Kasper Rynning-Tønnesen
f021808d8b Fixed issue with playlist seeking with no list, seeking at statechangen for youtube and resizing on frontpage crash 2018-07-25 23:21:38 +02:00
Kasper Rynning-Tønnesen
e20dd72116 Fixed issue with playlist seeking with no list, seeking at statechangen for youtube and resizing on frontpage crash 2018-07-25 23:21:38 +02:00
Kasper Rynning-Tønnesen
1e6e507362 Fixed scaling issue on mobile when playing, and fixed embed crashes 2018-07-25 07:20:24 +02:00
Kasper Rynning-Tønnesen
a550138eef Fixed scaling issue on mobile when playing, and fixed embed crashes 2018-07-25 07:20:24 +02:00
Kasper Rynning-Tønnesen
2219e14f86 Playlist-play-pause resize coherent. Closes #355 2018-07-24 23:53:48 +02:00
Kasper Rynning-Tønnesen
e8fb72caf2 Playlist-play-pause resize coherent. Closes #355 2018-07-24 23:53:48 +02:00
Kasper Rynning-Tønnesen
dea78ffd41 moved some css out from js 2018-07-24 23:44:10 +02:00
Kasper Rynning-Tønnesen
eca63eaa8d moved some css out from js 2018-07-24 23:44:10 +02:00
Kasper Rynning-Tønnesen
8638685e19 Merge branch 'master' of github.com:zoff-music/zoff 2018-07-24 23:42:01 +02:00
Kasper Rynning-Tønnesen
1de7341e6e Merge branch 'master' of github.com:zoff-music/zoff 2018-07-24 23:42:01 +02:00
Kasper Rynning-Tønnesen
b3da558336 bugfixes
- Fixed color-issue on local
- Fixed issue with navigating back in playlist on local
- Fixed issue with starting at the right time on local when start/end had been set
- Fixed issue where changing channel when in local, song wouldn't change
- Fixed issue on previous song not starting at the correct time in local mode
2018-07-24 23:40:35 +02:00
Kasper Rynning-Tønnesen
865ba4ce80 bugfixes
- Fixed color-issue on local
- Fixed issue with navigating back in playlist on local
- Fixed issue with starting at the right time on local when start/end had been set
- Fixed issue where changing channel when in local, song wouldn't change
- Fixed issue on previous song not starting at the correct time in local mode
2018-07-24 23:40:35 +02:00
Your Name
4dfe5e061f catch for notificationa not existing on some devices 2018-07-15 15:44:43 -04:00
Your Name
514d45d0bf catch for notificationa not existing on some devices 2018-07-15 15:44:43 -04:00
Your Name
c75537d4b8 tempfixes until I get my computer back 2018-07-15 15:34:15 -04:00
Your Name
05860096cd tempfixes until I get my computer back 2018-07-15 15:34:15 -04:00
Your Name
73d31021d2 general fixes 2018-07-11 13:21:21 -04:00
Your Name
4090277c6b general fixes 2018-07-11 13:21:21 -04:00
Kasper Rynning-Tønnesen
d3e6af4643 Fixes 2018-07-10 16:21:16 +02:00
Kasper Rynning-Tønnesen
d7522cad73 Fixes 2018-07-10 16:21:16 +02:00
Kasper Rynning-Tønnesen
061b3832ae Concat before uglifying 2018-07-06 00:59:44 +02:00
Kasper Rynning-Tønnesen
609f07449e Concat before uglifying 2018-07-06 00:59:44 +02:00
Kasper Rynning-Tønnesen
0d5eec7b07 No map files maybe 2018-07-06 00:56:15 +02:00
Kasper Rynning-Tønnesen
e4f90e20fd No map files maybe 2018-07-06 00:56:15 +02:00
Kasper Rynning-Tønnesen
3ca6dea8e1 Gulp fixes 2018-07-06 00:53:18 +02:00
Kasper Rynning-Tønnesen
9b1876c426 Gulp fixes 2018-07-06 00:53:18 +02:00
Kasper Rynning-Tønnesen
9a66bc85ef issuefixing
- Closes #353 #352 #351 #350 #349
2018-07-05 18:32:31 +02:00
Kasper Rynning-Tønnesen
3e2f9e8c8e issuefixing
- Closes #353 #352 #351 #350 #349
2018-07-05 18:32:31 +02:00
Kasper Rynning-Tønnesen
8b9069b8be fixed some issues with switching channels and host-mode enabling 2018-07-01 22:26:29 +02:00
Kasper Rynning-Tønnesen
470a31d092 fixed some issues with switching channels and host-mode enabling 2018-07-01 22:26:29 +02:00
Kasper Rynning-Tønnesen
8b513f5582 Orange select-color line 2018-07-01 21:52:41 +02:00
Kasper Rynning-Tønnesen
42efd8cc8e Orange select-color line 2018-07-01 21:52:41 +02:00
Kasper Rynning-Tønnesen
1cb88fa999 even more nullchecks 2018-07-01 21:46:14 +02:00
Kasper Rynning-Tønnesen
ba9d96f1eb even more nullchecks 2018-07-01 21:46:14 +02:00
Kasper Rynning-Tønnesen
f8edd7c01a Fixing issue with embedded player suddenly showing up in debuglog 2018-07-01 21:41:31 +02:00
Kasper Rynning-Tønnesen
773b910b98 Fixing issue with embedded player suddenly showing up in debuglog 2018-07-01 21:41:31 +02:00
Kasper Rynning-Tønnesen
11509d9fbc More null-checks on wrapper 2018-07-01 21:34:56 +02:00
Kasper Rynning-Tønnesen
02efd01b87 More null-checks on wrapper 2018-07-01 21:34:56 +02:00
Kasper Rynning-Tønnesen
a9358ce360 Circular dependencies json-stringify and wrapper nullcheck 2018-07-01 21:31:59 +02:00
Kasper Rynning-Tønnesen
69f29c6157 Circular dependencies json-stringify and wrapper nullcheck 2018-07-01 21:31:59 +02:00
Kasper Rynning-Tønnesen
37aea96a95 moved sc.kill inside catch 2018-07-01 21:26:18 +02:00
Kasper Rynning-Tønnesen
3058e678a8 moved sc.kill inside catch 2018-07-01 21:26:18 +02:00
Kasper Rynning-Tønnesen
ac8693e650 readded error-window and fixed player hiding on small when loading 2018-07-01 21:25:01 +02:00
Kasper Rynning-Tønnesen
f76f7ae776 readded error-window and fixed player hiding on small when loading 2018-07-01 21:25:01 +02:00
Kasper Rynning-Tønnesen
8703adad14 Updated manifest.json 2018-07-01 21:08:24 +02:00
Kasper Rynning-Tønnesen
04594ccce2 Updated manifest.json 2018-07-01 21:08:24 +02:00
Kasper Rynning-Tønnesen
6fa293aba4 Fixed scaling issues with chat and soundcloud players on resizing 2018-06-28 16:51:31 +02:00
Kasper Rynning-Tønnesen
28f7b36730 Fixed scaling issues with chat and soundcloud players on resizing 2018-06-28 16:51:31 +02:00
Kasper Rynning-Tønnesen
cf68d52afb Update to new RC of materializecss 2018-06-28 16:19:03 +02:00
Kasper Rynning-Tønnesen
1881703fd8 Update to new RC of materializecss 2018-06-28 16:19:03 +02:00
Your Name
815a71b2d0 Small fix for frontpage-list icons 2018-06-27 03:57:15 -04:00
Your Name
4acdcf40b3 Small fix for frontpage-list icons 2018-06-27 03:57:15 -04:00
Kasper Rynning-Tønnesen
ece739a481 Fix for height of tabs on mobile 2018-06-27 07:28:11 +02:00
Kasper Rynning-Tønnesen
d352f76162 Fix for height of tabs on mobile 2018-06-27 07:28:11 +02:00
Your Name
4cfcd6a8a2 Updated style to have correct height for bigger player 2018-06-26 08:01:04 -04:00
Your Name
932cb54a09 Updated style to have correct height for bigger player 2018-06-26 08:01:04 -04:00
Kasper Rynning-Tønnesen
5af7fe2d37 Now sending next song when asked to correctly, and to only the askee 2018-06-23 13:30:00 +02:00
Kasper Rynning-Tønnesen
526bb36d99 Now sending next song when asked to correctly, and to only the askee 2018-06-23 13:30:00 +02:00
Kasper Rynning-Tønnesen
8139f786ec included a typo.. 2018-06-23 12:55:35 +02:00
Kasper Rynning-Tønnesen
ec8dd98ccb included a typo.. 2018-06-23 12:55:35 +02:00
Kasper Rynning-Tønnesen
f9fe694987 Better viewing of playlist on playing on a small screen
- Playlist-height adapts in case video is playing, allowing users to still easily scroll through videos while it is playing
2018-06-23 12:54:11 +02:00
Kasper Rynning-Tønnesen
a9eaa282a5 Better viewing of playlist on playing on a small screen
- Playlist-height adapts in case video is playing, allowing users to still easily scroll through videos while it is playing
2018-06-23 12:54:11 +02:00
Kasper Rynning-Tønnesen
1995c20f4e Not setting _uI on clientside 2018-06-22 19:36:37 +02:00
Kasper Rynning-Tønnesen
6f58e9514c Not setting _uI on clientside 2018-06-22 19:36:37 +02:00
Kasper Rynning-Tønnesen
23b36b1736 Trying more tests to avoid cookie being deleted 2018-06-22 18:59:19 +02:00
Kasper Rynning-Tønnesen
6e39f322f2 Trying more tests to avoid cookie being deleted 2018-06-22 18:59:19 +02:00
Kasper Rynning-Tønnesen
ef92068ea6 Fixed issue with embedded player, and trying to get better error-logs 2018-06-22 18:56:03 +02:00
Kasper Rynning-Tønnesen
f7df44d070 Fixed issue with embedded player, and trying to get better error-logs 2018-06-22 18:56:03 +02:00
Kasper Rynning-Tønnesen
3ef8a43c3c appstore and googleplay buttons 2018-06-22 07:06:22 +02:00
Kasper Rynning-Tønnesen
b46e125ff1 appstore and googleplay buttons 2018-06-22 07:06:22 +02:00
Kasper Rynning-Tønnesen
48099e93d8 Error log and now showing video on play in small player on desktop 2018-06-21 18:49:52 +02:00
Kasper Rynning-Tønnesen
b79527d681 Error log and now showing video on play in small player on desktop 2018-06-21 18:49:52 +02:00
Kasper Rynning-Tønnesen
58d26e4197 better total-users calculation hopefully 2018-06-20 14:59:18 +02:00
Kasper Rynning-Tønnesen
d5244c5162 better total-users calculation hopefully 2018-06-20 14:59:18 +02:00
Kasper Rynning-Tønnesen
43d5231231 next_song listener also now 2018-06-12 19:43:53 +02:00
Kasper Rynning-Tønnesen
893e622ba6 next_song listener also now 2018-06-12 19:43:53 +02:00
Kasper Rynning-Tønnesen
fc26aea9d0 Fixed typo 2018-06-11 15:55:23 +02:00
Kasper Rynning-Tønnesen
d879962465 Fixed typo 2018-06-11 15:55:23 +02:00
Kasper Rynning-Tønnesen
181576a0ce Showing/hiding previous button in host-mode also 2018-06-07 18:40:00 +02:00
Kasper Rynning-Tønnesen
67ede75ff6 Showing/hiding previous button in host-mode also 2018-06-07 18:40:00 +02:00
Kasper Rynning-Tønnesen
2b42ba58d1 No pointer-events on player on host-mode 2018-06-07 15:09:23 +02:00
Kasper Rynning-Tønnesen
2f6d68279c No pointer-events on player on host-mode 2018-06-07 15:09:23 +02:00
Kasper Rynning-Tønnesen
65fda10d64 Added some more info on host-mode 2018-06-07 14:34:17 +02:00
Kasper Rynning-Tønnesen
1ee8fce902 Added some more info on host-mode 2018-06-07 14:34:17 +02:00
Kasper Rynning-Tønnesen
7fd4ff0f34 Added toast for when new song is added, and changed so the playlistpage is switched to 1 on host-mode enabling 2018-06-07 14:25:17 +02:00
Kasper Rynning-Tønnesen
28e48c59d6 Added toast for when new song is added, and changed so the playlistpage is switched to 1 on host-mode enabling 2018-06-07 14:25:17 +02:00
Kasper Rynning-Tønnesen
38acd4db1c Re-enabled filter for badwords 2018-06-07 12:00:05 +02:00
Kasper Rynning-Tønnesen
37f71d5f69 Re-enabled filter for badwords 2018-06-07 12:00:05 +02:00
Kasper Rynning-Tønnesen
adb5993ff7 Changing qr-code and join link when changing channel by remotecontroller 2018-06-07 11:54:51 +02:00
Kasper Rynning-Tønnesen
25e2cdc707 Changing qr-code and join link when changing channel by remotecontroller 2018-06-07 11:54:51 +02:00
Kasper Rynning-Tønnesen
bc13ba9353 Merge branch 'master' of github.com:zoff-music/zoff 2018-06-07 11:43:48 +02:00
Kasper Rynning-Tønnesen
49f7e5876b Merge branch 'master' of github.com:zoff-music/zoff 2018-06-07 11:43:48 +02:00
Kasper Rynning-Tønnesen
a97336ea07 Fixed small issue where client-mode crashes 2018-06-07 11:43:23 +02:00
Kasper Rynning-Tønnesen
5826ad60a9 Fixed small issue where client-mode crashes 2018-06-07 11:43:23 +02:00
Kasper Rynning-Tønnesen
c917740d37 Added preview of host-mode 2018-06-07 11:41:39 +02:00
Kasper Rynning-Tønnesen
a6c96a5e78 Added preview of host-mode 2018-06-07 11:41:39 +02:00
Kasper Rynning-Tønnesen
8039ad1da3 Updated version of host-mode 2018-06-07 11:41:12 +02:00
Kasper Rynning-Tønnesen
8459923409 Updated version of host-mode 2018-06-07 11:41:12 +02:00
Kasper Rynning-Tønnesen
f4336bdb6a Added a function to embedded player in case it thinks it needs it 2018-06-06 22:54:50 +02:00
Kasper Rynning-Tønnesen
5cfeaa8917 Added a function to embedded player in case it thinks it needs it 2018-06-06 22:54:50 +02:00
Kasper Rynning-Tønnesen
1e016ef317 Removed some window-variables 2018-06-06 21:00:40 +02:00
Kasper Rynning-Tønnesen
d41db9cc76 Removed some window-variables 2018-06-06 21:00:40 +02:00
Kasper Rynning-Tønnesen
3b5b302a16 Now working with loadMedia on chromecast 2018-06-06 20:28:20 +02:00
Kasper Rynning-Tønnesen
820dfdb377 Now working with loadMedia on chromecast 2018-06-06 20:28:20 +02:00
Kasper Rynning-Tønnesen
779e93cca8 Added small info on how to go out of host-mode 2018-06-06 16:21:56 +02:00
Kasper Rynning-Tønnesen
14ff4b1d81 Added small info on how to go out of host-mode 2018-06-06 16:21:56 +02:00
Kasper Rynning-Tønnesen
058b235eb7 Fixed issue with too many/too few playlist-elements being shown on window-resize 2018-06-06 16:19:35 +02:00
Kasper Rynning-Tønnesen
f3db3701c9 Fixed issue with too many/too few playlist-elements being shown on window-resize 2018-06-06 16:19:35 +02:00
Kasper Rynning-Tønnesen
ddbd2a6381 Added missing function in embedded version 2018-06-06 16:05:01 +02:00
Kasper Rynning-Tønnesen
0abae82868 Added missing function in embedded version 2018-06-06 16:05:01 +02:00
Kasper Rynning-Tønnesen
319125eab4 Merge pull request #348 from zoff-music/feature/host-mode
Fixed issue with hostmode navigating and embedded issue
2018-06-06 16:01:54 +02:00
Kasper Rynning-Tønnesen
c620bfd8d6 Merge pull request #348 from zoff-music/feature/host-mode
Fixed issue with hostmode navigating and embedded issue
2018-06-06 16:01:54 +02:00
Kasper Rynning-Tønnesen
6587f371de Fixed issue with hostmode navigating and embedded issue 2018-06-06 16:01:33 +02:00
Kasper Rynning-Tønnesen
a858995efb Fixed issue with hostmode navigating and embedded issue 2018-06-06 16:01:33 +02:00
Kasper Rynning-Tønnesen
3475ec87c7 Merge pull request #347 from zoff-music/feature/host-mode
Added a host-mode
2018-06-06 15:59:34 +02:00
Kasper Rynning-Tønnesen
1688c1ae11 Merge pull request #347 from zoff-music/feature/host-mode
Added a host-mode
2018-06-06 15:59:34 +02:00
Kasper Rynning-Tønnesen
6636c8481a Added a host-mode
- Fullscreen video + playlist
- Removed fullscreenbutton in host-mode
- Removed skip-button in host-mode
- Disabled skipping in host-mode
- Removed buttons and rightclick menus in host-mode
- Host mode for easily having a computer playing at a party without being able to modifying the currently playing video/song
2018-06-06 15:58:28 +02:00
Kasper Rynning-Tønnesen
d23386b245 Added a host-mode
- Fullscreen video + playlist
- Removed fullscreenbutton in host-mode
- Removed skip-button in host-mode
- Disabled skipping in host-mode
- Removed buttons and rightclick menus in host-mode
- Host mode for easily having a computer playing at a party without being able to modifying the currently playing video/song
2018-06-06 15:58:28 +02:00
Kasper Rynning-Tønnesen
476f44c7e2 Sending chromecast-values again on reconnect 2018-06-05 19:20:51 +02:00
Kasper Rynning-Tønnesen
b91a7f17f1 Sending chromecast-values again on reconnect 2018-06-05 19:20:51 +02:00
Kasper Rynning-Tønnesen
8d314e150f Hiding 'waiting for video' text 2018-06-05 19:14:37 +02:00
Kasper Rynning-Tønnesen
408f9b4698 Hiding 'waiting for video' text 2018-06-05 19:14:37 +02:00
Kasper Rynning-Tønnesen
9eed4b5955 Trying to add a log to test if code is correctly run 2018-06-05 19:10:26 +02:00
Kasper Rynning-Tønnesen
832f27922d Trying to add a log to test if code is correctly run 2018-06-05 19:10:26 +02:00
Kasper Rynning-Tønnesen
800d63be17 Tried to update to add a small temporary log 2018-06-05 19:08:11 +02:00
Kasper Rynning-Tønnesen
e8e04192e7 Tried to update to add a small temporary log 2018-06-05 19:08:11 +02:00
Kasper Rynning-Tønnesen
028782d1d4 Use best connection to chromecast 2018-06-05 19:03:21 +02:00
Kasper Rynning-Tønnesen
4bc32235df Use best connection to chromecast 2018-06-05 19:03:21 +02:00
Kasper Rynning-Tønnesen
c134ccc058 Improved end-checking somewhat with less needed database-calls 2018-06-05 15:24:31 +02:00
Kasper Rynning-Tønnesen
da3d3ea83b Improved end-checking somewhat with less needed database-calls 2018-06-05 15:24:31 +02:00
Kasper Rynning-Tønnesen
48bb88d8e0 Less db-queries for settings 2018-06-05 15:08:48 +02:00
Kasper Rynning-Tønnesen
51f7477d1a Less db-queries for settings 2018-06-05 15:08:48 +02:00
Kasper Rynning-Tønnesen
9a4ffdc57c Added trust proxy 2018-06-05 14:28:19 +02:00
Kasper Rynning-Tønnesen
9c1eeb17d4 Added trust proxy 2018-06-05 14:28:19 +02:00
Kasper Rynning-Tønnesen
15112141e0 Added another fallback for id's being empty when chromecasting 2018-06-05 12:49:51 +02:00
Kasper Rynning-Tønnesen
38f7ccc06b Added another fallback for id's being empty when chromecasting 2018-06-05 12:49:51 +02:00
Kasper Rynning-Tønnesen
87aa720ea5 Merge pull request #346 from zoff-music/feature/testing-chromecast-fixes
Feature/testing chromecast fixes
2018-06-05 11:56:08 +02:00
Kasper Rynning-Tønnesen
ad65119b79 Merge pull request #346 from zoff-music/feature/testing-chromecast-fixes
Feature/testing chromecast fixes
2018-06-05 11:56:08 +02:00
Kasper Rynning-Tønnesen
25aca3eed3 Cleaning up logs, now working chromecast on private channel 2018-06-05 11:55:22 +02:00
Kasper Rynning-Tønnesen
55bc1593af Cleaning up logs, now working chromecast on private channel 2018-06-05 11:55:22 +02:00
Kasper Rynning-Tønnesen
031af8fe84 Created a forever loop 2018-06-05 11:07:49 +02:00
Kasper Rynning-Tønnesen
f9c95efe5d Created a forever loop 2018-06-05 11:07:49 +02:00
Kasper Rynning-Tønnesen
ea8f98ea07 Allowing chromecast to fetch position 2018-06-05 11:05:47 +02:00
Kasper Rynning-Tønnesen
a3aea4902b Allowing chromecast to fetch position 2018-06-05 11:05:47 +02:00
Kasper Rynning-Tønnesen
07494a6406 Typo in variable-name 2018-06-05 11:04:05 +02:00
Kasper Rynning-Tønnesen
88a3ecd108 Typo in variable-name 2018-06-05 11:04:05 +02:00
Kasper Rynning-Tønnesen
b55607ec1d Sending more values to get chromecast to think it is the mobile phone 2018-06-05 11:02:03 +02:00
Kasper Rynning-Tønnesen
2560450a6d Sending more values to get chromecast to think it is the mobile phone 2018-06-05 11:02:03 +02:00
Kasper Rynning-Tønnesen
afde001e8e Trying the flowthrough 2018-06-05 10:52:45 +02:00
Kasper Rynning-Tønnesen
abe6d1f5bb Trying the flowthrough 2018-06-05 10:52:45 +02:00
Kasper Rynning-Tønnesen
9268e5e2e4 Switching two variables around 2018-06-05 10:47:10 +02:00
Kasper Rynning-Tønnesen
764abdd19b Switching two variables around 2018-06-05 10:47:10 +02:00
Kasper Rynning-Tønnesen
e873ab5406 Trying to avoid chromecast fetching position 2018-06-05 10:43:16 +02:00
Kasper Rynning-Tønnesen
1476c8b0bc Trying to avoid chromecast fetching position 2018-06-05 10:43:16 +02:00
Kasper Rynning-Tønnesen
b1c7d26605 Typo.. 2018-06-05 10:38:09 +02:00
Kasper Rynning-Tønnesen
c4bacf5663 Typo.. 2018-06-05 10:38:09 +02:00
Kasper Rynning-Tønnesen
bddb623787 Trying a failsafe on the cookie_id 2018-06-05 10:37:12 +02:00
Kasper Rynning-Tønnesen
051d5df1ac Trying a failsafe on the cookie_id 2018-06-05 10:37:12 +02:00
Kasper Rynning-Tønnesen
3bfc7555e4 Trying to check useragent 2018-06-05 10:35:25 +02:00
Kasper Rynning-Tønnesen
94182ddaf7 Trying to check useragent 2018-06-05 10:35:25 +02:00
Kasper Rynning-Tønnesen
bc16ce4398 Uncommented a feature 2018-06-05 10:24:09 +02:00
Kasper Rynning-Tønnesen
4e77585a27 Uncommented a feature 2018-06-05 10:24:09 +02:00
Kasper Rynning-Tønnesen
dde19f2225 Forgot length of element 2018-06-04 23:55:52 +02:00
Kasper Rynning-Tønnesen
394b73e5d0 Forgot length of element 2018-06-04 23:55:52 +02:00
Kasper Rynning-Tønnesen
200ec58773 Logging more testing to see if data is set correctly 2018-06-04 23:54:16 +02:00
Kasper Rynning-Tønnesen
36cb2cd55a Logging more testing to see if data is set correctly 2018-06-04 23:54:16 +02:00
Kasper Rynning-Tønnesen
2b6aee218f Sending list with also 2018-06-04 23:48:40 +02:00
Kasper Rynning-Tønnesen
a44869a3cd Sending list with also 2018-06-04 23:48:40 +02:00
Kasper Rynning-Tønnesen
82d8c0c300 Forgot to export function 2018-06-04 23:46:42 +02:00
Kasper Rynning-Tønnesen
36618e34d4 Forgot to export function 2018-06-04 23:46:42 +02:00
Kasper Rynning-Tønnesen
89add8c90e Trying way of emulating cookies for chromecast 2018-06-04 23:45:25 +02:00
Kasper Rynning-Tønnesen
3bc0aa885f Trying way of emulating cookies for chromecast 2018-06-04 23:45:25 +02:00
Kasper Rynning-Tønnesen
0cca053abe trying with sending another id 2018-06-04 23:13:13 +02:00
Kasper Rynning-Tønnesen
b6c2a14445 trying with sending another id 2018-06-04 23:13:13 +02:00
Kasper Rynning-Tønnesen
5bb3731323 Printing out existing users 2018-06-04 23:09:29 +02:00
Kasper Rynning-Tønnesen
c38ec389ac Printing out existing users 2018-06-04 23:09:29 +02:00
Kasper Rynning-Tønnesen
0cf6ff51fa Printing tests to see what stop chromecast from joining channel 2018-06-04 23:06:42 +02:00
Kasper Rynning-Tønnesen
d5c8aa3dae Printing tests to see what stop chromecast from joining channel 2018-06-04 23:06:42 +02:00
Kasper Rynning-Tønnesen
6797cf1a50 Testing small things 2018-06-04 22:45:28 +02:00
Kasper Rynning-Tønnesen
2ebb35f377 Testing small things 2018-06-04 22:45:28 +02:00
Kasper Rynning-Tønnesen
077e7de1b8 Trying some more debugs 2018-06-04 22:37:19 +02:00
Kasper Rynning-Tønnesen
ed55f0768a Trying some more debugs 2018-06-04 22:37:19 +02:00
Kasper Rynning-Tønnesen
a5b55aa692 Sending channel on mobilespecs now 2018-06-04 22:30:36 +02:00
Kasper Rynning-Tønnesen
3720cea40f Sending channel on mobilespecs now 2018-06-04 22:30:36 +02:00
Kasper Rynning-Tønnesen
b0a24d9946 Updates 2018-06-04 22:27:02 +02:00
Kasper Rynning-Tønnesen
8bc5d1821e Updates 2018-06-04 22:27:02 +02:00
Kasper Rynning-Tønnesen
7234867531 Trying to fix crash on zoff 2018-06-04 22:04:17 +02:00
Kasper Rynning-Tønnesen
32d0d4f193 Trying to fix crash on zoff 2018-06-04 22:04:17 +02:00
Kasper Rynning-Tønnesen
72a0e7d6b0 Autoplaying celebration on api-complete 2018-06-04 16:24:30 +02:00
Kasper Rynning-Tønnesen
b8d04d9534 Autoplaying celebration on api-complete 2018-06-04 16:24:30 +02:00
Kasper Rynning-Tønnesen
9a6ee1baa2 Signing up for the API work again
- Can use the same email more than once, the only difference is that it wont create a new key, only a new link to the key
2018-06-04 16:21:36 +02:00
Kasper Rynning-Tønnesen
c7938f010d Signing up for the API work again
- Can use the same email more than once, the only difference is that it wont create a new key, only a new link to the key
2018-06-04 16:21:36 +02:00
Kasper Rynning-Tønnesen
9912e57148 Update README.md 2018-06-04 14:29:00 +02:00
Kasper Rynning-Tønnesen
f952f037e8 Update README.md 2018-06-04 14:29:00 +02:00
Kasper Rynning-Tønnesen
fdc8943260 Changed bitcoin-address to used address 2018-06-04 13:35:53 +02:00
Kasper Rynning-Tønnesen
cd0060f565 Changed bitcoin-address to used address 2018-06-04 13:35:53 +02:00
Kasper Rynning-Tønnesen
0a1f800659 Added a catch in promise for Jimp read 2018-06-04 11:38:04 +02:00
Kasper Rynning-Tønnesen
e8dc0d8c2d Added a catch in promise for Jimp read 2018-06-04 11:38:04 +02:00
Kasper Rynning-Tønnesen
21947a2717 There is no function called sendstatus 2018-06-04 11:33:05 +02:00
Kasper Rynning-Tønnesen
99c1b1bd99 There is no function called sendstatus 2018-06-04 11:33:05 +02:00
Kasper Rynning-Tønnesen
ee6497db0b Correct way of seeking in song 2018-06-01 15:24:33 +02:00
Kasper Rynning-Tønnesen
f3dd0b0063 Correct way of seeking in song 2018-06-01 15:24:33 +02:00
Kasper Rynning-Tønnesen
aace2b6549 Merge branch 'master' of github.com:zoff-music/zoff 2018-06-01 15:20:26 +02:00
Kasper Rynning-Tønnesen
102b15bde5 Merge branch 'master' of github.com:zoff-music/zoff 2018-06-01 15:20:26 +02:00
Kasper Rynning-Tønnesen
799bd1a223 Fixed issue with seeking too far in playlist where song has a set start-time 2018-06-01 15:20:07 +02:00
Kasper Rynning-Tønnesen
04b44ccda3 Fixed issue with seeking too far in playlist where song has a set start-time 2018-06-01 15:20:07 +02:00
Kasper Rynning-Tønnesen
e574d7542f No GA traffic on localhost 2018-06-01 13:07:53 +02:00
Kasper Rynning-Tønnesen
8d7feec269 No GA traffic on localhost 2018-06-01 13:07:53 +02:00
Kasper Rynning-Tønnesen
9727ef2039 Sorting list and added a fallback on crash 2018-05-31 22:24:25 +02:00
Kasper Rynning-Tønnesen
fdbe0c6e92 Sorting list and added a fallback on crash 2018-05-31 22:24:25 +02:00
Kasper Rynning-Tønnesen
b2a88014ba Removed a log 2018-05-31 17:29:18 +02:00
Kasper Rynning-Tønnesen
4a9bad6b11 Removed a log 2018-05-31 17:29:18 +02:00
Kasper Rynning-Tønnesen
f6fd8caa7e Better redirect with QRcode 2018-05-31 17:26:15 +02:00
Kasper Rynning-Tønnesen
2463ad3952 Better redirect with QRcode 2018-05-31 17:26:15 +02:00
Kasper Rynning-Tønnesen
a5c984f2e0 Fixed issue with API crashes the server 2018-05-31 16:56:59 +02:00
Kasper Rynning-Tønnesen
ff4397487a Fixed issue with API crashes the server 2018-05-31 16:56:59 +02:00
Kasper Rynning-Tønnesen
37764a4201 Not crashing on navigating to different channel 2018-05-31 15:51:17 +02:00
Kasper Rynning-Tønnesen
d8ad959ac5 Not crashing on navigating to different channel 2018-05-31 15:51:17 +02:00
Kasper Rynning-Tønnesen
f7664ac32b Fixed slashes issues in channel-names 2018-05-31 15:49:17 +02:00
Kasper Rynning-Tønnesen
b387250c2d Fixed slashes issues in channel-names 2018-05-31 15:49:17 +02:00
Kasper Rynning-Tønnesen
ded625ae25 Better handling of og_image 2018-05-31 15:31:54 +02:00
Kasper Rynning-Tønnesen
a3448e443b Better handling of og_image 2018-05-31 15:31:54 +02:00
Kasper Rynning-Tønnesen
4bdf9447f1 Updated facebook og:image 2018-05-31 15:15:17 +02:00
Kasper Rynning-Tønnesen
4cc91362db Updated facebook og:image 2018-05-31 15:15:17 +02:00
Kasper Rynning-Tønnesen
a4e73c8392 Bigger cards on frontpage to handle the bigger channel-names 2018-05-31 15:03:58 +02:00
Kasper Rynning-Tønnesen
7543ae8414 Bigger cards on frontpage to handle the bigger channel-names 2018-05-31 15:03:58 +02:00
Kasper Rynning-Tønnesen
96e61d7e6c Removed a small log 2018-05-31 15:03:18 +02:00
Kasper Rynning-Tønnesen
d8c211c4d3 Removed a small log 2018-05-31 15:03:18 +02:00
Kasper Rynning-Tønnesen
82ac25c5d2 Multi-word channel-names and API-fixes
- Spaces and signs allowed in channel-name
- Added missing functioncalls in RESTApi
2018-05-31 14:45:21 +02:00
Kasper Rynning-Tønnesen
9d10397fe5 Multi-word channel-names and API-fixes
- Spaces and signs allowed in channel-name
- Added missing functioncalls in RESTApi
2018-05-31 14:45:21 +02:00
Kasper Rynning-Tønnesen
e3c15431c5 Added possible crash-fix for subdomain-redirecting 2018-05-30 14:22:13 +02:00
Kasper Rynning-Tønnesen
ea8fedbe46 Added possible crash-fix for subdomain-redirecting 2018-05-30 14:22:13 +02:00
Kasper Rynning-Tønnesen
b971074788 Prettier JSON and less globally exposed variables 2018-05-30 14:19:10 +02:00
Kasper Rynning-Tønnesen
3c40e8960c Prettier JSON and less globally exposed variables 2018-05-30 14:19:10 +02:00
Kasper Rynning-Tønnesen
68c24b6317 Sorting on sending list via socket and RESTApi when projecting 2018-05-30 11:39:20 +02:00
Kasper Rynning-Tønnesen
65f7f50c18 Sorting on sending list via socket and RESTApi when projecting 2018-05-30 11:39:20 +02:00
Kasper Rynning-Tønnesen
fcaa50cfd4 Fixed pausing with spacebar playing video on casting 2018-05-29 19:51:27 +02:00
Kasper Rynning-Tønnesen
db62d92d1c Fixed pausing with spacebar playing video on casting 2018-05-29 19:51:27 +02:00
Kasper Rynning-Tønnesen
aceaa64920 Changed default requests per second to 20 instead of 100 2018-05-29 19:43:22 +02:00
Kasper Rynning-Tønnesen
5b056f1d15 Changed default requests per second to 20 instead of 100 2018-05-29 19:43:22 +02:00
Kasper Rynning-Tønnesen
637006ab73 Fixed some unhandled exceptions 2018-05-29 19:37:22 +02:00
Kasper Rynning-Tønnesen
084411d591 Fixed some unhandled exceptions 2018-05-29 19:37:22 +02:00
Kasper Rynning-Tønnesen
803ecb6a5b Trying some projections to have more consistency in data returned in RESTApi 2018-05-29 19:33:24 +02:00
Kasper Rynning-Tønnesen
a920e321c8 Trying some projections to have more consistency in data returned in RESTApi 2018-05-29 19:33:24 +02:00
Kasper Rynning-Tønnesen
adc55ee420 Updated thumbnailchecking
- Borrowing youtube 404 image for now if someone tries to trick the server to use other thumbnail than soundlcoud thumbnail when adding soundcloud song
- Setting thumbnail in db even for youtube-videos, for more consistency
2018-05-29 15:02:09 +02:00
Kasper Rynning-Tønnesen
ee546ade01 Updated thumbnailchecking
- Borrowing youtube 404 image for now if someone tries to trick the server to use other thumbnail than soundlcoud thumbnail when adding soundcloud song
- Setting thumbnail in db even for youtube-videos, for more consistency
2018-05-29 15:02:09 +02:00
Kasper Rynning-Tønnesen
51a5cc2b13 Merge branch 'master' of github.com:zoff-music/zoff 2018-05-29 14:38:27 +02:00
Kasper Rynning-Tønnesen
a0c6156852 Merge branch 'master' of github.com:zoff-music/zoff 2018-05-29 14:38:27 +02:00
Kasper Rynning-Tønnesen
90c8ba353d Sending source on playlist add, and printing source and thumbnail api 2018-05-29 14:38:18 +02:00
Kasper Rynning-Tønnesen
35ff48a15c Sending source on playlist add, and printing source and thumbnail api 2018-05-29 14:38:18 +02:00
Kasper Rynning-Tønnesen
4c26fff033 Flex auto on main-container 2018-05-25 16:20:16 +02:00
Kasper Rynning-Tønnesen
554b936f4d Flex auto on main-container 2018-05-25 16:20:16 +02:00
Kasper Rynning-Tønnesen
80ee5084a9 Removed local fonts 2018-05-24 13:31:00 +02:00
Kasper Rynning-Tønnesen
7b9670ac3c Removed local fonts 2018-05-24 13:31:00 +02:00
Kasper Rynning-Tønnesen
a0d01484ae Removed a jQuery file 2018-05-24 13:28:20 +02:00
Kasper Rynning-Tønnesen
70d8c19e09 Removed a jQuery file 2018-05-24 13:28:20 +02:00
Kasper Rynning-Tønnesen
120b3a0676 offline and color fixes
- ColorThief on soundcloud images
- Video title now working on offline instantiated player
- Green connected toast on connected
2018-05-24 13:22:29 +02:00
Kasper Rynning-Tønnesen
2174d9bfd7 offline and color fixes
- ColorThief on soundcloud images
- Video title now working on offline instantiated player
- Green connected toast on connected
2018-05-24 13:22:29 +02:00
Kasper Rynning-Tønnesen
0531c65ee2 Uncommented dismissal of toasts on click until a new materializecss version is released 2018-05-24 13:00:33 +02:00
Kasper Rynning-Tønnesen
b2a5901a11 Uncommented dismissal of toasts on click until a new materializecss version is released 2018-05-24 13:00:33 +02:00
Kasper Rynning-Tønnesen
b3fbd88a44 Not hiding result-containers on short input anymore 2018-05-22 22:09:44 +02:00
Kasper Rynning-Tønnesen
757062bb5a Not hiding result-containers on short input anymore 2018-05-22 22:09:44 +02:00
Kasper Rynning-Tønnesen
dacddf6cd7 Trying to fix issue where video pauses on skipping too fast 2018-05-21 14:16:12 +02:00
Kasper Rynning-Tønnesen
7df2bbe5b9 Trying to fix issue where video pauses on skipping too fast 2018-05-21 14:16:12 +02:00
Kasper Rynning-Tønnesen
de2607c403 Fix for thumbnail with soundwaves also 2018-05-20 16:34:18 +02:00
Kasper Rynning-Tønnesen
9f7f78db51 Fix for thumbnail with soundwaves also 2018-05-20 16:34:18 +02:00
Kasper Rynning-Tønnesen
aefafa5527 Fixed small issue with waveform-thumbnails from soundcloud 2018-05-20 16:27:30 +02:00
Kasper Rynning-Tønnesen
242f6d8363 Fixed small issue with waveform-thumbnails from soundcloud 2018-05-20 16:27:30 +02:00
Kasper Rynning-Tønnesen
c25b45c314 Fixed thumbnail issue 2018-05-20 16:22:24 +02:00
Kasper Rynning-Tønnesen
d326cb9e25 Fixed thumbnail issue 2018-05-20 16:22:24 +02:00
Kasper Rynning-Tønnesen
9db975e9e8 Fixed issue with farmhash and undefined ip 2018-05-15 12:47:39 +02:00
Kasper Rynning-Tønnesen
4e0e44e365 Fixed issue with farmhash and undefined ip 2018-05-15 12:47:39 +02:00
Kasper Rynning-Tønnesen
c11927de51 Added errormessage on faulty admin-login 2018-05-12 15:25:49 +02:00
Kasper Rynning-Tønnesen
7ae17b85e7 Added errormessage on faulty admin-login 2018-05-12 15:25:49 +02:00
Kasper Rynning-Tønnesen
d93c4eb2e7 Removed way of adding API-token from adminpanel 2018-05-12 15:18:30 +02:00
Kasper Rynning-Tønnesen
a1aadaa86c Removed way of adding API-token from adminpanel 2018-05-12 15:18:30 +02:00
Kasper Rynning-Tønnesen
0f22647c9c Sorting channels before adding to selects on adminpanel 2018-05-12 15:14:55 +02:00
Kasper Rynning-Tønnesen
6a9b9f4a91 Sorting channels before adding to selects on adminpanel 2018-05-12 15:14:55 +02:00
Kasper Rynning-Tønnesen
0a73c922c3 Fixed issues with imageblobblur and typo in io.js 2018-05-12 15:11:35 +02:00
Kasper Rynning-Tønnesen
b2d0d08cd7 Fixed issues with imageblobblur and typo in io.js 2018-05-12 15:11:35 +02:00
Kasper Rynning-Tønnesen
1bd1676f82 Updated performance of adminpanel 2018-05-12 15:07:59 +02:00
Kasper Rynning-Tønnesen
f4c9371593 Updated performance of adminpanel 2018-05-12 15:07:59 +02:00
Kasper Rynning-Tønnesen
1fd6427f31 Removed unused variables 2018-05-11 11:56:16 +02:00
Kasper Rynning-Tønnesen
49216d54bc Removed unused variables 2018-05-11 11:56:16 +02:00
Kasper Rynning-Tønnesen
627155cb04 Fixed issue where find-function says it found one element when it didnt 2018-05-11 11:48:24 +02:00
Kasper Rynning-Tønnesen
16268c1202 Fixed issue where find-function says it found one element when it didnt 2018-05-11 11:48:24 +02:00
Kasper Rynning-Tønnesen
4e33e50955 Updated /help on chat 2018-05-10 14:01:38 +02:00
Kasper Rynning-Tønnesen
31b75ab26e Updated /help on chat 2018-05-10 14:01:38 +02:00
Kasper Rynning-Tønnesen
8e5624be17 farmhash for worker-id, and prefix fix on firefox 2018-05-09 12:26:22 +02:00
Kasper Rynning-Tønnesen
c8920be95c farmhash for worker-id, and prefix fix on firefox 2018-05-09 12:26:22 +02:00
Kasper Rynning-Tønnesen
ee19212c81 Search and keypress issues
- Not searching on empty strings on soundcloud
- Fixed escape-button issue hiding song-title
- Escape button now works with closing find-dialog
- Fireplace-player fixes on open/close button for search
2018-05-08 14:56:27 +02:00
Kasper Rynning-Tønnesen
268ccc9dae Search and keypress issues
- Not searching on empty strings on soundcloud
- Fixed escape-button issue hiding song-title
- Escape button now works with closing find-dialog
- Fireplace-player fixes on open/close button for search
2018-05-08 14:56:27 +02:00
Kasper Rynning-Tønnesen
a0ae20b2fe Improved mobile and desktop
- Showing correct button on mobile
- Showing and hiding player-element on play/pause on mobile
- Improved playback on desktop, not stopping videoes if they're skipped while one is loading/buffering
- Small player visual-fixes on mobile
2018-05-08 09:56:55 +02:00
Kasper Rynning-Tønnesen
35014d6a05 Improved mobile and desktop
- Showing correct button on mobile
- Showing and hiding player-element on play/pause on mobile
- Improved playback on desktop, not stopping videoes if they're skipped while one is loading/buffering
- Small player visual-fixes on mobile
2018-05-08 09:56:55 +02:00
Kasper Rynning-Tønnesen
1233c8bb67 Merge branch 'master' of github.com:zoff-music/zoff 2018-05-07 16:16:27 +02:00
Kasper Rynning-Tønnesen
52fbf7a5b1 Merge branch 'master' of github.com:zoff-music/zoff 2018-05-07 16:16:27 +02:00
Kasper Rynning-Tønnesen
3f2b26c375 Fix for offline-mode having now_playing object updated wrongly 2018-05-07 16:16:13 +02:00
Kasper Rynning-Tønnesen
a3c945ab42 Fix for offline-mode having now_playing object updated wrongly 2018-05-07 16:16:13 +02:00
Kasper Rynning-Tønnesen
b060d74a5e Updated screenshots
Added searches with soundcloud tab in search
2018-05-07 15:52:31 +02:00
Kasper Rynning-Tønnesen
ac8371e949 Updated screenshots
Added searches with soundcloud tab in search
2018-05-07 15:52:31 +02:00
Kasper Rynning-Tønnesen
0710036ada Full-screen on soundcloud album-cover with videoonly for embedded 2018-05-07 15:46:04 +02:00
Kasper Rynning-Tønnesen
e6a4fe500b Full-screen on soundcloud album-cover with videoonly for embedded 2018-05-07 15:46:04 +02:00
Kasper Rynning-Tønnesen
93f9109848 Fix for allow autoplay in chrome 2018-05-07 15:25:39 +02:00
Kasper Rynning-Tønnesen
6b54c8766a Fix for allow autoplay in chrome 2018-05-07 15:25:39 +02:00
Kasper Rynning-Tønnesen
1d889d5a3d Other timeout 2018-05-07 15:19:34 +02:00
Kasper Rynning-Tønnesen
c029bb3887 Other timeout 2018-05-07 15:19:34 +02:00
Kasper Rynning-Tønnesen
38def13577 Trying with more timeout 2018-05-07 14:49:20 +02:00
Kasper Rynning-Tønnesen
6d0717d385 Trying with more timeout 2018-05-07 14:49:20 +02:00
Kasper Rynning-Tønnesen
f45dbe3b98 Workaround for playing if autoplay 2018-05-07 14:46:26 +02:00
Kasper Rynning-Tønnesen
f82ac79852 Workaround for playing if autoplay 2018-05-07 14:46:26 +02:00
Kasper Rynning-Tønnesen
653bebf8c1 Trying without the fix 2018-05-07 14:45:35 +02:00
Kasper Rynning-Tønnesen
43a1630966 Trying without the fix 2018-05-07 14:45:35 +02:00
Kasper Rynning-Tønnesen
59fcc35a47 Cheap workaround for playing embedded player 2018-05-07 14:44:17 +02:00
Kasper Rynning-Tønnesen
2672aa8490 Cheap workaround for playing embedded player 2018-05-07 14:44:17 +02:00
Kasper Rynning-Tønnesen
4d4479e067 Trying window load listener instead of DOMContentLoaded for embedded 2018-05-07 14:42:04 +02:00
Kasper Rynning-Tønnesen
d154d80036 Trying window load listener instead of DOMContentLoaded for embedded 2018-05-07 14:42:04 +02:00
Kasper Rynning-Tønnesen
3f1c45f65d Setting start and end to definite values on undefined 2018-05-07 14:35:59 +02:00
Kasper Rynning-Tønnesen
6c3fecbcbd Setting start and end to definite values on undefined 2018-05-07 14:35:59 +02:00
Kasper Rynning-Tønnesen
ee6454d626 Moved hashlink test in embed 2018-05-07 14:31:42 +02:00
Kasper Rynning-Tønnesen
c5a79e718a Moved hashlink test in embed 2018-05-07 14:31:42 +02:00
Kasper Rynning-Tønnesen
22b1e81cba Added a log to test embedded player 2018-05-07 14:28:34 +02:00
Kasper Rynning-Tønnesen
800731f09f Added a log to test embedded player 2018-05-07 14:28:34 +02:00
Kasper Rynning-Tønnesen
c7a75f2f72 Improvements to embedded player 2018-05-07 14:25:13 +02:00
Kasper Rynning-Tønnesen
4c35b7c447 Improvements to embedded player 2018-05-07 14:25:13 +02:00
Kasper Rynning-Tønnesen
1f921c3c34 Fixed issue where empty results would prevent search results from showing up 2018-05-07 13:48:19 +02:00
Kasper Rynning-Tønnesen
ec1e65372b Fixed issue where empty results would prevent search results from showing up 2018-05-07 13:48:19 +02:00
Kasper Rynning-Tønnesen
1c987514b3 Fixed issue with find in list function 2018-05-07 11:48:17 +02:00
Kasper Rynning-Tønnesen
96bae0ac75 Fixed issue with find in list function 2018-05-07 11:48:17 +02:00
Kasper Rynning-Tønnesen
ca2e73b00b Not removing toasts anymore until materializecss fixes issue that comes with it 2018-05-07 11:43:20 +02:00
Kasper Rynning-Tønnesen
9d2d56190e Not removing toasts anymore until materializecss fixes issue that comes with it 2018-05-07 11:43:20 +02:00
Kasper Rynning-Tønnesen
b84ee96907 Small fix for coll/channel issue 2018-05-07 11:04:51 +02:00
Kasper Rynning-Tønnesen
e0b1ee9329 Small fix for coll/channel issue 2018-05-07 11:04:51 +02:00
Kasper Rynning-Tønnesen
b886878c43 Fixed stuttering issues on leaving and entering channel 2018-05-06 13:02:19 +02:00
Kasper Rynning-Tønnesen
192548d26d Fixed stuttering issues on leaving and entering channel 2018-05-06 13:02:19 +02:00
Kasper Rynning-Tønnesen
fe01bcbe29 Stopping soundcloud player when navigating to frontpage from channel 2018-05-06 12:44:54 +02:00
Kasper Rynning-Tønnesen
9f1b882335 Stopping soundcloud player when navigating to frontpage from channel 2018-05-06 12:44:54 +02:00
Kasper Rynning-Tønnesen
3d1ec18cbd Visual fixes for search and fetchsuggestions fixesE 2018-05-06 12:16:08 +02:00
Kasper Rynning-Tønnesen
5b554fc328 Visual fixes for search and fetchsuggestions fixesE 2018-05-06 12:16:08 +02:00
Kasper Rynning-Tønnesen
0d1c3139cb Removing player correctly on closing player from frontpage 2018-05-05 21:57:35 +02:00
Kasper Rynning-Tønnesen
ddab34cf4f Removing player correctly on closing player from frontpage 2018-05-05 21:57:35 +02:00
Kasper Rynning-Tønnesen
723e163e80 Fixed small issues with client and navigating to a channel with soundcloud songs 2018-05-05 13:47:15 +02:00
Kasper Rynning-Tønnesen
ea6457dd77 Fixed small issues with client and navigating to a channel with soundcloud songs 2018-05-05 13:47:15 +02:00
Kasper Rynning-Tønnesen
8a64fc816a Fixes for chromecasting and embedded player 2018-05-05 13:05:49 +02:00
Kasper Rynning-Tønnesen
31904a2f84 Fixes for chromecasting and embedded player 2018-05-05 13:05:49 +02:00
Kasper Rynning-Tønnesen
d4e3a8afde Empty_clear variable 2018-05-04 22:54:03 +02:00
Kasper Rynning-Tønnesen
8083efa676 Empty_clear variable 2018-05-04 22:54:03 +02:00
Kasper Rynning-Tønnesen
05422252c7 Forgot to remove SC as a variable locally 2018-05-04 22:51:56 +02:00
Kasper Rynning-Tønnesen
b5aac4cb8b Forgot to remove SC as a variable locally 2018-05-04 22:51:56 +02:00
Kasper Rynning-Tønnesen
658096b663 Fixed loading issues with soundcloud player 2018-05-04 22:49:41 +02:00
Kasper Rynning-Tønnesen
e574c86119 Fixed loading issues with soundcloud player 2018-05-04 22:49:41 +02:00
Kasper Rynning-Tønnesen
1c5b2ad3df Updated adminpanel to be able to pin a list with fewer elements generally also 2018-05-04 22:40:19 +02:00
Kasper Rynning-Tønnesen
a256477750 Updated adminpanel to be able to pin a list with fewer elements generally also 2018-05-04 22:40:19 +02:00
Kasper Rynning-Tønnesen
ee3f178333 Updated adminpanel to be able to pin a list with fewer elements 2018-05-04 22:35:26 +02:00
Kasper Rynning-Tønnesen
6cde9f4674 Updated adminpanel to be able to pin a list with fewer elements 2018-05-04 22:35:26 +02:00
Kasper Rynning-Tønnesen
588abcea2a Fix for crash on first song in channel is from soundcloud, and uglifying css with gulp again 2018-05-04 22:32:53 +02:00
Kasper Rynning-Tønnesen
e71fe4cf26 Fix for crash on first song in channel is from soundcloud, and uglifying css with gulp again 2018-05-04 22:32:53 +02:00
Kasper Rynning-Tønnesen
25349ff6de Merge pull request #344 from zoff-music/feature/soundcloud-player
Fixes for suggested-showing of soundcloud objects
2018-05-04 22:26:31 +02:00
Kasper Rynning-Tønnesen
e3729ee960 Merge pull request #344 from zoff-music/feature/soundcloud-player
Fixes for suggested-showing of soundcloud objects
2018-05-04 22:26:31 +02:00
Kasper Rynning-Tønnesen
d9283a33b5 Fixes for suggested-showing of soundcloud objects 2018-05-04 22:25:43 +02:00
Kasper Rynning-Tønnesen
6412d0a478 Fixes for suggested-showing of soundcloud objects 2018-05-04 22:25:43 +02:00
Kasper Rynning-Tønnesen
f9b56858fe Merge pull request #343 from zoff-music/feature/soundcloud-player
Fix for suggestions not appearing
2018-05-04 22:07:16 +02:00
Kasper Rynning-Tønnesen
6a265e2415 Merge pull request #343 from zoff-music/feature/soundcloud-player
Fix for suggestions not appearing
2018-05-04 22:07:16 +02:00
Kasper Rynning-Tønnesen
dfe37df77c Fix for suggestions not appearing 2018-05-04 22:06:41 +02:00
Kasper Rynning-Tønnesen
7b91a5e5b5 Fix for suggestions not appearing 2018-05-04 22:06:41 +02:00
Kasper Rynning-Tønnesen
2531f7caef Merge pull request #342 from zoff-music/feature/soundcloud-player
Feature/soundcloud player
2018-05-04 21:55:57 +02:00
Kasper Rynning-Tønnesen
5c79497b4f Merge pull request #342 from zoff-music/feature/soundcloud-player
Feature/soundcloud player
2018-05-04 21:55:57 +02:00
Kasper Rynning-Tønnesen
f5bdaadff5 Updated version 2018-05-04 21:55:07 +02:00
Kasper Rynning-Tønnesen
42056e6de6 Updated version 2018-05-04 21:55:07 +02:00
Kasper Rynning-Tønnesen
2a4b7380e4 Better handling for frontpage-lists thumbnails 2018-05-04 21:44:57 +02:00
Kasper Rynning-Tønnesen
b87791ef7f Better handling for frontpage-lists thumbnails 2018-05-04 21:44:57 +02:00
Kasper Rynning-Tønnesen
54a42548cf Cleaned up logs 2018-05-04 21:19:10 +02:00
Kasper Rynning-Tønnesen
2db07b0040 Cleaned up logs 2018-05-04 21:19:10 +02:00
Kasper Rynning-Tønnesen
1a170c6509 API now sending source and thumbnail 2018-05-04 21:05:34 +02:00
Kasper Rynning-Tønnesen
31f466d2f2 API now sending source and thumbnail 2018-05-04 21:05:34 +02:00
Kasper Rynning-Tønnesen
2c449e628d Added support for info from soundcloud on next_song info 2018-05-04 20:50:26 +02:00
Kasper Rynning-Tønnesen
4557430ac2 Added support for info from soundcloud on next_song info 2018-05-04 20:50:26 +02:00
Kasper Rynning-Tønnesen
6e4f844fea Added btc image 2018-05-04 17:38:08 +02:00
Kasper Rynning-Tønnesen
2afb6ea64f Added btc image 2018-05-04 17:38:08 +02:00
Kasper Rynning-Tønnesen
829c31b268 Sending source of video to chromecast 2018-05-04 17:21:18 +02:00
Kasper Rynning-Tønnesen
bebf397687 Sending source of video to chromecast 2018-05-04 17:21:18 +02:00
Kasper Rynning-Tønnesen
fc7966a008 Fixed issues with embedded player 2018-05-04 17:15:04 +02:00
Kasper Rynning-Tønnesen
d40c2503cd Fixed issues with embedded player 2018-05-04 17:15:04 +02:00
Kasper Rynning-Tønnesen
3c87a148e1 Publisher and soundcloud attribute, streamer
- More attribute to publisher and soundcloud
- Started using the streamer api instead of widget api
2018-05-04 16:21:47 +02:00
Kasper Rynning-Tønnesen
c5e77500a2 Publisher and soundcloud attribute, streamer
- More attribute to publisher and soundcloud
- Started using the streamer api instead of widget api
2018-05-04 16:21:47 +02:00
Kasper Rynning-Tønnesen
06fb8d7046 Added buy/artist buttons when playing from soundcloud 2018-05-04 14:53:34 +02:00
Kasper Rynning-Tønnesen
4e189d5c94 Added buy/artist buttons when playing from soundcloud 2018-05-04 14:53:34 +02:00
Kasper Rynning-Tønnesen
3e1473caf8 Exporting of soundcloud implementation
- Fixed play/pause issue on stopping and playing the player
2018-05-04 14:40:02 +02:00
Kasper Rynning-Tønnesen
1bf0b0e5c0 Exporting of soundcloud implementation
- Fixed play/pause issue on stopping and playing the player
2018-05-04 14:40:02 +02:00
Kasper Rynning-Tønnesen
78be2aa820 Updated README's and other files to include SoundCloud mentions 2018-05-03 19:46:10 +02:00
Kasper Rynning-Tønnesen
e4cdd8427d Updated README's and other files to include SoundCloud mentions 2018-05-03 19:46:10 +02:00
Kasper Rynning-Tønnesen
2df793abb1 Updated RESTApi README 2018-05-03 19:36:53 +02:00
Kasper Rynning-Tønnesen
f56fa3f4de Updated RESTApi README 2018-05-03 19:36:53 +02:00
Kasper Rynning-Tønnesen
d6b7301464 Close player on frontpage now works with removing soundcloud 2018-05-03 19:34:33 +02:00
Kasper Rynning-Tønnesen
a597530613 Close player on frontpage now works with removing soundcloud 2018-05-03 19:34:33 +02:00
Kasper Rynning-Tønnesen
9442a2093b Fixed issues with window-history and soundcloud.load function 2018-05-03 19:31:31 +02:00
Kasper Rynning-Tønnesen
b3231bf54f Fixed issues with window-history and soundcloud.load function 2018-05-03 19:31:31 +02:00
Kasper Rynning-Tønnesen
a095e23db0 Fixed stuttering on load from soundcloud 2018-05-03 16:50:27 +02:00
Kasper Rynning-Tønnesen
c1b905612d Fixed stuttering on load from soundcloud 2018-05-03 16:50:27 +02:00
Kasper Rynning-Tønnesen
00e4f70c36 Upped performance of load somewhat for channel-load 2018-05-03 16:40:49 +02:00
Kasper Rynning-Tønnesen
08f72e1003 Upped performance of load somewhat for channel-load 2018-05-03 16:40:49 +02:00
Kasper Rynning-Tønnesen
3b1a87f14d Embedded version
- Embedded version now working with soundcloud-player
2018-05-03 15:45:34 +02:00
Kasper Rynning-Tønnesen
7747e29158 Embedded version
- Embedded version now working with soundcloud-player
2018-05-03 15:45:34 +02:00
Kasper Rynning-Tønnesen
7d9873efd8 Start-end event updated
- Visual fixes
- Set start-time and end-time for soundcloud player working
2018-05-03 15:32:42 +02:00
Kasper Rynning-Tønnesen
9a4fdda011 Start-end event updated
- Visual fixes
- Set start-time and end-time for soundcloud player working
2018-05-03 15:32:42 +02:00
Kasper Rynning-Tønnesen
2e404e6a61 Prettier soundcloud results and search-tabs 2018-05-03 14:30:49 +02:00
Kasper Rynning-Tønnesen
602f66c03b Prettier soundcloud results and search-tabs 2018-05-03 14:30:49 +02:00
Kasper Rynning-Tønnesen
9b1e91783e Soundcloud-player + soundcloud-search added 2018-05-03 14:27:54 +02:00
Kasper Rynning-Tønnesen
e94c024413 Soundcloud-player + soundcloud-search added 2018-05-03 14:27:54 +02:00
Kasper Rynning-Tønnesen
93fc30dada Url validation on thumbnails suggested 2018-05-02 15:31:59 +02:00
Kasper Rynning-Tønnesen
a66eb49b2b Opening channel-info on open settings 2018-05-01 14:22:55 +02:00
Kasper Rynning-Tønnesen
3d3d6eb29b Thumbnail not crashing embedded player 2018-05-01 14:14:42 +02:00
Kasper Rynning-Tønnesen
96e0c31bf9 Fixed sizing issue of playlistitems in client 2018-04-30 18:43:18 +02:00
Kasper Rynning-Tønnesen
b2f51c4682 Updates for channel-user-password modal and channel-info input-fields 2018-04-30 16:05:09 +02:00
Kasper Rynning-Tønnesen
902cc9df11 Not only 'jomedia' channel 2018-04-28 01:45:16 +02:00
Kasper Rynning-Tønnesen
72ba01d34b Fixed query-element in url issue 2018-04-28 01:41:22 +02:00
Kasper Rynning-Tønnesen
6b69001b03 Transitions you say 2018-04-27 15:14:00 +02:00
Kasper Rynning-Tønnesen
3e06af930f Toasts shouldn't be turned 2018-04-27 15:09:01 +02:00
Kasper Rynning-Tønnesen
a80ab6721a inverting is cool 2018-04-27 15:07:58 +02:00
Kasper Rynning-Tønnesen
ffc324fab9 Changed element to be affected 2018-04-27 15:01:13 +02:00
Kasper Rynning-Tønnesen
87bfb443fe Added a cool thing 2018-04-27 14:57:28 +02:00
Kasper Rynning-Tønnesen
3f4662d90e Update in refreshing viewers in playlist 2018-04-27 13:25:37 +02:00
Kasper Rynning-Tønnesen
1c4834211d Fixed small issue with pausing player with spacebar 2018-04-27 13:17:15 +02:00
Kasper Rynning-Tønnesen
1e53f371f6 updated gulp-file 2018-04-27 12:57:47 +02:00
Kasper Rynning-Tønnesen
9b3f2d00c5 Merge branch 'master' of github.com:zoff-music/zoff 2018-04-27 12:57:08 +02:00
Kasper Rynning-Tønnesen
e8208c32ea Fixed listeners-issue on embedded player 2018-04-27 12:56:47 +02:00
Kasper Rynning-Tønnesen
ceaaf540a1 Merge pull request #340 from zoff-music/fix/jquery-less-cross-browser-issues
Fixed issue with volume-control not being styled correctly
2018-04-26 23:14:05 +02:00
Kasper Rynning-Tønnesen
fd83f09b3c Fixed issue with volume-control not being styled correctly 2018-04-26 23:13:47 +02:00
Kasper Rynning-Tønnesen
69d118d511 Merge pull request #339 from zoff-music/fix/jquery-less-cross-browser-issues
Fixed small issue with context-menu
2018-04-26 17:18:11 +02:00
Kasper Rynning-Tønnesen
3cdb6c756d Fixed small issue with context-menu 2018-04-26 17:17:35 +02:00
Kasper Rynning-Tønnesen
4e093c3377 Merge pull request #338 from zoff-music/fix/jquery-less-cross-browser-issues
Fix/jquery less cross browser issues
2018-04-26 17:15:43 +02:00
Kasper Rynning-Tønnesen
fc182882a0 Fix for firefox not working 2018-04-26 17:15:16 +02:00
Kasper Rynning-Tønnesen
64da529ec2 Started fixing of cross-browser errors that came with removing jQuery 2018-04-26 16:11:59 +02:00
Kasper Rynning-Tønnesen
6b926ca92e Fireplace-player same size as other player 2018-04-26 15:30:53 +02:00
Kasper Rynning-Tønnesen
be6f91f17e Spacebar to pause video again 2018-04-26 13:49:40 +02:00
Kasper Rynning-Tønnesen
abee56d2ce Fixed issue with local-mode tooltip of position in song not showing up 2018-04-26 13:31:19 +02:00
Kasper Rynning-Tønnesen
a95828843b Fixed issue with playlist being loaded incorrectly 2018-04-26 13:15:45 +02:00
Kasper Rynning-Tønnesen
5478b6a6e2 Fixed suggestions notifier error 2018-04-26 13:07:48 +02:00
Kasper Rynning-Tønnesen
58ccdada3b Fixed list-populate error
- Fixed issue where updating a list would cause it to be empty visually on update for users
2018-04-26 12:24:54 +02:00
Kasper Rynning-Tønnesen
61647e96c7 Removed channel-name tap-target 2018-04-26 11:20:29 +02:00
Kasper Rynning-Tønnesen
6777ace942 Updated readme and about to remove jQuery mentions 2018-04-25 23:52:47 +02:00
Kasper Rynning-Tønnesen
a157daf7ec Trying without error-catcher 2018-04-25 23:37:07 +02:00
Kasper Rynning-Tønnesen
e4bafbc0e5 Fixed issue when closing player from frontpage 2018-04-25 23:29:06 +02:00
Kasper Rynning-Tønnesen
4d25db31df Parent is not a function 2018-04-25 23:25:43 +02:00
Kasper Rynning-Tønnesen
78c2f57679 Fixed parentIssue 2018-04-25 23:24:30 +02:00
Kasper Rynning-Tønnesen
ae827d295d Merge pull request #337 from zoff-music/refactor/no-jquery
Refactor/no jquery
2018-04-25 23:20:43 +02:00
Kasper Rynning-Tønnesen
15eeb3cc60 Working without jQuery 2018-04-25 23:19:49 +02:00
Kasper Rynning-Tønnesen
8cb8c46f2f Working results 2018-04-25 17:11:58 +02:00
Kasper Rynning-Tønnesen
e01bef2ace Completely removed jQuery
- Missing results/search not working properly
2018-04-25 16:59:40 +02:00
Kasper Rynning-Tønnesen
f540f10cca Working onepage_load without jQuery elements 2018-04-24 19:01:40 +02:00
Kasper Rynning-Tønnesen
93cffa9ded Created dynamic listeners, and functions to add/remove listeners 2018-04-24 16:05:15 +02:00
Kasper Rynning-Tønnesen
f3be9dbb91 Merge branch 'master' into refactor/no-jquery 2018-04-24 14:57:23 +02:00
Kasper Rynning-Tønnesen
5e563110e3 Fixed results error 2018-04-24 14:57:15 +02:00
Kasper Rynning-Tønnesen
000239514b Merge branch 'master' into refactor/no-jquery 2018-04-24 14:51:26 +02:00
Kasper Rynning-Tønnesen
5cc4cfaf55 overflow of controls 2018-04-24 14:51:03 +02:00
Kasper Rynning-Tønnesen
c29f4fc390 Merge branch 'master' into refactor/no-jquery 2018-04-24 14:48:46 +02:00
Kasper Rynning-Tønnesen
6a3851a765 Fixed issues with sidenav accordion 2018-04-24 14:48:31 +02:00
Kasper Rynning-Tønnesen
a5134928b5 migrated much of the listeners 2018-04-24 14:47:31 +02:00
Kasper Rynning-Tønnesen
30885e332b Removed 300 or something jquery references so far 2018-04-24 12:05:57 +02:00
Kasper Rynning-Tønnesen
529e8f2f38 Merge branch 'master' into refactor/no-jquery 2018-04-24 10:19:48 +02:00
Kasper Rynning-Tønnesen
3662e90e28 Removed some logs 2018-04-24 10:19:35 +02:00
Kasper Rynning-Tønnesen
a5231b42b5 Merge branch 'master' into refactor/no-jquery 2018-04-24 10:18:42 +02:00
Kasper Rynning-Tønnesen
af384de79e Fixed issue with slider not working properly on mobile 2018-04-24 10:17:29 +02:00
Kasper Rynning-Tønnesen
eb45eb48fc Small changes 2018-04-24 09:49:38 +02:00
Kasper Rynning-Tønnesen
a6e91ce590 Started migration from jquery 2018-04-23 17:53:07 +02:00
Kasper Rynning-Tønnesen
6dabe2963e using correct api-token on live 2018-04-23 16:49:44 +02:00
Kasper Rynning-Tønnesen
089471cd14 Fixed issue with slider_values lingering 2018-04-23 16:48:15 +02:00
Kasper Rynning-Tønnesen
88f18240df Merge pull request #336 from zoff-music/feature/no-jquery-ui
Stopped using jQuery UI
2018-04-23 16:43:11 +02:00
Kasper Rynning-Tønnesen
daa5f16945 Stopped using jQuery UI 2018-04-23 16:42:43 +02:00
Kasper Rynning-Tønnesen
5adf770af0 White text in find-form 2018-04-19 15:53:48 +02:00
Kasper Rynning-Tønnesen
9a00c426c6 Fixed issue where filter was filtering bad words someplaces, and somewhere it doesnt 2018-04-19 12:00:44 +02:00
Kasper Rynning-Tønnesen
dd8aac577a Fixed password-lock position 2018-04-11 16:46:36 +02:00
Kasper Rynning-Tønnesen
fc0f03e171 Updated jquery-ui 2018-04-11 14:56:17 +02:00
Kasper Rynning-Tønnesen
1535ac7251 Embed-controls position was 1 pixel off 2018-04-11 11:23:38 +02:00
Kasper Rynning-Tønnesen
d395648f2d Unique ids 2018-04-10 13:18:15 +02:00
Kasper Rynning-Tønnesen
0cfb1b6389 Fixed sizing of player 2018-04-10 13:06:54 +02:00
Kasper Rynning-Tønnesen
9273576fe6 Fixed issue with mobile-client on password-protected list 2018-04-08 17:41:24 +02:00
Kasper Rynning-Tønnesen
58362f14bb Fixed crashing 2018-04-06 17:59:40 +02:00
Kasper Rynning-Tønnesen
6bac97c15f Fixed issue with localmode 2018-04-06 17:50:25 +02:00
Kasper Rynning-Tønnesen
a44856eb57 Solid background loading on mobile 2018-04-06 17:46:40 +02:00
Kasper Rynning-Tønnesen
5a2cb39454 Better counter 2018-04-06 17:43:25 +02:00
Kasper Rynning-Tønnesen
88b1426bb1 Not showing suggested on mobileload 2018-04-06 17:39:47 +02:00
Kasper Rynning-Tønnesen
3fbca854d7 Not showing suggested either 2018-04-06 17:29:33 +02:00
Kasper Rynning-Tønnesen
2a8ee0673d Fixed issue with navigating on mobile 2018-04-06 17:17:30 +02:00
Kasper Rynning-Tønnesen
c8bfe33253 Pointer for nav-btns 2018-04-06 16:55:28 +02:00
Kasper Rynning-Tønnesen
6be0fceb78 Removed a dead file, and fixed some styling 2018-04-06 16:54:03 +02:00
Kasper Rynning-Tønnesen
435fb23fd3 Fixed issues with client 2018-04-06 16:51:04 +02:00
Kasper Rynning-Tønnesen
1d9b3a42b1 Merge pull request #334 from zoff-music/feature/materializecss-beta
Changed to materlializeCSS beta-1, that doesn't use jQuery
2018-04-06 15:52:17 +02:00
Kasper Rynning-Tønnesen
bd9b42fd9e Changed to materlializeCSS beta-1, that doesn't use jQuery 2018-04-06 15:51:04 +02:00
Kasper Rynning-Tønnesen
9164541750 Small fix for variable not defined crashing server 2018-04-06 13:23:52 +02:00
Kasper Rynning-Tønnesen
1394d6420d Tooltip on channel-name 2018-04-06 13:19:45 +02:00
Kasper Rynning-Tønnesen
c245ec80ff Removed some dependencies 2018-04-06 13:16:10 +02:00
Kasper Rynning-Tønnesen
d8ecd34960 Updated socket.io version 2018-04-06 12:51:31 +02:00
Kasper Rynning-Tønnesen
37ffa194e2 Featured channel-changes
- Tooltip for better info
- Removed pin from all other frontpage cards
2018-04-06 12:42:22 +02:00
Kasper Rynning-Tønnesen
7fde03e88e Updates for better handling of deleting list and inserting full playlist 2018-04-05 13:52:05 +02:00
Kasper Rynning-Tønnesen
72f204825e Better colorthief handling
- Moved colorthief handling to api, making it easier to controll where the requests comes from
2018-04-03 16:40:34 +02:00
Kasper Rynning-Tønnesen
02667f4348 Imageblob only from allowed origin 2018-04-03 16:19:11 +02:00
Kasper Rynning-Tønnesen
355926ddff Returning on imageblob error 2018-04-03 16:11:25 +02:00
Kasper Rynning-Tønnesen
20922fb494 No tap-target in client-mode
- some minor restructuring of if/unless
2018-04-03 16:09:16 +02:00
Kasper Rynning-Tønnesen
c710fb56e2 SameSite for cookies 2018-03-30 10:57:12 +02:00
Kasper Rynning-Tønnesen
d15c5c9e89 Fixed issue with channelnames with weird characters not working 2018-03-26 14:48:03 +02:00
Kasper Rynning-Tønnesen
e5460bf605 Both client and mobile send ajax at the beginning when socket disconnected 2018-03-23 18:40:08 +01:00
Kasper Rynning-Tønnesen
bb59378a2d Adding a log 2018-03-23 18:20:25 +01:00
Kasper Rynning-Tønnesen
c03d85b83f Trying fix for vote/add on mobile-client 2018-03-23 18:18:24 +01:00
Kasper Rynning-Tønnesen
a02cdbcf88 Forgot to add to embed.js 2018-03-23 17:55:17 +01:00
Kasper Rynning-Tønnesen
3048527635 Fixed issue with client vote/add and such 2018-03-23 17:54:43 +01:00
Kasper Rynning-Tønnesen
264948a88a Removed unused variable 2018-03-22 16:01:14 +01:00
Kasper Rynning-Tønnesen
9ccdcf7aec Better YouTube importing, and auth-form prettier 2018-03-22 15:53:55 +01:00
Kasper Rynning-Tønnesen
f518a06ed2 Changed functionality for adding playlists
dquote> - Sending event for addPlaylist, and sending the whole list instead of one-by one
2018-03-21 21:10:08 +01:00
Kasper Rynning-Tønnesen
4e87a6309f Uncommented 2018-03-21 20:29:35 +01:00
Kasper Rynning-Tønnesen
25f515ffa7 Fixed issue with not incrementing on adding from other channel 2018-03-21 20:29:15 +01:00
Kasper Rynning-Tønnesen
2794ff7234 Fix for elements with weird collectionnames in mongodb 2018-03-21 15:10:36 +01:00
Kasper Rynning-Tønnesen
859062204c Added functionality to add songs from another channel 2018-03-21 15:01:14 +01:00
Kasper Rynning-Tønnesen
8d14b14c65 Fixed issue with .replace of boolean 2018-03-20 08:07:00 +01:00
Kasper Rynning-Tønnesen
1da48a7f1a Fixed issue with crashing server 2018-03-19 23:48:11 +01:00
Kasper Rynning-Tønnesen
910ad7ed76 onepage_load not working twice 2018-03-19 15:08:29 +01:00
Kasper Rynning-Tønnesen
a9d82566ef Fixed padding-issue on mobile 2018-03-19 14:52:55 +01:00
Kasper Rynning-Tønnesen
4d3d61b887 Added update to the offline service-worker file 2018-03-19 14:51:42 +01:00
Kasper Rynning-Tønnesen
b6b7118fd8 margin for viewers instead of padding 2018-03-19 13:22:31 +01:00
Kasper Rynning-Tønnesen
701ff55588 Replacing without crashing 2018-03-19 13:17:39 +01:00
Kasper Rynning-Tønnesen
2a9f5dc434 Moved context-menu to work from frontpage also 2018-03-19 12:06:59 +01:00
Kasper Rynning-Tønnesen
95d518d42f More fixed positions on mobile 2018-03-18 18:47:07 +01:00
Kasper Rynning-Tønnesen
f70cf00fd1 Fixed issue with channels having spaces 2018-03-18 18:19:42 +01:00
Kasper Rynning-Tønnesen
2e29f8e20f Update to embed-css 2018-03-18 14:25:14 +01:00
Kasper Rynning-Tønnesen
5786e84974 Moved some scripts around to try and reduce render-blocking 2018-03-18 14:06:13 +01:00
Kasper Rynning-Tønnesen
83683b497f Results and padding for playlist sizing 2018-03-17 20:10:05 +01:00
Kasper Rynning-Tønnesen
a26bf00634 Changes to fit the sizing of channelname and title 2018-03-17 20:05:17 +01:00
Kasper Rynning-Tønnesen
a81e21fd99 Moved some db things to db file
- Changed some visuals on scaling website
2018-03-17 19:55:02 +01:00
Kasper Rynning-Tønnesen
b0dfa2e5b7 Fixed issue with chromecast-framework loading 2018-03-17 12:37:58 +01:00
Kasper Rynning-Tønnesen
e9c7f63d5d Adding another test and fix for lists with multiple now-playing videos 2018-03-16 17:30:54 +01:00
Kasper Rynning-Tønnesen
7412837739 trying to fix issues with mobile-navigation with sockets 2018-03-16 17:06:11 +01:00
Kasper Rynning-Tønnesen
8d07cfa772 Not setting name on empty input 2018-03-16 10:49:57 +01:00
Kasper Rynning-Tønnesen
053ca27abe Fixed issue with setting limit of api-token 2018-03-16 10:47:34 +01:00
Kasper Rynning-Tønnesen
c4d20da02e Showing origin in adminpanel also 2018-03-16 10:41:34 +01:00
Kasper Rynning-Tønnesen
088ba1babd Forgot how logic works 2018-03-16 10:36:34 +01:00
Kasper Rynning-Tønnesen
372eb8439a Opening for subdomain also 2018-03-16 10:33:33 +01:00
Kasper Rynning-Tønnesen
90292762c9 Updated token-info 2018-03-16 10:29:57 +01:00
Kasper Rynning-Tønnesen
dbba54c7ad Origin for api-tokens 2018-03-16 10:28:10 +01:00
Kasper Rynning-Tønnesen
6ea96c769a Fixed sizing of playlist and sizing of chat-tabs 2018-03-16 09:50:24 +01:00
Kasper Rynning-Tønnesen
b4dc90c3ea Only removing channel-load on when loaded on mobile 2018-03-15 15:52:33 +01:00
Kasper Rynning-Tønnesen
e6d9143fa8 Fixed issue with suggested-badge showing up 2018-03-15 15:47:44 +01:00
Kasper Rynning-Tønnesen
fba021aeff Not showing badge on empty suggestions 2018-03-15 15:44:05 +01:00
Kasper Rynning-Tønnesen
a4ebe56254 Updated how suggestions work and display
- Always showing suggested tab in tablist
- Fixed issue with contextmenu going all wonky when opened on suggested elements
2018-03-15 15:38:08 +01:00
Kasper Rynning-Tønnesen
6d97345719 Better namechange-setter initally 2018-03-15 14:26:05 +01:00
Kasper Rynning-Tønnesen
572df5a8e5 Fixed api-issues 2018-03-15 13:42:51 +01:00
Kasper Rynning-Tønnesen
27233c2272 Fixed issue where description and thumbnail fields not showing up on logged in 2018-03-15 11:43:48 +01:00
Kasper Rynning-Tønnesen
c1a83648d3 Handling cookie-ids somewhat diferrently on chromecasts 2018-03-15 08:43:57 +01:00
Kasper Rynning-Tønnesen
1abced50ca Updates 2018-03-14 22:42:19 +01:00
Kasper Rynning-Tønnesen
a5248f0f39 Fixed service-worker issues 2018-03-14 22:13:03 +01:00
Kasper Rynning-Tønnesen
15532d8f9a no more serviceworker until cookies and referrers are handled 2018-03-14 21:59:46 +01:00
Kasper Rynning-Tønnesen
0fdd491bfd Fixed issue where login-with cookie didn't work as expected 2018-03-14 15:06:44 +01:00
Kasper Rynning-Tønnesen
4fc0151e9f Secure usercookie 2018-03-14 13:43:43 +01:00
Kasper Rynning-Tønnesen
8974e8cde0 Readded serviceworker, and fixed namechange error 2018-03-14 13:31:52 +01:00
Kasper Rynning-Tønnesen
e73ce3a702 Removing correct amount of events from socket 2018-03-13 21:20:43 +01:00
Kasper Rynning-Tønnesen
7755060c6a Reverted remove of jquery-touch-punch 2018-03-13 21:00:24 +01:00
Kasper Rynning-Tønnesen
714b885dc5 Removing more dependencies 2018-03-13 20:59:01 +01:00
Kasper Rynning-Tønnesen
f566a19857 Trying to enable cors for api 2018-03-13 18:51:52 +01:00
Kasper Rynning-Tønnesen
d5376799cf Trying to force a channel-change/remove 2018-03-13 18:20:35 +01:00
Kasper Rynning-Tønnesen
be94303365 Removing listener on client move 2018-03-13 18:18:02 +01:00
Kasper Rynning-Tønnesen
c3e982ee8a Fixed issue where userpass not existing 2018-03-13 18:16:08 +01:00
Kasper Rynning-Tønnesen
ed38c213ac Fixed issue with login-in 2018-03-13 17:55:56 +01:00
Kasper Rynning-Tønnesen
eb69e1e67b Merge pull request #333 from zoff-music/feature/session-logins
Feature/session logins
2018-03-13 17:44:40 +01:00
Kasper Rynning-Tønnesen
c0400d7999 More fixes 2018-03-13 17:44:16 +01:00
Kasper Rynning-Tønnesen
6de7391be3 Client working 2018-03-13 17:06:40 +01:00
Kasper Rynning-Tønnesen
82140ace20 Started work for having session-logins instead of sending passwords back and forth 2018-03-13 16:26:51 +01:00
Kasper Rynning-Tønnesen
8c1c0011a2 Removed some aes/sha256 from dependencies on clientside 2018-03-13 12:39:24 +01:00
Kasper Rynning-Tønnesen
dba60cd866 bumped jquery up 2018-03-12 22:00:49 +01:00
Kasper Rynning-Tønnesen
f87527c7c0 Added help for client-mode 2018-03-12 20:00:52 +01:00
Kasper Rynning-Tønnesen
63f6c438ee Trying fix for load-error and volume chromecast 2018-03-12 19:54:30 +01:00
Kasper Rynning-Tønnesen
897553f127 Forcing a disconnect 2018-03-12 19:47:16 +01:00
Kasper Rynning-Tønnesen
f337ad3197 Trying a better disconnect event 2018-03-12 19:44:37 +01:00
Kasper Rynning-Tønnesen
0df26727da Added button on frontpage for accessing client-version 2018-03-12 19:33:19 +01:00
Kasper Rynning-Tønnesen
8180b284af Staying on client if on client subdomain 2018-03-12 19:23:15 +01:00
Kasper Rynning-Tønnesen
b6439a679b Fallback if userpass is undefined for channel 2018-03-12 19:18:59 +01:00
Kasper Rynning-Tønnesen
3f0f8eb5d9 Updating channel to fetch prettier 2018-03-12 19:17:01 +01:00
Kasper Rynning-Tønnesen
1d7331cb86 Trying fix for ajax request 2018-03-12 17:12:57 +01:00
Kasper Rynning-Tønnesen
631c13bb2d Merge pull request #332 from zoff-music/feature/own-small-player
Modified rest, and added client-version
2018-03-12 17:07:33 +01:00
Kasper Rynning-Tønnesen
c21eee838a Modified rest, and added client-version 2018-03-12 17:06:47 +01:00
Kasper Rynning-Tønnesen
79fa8805b2 Fixed http2 issue 2018-03-09 18:22:41 +01:00
Kasper Rynning-Tønnesen
9b7be4224a Trying some more fixes for the unknown error for .id undefined 2018-03-09 15:57:46 +01:00
Kasper Rynning-Tønnesen
82e643140e Better error-logging 2018-03-09 14:48:46 +01:00
Kasper Rynning-Tønnesen
8a3b2113f8 No more http2 2018-03-09 14:05:31 +01:00
Kasper Rynning-Tønnesen
cddce88207 Merge branch 'master' of github.com:zoff-music/zoff 2018-03-09 14:01:49 +01:00
Kasper Rynning-Tønnesen
913382c7f2 Trying with http2 2018-03-09 14:01:40 +01:00
Kasper Rynning-Tønnesen
68fb72aa9f Update EVENTS.md 2018-03-07 11:12:55 +01:00
Kasper Rynning-Tønnesen
ee085bcf07 Added customizable notify-mail-to 2018-03-06 16:04:44 +01:00
Kasper Rynning-Tønnesen
1774efd26c Idle players now changing song when they need to, to keep up with the channel 2018-03-06 15:52:45 +01:00
Kasper Rynning-Tønnesen
2fef90d375 Never sending position-request on offline 2018-03-06 15:29:12 +01:00
Kasper Rynning-Tønnesen
0dcdd617c3 Fixed issue where getting current-position returned update_required 2018-03-06 14:58:10 +01:00
Kasper Rynning-Tønnesen
01480b74de Redirecting /api/help to correct readme file 2018-03-06 14:08:48 +01:00
Kasper Rynning-Tønnesen
b68fc778f1 Fixed color-issue on entering a channel 2018-03-06 14:07:24 +01:00
Kasper Rynning-Tønnesen
259ef0fe7e Updated get-history to include channel-password if exists 2018-03-06 13:39:49 +01:00
Kasper Rynning-Tønnesen
64e4a84012 Merge pull request #331 from zoff-music/feature/more-info-error
Feature/more info error
2018-03-06 13:03:44 +01:00
Kasper Rynning-Tønnesen
57abb0b28f Added separate markdown files for events and rest 2018-03-06 13:03:13 +01:00
Kasper Rynning-Tønnesen
d757b95b44 Added more info on faulty input
- Sent in the results on REST
- Sent in the update_required msg on socket.io connection
2018-03-06 13:02:53 +01:00
Kasper Rynning-Tønnesen
43af39c03a Aligning toasts better on embed 2018-03-05 15:42:40 +01:00
Kasper Rynning-Tønnesen
19a5dc9c27 Prettier embedded-player on startup 2018-03-05 15:39:24 +01:00
Kasper Rynning-Tønnesen
fd8df5041a Localhost to zoff.me 2018-03-05 15:34:27 +01:00
Kasper Rynning-Tønnesen
421482ec3a Fixed embedded-version 2018-03-05 15:33:36 +01:00
Kasper Rynning-Tønnesen
25004f1a7a Fixed crashing issue in chat 2018-03-05 10:28:31 +01:00
Kasper Rynning-Tønnesen
2a0c2b276a Merge branch 'master' of github.com:zoff-music/zoff 2018-03-05 10:19:36 +01:00
Kasper Rynning-Tønnesen
5e7b74ef46 Made oauth window prettier with a loader 2018-03-05 10:19:28 +01:00
Kasper Rynning-Tønnesen
88f7813a3f Update README.md 2018-03-04 22:59:03 +01:00
Kasper Rynning-Tønnesen
924cc44a20 More typechecking 2018-03-04 22:57:27 +01:00
Kasper Rynning-Tønnesen
ad8bd1bff4 Fix for non-selectable API-code
- Fixed issue where API-code couldn't be selected
- Added view to see if the api-key has been fetched or not
- Added option to try again with the same email if the previous link has timed-out after a day
2018-03-04 22:29:59 +01:00
Kasper Rynning-Tønnesen
bdf014b4ff Paused, embed and includes
- Fixed issue with paused video playing on changing song for others
- Fixed more embedoptions
- cueVideoById is a neat function that I should have used earlier
- Added smaller jquery.ui files
2018-03-04 20:56:41 +01:00
Kasper Rynning-Tønnesen
57c64d8e29 Fixed issue with header in token-view not linking to frontpage 2018-03-04 20:21:07 +01:00
Kasper Rynning-Tønnesen
a34f7570cc Moved embed.html to handlebars-file, and fixed toast-wordbreaks 2018-03-04 20:13:07 +01:00
Kasper Rynning-Tønnesen
e3469875c2 Fixed modal z-index for google recaptcha 2018-03-04 14:35:49 +01:00
Kasper Rynning-Tønnesen
ed8fd2bc89 Merge branch 'master' of github.com:zoff-music/zoff 2018-03-04 14:09:28 +01:00
Kasper Rynning-Tønnesen
3bbc627473 Fixed API token-timeout fix 2018-03-04 14:09:12 +01:00
Kasper Rynning-Tønnesen
91be64626f Update README.md 2018-03-04 13:28:48 +01:00
Kasper Rynning-Tønnesen
552cd5eb9e Fix for clearing api-token-list in adminpanel on refresh 2018-03-04 13:27:09 +01:00
Kasper Rynning-Tønnesen
946bbb1c65 fixed rest-api issue with token not being checked correctly 2018-03-04 13:22:59 +01:00
Kasper Rynning-Tønnesen
2192b340c9 Pageview on api-apply also 2018-03-04 13:19:13 +01:00
Kasper Rynning-Tønnesen
b2801794ea Spelling again... 2018-03-04 12:41:16 +01:00
Kasper Rynning-Tønnesen
b863afaa1a Merge branch 'master' of github.com:zoff-music/zoff 2018-03-04 12:39:09 +01:00
Kasper Rynning-Tønnesen
c80e049844 Spelling-fixes and selectable 2018-03-04 12:37:00 +01:00
Kasper Rynning-Tønnesen
e2fe15f09f Update README.md 2018-03-04 12:17:26 +01:00
Kasper Rynning-Tønnesen
991d8a6e6f Fixed issue where token are not being built on deployment 2018-03-04 12:13:53 +01:00
Kasper Rynning-Tønnesen
786a6e0b5a Removed token.min.js from github, fixed issue with embedded player playing even when not supposed to, and fixed faulty error-message when applying to get a token 2018-03-04 12:10:48 +01:00
Kasper Rynning-Tønnesen
99f737d0b3 Merge pull request #330 from zoff-music/feature/api-token-apply
Added url for applying for api-tokens
2018-03-04 11:26:50 +01:00
Kasper Rynning-Tønnesen
0d333ac83a Limit is set to 100 automatically 2018-03-04 11:26:16 +01:00
Kasper Rynning-Tønnesen
76e7001e51 Added url for applying for api-tokens 2018-03-04 11:24:44 +01:00
Kasper Rynning-Tønnesen
785813b842 Fixed issue with new lists 2018-03-04 10:31:46 +01:00
Kasper Rynning-Tønnesen
ceebba6253 Adding option to name api-keys and removing them 2018-03-03 18:16:49 +01:00
Kasper Rynning-Tønnesen
e6eb066911 Timeouting wrong tokens 2018-03-03 16:41:24 +01:00
Kasper Rynning-Tønnesen
7d10360c81 Added error-message if trying to send token that doesn't exist 2018-03-03 16:39:18 +01:00
Kasper Rynning-Tønnesen
dea93456b0 Updated readme 2018-03-03 16:34:01 +01:00
Kasper Rynning-Tønnesen
a6b63be03b Fixed authorization issue with token 2018-03-03 16:32:45 +01:00
Kasper Rynning-Tønnesen
78ffcec66d Updated RESTApi to have tokens also 2018-03-03 16:24:57 +01:00
Kasper Rynning-Tønnesen
731f26e3d4 Fix for crashes 2018-03-03 16:17:11 +01:00
Kasper Rynning-Tønnesen
5c1e91467f Fix for list without conf 2018-03-03 15:51:11 +01:00
Kasper Rynning-Tønnesen
76776cdcd4 Fix for crashing server 2018-03-03 15:30:08 +01:00
Kasper Rynning-Tønnesen
740cf021f8 Fixed issue with correct title not returning result 2018-03-03 12:12:32 +01:00
Kasper Rynning-Tønnesen
fa7071ecb6 Correct output for output on post without auth 2018-03-02 13:23:32 +01:00
Kasper Rynning-Tønnesen
b9bc22d1d2 Fixed local-mode issues 2018-03-02 13:04:56 +01:00
Kasper Rynning-Tønnesen
5e9e682932 Correct error-message on song-get on protected list 2018-03-02 11:40:39 +01:00
Kasper Rynning-Tønnesen
1e00cbb9e7 README.md update 2018-03-02 11:35:42 +01:00
Kasper Rynning-Tønnesen
c9353e0236 Added frontpage-lists GET example 2018-03-02 11:17:37 +01:00
Kasper Rynning-Tønnesen
89d87a143d README update 2018-03-02 11:10:27 +01:00
Kasper Rynning-Tønnesen
e0ee2142b5 Fixed now-playing not being sent correctly from API 2018-03-02 11:07:54 +01:00
Kasper Rynning-Tønnesen
a7948d97c6 Merge pull request #328 from zoff-music/refactor/prettier-json-api
Refactor/prettier json api
2018-03-02 10:54:10 +01:00
Kasper Rynning-Tønnesen
ec9b9676fb Added fix for ga not being present on localhost 2018-03-02 10:52:43 +01:00
Kasper Rynning-Tønnesen
7aad759c26 Cleaned up admin.js some 2018-03-02 10:48:15 +01:00
Kasper Rynning-Tønnesen
c70b6a0ea9 Prettier returing on API
- Prettier returns on API
- Upped to version 4
2018-03-02 10:47:06 +01:00
Kasper Rynning-Tønnesen
7fda70965f Fixed issue with suggested being duplicated and RESTApi posting 2018-03-02 09:23:07 +01:00
Kasper Rynning-Tønnesen
e720776365 Updating to have type always 2018-03-02 08:50:17 +01:00
Kasper Rynning-Tønnesen
af947d3fd2 Added request-answers 2018-03-01 19:17:06 +01:00
Kasper Rynning-Tønnesen
151cbcd49f Updated README to be correct 2018-03-01 19:15:14 +01:00
Kasper Rynning-Tønnesen
92a7c88e42 More RESTApi explanation in README and more endpoints 2018-03-01 19:11:20 +01:00
Kasper Rynning-Tønnesen
557bc521a5 Validating song-info on add by api 2018-03-01 16:14:24 +01:00
Kasper Rynning-Tønnesen
c6ec847306 Merge branch 'master' of github.com:zoff-music/zoff 2018-03-01 15:55:28 +01:00
Kasper Rynning-Tønnesen
ec128823d9 Redirecting /api/help to github 2018-03-01 15:55:02 +01:00
Kasper Rynning-Tønnesen
e97d4c5f68 Update README.md 2018-03-01 15:47:56 +01:00
Kasper Rynning-Tønnesen
0401d824eb RESTApi is timed for 2 seconds 2018-03-01 15:44:17 +01:00
Kasper Rynning-Tønnesen
76d8973509 Shuffling is limited per channel instead of client 2018-03-01 15:42:09 +01:00
Kasper Rynning-Tønnesen
f678576a1a Updated README.md 2018-03-01 15:26:03 +01:00
Kasper Rynning-Tønnesen
7aa4b2d22a Limiting on how much you can shuffle 2018-03-01 15:20:26 +01:00
Kasper Rynning-Tønnesen
adc1b2bf31 Merge pull request #327 from zoff-music/feature/timeout-api
Timeout api, and fixes it lead to
2018-03-01 14:55:45 +01:00
Kasper Rynning-Tønnesen
9839c0bdda Timeout api, and fixes it lead to
- timeout on api-calls with Retry-After present in header
- Fixed issue where when server restarts you are sometimes logged out for some reason
- README updates
2018-03-01 14:55:23 +01:00
Kasper Rynning-Tønnesen
724fca9fec Merge pull request #326 from zoff-music/fix/userpass-emits
Added fixes for player not starting on youtubevideos that has already…
2018-03-01 13:11:32 +01:00
Kasper Rynning-Tønnesen
a63b2a41e0 Merge pull request #325 from zoff-music/feature/rest-api
REST-endpoints and readme
2018-03-01 13:11:12 +01:00
Kasper Rynning-Tønnesen
a6083d3402 Added fixes for player not starting on youtubevideos that has already been played by the client
Fix for userpass not being set correctly
Fix for emit function not being used everywhere it needs to be used
2018-03-01 13:10:51 +01:00
Kasper Rynning-Tønnesen
97e06e3726 REST-endpoints and readme 2018-03-01 13:09:44 +01:00
Kasper Rynning-Tønnesen
2e8ef6739c Added a try-again for commands with password if there exists an adminass saved 2018-02-28 15:40:55 +01:00
Kasper Rynning-Tønnesen
7b66575ea8 Locking down some paths not meant to be seen with url 2018-02-28 14:25:33 +01:00
Kasper Rynning-Tønnesen
9268db4bcc More errormessages 2018-02-27 15:33:34 +01:00
Kasper Rynning-Tønnesen
ded7fa9a14 Added test for start or end lower than 0 2018-02-27 15:28:06 +01:00
Kasper Rynning-Tønnesen
0383c035f4 Forcing int 2018-02-27 15:25:37 +01:00
Kasper Rynning-Tønnesen
8614ba0731 Updated so start can't be after end 2018-02-27 15:24:36 +01:00
Kasper Rynning-Tønnesen
dad95b3fd2 Informing about the new update 2018-02-27 11:41:53 +01:00
Kasper Rynning-Tønnesen
9f94a828d1 Merge pull request #324 from zoff-music/refactor/own-config
Conf error for api
2018-02-27 11:37:18 +01:00
Kasper Rynning-Tønnesen
31cadc18a6 Conf error for api 2018-02-27 11:36:59 +01:00
Kasper Rynning-Tønnesen
eb78e1e769 Merge pull request #323 from zoff-music/refactor/own-config
Refactor/own config
2018-02-27 11:34:11 +01:00
Kasper Rynning-Tønnesen
0c2298524c Rewriting for own settings collections for more consistency of documents 2018-02-27 11:32:22 +01:00
Kasper Rynning-Tønnesen
d2b3759913 Rewriting stuff 2018-02-27 11:26:31 +01:00
Kasper Rynning-Tønnesen
370e9ae72b Updating to use different collection for channelsettings 2018-02-27 11:11:29 +01:00
Kasper Rynning-Tønnesen
3efefb51d9 Merge pull request #322 from zoff-music/feature/chromecast
More metadatasending
2018-02-26 19:13:48 +01:00
Kasper Rynning-Tønnesen
8326c1b5f9 More metadatasending 2018-02-26 19:13:06 +01:00
Kasper Rynning-Tønnesen
9516460d02 Merge pull request #321 from zoff-music/feature/chromecast
Fixed issue with faulty player_overlay image on casting
2018-02-26 18:54:40 +01:00
Kasper Rynning-Tønnesen
836b80ea67 Fixed issue with faulty player_overlay image on casting 2018-02-26 18:54:12 +01:00
Kasper Rynning-Tønnesen
d970522b31 Merge pull request #320 from zoff-music/feature/chromecast
Fixed previous error with ,
2018-02-26 18:48:19 +01:00
Kasper Rynning-Tønnesen
cde92696ca Fixed previous error with , 2018-02-26 18:48:01 +01:00
Kasper Rynning-Tønnesen
16edaab2c6 Merge pull request #319 from zoff-music/feature/chromecast
More chromecastfeatures
2018-02-26 18:45:47 +01:00
Kasper Rynning-Tønnesen
ce656b97bc More chromecastfeatures
- Click on player pauses/plays video
- Receives event on play/pause
- Some indentationfixes
- Not showing Join Channel modal when chromecast connected
2018-02-26 18:45:17 +01:00
Kasper Rynning-Tønnesen
78fad1bbe0 About year fix 2018-02-26 15:23:28 +01:00
Kasper Rynning-Tønnesen
f84b1d55d3 Prettier helper.log 2018-02-26 14:58:45 +01:00
Kasper Rynning-Tønnesen
45fe704285 Added gulp to pm2 and updated pm2 + readme 2018-02-26 14:34:58 +01:00
Kasper Rynning-Tønnesen
c341edc33a Adminpanel now connects to current domain instead of zoff.me 2018-02-26 14:31:01 +01:00
Kasper Rynning-Tønnesen
e623e067ac Merge pull request #318 from zoff-music/refactor/helper-log
Refactor/helper log
2018-02-26 14:23:30 +01:00
Kasper Rynning-Tønnesen
181fd93e69 Error-reporting over mail also 2018-02-26 14:22:59 +01:00
Kasper Rynning-Tønnesen
86f8a936fc Better Helper.log and view 2018-02-26 12:56:43 +01:00
Kasper Rynning-Tønnesen
21692a9c71 Merge pull request #317 from zoff-music/refactor/hide-api-keys
Moved api-keys out of 'sight', and added analytics as optional
2018-02-26 12:36:57 +01:00
Kasper Rynning-Tønnesen
973a4f6fa9 Moved api-keys out of 'sight', and added analytics as optional 2018-02-26 12:35:11 +01:00
Kasper Rynning-Tønnesen
78adcf1caf Merge pull request #316 from zoff-music/fix/mobile-results
Fix for visuals of mobile results
2018-02-26 11:40:26 +01:00
Kasper Rynning-Tønnesen
8bd4effe9b Fix for visuals of mobile results
- Fix for no results being appended infinitely
- Loader on search input bar instead of interferring
2018-02-26 11:39:50 +01:00
Kasper Rynning-Tønnesen
c71234d71e Added a better truncate on channelname 2018-02-26 11:21:37 +01:00
Kasper Rynning-Tønnesen
bc13e83f90 Fixed player_overlay showing on mobile 2018-02-26 11:08:18 +01:00
Kasper Rynning-Tønnesen
9848da5608 Forgot how helper.log works 2018-02-25 22:56:25 +01:00
Kasper Rynning-Tønnesen
371414d1e0 Removing empty-checker counter debug log 2018-02-25 22:54:43 +01:00
Kasper Rynning-Tønnesen
8f696b574f Added some debuglogs for hostcontroller 2018-02-25 22:53:21 +01:00
Kasper Rynning-Tønnesen
c6b5bfb7f0 Merge pull request #315 from zoff-music/feature/ga-events
Google Analytics events
2018-02-25 22:43:15 +01:00
Kasper Rynning-Tønnesen
5aadb5ab4f Google Analytics events 2018-02-25 22:42:53 +01:00
Kasper Rynning-Tønnesen
48cd95a11e Merge pull request #314 from zoff-music/fix/redis-load
Redis-load start issue fix
2018-02-25 15:58:48 +01:00
Kasper Rynning-Tønnesen
9a877fa18e Fixed issue where clients without redis struggled with starting the server 2018-02-25 15:58:02 +01:00
Kasper Rynning-Tønnesen
df1dc29735 Merge pull request #313 from zoff-music/fix/mobile-chromecasting-fixes
Better loading on chromecast-loading for mobile
2018-02-25 15:53:14 +01:00
Kasper Rynning-Tønnesen
b407da74ff Better loading on chromecast-loading for mobile 2018-02-25 15:52:37 +01:00
Kasper Rynning-Tønnesen
afb6ab1c09 Merge pull request #312 from zoff-music/fix/mobile-chromecasting-fixes
Showing play-pause buttons
2018-02-25 15:21:46 +01:00
Kasper Rynning-Tønnesen
29a07ca099 Showing play-pause buttons 2018-02-25 14:53:24 +01:00
Kasper Rynning-Tønnesen
7f2557ba7b Merge pull request #311 from zoff-music/fix/mobile-chromecasting-fixes
Trying fixes for mobile chromecasting and visuals
2018-02-25 14:40:39 +01:00
Kasper Rynning-Tønnesen
90735948bb Trying fixes for mobile chromecasting and visuals 2018-02-25 14:39:03 +01:00
Kasper Rynning-Tønnesen
69abf6961a Hiding generatebutton mobile 2018-02-21 10:46:05 +01:00
Kasper Rynning-Tønnesen
52143238f0 Merge pull request #310 from zoff-music/feature/generate-channel-name
Added button for generating channelname in frontpage
2018-02-21 10:30:40 +01:00
Kasper Rynning-Tønnesen
c7e43762b4 Added button for generating channelname in frontpage 2018-02-21 10:30:10 +01:00
Kasper Rynning-Tønnesen
5011a3cf10 Fixed error in embed 2018-02-19 16:09:19 +01:00
Kasper Rynning-Tønnesen
6bf2e3a5eb Trying fix for dead mobile listeners 2018-02-19 09:46:37 +01:00
Kasper Rynning-Tønnesen
1da45805f6 Removed faulty logs 2018-02-15 12:41:44 +01:00
Kasper Rynning-Tønnesen
3c8f43a575 Stopping listening on more listeners on navigation and removed a title on hover 2018-02-15 12:40:48 +01:00
Kasper Rynning-Tønnesen
0c2ec57ed0 Fixed not closing brackets 2018-02-15 12:35:56 +01:00
Kasper Rynning-Tønnesen
6a51292016 Merge pull request #309 from zoff-music/fix/preloader-color
Better colors for preloader
2018-02-15 12:32:56 +01:00
Kasper Rynning-Tønnesen
1faf89e474 Merge pull request #308 from zoff-music/feature/prettier-PiP
Feature/prettier pi p
2018-02-15 12:32:35 +01:00
Kasper Rynning-Tønnesen
95ee5f7a35 Better colors for preloader 2018-02-15 12:32:12 +01:00
Kasper Rynning-Tønnesen
1c222b3812 Closeplayer button doesn't navigate to channel anymore 2018-02-15 12:31:43 +01:00
Kasper Rynning-Tønnesen
a369fed608 Prettier PiP for frontpage, with a hover 2018-02-15 12:22:44 +01:00
Kasper Rynning-Tønnesen
5c1d0b4096 Merge pull request #307 from zoff-music/fix/faster-mobile-load
Fixed removeAllListeners to be working
2018-02-15 11:17:35 +01:00
Kasper Rynning-Tønnesen
a45b82f9b9 Fixed removeAllListeners to be working 2018-02-15 11:17:09 +01:00
Kasper Rynning-Tønnesen
e713d80487 Merge pull request #306 from zoff-music/fix/faster-mobile-load
Trying to speed up mobile-loading for channels
2018-02-15 10:27:02 +01:00
Kasper Rynning-Tønnesen
1b52a06029 Trying to speed up mobile-loading for channels 2018-02-15 10:25:10 +01:00
Kasper Rynning-Tønnesen
cd90affedf Merge pull request #305 from zoff-music/feature/persistent-admin
Added expires option for mongo_configs
2018-02-14 14:00:38 +01:00
Kasper Rynning-Tønnesen
a4fd6f380e Added expires option for mongo_configs 2018-02-14 14:00:15 +01:00
Kasper Rynning-Tønnesen
ef21083c33 Merge pull request #304 from zoff-music/feature/persistent-admin
Started using persistance login for admin-panel
2018-02-14 13:57:56 +01:00
Kasper Rynning-Tønnesen
c3b8b53c6c Started using persistance login for admin-panel 2018-02-14 13:57:34 +01:00
Kasper Rynning-Tønnesen
958710440c Merge pull request #303 from zoff-music/fix/hostcontroller
Possible fix for remotecontroller not being enabled
2018-02-13 11:55:32 +01:00
Kasper Rynning-Tønnesen
df681c295e Possible fix for remotecontroller not being enabled 2018-02-13 11:55:01 +01:00
Kasper Rynning-Tønnesen
062e3630a3 Showing disabled configs when slow internet until config is fetched 2018-02-13 11:18:59 +01:00
Kasper Rynning-Tønnesen
fcecdade1a Merge pull request #302 from zoff-music/fix/pause-change
Fixed issue with player start playing when paused
2018-02-09 11:12:23 +01:00
Kasper Rynning-Tønnesen
7adc036dcd Fixed issue with player start playing when paused 2018-02-09 11:12:02 +01:00
Kasper Rynning-Tønnesen
bceda13245 Fixed result-buttons 2018-02-09 10:54:34 +01:00
Kasper Rynning-Tønnesen
306bfaf0eb Merge pull request #301 from zoff-music/feature/video-only-embed
Added video-only option for embedded channel
2018-02-07 16:13:12 +01:00
Kasper Rynning-Tønnesen
9f5159afb7 Added video-only option for embedded channel 2018-02-07 16:12:15 +01:00
Kasper Rynning-Tønnesen
0449442783 Fixed fullscreen-open-issue 2018-02-07 15:56:44 +01:00
Kasper Rynning-Tønnesen
d04f12fb7b Enabled help-modal for remote-page 2018-02-07 14:14:28 +01:00
Kasper Rynning-Tønnesen
77d7fb9eb5 Merge pull request #300 from zoff-music/fix/admin-panel
Fixed parameter and token issues
2018-02-06 15:15:29 +01:00
Kasper Rynning-Tønnesen
b047ccd9ef Fixed parameter and token issues 2018-02-06 15:15:07 +01:00
Kasper Rynning-Tønnesen
69b4aa4b33 Fixed issue with admin-panel login 2018-02-06 15:08:02 +01:00
Kasper Rynning-Tønnesen
c1d56ebb55 Removed some logs 2018-02-06 15:01:06 +01:00
Kasper Rynning-Tønnesen
fe722acacc Merge pull request #299 from zoff-music/fix/duplicates-and-play
Fixed issue with duplicates and player
2018-02-06 14:49:46 +01:00
Kasper Rynning-Tønnesen
47d5889c33 Fixed issue with duplicates and player
- Fixed issue where duplicates sometimes shows up in playlist
- Fixed issue where player starts playing when server is restarted and the user has paused the song
2018-02-06 14:49:23 +01:00
Kasper Rynning-Tønnesen
8eb9e99924 Merge pull request #298 from zoff-music/fix/loading-mail
Updated looks when sending a mail
2018-02-06 14:16:01 +01:00
Kasper Rynning-Tønnesen
c5f86108c7 Updated looks when sending a mail 2018-02-06 14:15:38 +01:00
Kasper Rynning-Tønnesen
c9d1b5312f Merge pull request #297 from zoff-music/fix/new-mailing
Using zoff.me instead of zoff.no for mailing now
2018-02-06 14:10:10 +01:00
Kasper Rynning-Tønnesen
626a6acb5f Using zoff.me instead of zoff.no for mailing now 2018-02-06 14:09:48 +01:00
Kasper Rynning-Tønnesen
0b2819649c Merge pull request #296 from zoff-music/feature/join-link-chromecast
Clicking on channel-name when casting zoff, join link opens up for 15…
2018-02-06 13:29:04 +01:00
Kasper Rynning-Tønnesen
aa724d3af9 Clicking on channel-name when casting zoff, join link opens up for 15seconds 2018-02-06 13:28:38 +01:00
Kasper Rynning-Tønnesen
47b7b27376 Merge pull request #295 from zoff-music/refactor/moving
Moved files, and shortened some
2018-02-05 23:44:30 +01:00
Kasper Rynning-Tønnesen
62944eb976 Moved files, and shortened some 2018-02-05 23:43:56 +01:00
Kasper Rynning-Tønnesen
4bca663bb3 Moved admin and client to apps folder 2018-02-05 21:22:23 +01:00
Kasper Rynning-Tønnesen
40d3fd3a21 Numprocesses set to 1 in non-redis environment 2018-02-05 21:03:35 +01:00
Kasper Rynning-Tønnesen
fca61a82eb Merge pull request #294 from zoff-music/refactor/adminpanel
Refactor/adminpanel
2018-02-05 20:53:55 +01:00
Kasper Rynning-Tønnesen
fedaedca8c Working adminpanel hopefully 2018-02-05 20:53:26 +01:00
Kasper Rynning-Tønnesen
2645a9b9dc Trying a fix for adminpanelserver 2018-02-05 20:21:00 +01:00
Kasper Rynning-Tønnesen
bcbfeed151 No more redirecting 2018-02-05 20:19:09 +01:00
Kasper Rynning-Tønnesen
00e9083d09 Merge pull request #293 from zoff-music/refactor/adminpanel
Trying to fix error
2018-02-05 20:00:04 +01:00
Kasper Rynning-Tønnesen
4fb88537cb Trying to fix error 2018-02-05 19:59:41 +01:00
Kasper Rynning-Tønnesen
3d2bd86284 Merge pull request #292 from zoff-music/refactor/adminpanel
Refactor/adminpanel
2018-02-05 19:55:37 +01:00
Kasper Rynning-Tønnesen
367f63e94e Added secret to mongo-config 2018-02-05 19:55:17 +01:00
Kasper Rynning-Tønnesen
c0a2e3331f fixed error 2018-02-05 19:54:53 +01:00
Kasper Rynning-Tønnesen
db7f993c18 Merge pull request #291 from zoff-music/refactor/adminpanel
Added adminpanel to this repo
2018-02-05 19:46:57 +01:00
Kasper Rynning-Tønnesen
01a42c7d68 Added adminpanel to this repo 2018-02-05 19:46:03 +01:00
Kasper Rynning-Tønnesen
38bceb1a53 Merge pull request #290 from zoff-music/fix/cors-anywhere-no
Removed cors-anywhere dependency
2018-02-05 18:09:22 +01:00
Kasper Rynning-Tønnesen
8169e2dd07 Removed cors-anywhere dependency 2018-02-05 18:06:53 +01:00
Kasper Rynning-Tønnesen
2cec9f92ab Fixed wss error 2018-02-05 15:18:57 +01:00
Kasper Rynning-Tønnesen
587eddfff5 Updated pm2 configuration 2018-02-05 15:05:11 +01:00
Kasper Rynning-Tønnesen
9c965c83b1 Forgot to move cors_proxy out 2018-02-05 15:02:26 +01:00
Kasper Rynning-Tønnesen
0a9b439368 Merge pull request #289 from zoff-music/refactor/app-js-refactoring
Added a way to check if redis exists, and open for non-redis-users
2018-02-05 15:00:21 +01:00
Kasper Rynning-Tønnesen
1ef809d062 Added a way to check if redis exists, and open for non-redis-users 2018-02-05 14:59:43 +01:00
Kasper Rynning-Tønnesen
132944e176 Updated API to include now_playing 2018-02-05 14:25:39 +01:00
Kasper Rynning-Tønnesen
93005c895b Small fixes, and removing unused variables 2018-02-05 14:18:47 +01:00
Kasper Rynning-Tønnesen
0c0e455336 Merge pull request #288 from zoff-music/test/cluster-mode
Test/cluster mode
2018-02-05 14:12:33 +01:00
Kasper Rynning-Tønnesen
cd491441f0 More trying and failing 2018-02-05 14:01:53 +01:00
Kasper Rynning-Tønnesen
c9446e151c Trying clustering 2018-02-05 12:56:10 +01:00
Kasper Rynning-Tønnesen
c5ef3404b7 Merge pull request #287 from zoff-music/fix/pagination-buttons
Improvements for pagination buttons
2018-02-05 12:17:39 +01:00
Kasper Rynning-Tønnesen
c39f71f64c Improvements for pagination buttons 2018-02-05 12:17:18 +01:00
Kasper Rynning-Tønnesen
72ad1a546b Donation-fixes 2018-02-02 16:11:21 +01:00
Kasper Rynning-Tønnesen
ae68d41a90 Merge pull request #286 from zoff-music/feature/join-link-qr
FeatureDiscovery of new QR code not showing on mobile anymore
2018-02-02 14:08:41 +01:00
Kasper Rynning-Tønnesen
99fbd85c95 FeatureDiscovery of new QR code not showing on mobile anymore 2018-02-02 14:08:06 +01:00
Kasper Rynning-Tønnesen
2f6f12e3e3 Update README.md 2018-02-02 13:36:29 +01:00
Kasper Rynning-Tønnesen
38c280dc05 Merge pull request #285 from zoff-music/feature/join-link-qr
Added a prettier QR-code link for joining on a channel
2018-02-02 13:34:39 +01:00
Kasper Rynning-Tønnesen
a2a78c1a87 Added a prettier QR-code link for joining on a channel 2018-02-02 13:34:12 +01:00
Kasper Rynning-Tønnesen
41ee83d6ea Merge pull request #284 from zoff-music/fix/analytics
Fixed analytics pageview being sent on localhost
2018-02-02 12:38:01 +01:00
Kasper Rynning-Tønnesen
ea0a18e5dd Fixed analytics pageview being sent on localhost 2018-02-02 12:37:27 +01:00
Kasper Rynning-Tønnesen
6d53455d41 Merge pull request #283 from zoff-music/feature/minimum-song-count-frontpage
Avoid frontpagelists not being to few
2018-01-31 11:48:02 +01:00
Kasper Rynning-Tønnesen
664b6c473f Avoid frontpagelists not being to few 2018-01-31 11:47:30 +01:00
Kasper Rynning-Tønnesen
e36fa619ae Merge pull request #282 from zoff-music/feature/minimum-song-count-frontpage
Put minimum song-count on list to display on the frontpage to 5
2018-01-31 11:46:00 +01:00
Kasper Rynning-Tønnesen
0f68967044 Put minimum song-count on list to display on the frontpage to 5 2018-01-31 11:45:29 +01:00
Kasper Rynning-Tønnesen
c9a2b9367c Merge pull request #281 from zoff-music/fix/listeners
Small fix for listener-counter
2018-01-31 11:39:07 +01:00
Kasper Rynning-Tønnesen
dcb01e5034 Small fix for listener-counter 2018-01-31 11:38:44 +01:00
Kasper Rynning-Tønnesen
8cef8df219 Merge pull request #280 from zoff-music/refactor/less-large-files
Refactored to have more files, but less long files
2018-01-31 11:29:05 +01:00
Kasper Rynning-Tønnesen
fd6db734f4 Refactored to have more files, but less long files 2018-01-31 11:28:35 +01:00
Kasper Rynning-Tønnesen
379f0ecb31 Merge pull request #279 from zoff-music/fix/offline-reset
Fixed issue where offline listeners not decreasing when leaving channel
2018-01-30 16:41:04 +01:00
Kasper Rynning-Tønnesen
fa5bdac1be Fixed issue where offline listeners not decreasing when leaving channel 2018-01-30 16:40:38 +01:00
Kasper Rynning-Tønnesen
8d57fd4774 Merge pull request #278 from zoff-music/fix/offline-listeners-fix
Fix for offline-listeners overflooding total viewers
2018-01-29 13:58:28 +01:00
Kasper Rynning-Tønnesen
05980fe33c Fix for offline-listeners overflooding total viewers 2018-01-29 13:57:54 +01:00
Kasper Rynning-Tønnesen
a6e87696b8 Merge pull request #277 from zoff-music/feature/notification
Sending mail when description or thumbnail is requested
2018-01-29 13:16:54 +01:00
Kasper Rynning-Tønnesen
26fcc9f6cb Sending mail when description or thumbnail is requested 2018-01-29 13:16:06 +01:00
Kasper Rynning-Tønnesen
6c437ba258 Merge pull request #276 from zoff-music/feature/recaptcha-mail
Implemented recaptcha
2018-01-29 12:59:45 +01:00
Kasper Rynning-Tønnesen
d5a2a75ddc Implemented recaptcha 2018-01-29 12:59:02 +01:00
Kasper Rynning-Tønnesen
aaab4e2bbb Merge pull request #275 from zoff-music/fix/offline-crash
Syntax
2018-01-29 09:55:46 +01:00
Kasper Rynning-Tønnesen
c3f7ed891f Syntax 2018-01-29 09:55:19 +01:00
Kasper Rynning-Tønnesen
d45829ed61 Merge pull request #274 from zoff-music/fix/offline-crash
Fixed issue where users was 0
2018-01-29 09:53:58 +01:00
Kasper Rynning-Tønnesen
f0bf000f4a Fixed issue where users was 0 2018-01-29 09:53:33 +01:00
Kasper Rynning-Tønnesen
2da1002d38 Merge pull request #273 from zoff-music/feature/embed-fixes
last and first page buttons for embedded version
2018-01-25 10:02:43 +01:00
Kasper Rynning-Tønnesen
2403646488 last and first page buttons for embedded version 2018-01-25 10:01:45 +01:00
Kasper Rynning-Tønnesen
99af0e8339 Merge pull request #272 from zoff-music/feature/start-end-mobile
Enabled setting start and end for a song on mobile
2018-01-24 12:53:28 +01:00
Kasper Rynning-Tønnesen
81b935cadf Enabled setting start and end for a song on mobile 2018-01-24 12:53:04 +01:00
Kasper Rynning-Tønnesen
bf395b061f Analytics pageview on navigation 2018-01-23 15:15:43 +01:00
Kasper Rynning-Tønnesen
79eb814677 Merge branch 'master' of github.com:zoff-music/zoff 2018-01-23 14:35:33 +01:00
Kasper Rynning-Tønnesen
cbd8872569 Transition on color for controls 2018-01-23 14:35:14 +01:00
Kasper Rynning-Tønnesen
cc96eb150c Merge pull request #269 from zoff-music/fix/area-click-options
Bigger optionsbutton on songs
2018-01-23 11:03:50 +01:00
Kasper Rynning-Tønnesen
8c4f23dc56 Bigger optionsbutton on songs 2018-01-23 11:03:28 +01:00
Kasper Rynning-Tønnesen
6fb415bc32 Merge pull request #268 from zoff-music/fix/name-loop
Trying to get a fix for looping namechanges
2018-01-22 15:07:41 +01:00
Kasper Rynning-Tønnesen
96e29f6856 Trying to get a fix for looping namechanges 2018-01-22 15:06:27 +01:00
Kasper Rynning-Tønnesen
ec515baca2 Update README.md 2018-01-22 08:39:18 +01:00
Kasper Rynning-Tønnesen
7eaec006fa Merge pull request #267 from zoff-music/fix/spotify-import
Fix for spotify import url
2018-01-22 08:38:21 +01:00
Kasper Rynning-Tønnesen
6968e0cdff Fix for spotify import url 2018-01-22 08:38:08 +01:00
Kasper Rynning-Tønnesen
24ba522cfb Merge pull request #266 from zoff-music/fix/footer-buttons-mobile
Better sizing of buttons on mobile
2018-01-18 15:01:06 +01:00
Kasper Rynning-Tønnesen
5777966d82 Better sizing of buttons on mobile 2018-01-18 15:00:41 +01:00
Kasper Rynning-Tønnesen
ab820b963a Merge pull request #265 from zoff-music/fix/donation-text
Added ethereum text
2018-01-18 12:21:09 +01:00
Kasper Rynning-Tønnesen
30d2b8f394 Added ethereum text 2018-01-18 12:18:40 +01:00
Kasper Rynning-Tønnesen
34512e34dd Merge pull request #264 from zoff-music/feature/complementary-bar
Improved colors for more faded
2018-01-17 15:19:06 +01:00
Kasper Rynning-Tønnesen
08195afdcb Improved colors for more faded 2018-01-17 15:18:29 +01:00
Kasper Rynning-Tønnesen
12c70f7afd Merge pull request #263 from zoff-music/feature/complementary-bar
Added other color to playbar for more fun
2018-01-17 14:16:31 +01:00
Kasper Rynning-Tønnesen
7135c594e3 Added other color to playbar for more fun 2018-01-17 14:16:05 +01:00
Kasper Rynning-Tønnesen
0606b22c39 Merge pull request #262 from zoff-music/fix/general_bug_fixes
Added pause effect on clicking zoff-image on embedded version
2018-01-17 09:23:56 +01:00
Kasper Rynning-Tønnesen
aa9f57cab1 Added pause effect on clicking zoff-image on embedded version 2018-01-17 09:23:22 +01:00
Kasper Rynning-Tønnesen
a7bb74f8af Merge pull request #261 from zoff-music/fix/general_bug_fixes
Fixed issue with title not being decoded correctly
2018-01-17 09:02:47 +01:00
Kasper Rynning-Tønnesen
817ec47a20 Fixed issue with title not being decoded correctly 2018-01-17 09:02:23 +01:00
Kasper Rynning-Tønnesen
68c8827630 Merge pull request #260 from zoff-music/fix/general_bug_fixes
Fixed player issue, and viewer issue on new channels
2018-01-12 13:46:54 +01:00
Kasper Rynning-Tønnesen
dbbd518978 Fixed player issue, and viewer issue on new channels 2018-01-12 13:46:21 +01:00
Kasper Rynning-Tønnesen
f6e94162cb Merge pull request #259 from zoff-music/fix/year
Updated year to update automatically
2018-01-11 08:49:59 +01:00
Kasper Rynning-Tønnesen
8e146e52f6 Updated year to update automatically 2018-01-11 08:49:41 +01:00
Kasper Rynning-Tønnesen
0cb3de6fae Merge pull request #258 from zoff-music/refactor/version-file
Moved versionnumber out to own file instead of defining it two places
2017-12-27 17:51:22 +01:00
Kasper Rynning-Tønnesen
65f0fcd4f9 Removed a whitespace 2017-12-27 17:50:39 +01:00
Kasper Rynning-Tønnesen
4afcbda9db Moved versionnumber out to own file instead of defining it two places 2017-12-27 17:47:43 +01:00
Kasper Rynning-Tønnesen
6df3af6978 Merge pull request #257 from zoff-music/fix/playlist-size
Fixed some playlist elements
2017-12-27 17:38:50 +01:00
Kasper Rynning-Tønnesen
a0ab993ffb Fixed some playlist elements
- Fixed issue with full song not being shown on mobile always
- Fixed issue where navigationbuttons are placed weirdly on desktop and mobile
- Fixed weird positioning issue on embedded player of songs
- Added navigationbuttons to embedded player
2017-12-27 17:38:11 +01:00
Kasper Rynning-Tønnesen
505e2ef47b Merge pull request #256 from zoff-music/feature/ethereum-donate
Added ethereum donate option
2017-12-22 13:45:35 +01:00
Kasper Rynning-Tønnesen
956dfaef6b Added ethereum donate option 2017-12-22 13:45:04 +01:00
Kasper Rynning-Tønnesen
2c442b4e60 Merge pull request #255 from zoff-music/refactor/qr-code-footer
Removed qr code from footer
2017-12-04 14:19:24 +01:00
Kasper Rynning-Tønnesen
19717de985 Removed qr code from footer 2017-12-04 14:18:57 +01:00
Kasper Rynning-Tønnesen
b6e0d28017 Merge pull request #254 from zoff-music/feature/scroll-chat
Closes #234
2017-12-04 13:07:39 +01:00
Kasper Rynning-Tønnesen
7f89cf80a7 Closes #234 2017-12-04 13:07:15 +01:00
Kasper Rynning-Tønnesen
e6b8064d23 Merge pull request #253 from zoff-music/feature/spotify-list-image
Fixed issue with wrong base64 image
2017-12-01 11:57:31 +01:00
Kasper Rynning-Tønnesen
6319b06608 Fixed issue with wrong base64 image 2017-12-01 11:57:07 +01:00
Kasper Rynning-Tønnesen
e62fbe7d21 Merge pull request #252 from zoff-music/feature/spotify-list-image
images not added for some reason..
2017-12-01 11:51:37 +01:00
Kasper Rynning-Tønnesen
8d7252c0f9 More general address for fetching image 2017-12-01 11:51:20 +01:00
Kasper Rynning-Tønnesen
e344b9615a images not added for some reason.. 2017-12-01 11:50:26 +01:00
Kasper Rynning-Tønnesen
f319238567 Merge pull request #251 from zoff-music/feature/spotify-list-image
Feature/spotify list image
2017-12-01 11:47:59 +01:00
Kasper Rynning-Tønnesen
8f49e4c1ee Removed logs 2017-12-01 11:47:26 +01:00
Kasper Rynning-Tønnesen
fe728ad3c2 Added spotify playlist image on exportation 2017-12-01 11:47:04 +01:00
Kasper Rynning-Tønnesen
03db8aa60a Merge pull request #250 from zoff-music/fix/donations
Better mobile handling
2017-11-29 20:19:15 +01:00
Kasper Rynning-Tønnesen
2aaa461e30 Better mobile handling 2017-11-29 20:05:56 +01:00
Kasper Rynning-Tønnesen
e7cddf00f9 Merge pull request #249 from zoff-music/fix/donations
Moved modals some round, and added donation-modal
2017-11-29 20:03:41 +01:00
Kasper Rynning-Tønnesen
8d7d3ebabc Moved modals some round, and added donation-modal 2017-11-29 20:02:42 +01:00
Kasper Rynning-Tønnesen
41f71a2f95 Merge pull request #248 from zoff-music/fix/offline-listeners
Offline-toggling fix
2017-11-22 17:41:25 +01:00
Kasper Rynning-Tønnesen
bab88edd10 Offline-toggling fix
- Fixed issue where offline-toggling incremented listener number, infine
2017-11-22 17:40:42 +01:00
Kasper Rynning-Tønnesen
77023e65e2 Merge pull request #247 from zoff-music/refactor/pagebuttons
Changed how pagebuttons are added/initialized
2017-11-22 17:05:00 +01:00
Kasper Rynning-Tønnesen
65d1b9cd61 Changed how pagebuttons are added/initialized 2017-11-22 17:04:38 +01:00
Kasper Rynning-Tønnesen
b94fa58db6 Minor change 2017-11-22 14:49:49 +01:00
Kasper Rynning-Tønnesen
3897923840 Merge pull request #246 from zoff-music/fix/margins-navbar
Fixed margins
2017-11-22 14:48:15 +01:00
Kasper Rynning-Tønnesen
8cc5963ce0 Fixed margins 2017-11-22 14:47:43 +01:00
Kasper Rynning-Tønnesen
fda32fe306 Merge pull request #245 from zoff-music/fix/overflow-body
Fixed issue where overflow is hidden on empty search
2017-11-22 12:20:11 +01:00
Kasper Rynning-Tønnesen
047dd256f0 Fixed issue where overflow is hidden on empty search 2017-11-22 12:19:48 +01:00
Kasper Rynning-Tønnesen
4e6d8cc5c4 Merge pull request #244 from zoff-music/refactor/general
Added two new events in README.md, and how zoff is pronounced (README…
2017-11-22 10:46:08 +01:00
Kasper Rynning-Tønnesen
f0d44b76f8 Added two new events in README.md, and how zoff is pronounced (README.md and about-modal) 2017-11-22 10:45:32 +01:00
Kasper Rynning-Tønnesen
9b1d1429a3 Merge pull request #243 from zoff-music/refactor/general
Refactored how menu-buttons are placed in playlist
2017-11-22 10:29:47 +01:00
Kasper Rynning-Tønnesen
181d9741e2 Refactored how menu-buttons are placed in playlist 2017-11-22 10:29:20 +01:00
Kasper Rynning-Tønnesen
48f85e9b69 Merge pull request #242 from zoff-music/refactor/general
Controls on mobile, and dragging
2017-11-21 17:48:48 +01:00
Kasper Rynning-Tønnesen
d4a2798dc8 Controls on mobile, and dragging
- Not using #playbar anymore, since the default controls work on mobile
- Removed List.dragging code, not in use anymore
2017-11-21 17:48:25 +01:00
Kasper Rynning-Tønnesen
e719dc632b Merge pull request #241 from zoff-music/fix/truncate-channel-name
Fixed issue where channel-name and url was truncated
2017-11-21 17:00:05 +01:00
Kasper Rynning-Tønnesen
9652abf10b Fixed issue where channel-name and url was truncated 2017-11-21 16:59:40 +01:00
Kasper Rynning-Tønnesen
572c63f011 Merge pull request #240 from zoff-music/fix/clipping-songs
Added fix for clipping songs on hover on small player
2017-11-21 16:18:16 +01:00
Kasper Rynning-Tønnesen
0578863317 Added fix for clipping songs on hover on small player 2017-11-21 16:17:42 +01:00
Kasper Rynning-Tønnesen
bdf531f80e Merge pull request #239 from zoff-music/fix/volume-slider-resize-hide
Fixed issue with volumeslider being hidden on window-resize
2017-11-21 15:12:01 +01:00
Kasper Rynning-Tønnesen
76aa1d1417 Fixed issue with volumeslider being hidden on window-resize 2017-11-21 15:11:32 +01:00
Kasper Rynning-Tønnesen
2fee4b359b Merge pull request #238 from zoff-music/fix/view-counter
Fixed issue with viewercounter being below 0
2017-11-21 11:27:21 +01:00
Kasper Rynning-Tønnesen
789a3cc1e7 Fixed issue with viewercounter being below 0 2017-11-21 11:27:01 +01:00
Kasper Rynning-Tønnesen
b92ff8146a Temporarily deactive self_ping 2017-11-20 15:04:38 +01:00
Kasper Rynning-Tønnesen
3afb93a21a Forgot to format logging correctly 2017-11-20 09:33:09 +01:00
Kasper Rynning-Tønnesen
31b47cac1d Added logs for error-checker 2017-11-20 09:30:58 +01:00
Kasper Rynning-Tønnesen
748f329f38 Show player bottom always 2017-11-14 15:34:14 +01:00
Kasper Rynning-Tønnesen
324b0438f4 Fixed video-container sizing issue on mobile 2017-11-14 15:20:10 +01:00
Kasper Rynning-Tønnesen
4505e2df1e Better transition of colors 2017-11-14 14:58:12 +01:00
Kasper Rynning-Tønnesen
8b1737df91 Merge pull request #237 from zoff-music/feature/mobile-desktop-search
Desktop and mobile use the same search
2017-11-14 14:52:36 +01:00
Kasper Rynning-Tønnesen
fdfe832ef9 Desktop and mobile use the same search 2017-11-14 14:48:52 +01:00
Kasper Rynning-Tønnesen
035f47d6c1 Merge pull request #236 from zoff-music/fix/404
Fixed 404 status not being sent
2017-11-14 12:43:28 +01:00
Kasper Rynning-Tønnesen
8219c25e42 Fixed 404 status not being sent 2017-11-14 12:42:53 +01:00
Kasper Rynning-Tønnesen
0ebd18de16 Merge pull request #235 from zoff-music/fix/404
Added a funny 404 page
2017-11-14 12:26:08 +01:00
Kasper Rynning-Tønnesen
1adff62a45 Added a funny 404 page 2017-11-14 12:24:09 +01:00
Kasper Rynning-Tønnesen
7b0d3c3232 Small adjustement to sending next song 2017-11-13 14:39:43 +01:00
Kasper Rynning-Tønnesen
8cc9a66948 Fix for errornous ending a song and sending many messages if slow internet 2017-11-13 14:32:06 +01:00
Kasper Rynning-Tønnesen
a43d9a327f Merge branch 'master' of github.com:zoff-music/zoff 2017-11-13 11:38:06 +01:00
Kasper Rynning-Tønnesen
b2f38b21e1 Testing if autopull works 2017-11-13 11:37:47 +01:00
Kasper Rynning-Tønnesen
4064e60976 Merge pull request #233 from zoff-music/fix/better-exporting
Better exporting, and small issues with sizing in panel
2017-11-11 16:16:57 +01:00
Kasper Rynning-Tønnesen
23ad15e662 Better exporting, and small issues with sizing in panel 2017-11-11 16:16:34 +01:00
Kasper Rynning-Tønnesen
527904d49b Fixed positioning of searchloader on mobile 2017-11-11 13:00:59 +01:00
Kasper Rynning-Tønnesen
82047a5e2d Small correction on volume-container-cast 2017-11-10 19:13:26 +01:00
Kasper Rynning-Tønnesen
a8190faebc Merge pull request #232 from zoff-music/fix/smaller-error-startup
Smaller error on startup in localhost mode
2017-11-10 16:51:23 +01:00
Kasper Rynning-Tønnesen
15b6c2788f Smaller error on startup in localhost mode 2017-11-10 16:51:01 +01:00
Kasper Rynning-Tønnesen
68a72befcd Merge pull request #231 from zoff-music/feature/mailrequirement
Feature/mailrequirement
2017-11-10 16:47:58 +01:00
Kasper Rynning-Tønnesen
dc7a347802 Made changes accordingly to readme.md 2017-11-10 16:47:37 +01:00
Kasper Rynning-Tønnesen
96c4cb443a Merge branch 'master' into feature/mailrequirement 2017-11-10 16:46:16 +01:00
Kasper Rynning-Tønnesen
adf72fa296 Don't require the mailconfig, but log out in the console that it wont be enabled. 2017-11-10 16:45:59 +01:00
Kasper Rynning-Tønnesen
c4168b6c07 Fixed issue in README.md 2017-11-10 16:41:06 +01:00
Kasper Rynning-Tønnesen
4e58c0a77f Updated README.md
- Added info about the config files
2017-11-10 16:40:27 +01:00
Kasper Rynning-Tønnesen
3462879cf9 Merge pull request #230 from zoff-music/fix/ensure-number
Ensuring that the start and end is a number
2017-11-10 16:35:00 +01:00
Kasper Rynning-Tønnesen
59e7edb5e3 Ensuring that the start and end is a number 2017-11-10 16:34:40 +01:00
Kasper Rynning-Tønnesen
9c4342c57e Merge pull request #229 from zoff-music/fix/errors-missing-configs
Added more error-messages on crashing because of missing files.
2017-11-10 16:25:50 +01:00
Kasper Rynning-Tønnesen
12c8ea2299 Merge pull request #228 from zoff-music/fix/end-of-video-fix
Fixed issue with player not changing song when the song is over defin…
2017-11-10 16:24:26 +01:00
Kasper Rynning-Tønnesen
814e1eaac9 Added more error-messages on crashing because of missing files. Closes #227 2017-11-10 16:23:45 +01:00
Kasper Rynning-Tønnesen
f047ae1e1f Fixed issue with player not changing song when the song is over defined by the endSeconds 2017-11-10 16:22:51 +01:00
Kasper Rynning-Tønnesen
521dfe2f2c Merge pull request #226 from zoff-music/fix/chat-select
Able to select in chat
2017-11-10 14:57:05 +01:00
Kasper Rynning-Tønnesen
2d4939f14c Able to select in chat 2017-11-10 14:56:44 +01:00
Kasper Rynning-Tønnesen
4b70d862de Merge pull request #225 from zoff-music/fix/improved-import-export
Improved import/export functions, started using levenshtein distance …
2017-11-10 14:03:57 +01:00
Kasper Rynning-Tønnesen
b66888ada0 Improved import/export functions, started using levenshtein distance as a supplement 2017-11-10 14:03:11 +01:00
Kasper Rynning-Tønnesen
721b1d1a25 Merge pull request #224 from zoff-music/fix/offline-fixes
Fixed start and end not being sent on add
2017-11-10 11:49:44 +01:00
Kasper Rynning-Tønnesen
28e822fbb1 Fixed start and end not being sent on add 2017-11-10 11:49:18 +01:00
Kasper Rynning-Tønnesen
e8a2a34e21 Merge pull request #223 from zoff-music/fix/offline-fixes
Dragging and loading
2017-11-10 11:36:32 +01:00
Kasper Rynning-Tønnesen
47e4cecdef Dragging and loading
- Fixed searching in offline
- Fixed load on mobile in offline
2017-11-10 11:36:06 +01:00
Kasper Rynning-Tønnesen
88585b793e Merge pull request #222 from zoff-music/fix/improved-finding-errorsongs
Fixed small } error
2017-11-10 11:16:38 +01:00
Kasper Rynning-Tønnesen
1debe715d4 Fixed small } error 2017-11-10 11:16:09 +01:00
Kasper Rynning-Tønnesen
fd585bcfbf Merge pull request #221 from zoff-music/fix/improved-finding-errorsongs
Fix/improved finding errorsongs
2017-11-10 11:14:11 +01:00
Kasper Rynning-Tønnesen
dc8290ff28 Removed log 2017-11-10 11:13:31 +01:00
Kasper Rynning-Tønnesen
9bcf20269a Improved finding errorounus songs, and fix error with embedded player 2017-11-10 11:13:01 +01:00
Kasper Rynning-Tønnesen
845d0a423e Merge pull request #220 from zoff-music/feature/song2
Setting a timed run of the song-testing
2017-11-09 21:00:55 +01:00
Kasper Rynning-Tønnesen
b9811a5391 Setting a timed run of the song-testing 2017-11-09 20:59:58 +01:00
Kasper Rynning-Tønnesen
6745c50d6b Merge pull request #219 from zoff-music/feature/song2
Feature/song2
2017-11-09 20:16:38 +01:00
Kasper Rynning-Tønnesen
ddfb94be01 Merge branch 'master' into feature/song2 2017-11-09 20:15:23 +01:00
Kasper Rynning-Tønnesen
375046d270 Trying a new approach 2017-11-09 20:08:15 +01:00
Kasper Rynning-Tønnesen
1b9b21bacd Merge pull request #218 from zoff-music/revert-217-feature/song-replacement
Revert "Feature/song replacement"
2017-11-09 19:51:42 +01:00
Kasper Rynning-Tønnesen
7a62057a30 Revert "Feature/song replacement" 2017-11-09 19:51:32 +01:00
Kasper Rynning-Tønnesen
5a08358f62 Merge pull request #217 from zoff-music/feature/song-replacement
Feature/song replacement
2017-11-09 19:48:15 +01:00
Kasper Rynning-Tønnesen
b03213d61a Got automatic detection working for changing song when they are similar enough (higher than 0.75) 2017-11-09 19:47:31 +01:00
Kasper Rynning-Tønnesen
3050d56bf8 Everything except img error handling working 2017-11-09 17:14:19 +01:00
Kasper Rynning-Tønnesen
c73f70d99c Merge pull request #216 from zoff-music/feature/song-validation
Feature/song validation
2017-11-09 16:13:21 +01:00
Kasper Rynning-Tønnesen
f86a5382f0 Forgot to add the files 2017-11-09 16:12:29 +01:00
Kasper Rynning-Tønnesen
e5013599c8 Added test serverside to ensure that title is correct + duration isn't insanely much higher that it should be 2017-11-09 16:11:57 +01:00
Kasper Rynning-Tønnesen
dd357ce7e3 Quick fix for enabling start and end seconds on chromecast 2017-11-09 08:07:49 +01:00
Kasper Rynning-Tønnesen
120006c866 Fixed margin error 2017-11-08 19:42:23 +01:00
Kasper Rynning-Tønnesen
62934c10c0 Small fix to ensure close button for sidenav stays there on desktop 2017-11-08 16:07:10 +01:00
Kasper Rynning-Tønnesen
f6fc3b4c81 Update README.md 2017-11-08 15:51:46 +01:00
Kasper Rynning-Tønnesen
92438a301e Merge pull request #214 from zoff-music/fix/duration-fix
Fixed issue with duration not working on songs without a start and en…
2017-11-08 15:45:23 +01:00
Kasper Rynning-Tønnesen
f90af8d2e1 Fixed issue with duration not working on songs without a start and end set 2017-11-08 15:44:48 +01:00
Kasper Rynning-Tønnesen
2e58559407 Merge pull request #213 from zoff-music/fix/sizing-results
Fixed issue with buttons on results
2017-11-08 15:40:33 +01:00
Kasper Rynning-Tønnesen
016f95052a Fixed issue with buttons on results 2017-11-08 15:40:14 +01:00
Kasper Rynning-Tønnesen
79c3844d6e Merge pull request #212 from zoff-music/fix/deleted-empty
Fixed issue with deleting a song in a list with 2 elements, it thinks…
2017-11-08 15:37:09 +01:00
Kasper Rynning-Tønnesen
6f28e10041 Fixed issue with deleting a song in a list with 2 elements, it thinks it is empty 2017-11-08 15:36:47 +01:00
Kasper Rynning-Tønnesen
736ae6abea Merge pull request #211 from zoff-music/feature/start-end-song
Added functionality for setting start and end on a song
2017-11-08 15:35:38 +01:00
Kasper Rynning-Tønnesen
47a1668cd5 Added functionality for setting start and end on a song 2017-11-08 15:33:50 +01:00
Kasper Rynning-Tønnesen
605468e891 No scroll on search 2017-11-07 16:44:24 +01:00
Kasper Rynning-Tønnesen
9ede1f8d2b Quickfix for initSlider not being run on reentering channel 2017-11-07 15:38:19 +01:00
Kasper Rynning-Tønnesen
1e7dcd7188 Merge pull request #209 from zoff-music/fix/volume-slider-resize
Fixed small issue with volume-slider being faulty initiated sometimes
2017-11-07 15:09:51 +01:00
Kasper Rynning-Tønnesen
847c42220e Fixed small issue with volume-slider being faulty initiated sometimes 2017-11-07 15:09:23 +01:00
Kasper Rynning-Tønnesen
7606f91480 Merge pull request #208 from zoff-music/fix/volume-slider-resize
Fixed issue with volumeslider being messed up on windowresize
2017-11-07 14:55:25 +01:00
Kasper Rynning-Tønnesen
c86372b0fc Fixed issue with volumeslider being messed up on windowresize 2017-11-07 14:54:44 +01:00
Kasper Rynning-Tønnesen
4175eaa271 Merge pull request #207 from zoff-music/fix/readme-update
Readme updates
2017-11-06 16:05:43 +01:00
Kasper Rynning-Tønnesen
d02de27ff5 Readme updates 2017-11-06 16:05:22 +01:00
Kasper Rynning-Tønnesen
66a4ba19f7 Merge pull request #206 from zoff-music/feature/pagination_search
Search pagination and animations
2017-11-06 16:00:25 +01:00
Kasper Rynning-Tønnesen
7bf551dfce Search pagination and animations
- Added previous and next button at the end of searches, and styled the buttons
- Added so buttons only work when there are a previous or next page, depending on what is clicked
- Added a pretty and better way of showing the search with animations
2017-11-06 15:59:57 +01:00
Kasper Rynning-Tønnesen
532bc851c0 Merge pull request #205 from zoff-music/fix/errors
Changed cursor of toast
2017-11-06 14:54:41 +01:00
Kasper Rynning-Tønnesen
124ab116e7 Changed cursor of toast 2017-11-06 14:54:07 +01:00
Kasper Rynning-Tønnesen
b00fe9a33e Merge pull request #204 from zoff-music/fix/errors
Fixed errors appearing in log
2017-11-06 14:51:52 +01:00
Kasper Rynning-Tønnesen
98149e1fe5 Fixed errors appearing in log
- Fixed Uncaught TypeError: Cannot read property 'removeChild' of null error
- Fixed Uncaught TypeError: Cannot read property 'tweensContainer' of undefined

first error was a problem with toasts, and how they were removed
second error was problem with playlist tabs, and trying to set the selected_tab after the tabscontainer was removed
2017-11-06 14:51:30 +01:00
Kasper Rynning-Tønnesen
01c95f90f5 Merge pull request #203 from zoff-music/fix/update-helper-modal
updated help modal in channel
2017-11-03 16:02:20 +01:00
Kasper Rynning-Tønnesen
c00e92c6f4 updated help modal in channel 2017-11-03 16:01:51 +01:00
Kasper Rynning-Tønnesen
2d0d8d5a50 Merge pull request #202 from zoff-music/fix/no-snow-channel
No snow on channel
2017-11-02 17:04:00 +01:00
Kasper Rynning-Tønnesen
1bf34d0bdb No snow on channel 2017-11-02 17:03:38 +01:00
Kasper Rynning-Tønnesen
1b51bf9389 Merge pull request #201 from zoff-music/fix/snow-fix
Fixed issue with snow not dissapearing
2017-11-02 13:15:31 +01:00
Kasper Rynning-Tønnesen
a81bd8600a Fixed issue with snow not dissapearing 2017-11-02 13:14:52 +01:00
Kasper Rynning-Tønnesen
09316e6363 Merge pull request #200 from zoff-music/feature/delete-all-songs-confirmation
Added confirmationprompt on delete all songs
2017-11-02 13:12:14 +01:00
Kasper Rynning-Tønnesen
3fef6379dc Added confirmationprompt on delete all songs 2017-11-02 13:11:39 +01:00
Kasper Rynning-Tønnesen
8765f72641 Merge pull request #199 from zoff-music/feature/snow-channel
Snow in channel also on video
2017-11-02 11:45:43 +01:00
Kasper Rynning-Tønnesen
c3183e746c Snow in channel also on video 2017-11-02 11:45:21 +01:00
Kasper Rynning-Tønnesen
56d7db4257 Merge pull request #198 from zoff-music/fix/password-set-fix
Fixed issue where setting password was faulty on entering channel a s…
2017-11-02 11:38:21 +01:00
Kasper Rynning-Tønnesen
084550d84c Fixed issue where setting password was faulty on entering channel a second time 2017-11-02 11:38:02 +01:00
Kasper Rynning-Tønnesen
95f6ae4b57 Merge pull request #197 from zoff-music/refactor/api-own-file
Added api to own file
2017-11-01 12:53:56 +01:00
Kasper Rynning-Tønnesen
795686df05 Merge pull request #196 from zoff-music/fix/pausefix
Fixed skipping/pause issues
2017-11-01 12:53:41 +01:00
Kasper Rynning-Tønnesen
b776e03da8 Added api to own file 2017-11-01 12:53:15 +01:00
Kasper Rynning-Tønnesen
d7677a5f7a Fixed skipping/pause issues 2017-11-01 12:52:38 +01:00
Kasper Rynning-Tønnesen
5145b8d03c Removed unused files 2017-11-01 12:18:03 +01:00
Kasper Rynning-Tønnesen
48971cb7d3 Merge pull request #195 from zoff-music/revert-194-refactor/combinejs
Revert "Trying to concat libs"
2017-11-01 11:59:46 +01:00
Kasper Rynning-Tønnesen
787ea6f1e4 Revert "Trying to concat libs" 2017-11-01 11:59:37 +01:00
Kasper Rynning-Tønnesen
fab74f236a Merge pull request #194 from zoff-music/refactor/combinejs
Trying to concat libs
2017-11-01 11:57:52 +01:00
Kasper Rynning-Tønnesen
35e2460773 Trying to concat libs 2017-11-01 11:57:31 +01:00
Kasper Rynning-Tønnesen
57faabd8dd Merge branch 'master' of github.com:zoff-music/zoff 2017-10-31 14:54:44 +01:00
Kasper Rynning-Tønnesen
4850d3558c Added background-color to match footer for overscroll on mac 2017-10-31 14:54:22 +01:00
Kasper Rynning-Tønnesen
135b78df1f Merge pull request #193 from zoff-music/fix/scaling-w3c
Scaling rule removed for better w3c validator
2017-10-31 14:04:22 +01:00
Kasper Rynning-Tønnesen
a64d2d8bc8 Scaling rule removed for better w3c validator 2017-10-31 14:04:02 +01:00
Kasper Rynning-Tønnesen
5304feaebb Merge pull request #192 from zoff-music/fix/polyfill-color-sizing
Fixed small issues with sizing of polyfill container
2017-10-31 13:58:58 +01:00
Kasper Rynning-Tønnesen
de007073bc Fixed small issues with sizing of polyfill container 2017-10-31 13:58:37 +01:00
Kasper Rynning-Tønnesen
8de842f154 Merge pull request #191 from zoff-music/feature/polyfill-color
Feature/polyfill color
2017-10-31 13:55:55 +01:00
Kasper Rynning-Tønnesen
c501b162e8 Styled polyfill window for colorpicker to match rest of site 2017-10-31 13:55:22 +01:00
Kasper Rynning-Tønnesen
a31cc6c759 Added colorpicker polyfill 2017-10-31 13:34:12 +01:00
Kasper Rynning-Tønnesen
bfcfb6d140 Merge pull request #190 from zoff-music/fix/cleared_channel
Fixed issue with added a playlist to a recently cleared channel
2017-10-30 12:26:44 +01:00
Kasper Rynning-Tønnesen
e08c72f98c Fixed issue with added a playlist to a recently cleared channel 2017-10-30 12:26:15 +01:00
Kasper Rynning-Tønnesen
bbce393a5f Merge pull request #189 from zoff-music/fix/chat-skip
Fixed issue where name of person skipping not being correctly sent
2017-10-18 17:03:52 +02:00
Kasper Rynning-Tønnesen
3b8e4ce952 Fixed issue where name of person skipping not being correctly sent 2017-10-18 17:03:24 +02:00
Kasper Rynning-Tønnesen
1dbf9931ea Merge pull request #188 from zoff-music/fix/html-markup-fix
Fixed issue from html validator with li not being inside ul
2017-10-17 21:18:36 +02:00
Kasper Rynning-Tønnesen
96e46fdbbb Fixed issue from html validator with li not being inside ul 2017-10-17 21:17:56 +02:00
Kasper Rynning-Tønnesen
d62bd31aa9 Merge pull request #187 from zoff-music/fix/panel-refactorfix
Refactored in more files, and fixed issues with panel markup
2017-10-17 20:51:36 +02:00
Kasper Rynning-Tønnesen
2e685ef9dd Refactored in more files, and fixed issues with panel markup 2017-10-17 20:50:34 +02:00
Kasper Rynning-Tønnesen
074ae2bdaf Merge pull request #186 from zoff-music/fix/readme-typos
Receives is types receives not recieves
2017-10-17 20:21:56 +02:00
Kasper Rynning-Tønnesen
ceb5ed309e Receives is types receives not recieves 2017-10-17 20:21:27 +02:00
Kasper Rynning-Tønnesen
a588bffb17 Merge pull request #185 from zoff-music/fix/hostcontroller
Fixed versionissue in hostcontroller.js
2017-10-17 20:20:11 +02:00
Kasper Rynning-Tønnesen
84c5981e60 Merge pull request #184 from zoff-music/fix/readme-logs
Fix/readme logs
2017-10-17 20:19:59 +02:00
Kasper Rynning-Tønnesen
0a17e736e8 Fixed versionissue in hostcontroller.js 2017-10-17 20:19:40 +02:00
Kasper Rynning-Tønnesen
68a18ef869 Updated events being sent 2017-10-17 20:18:58 +02:00
Kasper Rynning-Tønnesen
f351b6bb99 Started working on README.md events 2017-10-17 16:12:50 +02:00
Kasper Rynning-Tønnesen
a5fccb3a5e Removed previous logs 2017-10-17 16:01:45 +02:00
Kasper Rynning-Tønnesen
68b6317f1a Log added now maybe? 2017-10-17 15:57:43 +02:00
Kasper Rynning-Tønnesen
1504496219 Trying testcommand for building purposes 2017-10-17 15:55:58 +02:00
Kasper Rynning-Tønnesen
4eb4fe995e Merge pull request #182 from zoff-music/fix/chat_names
Trying a fix for chat names crashing the server
2017-10-17 15:53:25 +02:00
Kasper Rynning-Tønnesen
0be7813428 Trying a fix for chat names crashing the server 2017-10-17 15:52:51 +02:00
Kasper Rynning-Tønnesen
9a4df38122 Merge pull request #181 from zoff-music/refactor/cdns
Fixed relative issue
2017-10-17 15:48:25 +02:00
Kasper Rynning-Tønnesen
a7f147eb1f Fixed relative issue 2017-10-17 15:47:24 +02:00
Kasper Rynning-Tønnesen
90ee089b37 Merge pull request #180 from zoff-music/refactor/cdns
Personalized jquery-ui-min
2017-10-17 15:44:27 +02:00
Kasper Rynning-Tønnesen
f53a6ecedd Personalized jquery-ui-min 2017-10-17 15:44:02 +02:00
Kasper Rynning-Tønnesen
831f163ea9 Merge pull request #179 from zoff-music/refactor/cdns
Trying to use cdns
2017-10-17 15:39:37 +02:00
Kasper Rynning-Tønnesen
6a3f945ce5 Trying to use cdns 2017-10-17 15:38:56 +02:00
Kasper Rynning-Tønnesen
c90253993b Merge pull request #178 from zoff-music/refactor/ignoring
Refactor/ignoring
2017-10-17 15:18:41 +02:00
Kasper Rynning-Tønnesen
aa0d35c854 Removed old files 2017-10-17 15:17:38 +02:00
Kasper Rynning-Tønnesen
5830c4c06b Merged 2017-10-17 15:16:28 +02:00
Kasper Rynning-Tønnesen
f5facd0b70 Removed cached version 2017-10-17 15:13:47 +02:00
Kasper Rynning-Tønnesen
acadfb5b19 Added minified to ignorelist 2017-10-17 15:11:01 +02:00
Kasper Rynning-Tønnesen
3b4cfe2af7 Merge pull request #176 from zoff-music/feature/auto-pull
updated gulpfile
2017-10-17 14:55:53 +02:00
Kasper Rynning-Tønnesen
1fa7a7e439 updated gulpfile 2017-10-17 14:53:39 +02:00
Kasper Rynning-Tønnesen
fb35851cc5 Merge pull request #175 from zoff-music/fix/chat-icons
Fixed chat icons
2017-10-17 14:44:45 +02:00
Kasper Rynning-Tønnesen
6e3ca04fe8 Fixed chat icons 2017-10-17 14:39:09 +02:00
Kasper Rynning-Tønnesen
2a1bcc51ba Merge pull request #174 from zoff-music/refactor/folders
Moved files to config folders, and updated pm2 command
2017-10-17 14:21:10 +02:00
Kasper Rynning-Tønnesen
70360f3760 Moved files to config folders, and updated pm2 command 2017-10-17 14:12:49 +02:00
Kasper Rynning-Tønnesen
c7816f5d15 Merge pull request #173 from zoff-music/refactor/move
Moved to more partials
2017-10-17 14:00:25 +02:00
Kasper Rynning-Tønnesen
73c73fbcff Merge pull request #172 from zoff-music/fix/examples
Added examplefiles
2017-10-17 14:00:12 +02:00
Kasper Rynning-Tønnesen
a9b3adb368 Added examplefiles 2017-10-17 13:59:38 +02:00
Kasper Rynning-Tønnesen
3fbfb6c12f Moved to more partials 2017-10-17 13:56:46 +02:00
Kasper Rynning-Tønnesen
0f6e9f8161 Trying to support fb.zoff.me 2017-10-16 22:35:46 +02:00
Kasper Rynning-Tønnesen
f8bbf7a278 CORS 2017-10-16 22:31:44 +02:00
Kasper Rynning-Tønnesen
4933b6f8b9 cors 2017-10-16 22:27:51 +02:00
Kasper Rynning-Tønnesen
89a5c3b485 Included fb.zoff.me 2017-10-16 22:19:15 +02:00
Kasper Rynning-Tønnesen
f2e7c67457 Trying a log 2017-10-16 22:07:13 +02:00
Kasper Rynning-Tønnesen
3d0ed3aeb5 Fixed urls 2017-10-16 22:05:48 +02:00
Kasper Rynning-Tønnesen
296327ba7d Removed unused variables and trying to fix frontpage error on fb.zoff.me 2017-10-16 22:03:33 +02:00
Kasper Rynning-Tønnesen
b25ca4eadd Moved certificates and stuff 2017-10-16 21:56:48 +02:00
Kasper Rynning-Tønnesen
e0c17676cd Updated certificate 2017-10-16 21:53:39 +02:00
Kasper Rynning-Tønnesen
b1b3ed4f28 Better aligning of volume-slider and chromecast button on mobile 2017-10-16 12:05:05 +02:00
Kasper Rynning-Tønnesen
e3ce00ca18 Margin readded, looked weird without 2017-10-14 13:24:04 +02:00
Kasper Rynning-Tønnesen
a65ae66e03 Fixed coloring of volume-slider on mobile 2017-10-14 13:22:28 +02:00
Kasper Rynning-Tønnesen
5b0b779530 More aligning and prettified playbar somewhat 2017-10-14 13:20:23 +02:00
Kasper Rynning-Tønnesen
47974a4711 Aligned skip buttons better 2017-10-14 13:08:45 +02:00
Kasper Rynning-Tønnesen
6daf87ceaf Removed futura 2017-10-13 20:20:24 +02:00
Kasper Rynning-Tønnesen
d789118aa7 Fixed issue with snow-images 2017-10-13 16:08:10 +02:00
Kasper Rynning-Tønnesen
d8c1abfba9 10 minutes chat history, limit of 20 messages 2017-10-13 13:47:13 +02:00
Kasper Rynning-Tønnesen
3b50d84af8 Better icon-handling 2017-10-12 17:23:49 +02:00
Kasper Rynning-Tønnesen
520558166b Minor change to how image is added 2017-10-11 18:34:17 +02:00
Kasper Rynning-Tønnesen
5d51159832 Sizing 2017-10-11 18:30:03 +02:00
Kasper Rynning-Tønnesen
2daa9607d2 Images for admins and stuff 2017-10-11 18:24:54 +02:00
Kasper Rynning-Tønnesen
94d7d50789 Only sending namechange if userstarted, and fixed visual chat on mobile 2017-10-11 15:07:49 +02:00
Kasper Rynning-Tønnesen
f38b5ad3e9 More contrast in chat, and fixed skipbutton highlight bug on mobile 2017-10-11 14:45:19 +02:00
Kasper Rynning-Tønnesen
80c37d9cba Easier to see where people chat from 2017-10-11 14:39:22 +02:00
Kasper Rynning-Tønnesen
ec2ea167b3 Case insensitive 2017-10-11 12:27:31 +02:00
Kasper Rynning-Tønnesen
c04614e95b Names reimplemented, just a little better 2017-10-11 12:22:08 +02:00
Kasper Rynning-Tønnesen
f13ba939a4 playbarbutton class 2017-10-11 10:00:49 +02:00
Kasper Rynning-Tønnesen
1a84051252 more aligning 2017-10-11 09:57:15 +02:00
Kasper Rynning-Tønnesen
c873e85a1c Fixed issue with skip and prev button being misaligned 2017-10-11 09:55:16 +02:00
Kasper Rynning-Tønnesen
fd47f9ca8b Animated hamburger menu working 2017-10-11 09:38:47 +02:00
Kasper Rynning-Tønnesen
1a52a9f769 Shufflebutton visible on mobile 2017-10-09 10:13:20 +02:00
Kasper Rynning-Tønnesen
f88d53b132 Fixed local issue with infinite users 2017-10-09 08:42:07 +02:00
Kasper Rynning-Tønnesen
2339327a6e Offline previous song 2017-10-08 22:31:59 +02:00
Kasper Rynning-Tønnesen
9fd9cd301b Moved skip-button down 2017-10-08 21:51:43 +02:00
Kasper Rynning-Tønnesen
b55598b5d9 Embed changed 2017-10-04 12:43:39 +02:00
Kasper Rynning-Tønnesen
a810e3365e Fixed dragging error on mobile 2017-10-04 12:37:56 +02:00
Kasper Rynning-Tønnesen
ac6a07b9b2 Updated readme 2017-10-03 17:02:53 +02:00
Kasper Rynning-Tønnesen
3aadcbd9e8 Deleted a package.json 2017-10-03 16:58:59 +02:00
Kasper Rynning-Tønnesen
17c65267d5 Update README.md 2017-10-03 16:50:09 +02:00
Kasper Rynning-Tønnesen
31e2681e2f precomposed correctly 2017-10-03 16:42:19 +02:00
Kasper Rynning-Tønnesen
811d8f0737 reverting to using shortname 2017-10-03 16:38:26 +02:00
Kasper Rynning-Tønnesen
4a3dbd3aef sending precomposed instead of apple-touch 2017-10-03 16:36:38 +02:00
Kasper Rynning-Tønnesen
f71d641f8f precomposed image also present 2017-10-03 16:34:45 +02:00
Kasper Rynning-Tønnesen
94004af00c trying fix for safari-pinned-tab 2017-10-03 16:31:03 +02:00
Kasper Rynning-Tønnesen
2535da4e40 Fixed safari-pinned-tab 2017-10-03 16:27:28 +02:00
Kasper Rynning-Tønnesen
0570bfd45a Trying to get realfavicon working 2017-10-03 16:25:31 +02:00
Kasper Rynning-Tønnesen
ef329b9b71 Used realfavicongenerator.net to generate new favicons 2017-10-03 16:14:39 +02:00
Kasper Rynning-Tønnesen
c14c9717b7 Fixing weird visual bug on frontpage for firefox 2017-10-03 15:38:49 +02:00
Kasper Rynning-Tønnesen
e0ca8eab68 Different color on chat time 2017-09-28 12:24:57 +02:00
Kasper Rynning-Tønnesen
0ee6a9fde7 Time on chat 2017-09-28 12:04:36 +02:00
Kasper Rynning-Tønnesen
182ebeca50 Prefix for icon 2017-09-28 11:33:35 +02:00
Kasper Rynning-Tønnesen
a41a1c1728 Trying to fix for firefox.. 2017-09-28 11:13:43 +02:00
Kasper Rynning-Tønnesen
c2c0cfcc58 Fixed issue with lock being placed weird on firefox 2017-09-28 11:09:42 +02:00
Kasper Rynning-Tønnesen
41488aecf4 Removed tooltipped as class 2017-09-27 11:27:26 +02:00
Kasper Rynning-Tønnesen
70f9eda634 Removed tooltips from mobile 2017-09-27 11:23:18 +02:00
Kasper Rynning-Tønnesen
b246c2029f Added more api 2017-09-26 16:54:42 +02:00
Kasper Rynning-Tønnesen
733ced2697 half to the right 2017-09-25 22:14:15 +02:00
Kasper Rynning-Tønnesen
55e50edca7 Better background and positioning of the volumeslider for mobile 2017-09-25 22:12:53 +02:00
Kasper Rynning-Tønnesen
bb40c21f97 Styling on volumebar 2017-09-25 21:59:30 +02:00
Kasper Rynning-Tønnesen
bc397c1ef1 More volumecontrol for chromecasting 2017-09-25 21:49:38 +02:00
Kasper Rynning-Tønnesen
5c78119a3a Hopefully fixed to crashpoints 2017-09-25 16:54:50 +02:00
Kasper Rynning-Tønnesen
9372bf3bf0 More indentation 2017-09-22 11:45:54 +02:00
Kasper Rynning-Tønnesen
68d243c93a Removed some old functions and indented code 2017-09-22 11:42:26 +02:00
Kasper Rynning-Tønnesen
758f7cebc4 Made improvement to admin-site 2017-09-19 14:43:56 +02:00
Kasper Rynning-Tønnesen
34633c6e33 Removing tooltips from channel on navigating back to frontpage 2017-09-18 17:40:56 +02:00
Kasper Rynning-Tønnesen
36d56828f0 Updated images on README.md 2017-09-18 15:11:55 +02:00
Kasper Rynning-Tønnesen
7a89defb3b Removed github from bottom 2017-09-18 15:08:21 +02:00
Kasper Rynning-Tønnesen
c4967ae120 Updated .gitignore and npm scripts 2017-09-18 15:01:48 +02:00
Kasper Rynning-Tønnesen
5f1c6549c9 Updated gulpfile, and sending total # of users 2017-09-18 14:51:09 +02:00
Kasper Rynning-Tønnesen
77c374f9b7 Returned to refactored state 2017-09-18 14:47:24 +02:00
Kasper Rynning-Tønnesen
52c7552b67 Fixed issue with unique id crashing server 2017-09-18 13:27:12 +02:00
Kasper Rynning-Tønnesen
130538f462 Fixed errors in code 2017-09-18 12:45:34 +02:00
Kasper Rynning-Tønnesen
440d5dc677 Trying to improve cpu on server.. 2017-09-18 12:30:16 +02:00
Kasper Rynning-Tønnesen
71f5be88df Trying to deactivate send_ping 2017-09-17 22:23:48 +02:00
Kasper Rynning-Tønnesen
c3935c993b Fixed issue with autocomplete not appearing 2017-09-17 22:16:43 +02:00
Kasper Rynning-Tønnesen
78bf0f6750 Fixed issue with viewing all channels on the frontpage 2017-09-17 22:15:04 +02:00
Kasper Rynning-Tønnesen
4db99a148e important to be imortant 2017-09-17 22:11:51 +02:00
Kasper Rynning-Tønnesen
9663898e9b Moved text somewhat up on frontpage 2017-09-17 22:10:59 +02:00
Kasper Rynning-Tønnesen
76ece66b66 Trying to deactivate cache 2017-09-17 22:00:11 +02:00
Kasper Rynning-Tønnesen
de92bae7f5 Trying to use rest to fetch frontpagelists 2017-09-17 21:39:30 +02:00
Kasper Rynning-Tønnesen
1f342c4090 Set up api for frontpages 2017-09-17 21:29:22 +02:00
Kasper Rynning-Tønnesen
0be7816edc Trying to move frontpage back to io.js 2017-09-17 21:23:41 +02:00
Kasper Rynning-Tønnesen
7d2cecd6be Trying to not use greater than 2017-09-17 21:14:08 +02:00
Kasper Rynning-Tønnesen
733d839b85 Fixed namechange error 2017-09-17 11:35:18 +02:00
Kasper Rynning-Tønnesen
850be93973 Trying to improve frontpage fetching 2017-09-17 11:33:01 +02:00
Kasper Rynning-Tønnesen
5bbde84a7c Trying to get server to understand 2017-09-14 12:02:41 +02:00
Kasper Rynning-Tønnesen
d0e53ec1f5 Fixed issue with fb.zoff.me not being able to connect 2017-09-14 12:00:12 +02:00
Kasper Rynning-Tønnesen
f241243d28 Updated templates a bit, and improved frontpage sorting 2017-09-13 22:38:28 +02:00
Kasper Rynning-Tønnesen
a6d238e4df Forgot to flush names 2017-09-13 19:42:32 +02:00
Kasper Rynning-Tønnesen
c8e8e841e6 Fixed issue with errorounououoesess coll on linje 106 in chat 2017-09-13 19:39:24 +02:00
Kasper Rynning-Tønnesen
bc71e67ca4 Deactivated usernames for now, until it is more stabil 2017-09-13 19:35:56 +02:00
Kasper Rynning-Tønnesen
22b62e36cd Starting to work on some better pinging for usernames 2017-09-13 18:36:12 +02:00
Kasper Rynning-Tønnesen
2931dfc99b Fixed embed and spotifycallback issue 2017-09-13 15:48:31 +02:00
Kasper Rynning-Tønnesen
165ca4ad32 Fixed typo 2017-09-13 15:46:44 +02:00
Kasper Rynning-Tønnesen
a42b746abf Fixed issue with lists not being sorted properly on the frontpage 2017-09-13 15:46:04 +02:00
Kasper Rynning-Tønnesen
a8fa6a2901 Fixed issue with frontpagelists image not being saved on 404 2017-09-13 15:22:39 +02:00
Kasper Rynning-Tønnesen
5be5934ea2 Merge branch 'master' of github.com:zoff-music/zoff 2017-09-13 15:11:28 +02:00
Kasper Rynning-Tønnesen
e629f70906 Fixed issue with channelname not being changed 2017-09-13 15:10:58 +02:00
Kasper Rynning-Tønnesen
26e4214a50 Update server.js 2017-09-13 13:05:42 +02:00
Kasper Rynning-Tønnesen
be5056f712 Update chat.js 2017-09-13 13:03:27 +02:00
Kasper Rynning-Tønnesen
62250f890a Chromecast backendfix 2017-09-13 09:05:04 +02:00
Kasper Rynning-Tønnesen
a2e7bb7ffb Updated socket.id for chromecastlistening on mobile 2017-09-12 20:19:13 +02:00
Kasper Rynning-Tønnesen
a6a7c86975 Sending some info to adminpanel 2017-09-12 17:53:04 +02:00
Kasper Rynning-Tønnesen
4d9db5cba8 Made temporary fix for adminpanel crashing server 2017-09-12 17:50:38 +02:00
Kasper Rynning-Tønnesen
253b5d75d9 Trying small fix for null-viewers bug 2017-09-12 17:43:31 +02:00
Kasper Rynning-Tønnesen
e8ed8fa815 Fixed issue with leaving and joining a channel on the same computer made you not able to speak in chat 2017-09-12 17:37:21 +02:00
Kasper Rynning-Tønnesen
e606361371 Merge pull request #168 from zoff-music/refactoring
Refactoring
2017-09-12 16:57:45 +02:00
Kasper Rynning-Tønnesen
7c4e56b00c Merged with master 2017-09-12 16:53:15 +02:00
Kasper Rynning-Tønnesen
02081d9bb5 Fixed issue with toasts acting weird 2017-09-12 16:52:04 +02:00
Kasper Rynning-Tønnesen
977d3846f4 refactored and moved a lot of code around to separate files 2017-09-12 16:50:26 +02:00
Kasper Rynning-Tønnesen
657ace250a Names fixed 2017-09-12 14:12:24 +02:00
Kasper Rynning-Tønnesen
9efe6ab34e names working 2017-09-12 13:14:33 +02:00
Kasper Rynning-Tønnesen
ce4d49cc8f Skippedtimes 2017-09-12 10:48:41 +02:00
Kasper Rynning-Tønnesen
43af2219d1 Unique id via DB 2017-09-12 10:22:07 +02:00
Kasper Rynning-Tønnesen
bf8563bd74 Fixed issue with skip not working 2017-09-12 10:05:23 +02:00
Kasper Rynning-Tønnesen
8f1a8f60e3 not sending empty lists 2017-09-11 20:00:33 +02:00
Kasper Rynning-Tønnesen
cbdacf299b Fixing issue with too many total viewers 2017-09-11 18:49:58 +02:00
Kasper Rynning-Tønnesen
a7d213630c Removed condition where in_list was set whenever frontpage lists where fetched 2017-09-11 16:56:50 +02:00
Kasper Rynning-Tønnesen
0fecac6cca Added upsert to two fields 2017-09-11 16:45:49 +02:00
Kasper Rynning-Tønnesen
fd71c4406e Typo 2017-09-11 16:29:22 +02:00
Kasper Rynning-Tønnesen
546baa09cc Fixed some issues with multi-db 2017-09-11 16:27:45 +02:00
Kasper Rynning-Tønnesen
05ce8923e6 Fixed issue with infinate counter 2017-09-11 16:24:13 +02:00
Kasper Rynning-Tønnesen
7e96a1e584 selftest 2017-09-11 16:15:36 +02:00
Kasper Rynning-Tønnesen
2b07dccc39 Trying to move connected users and such from in-memory to db 2017-09-11 15:50:43 +02:00
Kasper Rynning-Tønnesen
d99ef644ad Trying to fix issue with total viewer count 2017-09-11 10:57:29 +02:00
Kasper Rynning-Tønnesen
e27e547f8d Fixing issue with dead listeners on server restart 2017-09-11 10:44:39 +02:00
Kasper Rynning-Tønnesen
b79e38af34 Trying caching in express-handlebars 2017-09-11 10:35:51 +02:00
Kasper Rynning-Tønnesen
f1f374763c not showing lists with 0 songs 2017-09-11 09:57:19 +02:00
Kasper Rynning-Tønnesen
052cdc229a Improved performance on server on frontpage a bit 2017-09-11 09:52:58 +02:00
Kasper Rynning-Tønnesen
2673892974 UPPERCASE FUCK 2017-09-11 09:02:21 +02:00
Kasper Rynning-Tønnesen
d55680425b Ensuring version is sent before testing the value of it 2017-09-11 09:01:33 +02:00
Kasper Rynning-Tønnesen
29c7af98f2 Fixed issue with frontpage crashing server 2017-09-11 08:59:23 +02:00
Kasper Rynning-Tønnesen
2afacf6408 Added a way of ensuring correct versions between server and client 2017-09-11 08:57:31 +02:00
Kasper Rynning-Tønnesen
7ccb9298c0 Channel fix 2017-09-08 15:44:17 +02:00
Kasper Rynning-Tønnesen
7f5d52ca30 Sending current server to chromecast also 2017-09-08 15:39:19 +02:00
Kasper Rynning-Tønnesen
4c7b8e17e1 Updated embed to accommodate the new changees for dead listeners 2017-09-08 14:59:54 +02:00
Kasper Rynning-Tønnesen
0483250196 Merge pull request #167 from zoff-music/fix/dead_listeners
Trying fix for dead listeners
2017-09-08 15:52:17 +03:00
Kasper Rynning-Tønnesen
94e041e002 Trying fix for dead listeners 2017-09-08 14:51:47 +02:00
Kasper Rynning-Tønnesen
5702b4cf8a Merge pull request #166 from zoff-music/tooltips
tooltips thingy
2017-09-08 15:38:17 +03:00
Kasper Rynning-Tønnesen
93424424eb tooltips thingy 2017-09-06 16:07:54 +02:00
Kasper Rynning-Tønnesen
b429f646f3 Made improvements to find 2017-09-06 14:07:03 +02:00
Kasper Rynning-Tønnesen
95a15f4b6e Updated find-div to say how many were found, and the current found in the array.
- Fixed bug where updating the searchtext when CTRL+F (find) didn't reset the search in the list
- Fixed bug where using the find function when a song is changed didn't reset the search
2017-09-06 12:39:24 +02:00
Kasper Rynning-Tønnesen
84cbdfaba0 Improved way of showing playbuttom somewhat 2017-08-28 19:24:29 +02:00
Kasper Rynning-Tønnesen
47e018bb99 Fixed issue with mobile not playing 2017-08-28 19:20:41 +02:00
Kasper Rynning-Tønnesen
8041de8e56 Updated materializecss 2017-08-28 11:15:56 +02:00
Kasper Rynning-Tønnesen
c010bcc4df Fixed issue with Toasts, and temporarily disabled drag-to-delete on mobile 2017-08-11 20:16:20 +02:00
Kasper Rynning-Tønnesen
b92949fd18 Moved names around, and added some text to the contact field 2017-08-08 15:57:40 +02:00
Kasper Rynning-Tønnesen
26cd2feb1b Fixed issue with some modals, and showing a toast on wrong list password 2017-07-22 18:56:59 +02:00
Kasper Rynning-Tønnesen
f05f061d89 Updated to materializecss v0.100.1 2017-07-22 15:09:46 +02:00
Kasper Rynning-Tønnesen
09d858486d Fixed issue with channelloader going indefinetly on empty channel 2017-07-22 14:38:56 +02:00
Kasper Rynning-Tønnesen
a5bb390479 Fixed issue with importing playlist on passwordprotected playlist didnt inform the user 2017-07-22 14:23:43 +02:00
Kasper Rynning-Tønnesen
7298df62a9 Fix for find and apuse 2017-07-19 08:35:35 +02:00
Kasper Rynning-Tønnesen
8427c1bd70 Fixing issue with decodeURIComponent 2017-07-09 23:14:53 +02:00
Kasper Rynning-Tønnesen
3830279f69 Trying to fix issue with dragging 2017-06-23 16:42:38 +02:00
Kasper Rynning-Tønnesen
f204f5d341 Forgot to save style.css 2017-06-23 16:35:02 +02:00
Kasper Rynning-Tønnesen
f618fabfda Smaller player on mobile handle delete button better 2017-06-23 16:33:36 +02:00
Kasper Rynning-Tønnesen
2bae0af081 Adding some logs to the server for debugging purposes 2017-06-22 23:16:17 +02:00
Kasper Rynning-Tønnesen
e6c7682380 fixed issue with player not always showing up with a video, and skipping to fast not always changing the video 2017-06-19 23:21:25 +02:00
Kasper Rynning-Tønnesen
bd950fc1e7 Smoother drag on element 2017-06-19 07:21:31 +02:00
Kasper Rynning-Tønnesen
9a721102c0 Lower cases on entering enw channel 2017-06-18 21:43:46 +02:00
Kasper Rynning-Tønnesen
11d473373d Fixed issue with empty playlists 2017-06-18 21:40:30 +02:00
Kasper Rynning-Tønnesen
51dcb53aa5 Setting limit for 10px before new way of deleting is triggered 2017-06-18 21:33:45 +02:00
Kasper Rynning-Tønnesen
49dab75c35 New way of deleting songs on mobile 2017-06-18 21:03:15 +02:00
Kasper Rynning-Tønnesen
24432e0d0d Centering inputfields 2017-06-16 20:19:37 +02:00
Kasper Rynning-Tønnesen
4595a70239 Buttons more matching throughout the site 2017-06-16 20:17:18 +02:00
Kasper Rynning-Tønnesen
67ab79aa68 Zoff logo now shows as button 2017-06-16 19:23:22 +02:00
Kasper Rynning-Tønnesen
6ac548ee37 Added some tooltips and made noselect even more noselect 2017-06-16 16:20:22 +02:00
Kasper Rynning-Tønnesen
2f60f92dbd Adding song and removing song comes from two different sides now 2017-06-16 16:08:14 +02:00
Kasper Rynning-Tønnesen
7e8136752b Animation on song remove, song add 2017-06-16 15:42:07 +02:00
Kasper Rynning-Tønnesen
083cc921a1 Embedding sending correct title 2017-06-15 19:01:11 +02:00
Kasper Rynning-Tønnesen
e320dca191 Updated embedded version 2017-06-15 18:56:14 +02:00
Kasper Rynning-Tønnesen
a025953f3f More fixes for current playing, and enabling remotecontroller if specified 2017-06-15 18:42:18 +02:00
Kasper Rynning-Tønnesen
e76f9f59b5 Full path instead of relative for assets on chat 2017-06-15 13:52:43 +02:00
Kasper Rynning-Tønnesen
2a87d4f10e Fixed issue where chat-blinking pointed to a dead local link 2017-06-15 13:51:13 +02:00
Kasper Rynning-Tønnesen
7e0b1d9034 Updated embedded player to send now playing and next sooner 2017-06-15 12:59:50 +02:00
Kasper Rynning-Tønnesen
a0c1fa293a Moved toast container somewhat on mobile 2017-06-13 15:56:49 +02:00
Kasper Rynning-Tønnesen
df99dd2b92 More mobile castbutton fixes 2017-06-13 15:54:56 +02:00
Kasper Rynning-Tønnesen
5bb185e181 updated style for castbutton on mobile 2017-06-13 15:54:00 +02:00
Kasper Rynning-Tønnesen
e106d3defd Fixed issue with next song not being sent to embedder 2017-06-09 01:20:52 +02:00
Kasper Rynning-Tønnesen
0458d93d96 Now sending duration event, and next song event to listening embedder 2017-06-09 01:10:51 +02:00
Kasper Rynning-Tønnesen
cb16d2186e even elements in chat list, darker color 2017-06-07 02:25:50 +02:00
Kasper Rynning-Tønnesen
b992baf136 Animated chromecast-icon 2017-06-07 01:27:34 +02:00
Kasper Rynning-Tønnesen
9a57ad1b59 Fixed issue where chromecast button not showing up when navigating back and forth from channels 2017-06-07 00:49:46 +02:00
Kasper Rynning-Tønnesen
991e093b8d Incrementing down, not up.. 2017-06-07 00:42:49 +02:00
Kasper Rynning-Tønnesen
b11b0faf0e Fixing issue with removeafter play not being incremented on the frontpage 2017-06-07 00:36:23 +02:00
Kasper Rynning-Tønnesen
26d558c725 Fixed truncate on card-reveal for description, and removing player when closing the player from the frontpage 2017-06-07 00:23:03 +02:00
Kasper Rynning-Tønnesen
9df7c1802a Prettier chromecast icon on phone 2017-06-05 19:02:23 +02:00
Kasper Rynning-Tønnesen
03e608b1b1 Improvements to look and feel of embedded player 2017-06-05 15:26:44 +02:00
Kasper Rynning-Tønnesen
946b646822 Iframe instead of embed 2017-06-05 14:59:24 +02:00
Kasper Rynning-Tønnesen
3b0d7df4df Moved find-div to front 2017-06-05 10:58:51 +02:00
Kasper Rynning-Tønnesen
b79bea899c Trying again to update frontpagelist.. 2017-06-05 10:55:36 +02:00
Kasper Rynning-Tønnesen
b6bcad56e1 Count fix deleted songs 2017-06-05 10:52:31 +02:00
Kasper Rynning-Tønnesen
d2ce406088 Fixed issue where deleteing all songs didnt clear the frontpage info 2017-06-05 10:47:34 +02:00
Kasper Rynning-Tønnesen
d8bae1142b Fixed delete all button 2017-06-05 10:43:56 +02:00
Kasper Rynning-Tønnesen
947cf6df0d Got chromecast discoveryworking 2017-06-04 23:11:47 +02:00
Kasper Rynning-Tønnesen
10934c53e0 Forgot to remove a log 2017-06-04 22:47:15 +02:00
Kasper Rynning-Tønnesen
7383c8731d Fix for chromecast feature-discovery not showing up 2017-06-04 22:45:31 +02:00
Kasper Rynning-Tønnesen
4757bf263c Fixed issue with viewers not updating 2017-06-04 14:03:05 +02:00
Kasper Rynning-Tønnesen
b6f7a834d8 Started using the more options button on the suggested videos also, to ensure similarity through the page 2017-06-04 10:45:27 +02:00
Kasper Rynning-Tønnesen
a20f454642 Merge pull request #165 from zoff-music/mobilehack
Updated embedded to allow for showing only video
2017-06-03 22:34:43 +02:00
Kasper Rynning-Tønnesen
bbf3f884be Updated embedded to allow for showing only video 2017-06-03 22:33:56 +02:00
Kasper Rynning-Tønnesen
b17615bb11 Merge pull request #164 from zoff-music/mobilehack
Mobilehack
2017-06-03 21:15:04 +02:00
Kasper Rynning-Tønnesen
5500e89579 Opening for better integration with fetching and sending title-events 2017-06-03 21:14:18 +02:00
Kasper Rynning-Tønnesen
57b1b68fb3 Listener update for chromecast 2017-06-03 19:55:42 +02:00
Kasper Rynning-Tønnesen
aa3679737b Chromecast now joining correct namespace 2017-06-02 15:07:46 +02:00
Kasper Rynning-Tønnesen
568a141b21 Fix for github-commit-fetch 2017-06-02 13:05:51 +02:00
Kasper Rynning-Tønnesen
7f13a71771 Mobile 'hack' 2017-06-02 11:03:00 +02:00
Kasper Rynning-Tønnesen
a85623dbbf Delete all songs button added. DANGER 2017-06-01 13:30:12 +02:00
Kasper Rynning-Tønnesen
558deadd45 Updating certificates 2017-05-31 23:08:35 +02:00
Kasper Rynning-Tønnesen
eb3085a23c Github commit fix 2017-05-31 20:54:28 +02:00
Kasper Rynning-Tønnesen
c93957bb18 Target fix 2017-05-31 20:47:30 +02:00
Kasper Rynning-Tønnesen
9379297be1 no fireplace on mobile 2017-05-31 17:27:38 +02:00
Kasper Rynning-Tønnesen
4dbfbe262e Removing deprecationnotice in console 2017-05-31 15:48:47 +02:00
Kasper Rynning-Tønnesen
6cf5577907 Better handling of removing service-worker 2017-05-31 15:45:36 +02:00
Kasper Rynning-Tønnesen
19c0c45433 Song-title widt 2017-05-31 15:43:45 +02:00
Kasper Rynning-Tønnesen
dfc8519e28 Spacebar also unpauses now 2017-05-31 14:07:11 +02:00
Kasper Rynning-Tønnesen
2de4f4f8b6 Play button now functions on song changed 2017-05-31 14:05:26 +02:00
Kasper Rynning-Tønnesen
7a3c2b7c86 Adding tap-target for chromecast-button when first time seeing the chromecast available icon 2017-05-31 12:57:08 +02:00
Kasper Rynning-Tønnesen
daabc07268 Options menu on playlist elements 2017-05-30 19:48:49 +02:00
Kasper Rynning-Tønnesen
1257075c03 Removing song from results when clicked add many button 2017-05-30 17:51:33 +02:00
Kasper Rynning-Tønnesen
52218cafaf Waves-effeeeect 2017-05-30 17:34:38 +02:00
Kasper Rynning-Tønnesen
7678ce5dbe Added open in YouTube button on search, and setting start/endtime of YouTube video.
- Opening for further development with userset end/starttime
2017-05-29 22:20:05 +02:00
Kasper Rynning-Tønnesen
c10477f4e0 Fixing double playlist error 2017-05-28 18:43:40 +02:00
Kasper Rynning-Tønnesen
e8adcafecc Update close-settings button 2017-05-28 18:22:51 +02:00
Kasper Rynning-Tønnesen
44fc43d5c6 More spacebar pausefixes 2017-05-28 18:20:08 +02:00
Kasper Rynning-Tønnesen
5c49e8d7bc No pause on video on sending mail also 2017-05-28 18:17:00 +02:00
Kasper Rynning-Tønnesen
4901c46457 Fixed issue with typing password and such tried to pause video 2017-05-28 18:15:31 +02:00
Kasper Rynning-Tønnesen
03433f0329 Font size on viewers for mobile 2017-05-28 17:51:13 +02:00
Kasper Rynning-Tønnesen
d7eecc5de8 Footer fixes 2017-05-27 22:50:45 +02:00
Kasper Rynning-Tønnesen
fb9572c6cf Trying to fix error where results sometimes end up as undefined when searching 2017-05-27 22:42:53 +02:00
Kasper Rynning-Tønnesen
f17ac8728b Added spacebar pause 2017-05-27 20:18:10 +02:00
Kasper Rynning-Tønnesen
94c6ac091f Showing viewers on mobile 2017-05-27 13:41:50 +02:00
Kasper Rynning-Tønnesen
cfecbbf3e2 Updates to playlist sizing on screen width 2017-05-27 13:31:03 +02:00
Kasper Rynning-Tønnesen
39797f82ab Padding on playlist 2017-05-26 14:40:55 +02:00
Kasper Rynning-Tønnesen
9273e61cb4 Trying update of socket.io to 2.0.1 2017-05-26 14:35:40 +02:00
Kasper Rynning-Tønnesen
2cbf055fe2 Pointer events on controls 2017-05-26 14:28:13 +02:00
Kasper Rynning-Tønnesen
696afe722f Controls on bottom when too small 2017-05-26 13:56:29 +02:00
Kasper Rynning-Tønnesen
14d84f821f hd also 2017-05-24 19:48:38 +02:00
Kasper Rynning-Tønnesen
f8a3c5ede9 Spotify exports 2017-05-24 19:44:46 +02:00
Kasper Rynning-Tønnesen
2aa9af8778 Updated way of exporting, now doesn't crash when trying again and removed a searchword 2017-05-24 19:36:36 +02:00
Kasper Rynning-Tønnesen
f43b3b50e5 Buttonnames.. 2017-05-23 18:41:12 +02:00
Kasper Rynning-Tønnesen
f9359636a3 Renaming private mode to local mode 2017-05-23 18:37:07 +02:00
Kasper Rynning-Tønnesen
a9edf426e9 No animation on delete 2017-05-23 11:15:52 +02:00
Kasper Rynning-Tønnesen
2caa7b1487 Update on the pinging to try and keep the client alive 2017-05-20 19:23:17 +02:00
Kasper Rynning-Tønnesen
d86cb764ab Added google-play badge and link 2017-05-20 12:44:15 +02:00
Kasper Rynning-Tønnesen
0ffe14cbdf Embedded is now also ajour 2017-05-16 17:26:22 +02:00
Kasper Rynning-Tønnesen
7e83116a61 Fixed issues regarding forcing restarts, and userpasswords not working correctly 2017-05-16 16:44:48 +02:00
Kasper Rynning-Tønnesen
0db90fe416 Major update on cryptosystem, all passwords now obsolete.. 2017-05-16 15:15:47 +02:00
Kasper Rynning-Tønnesen
b6b19cc8b7 Autohiding copy-link 2017-05-14 15:10:28 +02:00
Kasper Rynning-Tønnesen
b9349d53a0 Removed scripts and added from github 2017-05-14 14:13:10 +02:00
Kasper Rynning-Tønnesen
b6c6600f1f Removed a simple log 2017-05-14 14:06:24 +02:00
Kasper Rynning-Tønnesen
e72f9a635c Copying video link now working 2017-05-14 14:06:01 +02:00
Kasper Rynning-Tønnesen
c8cc177bbe Deleting correct song on error 2017-05-14 13:13:04 +02:00
Kasper Rynning-Tønnesen
54d33022b3 Skipping on error 2017-05-14 13:04:36 +02:00
Kasper Rynning-Tønnesen
8605ac49cd Trying fix for skip on error 2017-05-14 13:02:27 +02:00
Kasper Rynning-Tønnesen
1ded3c391c Fixed shadowtransition bug 2017-05-13 18:39:29 +02:00
Kasper Rynning-Tønnesen
6dead53184 Fixed donationhash 2017-05-13 15:21:29 +02:00
Kasper Rynning-Tønnesen
a16ec66017 Added another test for voting 2017-05-12 23:41:11 +02:00
Kasper Rynning-Tønnesen
4102c85f5f No select 2017-05-11 13:29:14 +02:00
Kasper Rynning-Tønnesen
3f0ff5d40f Updated some minor server stuff 2017-05-11 11:15:47 +02:00
Kasper Rynning-Tønnesen
e84c8695ab Fixed error when adding a new song to an empty playlist in private mode 2017-05-11 11:01:40 +02:00
Kasper Rynning-Tønnesen
adc5f9438a Updated link from remote-site 2017-05-11 10:39:40 +02:00
Kasper Rynning-Tønnesen
c426bd1da3 Fixing issue with skipping too fast 2017-05-09 23:35:53 +02:00
Kasper Rynning-Tønnesen
d40fed6213 Added a failsafe for servercrash 2017-05-09 13:32:31 +02:00
Kasper Rynning-Tønnesen
c581c11d04 Removed serviceworker, yet again 2017-05-09 12:55:06 +02:00
Kasper Rynning-Tønnesen
f240877928 Service-worker 2017-05-09 12:49:28 +02:00
Kasper Rynning-Tønnesen
a0d245b818 Re added service-worker 2017-05-09 12:45:05 +02:00
Kasper Rynning-Tønnesen
2d00c1df13 Removed serviceworker completely 2017-05-09 12:28:56 +02:00
Kasper Rynning-Tønnesen
4851a8a4ed Removed restrictions 2017-05-06 15:11:54 +02:00
Kasper Rynning-Tønnesen
a84f338534 indentations on server.js 2017-05-06 13:46:17 +02:00
Kasper Rynning-Tønnesen
627719a967 More indentationfixes 2017-05-06 13:29:23 +02:00
Kasper Rynning-Tønnesen
f1d4b80636 Fixed a lot of indentations 2017-05-06 13:21:39 +02:00
Kasper Rynning-Tønnesen
60a7610a28 Fixed authentication issue with chat 2017-05-06 11:37:46 +02:00
Kasper Rynning-Tønnesen
417c928b77 Removing channelpassword from cookies on delete 2017-05-06 11:27:31 +02:00
Kasper Rynning-Tønnesen
92ba3f1a82 Fixed critical crash issue with shuffling 2017-05-05 23:30:37 +02:00
Kasper Rynning-Tønnesen
1a2513920b Another list issue fix 2017-05-05 18:10:42 +02:00
Kasper Rynning-Tønnesen
a680b3ce0a Updated issue with 'pos' 2017-05-05 18:07:41 +02:00
Kasper Rynning-Tønnesen
22c8743aa8 Forgot to revert embedded target 2017-05-05 18:03:33 +02:00
Kasper Rynning-Tønnesen
267ac9a86e Updated frontpage-rotation somewhat, to prevent more than one timer to be active at any given time 2017-05-05 17:59:56 +02:00
Kasper Rynning-Tønnesen
f71dcb51e9 Made major improvements to embedded player, added option for making server force clients to fully refresh, and added some more failsafes for the server 2017-05-05 17:35:27 +02:00
Kasper Rynning-Tønnesen
b9aa04f360 Fixed issue with event trying to fire without existing 2017-05-05 16:45:37 +02:00
Kasper Rynning-Tønnesen
611bee8a99 Trying fix for serviceworker 2017-05-05 16:35:26 +02:00
Kasper Rynning-Tønnesen
7f09c1a999 Fixed issue with playeroverlay 2017-05-05 16:18:07 +02:00
Kasper Rynning-Tønnesen
aa1ca995f0 Fixed issue with toasts comming in the background 2017-05-05 15:58:04 +02:00
Kasper Rynning-Tønnesen
7714729093 Fixed issue with password not being set correctly 2017-05-05 15:53:13 +02:00
Kasper Rynning-Tønnesen
9d06c2bda7 Update server.js 2017-05-05 12:02:42 +02:00
Kasper Rynning-Tønnesen
f8ec4cd888 Update server.js 2017-05-05 10:48:10 +02:00
Kasper Rynning-Tønnesen
eee681a5a5 Update service-worker.js 2017-05-05 09:34:16 +02:00
Kasper Rynning-Tønnesen
c980ca3ae4 Update service-worker.js 2017-05-05 09:33:54 +02:00
Kasper Rynning-Tønnesen
554912a18f Update server.js 2017-05-05 09:25:15 +02:00
Kasper Rynning-Tønnesen
c3ca04a747 Update server.js 2017-05-05 09:16:18 +02:00
Kasper Rynning-Tønnesen
5186bbd4f1 Merge pull request #163 from zoff-music/listpasswords
Listpasswords
2017-05-04 23:36:52 +02:00
Kasper Rynning-Tønnesen
adbd1bb88d Added list-passwords for regular users 2017-05-04 23:36:25 +02:00
Kasper Rynning-Tønnesen
fa38f69f75 Locked password alert shows up correctly 2017-05-04 18:01:05 +02:00
Kasper Rynning-Tønnesen
01bb2c02e6 Started implementation 2017-05-04 13:32:24 +02:00
Kasper Rynning-Tønnesen
49734b935d updated title 2017-05-03 19:37:00 +02:00
Kasper Rynning-Tønnesen
e57dc9867d Updated robots.txt 2017-05-03 19:34:54 +02:00
Kasper Rynning-Tønnesen
da2711e307 Updated cacheversion 2017-05-03 19:29:27 +02:00
Kasper Rynning-Tønnesen
730cf0d724 Changed .gitignore, and started using service-worker again 2017-05-03 19:26:02 +02:00
Kasper Rynning-Tønnesen
c9af861073 Gulpfile format 2017-05-03 19:08:51 +02:00
Kasper Rynning-Tønnesen
5f8984d2d1 fixed background error 2017-05-03 19:00:42 +02:00
Kasper Rynning-Tønnesen
ef6d3af3a9 fixed port redirect issue 2017-05-03 18:47:57 +02:00
Kasper Rynning-Tønnesen
84dd2d7b9f Updated routing somewhat, so it should be possible to run the server without being in the correct folder 2017-05-03 18:37:16 +02:00
Kasper Rynning-Tønnesen
a5257c62f6 updatd manifest.json 2017-05-03 18:11:11 +02:00
Kasper Rynning-Tønnesen
de6a3cc2ca updated package and created pm2 runfile 2017-05-03 16:43:28 +02:00
Kasper Rynning-Tønnesen
743870d2fb Update README.md 2017-05-03 12:31:28 +02:00
Kasper Rynning-Tønnesen
9bc885ceab Moved where events are in the readme 2017-05-02 21:05:03 +02:00
Kasper Rynning-Tønnesen
a53b484fad Added a new mailservice 2017-05-02 20:56:29 +02:00
Kasper Rynning-Tønnesen
ffe5a70f01 Changed php to express in readme 2017-05-02 20:15:38 +02:00
Kasper Rynning-Tønnesen
b6e578015c Updated README 2017-05-02 20:12:14 +02:00
Kasper Rynning-Tønnesen
0685003d9c Fixed issue with player height on mobile 2017-05-02 19:59:56 +02:00
Kasper Rynning-Tønnesen
566367d8ba updated so background ahs transiton 2017-05-02 19:39:12 +02:00
Kasper Rynning-Tønnesen
df5565caae Removed php text 2017-05-02 19:37:37 +02:00
Kasper Rynning-Tønnesen
c05a49028c Merge pull request #160 from zoff-music/nodejsserver
Nodejsserver
2017-05-02 19:36:06 +02:00
Kasper Rynning-Tønnesen
dd322529c4 forgot to change the port 2017-05-02 19:30:08 +02:00
Kasper Rynning-Tønnesen
8c17f7c711 forgot to remove some server_2 2017-05-02 19:29:31 +02:00
Kasper Rynning-Tønnesen
a3e3a6a950 Reverting some https 2017-05-02 19:26:26 +02:00
Kasper Rynning-Tønnesen
9461488dec No console 2017-05-02 18:39:21 +02:00
Kasper Rynning-Tønnesen
5300959499 Fixing remotecontroller 2017-05-02 18:34:59 +02:00
Kasper Rynning-Tønnesen
228b8b1928 Updated way of setting color 2017-05-02 18:31:08 +02:00
Kasper Rynning-Tønnesen
380a6cd60e Fixed issue with trying to access private list 2017-05-02 18:28:39 +02:00
Kasper Rynning-Tønnesen
0a16370ba7 Fixed redirecting 2017-05-02 18:25:24 +02:00
Kasper Rynning-Tønnesen
f366b9a0dc Made change to both functions 2017-05-02 18:06:31 +02:00
Kasper Rynning-Tønnesen
f8e5d63fba Updated some routing 2017-05-02 18:05:51 +02:00
Kasper Rynning-Tønnesen
1d97e9b37e updated protocol enforcing 2017-05-02 18:03:14 +02:00
Kasper Rynning-Tønnesen
e3fba808b1 Portchange 2017-05-02 17:59:04 +02:00
Kasper Rynning-Tønnesen
c523f44cd9 Trying some small fixes 2017-05-02 17:57:59 +02:00
Kasper Rynning-Tønnesen
cef9af4d2d Fixed issue with mongodb 2017-05-02 17:29:28 +02:00
Kasper Rynning-Tønnesen
d40e0d0080 Working handlebars 2017-05-02 17:25:21 +02:00
Kasper Rynning-Tønnesen
9f3e2fddb9 NodeJS server instead of PHP 2017-05-01 23:51:02 +02:00
Kasper Rynning-Tønnesen
824e061996 Updated way of deleting song when not exist 2017-05-01 16:54:58 +02:00
Kasper Rynning-Tønnesen
53cf85046b Height of video 2017-05-01 12:07:26 +02:00
Kasper Rynning-Tønnesen
3c2603b33f Added privatemode for mobile 2017-04-29 21:36:47 +02:00
Kasper Rynning-Tønnesen
c97fc41399 Fixed issue with closebutton not working on frontpage 2017-04-29 17:58:19 +02:00
Kasper Rynning-Tønnesen
7942c8b121 Updated player_overlay 2017-04-29 17:11:19 +02:00
Kasper Rynning-Tønnesen
2a9eeda325 Updated player_overlay height 2017-04-29 17:08:53 +02:00
Kasper Rynning-Tønnesen
36592d55f9 Fixed bug where you can't change viewing channels on frontpage when navigating back and forth 2017-04-29 16:46:31 +02:00
Kasper Rynning-Tønnesen
ee846b7dff Fixed emptychannel placehodler 2017-04-29 16:38:46 +02:00
Kasper Rynning-Tønnesen
4055b52ba0 updated where to remove select programmatically 2017-04-29 16:12:02 +02:00
Kasper Rynning-Tønnesen
407e3a67d0 Updated text for disabled in select on frontpage 2017-04-29 16:10:22 +02:00
Kasper Rynning-Tønnesen
8bb17343bf added option for showing all channels on frontpage, will probably crash stuff 2017-04-29 16:02:56 +02:00
Kasper Rynning-Tønnesen
66987b9339 Delete LICENSE 2017-04-29 15:10:00 +02:00
Kasper Rynning-Tønnesen
fa7a8a0e0f Create LICENSE 2017-04-29 15:08:35 +02:00
Kasper Rynning-Tønnesen
4c9a17208c Update README.md 2017-04-29 15:00:07 +02:00
Kasper Rynning-Tønnesen
cc61a0cb89 Added another failsafe for video not always starting from 0 2017-04-29 14:37:29 +02:00
Kasper Rynning-Tønnesen
f2a98d6bae Firelace in the front, always 2017-04-29 14:24:50 +02:00
Kasper Rynning-Tønnesen
0b082b8484 Updated jquery-ui to only contain things we need, and reverted materialize.min.js to its original state 2017-04-29 14:10:34 +02:00
Kasper Rynning-Tønnesen
aff12c0f7e Fixed issues with mobileplayer 2017-04-29 13:16:42 +02:00
Kasper Rynning-Tønnesen
7998ffb906 Updated delete-button font-size 2017-04-29 13:03:06 +02:00
Kasper Rynning-Tønnesen
b738589414 overlay fix on video-container 2017-04-29 12:58:21 +02:00
Kasper Rynning-Tønnesen
151dbd5b47 More improvements to moving video-container 2017-04-29 12:51:49 +02:00
Kasper Rynning-Tønnesen
0236493e53 using transform instead of position for moving the videoplayer around2 2017-04-29 12:33:10 +02:00
Kasper Rynning-Tønnesen
d503d3a41b Removed a lot of dead elements when navigating back and forth, and added transition on videoplayer 2017-04-29 11:35:19 +02:00
Kasper Rynning-Tønnesen
2b531039c0 updating mailscript 2017-04-28 17:43:48 +02:00
Kasper Rynning-Tønnesen
ebd0fe64af Added dragging variable to embed to fix bar bug 2017-04-28 17:36:35 +02:00
Kasper Rynning-Tønnesen
49031905c8 SSL not being sent on embed... 2017-04-28 17:34:44 +02:00
Kasper Rynning-Tønnesen
ab863addd0 SSL for embed 2017-04-28 17:33:01 +02:00
Kasper Rynning-Tønnesen
1a028a1fbf Changing position of next-prev buttons on playlist in embedded version 2017-04-28 17:23:39 +02:00
Kasper Rynning-Tønnesen
195176e04a more tweaks to the embedded version 2017-04-28 17:20:01 +02:00
Kasper Rynning-Tønnesen
ca524be461 Fixed some dragging issues, and updated the embedded version 2017-04-28 17:05:57 +02:00
Kasper Rynning-Tønnesen
f1f0659899 Added dragging to the duration while in private-mode 2017-04-28 16:36:50 +02:00
Kasper Rynning-Tønnesen
7e2d16ed20 Updated qr-code link to a div 2017-04-28 16:23:36 +02:00
Kasper Rynning-Tønnesen
8068b2eb68 Updated materializeCSS to 0.98.2 2017-04-28 15:19:01 +02:00
Kasper Rynning-Tønnesen
f39426686e Removed fullscreen button from mobile 2017-04-28 15:04:42 +02:00
Kasper Rynning-Tønnesen
750623ea55 Removed materializeCSS slider 2017-04-13 12:35:26 +02:00
Kasper Rynning-Tønnesen
61b2e42472 Updated HSL 2017-04-13 12:32:58 +02:00
Kasper Rynning-Tønnesen
fdb9cd7b43 Updated materializeCSS to 0.98.1 2017-04-13 12:30:40 +02:00
Kasper Rynning-Tønnesen
d8d14dd77c Updated so the placeholder on the frontpage changes 2017-03-22 12:22:17 +01:00
Kasper Rynning-Tønnesen
82723e101f Removed redirect in javascript 2017-03-16 15:27:41 +01:00
Kasper Rynning-Tønnesen
bd298544bd updated frontpage again 2017-03-16 14:44:53 +01:00
Kasper Rynning-Tønnesen
17b3450deb Updated frontpage redirecting 2017-03-16 14:42:54 +01:00
Kasper Rynning-Tønnesen
9ae2634ec8 Trying small fix for redirecting and such 2017-03-16 14:37:53 +01:00
Kasper Rynning-Tønnesen
18e6c82e28 Trying to update serviceworker 2017-03-15 12:45:28 +01:00
Kasper Rynning-Tønnesen
a1f42d8646 Chromecast fixes 2017-03-15 10:41:50 +01:00
Kasper Rynning-Tønnesen
f00071ce3c Fix for skipping in offline mode on chromecast 2017-03-15 10:39:32 +01:00
Kasper Rynning-Tønnesen
4afc7dd0bd Trying fix for get_values 2017-03-14 23:32:57 +01:00
Kasper Rynning-Tønnesen
d1f0dd3323 more relatives 2017-03-14 23:21:33 +01:00
Kasper Rynning-Tønnesen
3b27913da3 reverting 2017-03-14 23:20:02 +01:00
Kasper Rynning-Tønnesen
6372b946bd Trying fix for weird get-requests 2017-03-14 23:18:12 +01:00
Kasper Rynning-Tønnesen
5694a8d484 Updated so suggestions get cleared 2017-03-03 11:27:14 +01:00
Kasper Rynning-Tønnesen
a57826201a Static imagesize on result image, and fixed way of adding suggested number 2017-03-03 11:08:42 +01:00
Kasper Rynning-Tønnesen
f6211944be Hiding suggested notifier when none notified 2017-03-03 10:59:32 +01:00
Kasper Rynning-Tønnesen
d2820f942e forcing flex on suggested-link 2017-03-03 10:57:31 +01:00
Kasper Rynning-Tønnesen
cbe270594d Fixed some positioning of the notification of suggestions 2017-03-03 10:55:43 +01:00
Kasper Rynning-Tønnesen
df44f83341 Way of notifying admins of suggested songs, closes #140 2017-03-03 10:49:06 +01:00
Kasper Rynning-Tønnesen
60b2016fdf Updated some private mode information 2017-03-03 10:18:59 +01:00
Kasper Rynning-Tønnesen
1fbbc31ff0 Working seekto on chromecast also 2017-03-03 08:26:14 +01:00
Kasper Rynning-Tønnesen
95c7ca62ff reverting 2017-03-02 21:57:42 +01:00
Kasper Rynning-Tønnesen
77cae92007 changed back to non socket.zoff.me 2017-03-02 21:55:12 +01:00
Kasper Rynning-Tønnesen
835ffb7f39 Trying new way of connecting to socketio 2017-03-02 21:36:39 +01:00
Kasper Rynning-Tønnesen
c8901a7c1b Updated so users can seekto position in song 2017-03-02 21:15:20 +01:00
Kasper Rynning-Tønnesen
82d734f96e Trying some changes for fb canvas 2017-03-01 16:16:46 +01:00
Kasper Rynning-Tønnesen
744ca2c219 Trying a fix for facebookcanvas 2017-03-01 14:55:16 +01:00
Kasper Rynning-Tønnesen
d6d31ffb14 added some testing stuff 2017-03-01 14:48:40 +01:00
Kasper Rynning-Tønnesen
8754511c64 Updated last-commit 2017-03-01 14:28:16 +01:00
Kasper Rynning-Tønnesen
48bd42a795 Fixed issue with last commit linking to api.github instead of commit itself 2017-03-01 14:22:02 +01:00
Kasper Rynning-Tønnesen
c26f1d67e4 Embed css ubdate 2017-02-28 19:40:41 +01:00
Kasper Rynning-Tønnesen
11459c45c2 Merged 2017-02-28 19:38:11 +01:00
Kasper Rynning-Tønnesen
492236376c Updated vote-button 2017-02-28 19:37:25 +01:00
Kasper Rynning-Tønnesen
f46790b7f0 Merge pull request #159 from zoff-music/medomain
Medomain
2017-02-28 19:27:56 +01:00
Kasper Rynning-Tønnesen
55b13366b5 Updated some frontpage styling 2017-02-28 19:25:51 +01:00
Kasper Rynning-Tønnesen
67ae9159bc More .me redirects 2017-02-28 19:22:29 +01:00
Kasper Rynning-Tønnesen
9a4004a166 .htaccess update 2017-02-28 18:50:35 +01:00
Kasper Rynning-Tønnesen
0cab9db135 More changes made 2017-02-28 18:40:12 +01:00
Kasper Rynning-Tønnesen
5baf8772cc Updates for change to .me 2017-02-28 18:38:49 +01:00
Kasper Rynning-Tønnesen
d67d85781b changed from .no to .me 2017-02-28 18:37:03 +01:00
Kasper Rynning-Tønnesen
0756da0293 Changed name to zoff instead of zöff 2017-02-28 18:35:51 +01:00
Kasper Rynning-Tønnesen
815c757367 Removed truncate on last commit 2017-02-24 16:50:22 +01:00
Kasper Rynning-Tønnesen
157cb80c93 Fixed issue with client trying to destroy fireplace when it already was destroyed 2017-02-24 16:43:31 +01:00
Kasper Rynning-Tønnesen
7053132cfc Removing fireplace on channel exit 2017-02-24 12:49:32 +01:00
Kasper Rynning-Tønnesen
9d6022a0b2 Forgot to remove fireplace on channel-change.. 2017-02-24 12:45:59 +01:00
Kasper Rynning-Tønnesen
6e71c57079 Pointer events none fireplace 2017-02-24 12:43:12 +01:00
Kasper Rynning-Tønnesen
e13aee068e Clearing search on adding fireplace 2017-02-24 12:33:04 +01:00
Kasper Rynning-Tønnesen
cbc2a26eac Added 'hidden' fireplace player 2017-02-24 12:29:43 +01:00
Kasper Rynning-Tønnesen
7ea5f6e81c Updated latest-commit to show from all repos 2017-02-23 19:49:35 +01:00
Kasper Rynning-Tønnesen
4f1372c38c Moved footer around a bit 2017-02-23 19:40:51 +01:00
Kasper Rynning-Tønnesen
6348f0bec8 Removed all rights reserved, it looked stupid 2017-02-23 14:36:24 +01:00
Kasper Rynning-Tønnesen
afbea29b36 Fixed issue with duration not being added 2017-02-23 14:17:43 +01:00
Kasper Rynning-Tønnesen
7f23474b6d Removing toasts when new toasts appear, and added a small fix for w3cvalidator 2017-02-22 22:55:30 +01:00
Kasper Rynning-Tønnesen
4efa995599 Using vector instead of lowres image 2017-02-22 21:36:08 +01:00
Kasper Rynning-Tønnesen
7774626ec3 Fixed issue with showing removebutton 2017-02-22 14:34:45 +01:00
Kasper Rynning-Tønnesen
14939ae97b Fixed issue with not 'skipping' to right position 2017-02-22 14:32:35 +01:00
Kasper Rynning-Tønnesen
30757fa0ec Removed some logs 2017-02-22 12:37:02 +01:00
Kasper Rynning-Tønnesen
c6118d50ff Merged 2017-02-22 12:34:45 +01:00
Kasper Rynning-Tønnesen
f14bfefdf4 Updated mobile-looks 2017-02-22 12:34:16 +01:00
Kasper Rynning-Tønnesen
a746cbc889 Merge pull request #158 from zoff-music/mongoose
Working mongoose version
2017-02-21 18:19:31 +01:00
Kasper Rynning-Tønnesen
87d74c0100 Working mongoose version 2017-02-21 17:07:42 +01:00
Kasper Rynning-Tønnesen
3006237805 Upper first case export 2017-02-16 23:11:00 +01:00
Kasper Rynning-Tønnesen
4d6dffc35d Fixed issue with not all songs being added on export to YouTube 2017-02-16 23:07:13 +01:00
Kasper Rynning-Tønnesen
96070e2591 Matching durations along both suggested and regular 2017-02-16 12:16:28 +01:00
Kasper Rynning-Tønnesen
efcd71cb02 Fixed padding on nav-button in channel 2017-02-15 17:01:40 +01:00
Kasper Rynning-Tønnesen
5dfa27518e Moved duration left and above ::after 2017-02-15 16:56:07 +01:00
Kasper Rynning-Tønnesen
770753e1f8 Fixed issue with player not showing up on ipad 2017-02-15 16:51:32 +01:00
Kasper Rynning-Tønnesen
aa92447e4e Update way of showing play button on android and iPhone 2017-02-15 16:45:47 +01:00
Kasper Rynning-Tønnesen
c76e765904 Fixed search 2017-02-15 15:44:45 +01:00
Kasper Rynning-Tønnesen
ab7c0ecfe8 Added style for admin-panel badges 2017-02-15 15:19:58 +01:00
Kasper Rynning-Tønnesen
131139f6af Fixed issue with no duration shown on suggested 2017-02-15 14:55:38 +01:00
Kasper Rynning-Tønnesen
b1d1b0764d Added duration to songs 2017-02-15 14:49:43 +01:00
Kasper Rynning-Tønnesen
41b14437cf Waves-effect on chat-btn 2017-02-15 13:17:54 +01:00
Kasper Rynning-Tønnesen
76166ee719 Fixed touch error on iphone/ipad 2017-02-15 12:38:44 +01:00
Kasper Rynning-Tønnesen
6b94159cce Fixed tooltip for viewers 2017-02-15 12:31:12 +01:00
Kasper Rynning-Tønnesen
db1c25c2f3 Temporary fix for autocomplete with materializeCSS 2017-02-15 12:21:12 +01:00
Kasper Rynning-Tønnesen
9d4bb0b68b More functioning 'autocomplete' 2017-02-14 21:35:59 +01:00
Kasper Rynning-Tønnesen
35a428b801 Fixed issue with hiding/showing the last video on resize 2017-02-12 17:17:32 +01:00
Kasper Rynning-Tønnesen
5ff69f557b Updated style for admin-panel 2017-02-12 15:56:26 +01:00
Kasper Rynning-Tønnesen
480b3b040d fixed issue with remove-button not hiding on switching from private mode to online-mode, and added help function in chat2 2017-02-12 15:50:25 +01:00
Kasper Rynning-Tønnesen
86d977bb74 Tooltips for private-mode 2017-02-10 16:57:19 +01:00
Kasper Rynning-Tønnesen
ca659e18e5 Description appear fix 2017-02-10 15:34:30 +01:00
Kasper Rynning-Tønnesen
1db3928c2a More delay on frontpage descriptions 2017-02-10 15:30:21 +01:00
Kasper Rynning-Tønnesen
70a301ecf5 Added chat-send button 2017-02-10 15:17:11 +01:00
Kasper Rynning-Tønnesen
4047cce1cd Updating tabs 2017-02-10 12:18:47 +01:00
Kasper Rynning-Tønnesen
4a3cc246dc More descriptive about how many messages have appeared 2017-02-10 11:27:27 +01:00
Kasper Rynning-Tønnesen
0ccdda4815 Charactercount now dynamic 2017-02-09 18:41:52 +01:00
Kasper Rynning-Tønnesen
4eec51e271 Added lengthcounter to description 2017-02-09 18:38:20 +01:00
Kasper Rynning-Tønnesen
88d0eb2ef6 Fixed error with label for inputfield not working as intended on mobile 2017-02-09 18:31:49 +01:00
Kasper Rynning-Tønnesen
e264c18b7c Not showing descriptions on mobile 2017-02-09 17:34:38 +01:00
Kasper Rynning-Tønnesen
d0b6553251 Improved performance for showing searchloader 2017-02-09 15:24:33 +01:00
Kasper Rynning-Tønnesen
9b7a8a00e3 White loader on channel-search 2017-02-09 15:16:08 +01:00
Kasper Rynning-Tønnesen
c4afbfb2ed updated info-icon 2017-02-09 15:11:13 +01:00
Kasper Rynning-Tønnesen
5549434132 Improved frontpage descriptions 2017-02-09 14:40:17 +01:00
Kasper Rynning-Tønnesen
53b4bb81cb Better autocomplete for channelsearch + descriptions on frontpage 2017-02-09 14:17:59 +01:00
Kasper Rynning-Tønnesen
f2ca6da200 Material icons on embeded also 2017-02-08 15:26:49 +01:00
Kasper Rynning-Tønnesen
350ab85143 Updated embedded version 2017-02-08 15:25:27 +01:00
Kasper Rynning-Tønnesen
82a3a42c07 Added default description text 2017-02-08 13:27:42 +01:00
Kasper Rynning-Tønnesen
26be5df1e9 Added max width and max-height for picture 2017-02-08 13:26:24 +01:00
Kasper Rynning-Tønnesen
cc61d70218 Added descriptions and thumbnails, and fixed issue with pagination on add song 2017-02-08 13:18:19 +01:00
Kasper Rynning-Tønnesen
4eb3ac6f10 Added two classes 2017-02-07 14:34:02 +01:00
Kasper Rynning-Tønnesen
132aeb3e5c Added style for admin-site 2017-02-07 13:12:05 +01:00
Kasper Rynning-Tønnesen
e460ed34c2 Not submitting password if no password on channel 2017-02-07 12:16:23 +01:00
Kasper Rynning-Tønnesen
40cb7d5597 Music category on spotify import 2017-02-07 08:56:58 +01:00
Kasper Rynning-Tønnesen
970709d2ef pagination buttons 2017-02-06 13:19:32 +01:00
Kasper Rynning-Tønnesen
0fa7ec8cea Updated help section on channel 2017-02-02 14:29:41 +01:00
Kasper Rynning-Tønnesen
1649756f29 Merge pull request #157 from zoff-music/header_same
More similar header on mobile
2017-02-01 23:21:41 +01:00
Kasper Rynning-Tønnesen
9a52e5f7dd More similar header on mobile 2017-02-01 23:21:10 +01:00
Kasper Rynning-Tønnesen
3b3a984689 Styled volumeslider on mobileremote to match other 2017-02-01 21:18:27 +01:00
Kasper Rynning-Tønnesen
ab2a1b0942 More material style for volumeslider 2017-02-01 15:53:45 +01:00
Kasper Rynning-Tønnesen
01e1cefc70 More material volumeslider, and new order of hiding for the the pagination-buttons 2017-02-01 15:43:57 +01:00
Kasper Rynning-Tønnesen
3dc7a89718 Changed color of bar 2017-02-01 14:39:10 +01:00
Kasper Rynning-Tønnesen
cf3289048a Changed modals 2017-02-01 13:34:47 +01:00
Kasper Rynning-Tønnesen
857c39e872 Updated socket.io to 1.7.2 2017-02-01 12:41:18 +01:00
Kasper Rynning-Tønnesen
0ca90f223e More mobilecheck 2017-02-01 12:25:28 +01:00
Kasper Rynning-Tønnesen
d6e90896ec More channels on frontpage 2017-01-31 18:24:02 +01:00
Kasper Rynning-Tønnesen
470064500c Transitionssss 2017-01-31 16:33:38 +01:00
Kasper Rynning-Tønnesen
f7f2d3252a Overflow hidden on card 2017-01-31 10:14:55 +01:00
Kasper Rynning-Tønnesen
dd7ac82527 Pin position 2017-01-30 11:40:56 +01:00
Kasper Rynning-Tønnesen
d09a05fc5f Using boolean to display chromecast button 2017-01-30 11:35:23 +01:00
Kasper Rynning-Tønnesen
581b1eea4d Fixing issues with chromecastbutton 2017-01-28 19:52:58 +01:00
Kasper Rynning-Tønnesen
1bcf63f84e Updated to dynamic tooltips 2017-01-28 19:50:20 +01:00
Kasper Rynning-Tønnesen
def2846e97 Changed way of backdrop rotation 2017-01-28 19:41:13 +01:00
Kasper Rynning-Tønnesen
6563f0c09f Fixed casesensitive issue with pagenumber 2017-01-28 18:25:08 +01:00
Kasper Rynning-Tønnesen
ce50a53d33 Merge pull request #156 from zoff-music/materialv098
Updated materialize to v0.98 and made changes accordingly
2017-01-28 18:17:57 +01:00
Kasper Rynning-Tønnesen
3d4ed9b66c Updated materialize to v0.98 and made changes accordingly
- Made improvements to how the remotecontroller on mobile looks
- Added thumbnails some places
- Started using googles new material font because of materializecss
2017-01-28 18:16:57 +01:00
Kasper Rynning-Tønnesen
da45f27cd1 Showing number of viewers no matter how many there are 2017-01-28 13:17:57 +01:00
Kasper Rynning-Tønnesen
75a713dfbb Changed way viewers are showed 2017-01-28 13:12:12 +01:00
Kasper Rynning-Tønnesen
2f8e2f285b Made minor improvements to connection_options 2017-01-27 23:39:02 +01:00
Kasper Rynning-Tønnesen
303849ea43 Fixed issue on cast image/title 2017-01-27 19:41:58 +01:00
Kasper Rynning-Tønnesen
2fbdf66783 Fixed isse when disconnecting chromecast on private modde 2017-01-27 18:28:34 +01:00
Kasper Rynning-Tønnesen
ee34c88276 Chromcast listener 2017-01-27 15:41:38 +01:00
Kasper Rynning-Tønnesen
a4a06838c2 Chromecast next private fix 2017-01-27 15:33:38 +01:00
Kasper Rynning-Tønnesen
156d3e8c50 Merged 2017-01-27 11:13:50 +01:00
Kasper Rynning-Tønnesen
84aa951149 Votes and shuffled lists remain the same if the user navigates from a frontpage, and back to the same list in private mode 2017-01-27 11:11:47 +01:00
Kasper Rynning-Tønnesen
7641ba0fa8 Update README.md 2017-01-26 22:25:10 +01:00
Kasper Rynning-Tønnesen
5953b4a538 Fixed positioning of frontpage .mega-class 2017-01-26 21:45:46 +01:00
Kasper Rynning-Tønnesen
948b4a6692 Positioning of header-buttons 2017-01-26 21:40:44 +01:00
Kasper Rynning-Tønnesen
d1cb1bfe98 Removed a unnecessary log 2017-01-26 21:07:08 +01:00
Kasper Rynning-Tønnesen
a06ecd9d17 Private mode not picking up shuffling from others 2017-01-26 16:53:15 +01:00
Kasper Rynning-Tønnesen
0f86a3197e Fixing list not updating on change in private mode 2017-01-26 15:51:01 +01:00
Kasper Rynning-Tønnesen
cff94a3a60 Fixed missing break in switch-case 2017-01-26 15:15:07 +01:00
Kasper Rynning-Tønnesen
09c75ed8b6 Fixed issue on serverrestart, stocking over the playlist regardless if the player is in private mode or not 2017-01-26 14:59:42 +01:00
Kasper Rynning-Tønnesen
c72c2c9a3a Limiting number of lists in inputfield to only those with more than 5 songs, and accessed within the last 7 days 2017-01-26 14:51:47 +01:00
Kasper Rynning-Tønnesen
d665b59c7a Added shufflefunction for when in offline 2017-01-26 13:34:46 +01:00
Kasper Rynning-Tønnesen
0790002b6a Updated header for remote controll 2017-01-26 13:24:20 +01:00
Kasper Rynning-Tønnesen
f54119b8da Removed some excessive buttons in header 2017-01-26 13:22:20 +01:00
Kasper Rynning-Tønnesen
4508099fb5 Fixed wrapper height, and issues with empty channel 2017-01-26 12:35:50 +01:00
Kasper Rynning-Tønnesen
31d661acd1 Fixed player not starting in private mode when empty playlist, and added import/export to mobile 2017-01-26 11:38:40 +01:00
Kasper Rynning-Tønnesen
eeb99f2c7b Hiding chromecast button on desktop browsers thats not chrome, but showing on mobile 2017-01-25 21:56:27 +01:00
Kasper Rynning-Tønnesen
3f8c8380e4 Hiding chromecast button from browsers that isnt chrome(ium) 2017-01-25 21:43:44 +01:00
Kasper Rynning-Tønnesen
885e9e15ed When in private mode, all votes are reset 2017-01-25 19:51:31 +01:00
Kasper Rynning-Tønnesen
68a70a5687 Showing votes again, to easier understand how the songs behave 2017-01-25 19:44:02 +01:00
Kasper Rynning-Tønnesen
6459c3543c Fixed sizing and positioning of voting thumb 2017-01-25 19:37:59 +01:00
Kasper Rynning-Tønnesen
ee9d42da37 Added missing variables in embed 2017-01-25 19:18:14 +01:00
Kasper Rynning-Tønnesen
01d4a38353 Updated embedded player to work with the new offline functions 2017-01-25 19:17:24 +01:00
Kasper Rynning-Tønnesen
02b946448f Voting now functioning better in private mode 2017-01-25 18:14:44 +01:00
Kasper Rynning-Tønnesen
2697315ed9 Fixed issue with adding song when logged in on private 2017-01-25 16:50:41 +01:00
Kasper Rynning-Tønnesen
c35ef1bc96 Can now add songs in private mode even if its admin-locked 2017-01-25 16:06:53 +01:00
Kasper Rynning-Tønnesen
3633df97cd Changed icon of private mode 2017-01-25 15:28:31 +01:00
Kasper Rynning-Tønnesen
ee9f8831c3 Changed offline-mode name to private-mode 2017-01-25 15:24:58 +01:00
Kasper Rynning-Tønnesen
49bcec5fb7 Update README.md 2017-01-25 15:18:01 +01:00
Kasper Rynning-Tønnesen
a40921668c Added info about offline to the help modal 2017-01-25 14:13:17 +01:00
Kasper Rynning-Tønnesen
d23ee61082 Voting now only affects online players 2017-01-25 14:09:33 +01:00
Kasper Rynning-Tønnesen
2b3bf29ee6 Merge pull request #155 from zoff-music/localplay
Now fetching full playlist fresh on changing back to online-mode
2017-01-25 14:06:19 +01:00
Kasper Rynning-Tønnesen
fa9abe7b63 Now fetching full playlist fresh on changing back to online-mode 2017-01-25 14:05:09 +01:00
Kasper Rynning-Tønnesen
9b2772ccb9 Merge pull request #154 from zoff-music/localplay
Added functionality for offline playing
2017-01-25 13:58:42 +01:00
Kasper Rynning-Tønnesen
1305dd3072 Added functionality for offline playing 2017-01-25 13:57:24 +01:00
Kasper Rynning-Tønnesen
275d1a95b2 Updated ç year 2017-01-24 14:16:23 +01:00
Kasper Rynning-Tønnesen
870e805743 Fixed width of titlebar of songs 2017-01-24 14:09:12 +01:00
Kasper Rynning-Tønnesen
9d21e059f7 Improving showing/hiding of chromecastbutton 2017-01-24 12:15:53 +01:00
Kasper Rynning-Tønnesen
e515915ec8 Updated chromecast sender
- Trying to get YouTube thumbnail to show up in the notificationbar
 - Trying to get YouTube title to show up in the notificationbar
2017-01-24 11:54:12 +01:00
Kasper Rynning-Tønnesen
8561b715e4 Hiding frontpage player on close 2017-01-24 10:35:36 +01:00
Kasper Rynning-Tønnesen
f8e8d0c99b Changing background-color on mobile 2017-01-23 14:18:45 +01:00
Kasper Rynning-Tønnesen
7e650d73f8 Truncating playlist-suggested-chat tabs 2017-01-23 14:01:37 +01:00
Kasper Rynning-Tønnesen
06223bcef1 Spotify export improvements 2017-01-23 13:45:42 +01:00
Kasper Rynning-Tønnesen
91f15abc11 Improved exporting to spotify 2017-01-23 13:41:33 +01:00
Kasper Rynning-Tønnesen
211e29bcc4 Changed nochan to frontpage, and made changes accordingly 2017-01-23 12:26:05 +01:00
Kasper Rynning-Tønnesen
aa7ed10522 Trying to get iphone playbutton to work 2017-01-22 17:35:08 +01:00
Kasper Rynning-Tønnesen
0c1353b660 Fixed issue with song dissapearing on voting, and added player to iphone 2017-01-22 17:25:06 +01:00
Kasper Rynning-Tønnesen
5ecb4f36bc Fixed issue with chromecast button not showing up 2017-01-20 20:45:25 +01:00
Kasper Rynning-Tønnesen
73759e1200 Updated way of playbutton is showed on mobile 2017-01-20 10:39:49 +01:00
Kasper Rynning-Tønnesen
a5703d33d3 Fixed error where mobile couldn't skip videos if no video was playing 2017-01-19 18:27:24 +01:00
Kasper Rynning-Tønnesen
b920b6d100 Multiplying with correct can_fit number 2017-01-19 18:10:14 +01:00
Kasper Rynning-Tønnesen
9bba760d9b Taking the floor of a division 2017-01-19 18:08:00 +01:00
Kasper Rynning-Tønnesen
02938c7b01 Trying to push again 2017-01-19 18:05:13 +01:00
Kasper Rynning-Tønnesen
c4b016366b Added a search in list function on CTRL/cmd + F 2017-01-19 18:00:48 +01:00
Kasper Rynning-Tønnesen
8bb9f88037 Only using secure cookies if https protocol 2017-01-19 16:52:10 +01:00
Kasper Rynning-Tønnesen
107092277e Changed timing of when snow appears 2017-01-19 16:45:29 +01:00
Kasper Rynning-Tønnesen
6274ba6d5b Changed width of results in resultlist 2017-01-13 15:36:24 +01:00
Kasper Rynning-Tønnesen
b4c2d75f00 Updated the way dynamic content is added 2017-01-13 12:38:32 +01:00
Kasper Rynning-Tønnesen
1c65b6d035 Ignoring studio version also 2017-01-07 17:42:24 +01:00
Kasper Rynning-Tønnesen
70ff818b43 Logging retry-after 2017-01-07 17:37:37 +01:00
Kasper Rynning-Tønnesen
d66c07bd46 Fixed error with searchSpotify not defined 2017-01-07 17:35:53 +01:00
Kasper Rynning-Tønnesen
7f1d3dd51c Rule for dot at the end 2017-01-07 17:32:36 +01:00
Kasper Rynning-Tønnesen
cbf73d3d7c Small change with dashes 2017-01-07 17:28:55 +01:00
Kasper Rynning-Tønnesen
1b802a1d87 Trying to add retry-after field 2017-01-07 17:25:20 +01:00
Kasper Rynning-Tønnesen
a63f74d9ac Added exporting to spotify from zöff playlist 2017-01-07 17:02:01 +01:00
Kasper Rynning-Tønnesen
62390e168c Updated YouTube sizing 2017-01-07 12:31:26 +01:00
Kasper Rynning-Tønnesen
bb8dbafa9c Changing ports 2017-01-05 14:45:56 +01:00
Kasper Rynning-Tønnesen
4a4184ae3a Hiding chromecast button if no chromecast 2016-12-25 01:15:55 +01:00
Kasper Rynning-Tønnesen
0f9c1f8d17 Reimplemented resizable 2016-12-15 16:07:29 +01:00
Kasper Rynning-Tønnesen
06b96f827e Updated resiable and width of overlay 2016-12-15 16:06:35 +01:00
Kasper Rynning-Tønnesen
a7e16c7680 Updated mobile caster 2016-12-15 13:55:52 +01:00
Kasper Rynning-Tønnesen
171c01f1f3 Fixed error with script being wrongly placed 2016-12-14 19:31:32 +01:00
Kasper Rynning-Tønnesen
f9012e75e8 Updated width of overlay 2016-12-14 19:20:11 +01:00
Kasper Rynning-Tønnesen
813401f481 Small mobile fix? 2016-12-14 19:14:19 +01:00
Kasper Rynning-Tønnesen
7a5b273cb3 Updated chromecast sender 2016-12-14 19:11:58 +01:00
Kasper Rynning-Tønnesen
1306b9eb0e Merged 2016-12-14 17:01:27 +01:00
Kasper Rynning-Tønnesen
58d0cbc7fa Updated slidebars on the sidebar 2016-12-14 17:00:42 +01:00
Kasper Rynning-Tønnesen
198578a5c9 Delete bot.php 2016-12-12 18:51:41 +01:00
Kasper Rynning-Tønnesen
8e11bc30a2 Delete update_lists.php 2016-12-12 18:51:33 +01:00
Kasper Rynning-Tønnesen
66570a6813 Updated to seekto if currentduration is wrong 2016-12-12 17:23:38 +01:00
Kasper Rynning-Tønnesen
ccf6f7cc8a Fixed error with embedded player linking 2016-12-12 17:01:06 +01:00
Kasper Rynning-Tønnesen
e0993e5ec9 Reverted 2016-12-12 16:42:47 +01:00
Kasper Rynning-Tønnesen
26f88721c3 Updated logo 2016-12-12 16:40:29 +01:00
Kasper Rynning-Tønnesen
4331082903 Updating imageblob 2016-12-12 16:22:50 +01:00
Kasper Rynning-Tønnesen
1b9f80072c More rules 2016-12-12 16:14:52 +01:00
Kasper Rynning-Tønnesen
6e9e8eb544 not so full path 2016-12-12 16:13:29 +01:00
Kasper Rynning-Tønnesen
982f81bdb2 Trying to fix remote error 2016-12-12 16:12:48 +01:00
Kasper Rynning-Tønnesen
74761dcc07 Updated mailscript 2016-12-12 16:08:28 +01:00
Kasper Rynning-Tønnesen
c5d9b2f0d1 Renaming and fixing some filestructure 2016-12-12 16:07:06 +01:00
Kasper Rynning-Tønnesen
d35a6599c2 Destroying resizable 2016-12-11 19:36:22 +01:00
Kasper Rynning-Tønnesen
b3908781c3 Merge branch 'master' of github.com:zoff-music/Zoff 2016-12-11 17:31:18 +01:00
Kasper Rynning-Tønnesen
62a7a91f9b Mobile fix for playbutton 2016-12-11 17:31:02 +01:00
Kasper Rynning-Tønnesen
50ce96f4f2 Mobile fix for playbutton 2016-12-11 17:27:56 +01:00
Kasper Rynning-Tønnesen
9fd0d5e786 Max res 2016-12-11 01:05:50 +01:00
Kasper Rynning-Tønnesen
ee06ff94b7 Fixed pausing on chromecast 2016-12-11 00:46:56 +01:00
Kasper Rynning-Tønnesen
4c3d8246ef Fixing position of logo 2016-12-10 21:12:06 +01:00
Kasper Rynning-Tønnesen
a372494f55 Updated chromecast view, volume now changes volume on chromecast 2016-12-10 21:08:43 +01:00
Kasper Rynning-Tønnesen
dd6fdc493c Updated so that errors on video now skips on chromecast also 2016-12-10 00:09:49 +01:00
Kasper Rynning-Tønnesen
236e813e89 Trying mailfix 2016-12-09 16:28:19 +01:00
Kasper Rynning-Tønnesen
5fc125b117 Added spotify and YouTube logo for import-buttons, and fixed so the spinning thingy moves when exporting playlist 2016-12-09 14:40:58 +01:00
Kasper Rynning-Tønnesen
3e68196cf1 Fixed embedded player a bit 2016-11-30 17:30:22 +01:00
Kasper Rynning-Tønnesen
3cd0018a2d Updated embedding css 2016-11-30 17:15:31 +01:00
Kasper Rynning-Tønnesen
91af9ad701 Now able to change color of list on embed 2016-11-30 17:12:27 +01:00
Kasper Rynning-Tønnesen
ce35ec42e3 Font-sizing suggested 2016-11-30 15:44:53 +01:00
Kasper Rynning-Tønnesen
1d1d68fb6f Suggested height fix 2016-11-30 15:43:13 +01:00
Kasper Rynning-Tønnesen
a87bbe778f Clickthrough only on mobile 2016-11-30 15:16:17 +01:00
Kasper Rynning-Tønnesen
b442645dd1 clickthrough 2016-11-30 14:42:10 +01:00
Kasper Rynning-Tønnesen
5c577272f2 Fixed placing of border on delete button 2016-11-30 14:19:20 +01:00
Kasper Rynning-Tønnesen
28306908c2 Updated shufflehandling and styling of deletebutton 2016-11-30 14:14:47 +01:00
Kasper Rynning-Tønnesen
fb89ac2fe8 Updated styling of vote-images 2016-11-30 14:00:28 +01:00
Kasper Rynning-Tønnesen
57c8f72e65 Fixed error with pagination on songchange 2016-11-30 13:17:36 +01:00
Kasper Rynning-Tønnesen
ce5f9bc086 Moved receiver to other repository 2016-11-23 15:36:00 +01:00
Kasper Rynning-Tønnesen
ccfea3fa5d Safari fix for channelname 2016-11-23 15:22:32 +01:00
Kasper Rynning-Tønnesen
05b28db083 Updated listener to look more for chromecastAvailable 2016-11-22 18:58:10 +01:00
Kasper Rynning-Tønnesen
f866aa8a48 updated embed.min.js 2016-11-22 18:23:25 +01:00
Kasper Rynning-Tønnesen
104aa85b65 Forgot embed cant use localhost.. 2016-11-22 18:22:26 +01:00
Kasper Rynning-Tønnesen
4592f4d7f9 Updated embedded player, and fixes for chromecast on mobile 2016-11-22 18:20:55 +01:00
Kasper Rynning-Tønnesen
db2887c610 Added pointer events none to snow 2016-11-22 17:32:04 +01:00
Kasper Rynning-Tønnesen
66dde0c2e0 Updated snowfall 2016-11-22 17:29:55 +01:00
Kasper Rynning-Tønnesen
35bc7f5177 Added index and nofollow on nochan.php only. Doesn't allow indexing or following on index.php 2016-11-22 14:39:51 +01:00
Kasper Rynning-Tønnesen
ec6f4ae436 Added facebook app_id 2016-11-22 14:34:04 +01:00
Kasper Rynning-Tønnesen
da9565bf63 Using codepen https://codepen.io/NickyCDK/pen/AIonk for snow on frontpage 2016-11-22 11:15:15 +01:00
Kasper Rynning-Tønnesen
1a968715d9 Added images locally 2016-11-22 11:14:30 +01:00
Kasper Rynning-Tønnesen
4682d7dca6 Better snowfall 2016-11-22 11:09:30 +01:00
Kasper Rynning-Tønnesen
fb07076d25 Winter 2016-11-22 11:04:04 +01:00
Kasper Rynning-Tønnesen
65375765bc Resizing now changes to first page if there are too many elements 2016-11-22 10:21:01 +01:00
Kasper Rynning-Tønnesen
bbb0d6b7a6 Trying fix for mobile 2016-11-22 10:17:51 +01:00
Kasper Rynning-Tønnesen
2e34170a82 Removed notifications from mobile 2016-11-21 19:22:23 +01:00
Kasper Rynning-Tønnesen
dd7e9ecd7a Trying to fix errors with mobile chromecasting 2016-11-21 19:09:34 +01:00
Kasper Rynning-Tønnesen
2377031c91 Fixing first page button being hidden on wrong instances 2016-11-21 16:00:52 +01:00
Kasper Rynning-Tønnesen
7192e34bbe Updated positioning of zöff logo on receiver 2016-11-21 14:54:10 +01:00
Kasper Rynning-Tønnesen
9d3cc12724 Disabled doubleclick fullscreen to prevent player being stuck in fullscreen 2016-11-21 13:02:41 +01:00
Kasper Rynning-Tønnesen
8ac79898b8 Secure cookies now in use 2016-11-21 12:55:04 +01:00
Kasper Rynning-Tønnesen
b1a41ca74a Added fix for frontpage listener not being initiated 2016-11-21 12:46:05 +01:00
Kasper Rynning-Tønnesen
8bb0f3f886 Better cursor on resizable col 2016-11-21 10:30:24 +01:00
Kasper Rynning-Tønnesen
bfbba70685 Fix nav-error 2016-11-21 09:45:17 +01:00
Kasper Rynning-Tønnesen
5536fbda96 Added first/last page buttons 2016-11-21 09:41:41 +01:00
Kasper Rynning-Tønnesen
3efc7109f5 Removed loop 2016-11-20 15:37:56 +01:00
Kasper Rynning-Tønnesen
fe1fe6f4a8 Updated some sizing 2016-11-20 15:29:34 +01:00
Kasper Rynning-Tønnesen
6d52617fab Fixed error with wrong positioning on newly voted song 2016-11-20 15:12:26 +01:00
Kasper Rynning-Tønnesen
fbb03c0e65 Fixed error with wrong song being shown 2016-11-20 15:08:08 +01:00
Kasper Rynning-Tønnesen
3c9b29c29e Changed placing of deletebutton 2016-11-20 14:58:36 +01:00
Kasper Rynning-Tønnesen
7e950ea734 Trying some new sizing of playlist, removing scroll form playlist, only pagination 2016-11-20 14:55:51 +01:00
Kasper Rynning-Tønnesen
d52c169873 Logging some more 2016-11-20 12:52:00 +01:00
Kasper Rynning-Tønnesen
42ce8a4067 Case sensitivity 2016-11-20 12:43:47 +01:00
Kasper Rynning-Tønnesen
64fc093bbc Added some logs to try and find out whats wrong with the frontpage 2016-11-20 12:42:44 +01:00
Kasper Rynning-Tønnesen
be007299d5 Updated search to remove lazyload 2016-11-19 15:12:25 +01:00
Kasper Rynning-Tønnesen
c4bd1f31f7 Merge branch 'master' of github.com:zoff-music/Zoff 2016-11-19 12:21:29 +01:00
Kasper Rynning-Tønnesen
c09930e079 Closing player on frontpage now disconnects chromecast if chromecast is connected 2016-11-19 12:20:56 +01:00
Kasper Rynning-Tønnesen
1220947601 Update README.md 2016-11-18 22:15:05 +01:00
Kasper Rynning-Tønnesen
8e738a4500 Fixed issue with not moving duration chromecast 2016-11-18 22:07:06 +01:00
Kasper Rynning-Tønnesen
fc27388534 forgot videoId of chromecast on end 2016-11-18 21:58:01 +01:00
Kasper Rynning-Tønnesen
3e5eed4af5 Trying delayed start event 2016-11-18 21:34:39 +01:00
Kasper Rynning-Tønnesen
e0a1045252 ABORTING LOOP 2016-11-18 21:31:50 +01:00
Kasper Rynning-Tønnesen
ffc977157c Chromecast app working 2016-11-18 21:29:52 +01:00
Kasper Rynning-Tønnesen
0ccf943934 added mute/unmute functionality 2016-11-18 21:26:16 +01:00
Kasper Rynning-Tønnesen
4eaedfe621 Forgot to added type 2016-11-18 20:44:01 +01:00
Kasper Rynning-Tønnesen
4c90e62569 Button positioning 2016-11-18 20:41:30 +01:00
Kasper Rynning-Tønnesen
4a53bc4a85 Some pointers and buttons 2016-11-18 20:36:14 +01:00
Kasper Rynning-Tønnesen
450ad44550 Fixed deletionthingy 2016-11-18 20:31:55 +01:00
Kasper Rynning-Tønnesen
73bf5feec8 I AM A STUPID MAN 2016-11-18 20:24:45 +01:00
Kasper Rynning-Tønnesen
48f14c644e Stopping a range of functions 2016-11-18 20:18:36 +01:00
Kasper Rynning-Tønnesen
05a24e63ba Fixing for more seeking/loading 2016-11-18 20:13:37 +01:00
Kasper Rynning-Tønnesen
88dafeb561 I am a stupid person 2016-11-18 20:09:05 +01:00
Kasper Rynning-Tønnesen
b648316b51 Stringifyyy 2016-11-18 20:02:38 +01:00
Kasper Rynning-Tønnesen
9aebd4445c Fix on json 2016-11-18 19:53:14 +01:00
Kasper Rynning-Tønnesen
ced8db7de1 Flexing 2016-11-18 19:43:51 +01:00
Kasper Rynning-Tønnesen
692b0361c6 Showing next song 2016-11-18 19:39:17 +01:00
Kasper Rynning-Tønnesen
2080de37fe Updated a lot 2016-11-18 19:37:11 +01:00
Kasper Rynning-Tønnesen
97ad0e3d2b Listener now prints 2016-11-18 19:22:25 +01:00
Kasper Rynning-Tønnesen
4261eee360 So much pushing and pulling.. 2016-11-18 19:21:44 +01:00
Kasper Rynning-Tønnesen
47d68814dc Stupid thing 2016-11-18 19:17:51 +01:00
Kasper Rynning-Tønnesen
066e6dac81 Logging 2016-11-18 19:16:11 +01:00
Kasper Rynning-Tønnesen
7606fa5810 Data not json object.. 2016-11-18 19:15:05 +01:00
Kasper Rynning-Tønnesen
0d3ac5c6d6 Updated to listener even though api says listner 2016-11-18 19:13:04 +01:00
Kasper Rynning-Tønnesen
f88142abc1 Updated some logging 2016-11-18 19:11:14 +01:00
Kasper Rynning-Tønnesen
673f9a7a0e Now sending next video to chromecast 2016-11-18 15:26:58 +01:00
Kasper Rynning-Tønnesen
37ee42fab5 removed some logging functions, and made lsitening on chromecast better 2016-11-18 15:13:53 +01:00
Kasper Rynning-Tønnesen
071744440d Updated receiver to work more properly with the current player, and added a picture 2016-11-18 15:07:58 +01:00
Kasper Rynning-Tønnesen
8854f1d687 Working? 2016-11-18 13:19:13 +01:00
Kasper Rynning-Tønnesen
5206144d06 Receiver 2016-11-18 13:16:53 +01:00
Kasper Rynning-Tønnesen
f4c3a4a321 Receiver 2016-11-18 13:14:29 +01:00
Kasper Rynning-Tønnesen
e74e188bd9 Update to get videoId 2016-11-18 13:10:27 +01:00
Kasper Rynning-Tønnesen
40b552dc49 Updating receiver 2016-11-18 13:06:29 +01:00
Kasper Rynning-Tønnesen
a4a41f1e59 receiver 2016-11-18 12:57:28 +01:00
Kasper Rynning-Tønnesen
e6d7404660 Namespace higher up 2016-11-18 12:56:15 +01:00
Kasper Rynning-Tønnesen
fece31e31a More updates receiver 2016-11-18 12:54:22 +01:00
Kasper Rynning-Tønnesen
c12db4c3bf Upading receiver 2016-11-18 12:22:43 +01:00
Kasper Rynning-Tønnesen
342268c399 Reverting to old version of receiver 2016-11-18 11:06:31 +01:00
Kasper Rynning-Tønnesen
6a5350e648 fixing error with remote 2016-11-18 10:57:47 +01:00
Kasper Rynning-Tønnesen
9d9f7f3d4d Starting add of custom receiver app 2016-11-18 10:42:55 +01:00
Kasper Rynning-Tønnesen
8d7f987ccb Sizing and position of castbutton mobile 2016-11-18 00:17:12 +01:00
Kasper Rynning-Tønnesen
4cac15cf97 Font size for castbutton on mobile 2016-11-18 00:15:18 +01:00
Kasper Rynning-Tønnesen
6e7c4caa62 Added chromecastbutton 2016-11-17 23:29:48 +01:00
Kasper Rynning-Tønnesen
b43bf1664d Fixed height of videoplayer 2016-11-17 20:53:35 +01:00
Kasper Rynning-Tønnesen
524b8ada86 Moved close button outside of trigger of opening channel-settings 2016-11-17 20:50:10 +01:00
Kasper Rynning-Tønnesen
d5c9008d3e Fixed header issues 2016-11-17 20:29:38 +01:00
Kasper Rynning-Tønnesen
6ceb241170 Added robots.txt and robots metatag 2016-11-17 20:27:52 +01:00
Kasper Rynning-Tønnesen
8037fdd233 Trying to fix some w3c validator issues 2016-11-17 20:20:24 +01:00
Kasper Rynning-Tønnesen
2c4ca881be Fixed error when logging out and in, and made the next/prev buttons more button'y 2016-11-17 19:33:02 +01:00
Kasper Rynning-Tønnesen
3629d82499 Preventing default action on modal-close 2016-11-17 18:04:18 +01:00
Kasper Rynning-Tønnesen
d3bd4c5db9 Centeraligning pagebuttons on embed 2016-11-17 16:33:53 +01:00
Kasper Rynning-Tønnesen
b44ef845db Removed lazyload completely, and updated embedding 2016-11-17 16:31:26 +01:00
Kasper Rynning-Tønnesen
8c218d1086 Hopefully fixed error with 'reloading every click' 2016-11-17 15:58:52 +01:00
Kasper Rynning-Tønnesen
90f8a8f1a6 Added 'pagination' emulation. Hopefully this will fix some of the major lag caused by the bigger lists 2016-11-17 15:54:48 +01:00
Kasper Rynning-Tønnesen
31d6da3c85 placeholder fix 2016-11-09 23:30:11 +01:00
Kasper Rynning-Tønnesen
0a94c3079f Updated frontpage to fix backdrop issue 2016-11-09 23:26:10 +01:00
Kasper Rynning-Tønnesen
36933f1bab drag target no pointer events
- users can now drag the scrollbar
2016-10-14 12:27:39 +02:00
Kasper Rynning-Tønnesen
2355bc10bc Fixed how the channels are sent from the server 2016-09-23 12:31:25 +02:00
Kasper Rynning-Tønnesen
eebd1113c3 Fixed some http/https issues 2016-09-23 12:06:08 +02:00
Kasper Rynning-Tønnesen
814252375a Removed spotify and fixed error with panel 2016-09-09 15:56:48 +02:00
Kasper Rynning-Tønnesen
38817162b3 Forgot to add callback-files 2016-09-06 14:49:51 +02:00
Kasper Rynning-Tønnesen
9a291c065c Fixed user-suggested songs 2016-09-05 14:51:59 +02:00
Kasper Rynning-Tønnesen
1f25aaedfc Fixed error with adding new song 2016-09-05 14:31:16 +02:00
Kasper Rynning-Tønnesen
c6d6270c4a Added export to youtube and improved importing from YouTube 2016-09-05 13:36:21 +02:00
Kasper Rynning-Tønnesen
d5acdb2161 Improved look of all messages being sent back and forth 2016-09-02 21:45:19 +02:00
Kasper Rynning-Tønnesen
f3778ae260 Improved embedded version 2016-09-01 22:15:39 +02:00
Kasper Rynning-Tønnesen
5bfdd25962 Added Helper.log and error message on connection failure 2016-09-01 20:06:05 +02:00
Kasper Rynning-Tønnesen
bded7f726e Removed a simple log 2016-09-01 15:19:32 +02:00
Kasper Rynning-Tønnesen
5469c00cfa Fixed spotify import even better 2016-09-01 15:16:04 +02:00
Kasper Rynning-Tønnesen
e78937ae35 added another field to sort on, for better consistency 2016-08-31 19:17:54 +02:00
Kasper Rynning-Tønnesen
f67340dc84 Fixed error with only localhost with spotify inport 2016-08-31 15:42:02 +02:00
Kasper Rynning-Tønnesen
c9dc08fe52 Improved spotify list importing 2016-08-31 13:10:38 +02:00
Kasper Rynning-Tønnesen
d6e9278a30 Removed viewers from title of title of song 2016-08-31 12:40:29 +02:00
Kasper Rynning-Tønnesen
8b162b3069 Hopefully improved spotify import 2016-08-31 12:37:20 +02:00
Kasper Rynning-Tønnesen
febebb2b0e Fixed scrollbar disapearing on modal, and added width+height adjustment for embed, along with fixing error in position of controls of embed 2016-08-31 12:03:44 +02:00
Kasper Rynning-Tønnesen
7c8be00c9a Update spotify 2016-08-27 15:47:28 +02:00
Kasper Rynning-Tønnesen
1f5e071767 Forgot to add zoff.no to htaccessrewrite 2016-08-27 15:46:25 +02:00
Kasper Rynning-Tønnesen
93ed57e720 Improved all list importing, and added error-messages for faulty url/ids 2016-08-27 15:44:34 +02:00
Kasper Rynning-Tønnesen
a0fd178eca Improved how importing from spotify works 2016-08-27 15:34:58 +02:00
Kasper Rynning-Tønnesen
13bb52cded Added spotify import, somewhat still in beta 2016-08-26 15:48:02 +02:00
Kasper Rynning-Tønnesen
5956090c9f Fixed errors with navigating from and to a channel, and some mobile looks 2016-08-16 19:02:35 +02:00
Kasper Rynning-Tønnesen
892f00e2f4 Updated embedfile, removed unecessary font and fixed error where zöff name doesn't show up in header 2016-08-16 18:29:24 +02:00
Kasper Rynning-Tønnesen
f6b373cb79 No select 2016-08-16 13:37:09 +02:00
Kasper Rynning-Tønnesen
172ab7edc8 Forgot to update minified scripts 2016-08-16 11:19:30 +02:00
Kasper Rynning-Tønnesen
01989bc39a Updated mobile look, and fixed error where leaving channel before player initialized crashes 2016-08-16 11:17:45 +02:00
Kasper Rynning-Tønnesen
63f6e19fc0 Better working serviceworker and message to enduser 2016-08-16 10:55:37 +02:00
Kasper Rynning-Tønnesen
70576ce0c9 Updated offline site and new serivce-worker to reflect that 2016-08-15 21:53:26 +02:00
Kasper Rynning-Tønnesen
85081497aa Updated what to cache, and updated offline-page 2016-08-15 16:05:21 +02:00
Kasper Rynning-Tønnesen
3f152acc57 Updated offline page 2016-08-15 11:52:48 +02:00
Kasper Rynning-Tønnesen
436ccf88d5 Re-added serviceworker, hopefully it works 2016-08-15 11:48:13 +02:00
Kasper Rynning-Tønnesen
b96e566d61 Updated manifest.json 2016-08-15 11:37:09 +02:00
Kasper Rynning-Tønnesen
3a36fafdc6 Removed please 2016-08-13 18:51:10 +02:00
Kasper Rynning-Tønnesen
cdca1f136e Hopefully removed serviceworker completely 2016-08-13 18:45:51 +02:00
Kasper Rynning-Tønnesen
4b11cb18cf Unregistering serviceworker 2016-08-13 18:37:31 +02:00
Kasper Rynning-Tønnesen
0600486bd8 reenabling serviceworker hopefully 2016-08-13 17:49:03 +02:00
Kasper Rynning-Tønnesen
c3189d6e30 Updated and removed serviceworker. Will add again shortly 2016-08-13 17:45:05 +02:00
Kasper Rynning-Tønnesen
970395a4d7 Updated service-worker some 2016-08-13 16:10:46 +02:00
Kasper Rynning-Tønnesen
a9a02b56ba Updated how adding playlists works. 2016-08-13 13:33:17 +02:00
Kasper Rynning-Tønnesen
4359144925 Thingy 2016-08-03 10:29:19 +02:00
214 changed files with 42303 additions and 22827 deletions

21
.gitignore vendored
View File

@@ -1,3 +1,22 @@
static/images/thumbnails/
server/public/assets/images/thumbnails/
server/config/mailconfig.js
server/config/api_key.js
server/config/mongo_config.js
server/config/cert_config.js
server/config/recaptcha.js
server/config/analytics.js
server/config/google.js
server/config/allowed_api.js
server/public/assets/dist/maps/
server/public/assets/dist/callback.min.js
server/public/assets/dist/token.min.js
server/public/assets/dist/embed.min.js
server/public/assets/dist/main.min.js
server/public/assets/dist/remote.min.js
*/node_modules
node_modules/
scripts/
.DS_Store
npm-debug.log
server/npm-debug.log
server/public/assets/dist/

View File

@@ -1,43 +0,0 @@
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%1/$1 [L]
RewriteCond %{HTTP_HOST} ^(.*zoff.no.*)$
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [L]
RewriteCond %{HTTP_HOST} ^remote.zoff.no
RewriteCond %{REQUEST_URI} !/static
RewriteRule ^(.*)$ php/controller.php [L,NC,QSA]
RewriteCond %{HTTP_HOST} ^bot.zoff.no
RewriteCond %{REQUEST_URI} !/static
RewriteRule ^(.*)$ php/bot.php [L,NC,QSA]
#RewriteCond %{HTTP_HOST} ^(remote\.)?zoff\.no
#RewriteCond %{REQUEST_URI} !remote/
#RewriteRule ^(.*)$ remote/$1 [L]
#RewriteCond %{HTTP_HOST} ^(www\.)?etys\.no
#RewriteCond %{REQUEST_URI} !etys/
#RewriteRule ^(.*)$ etys/$1 [L]
#Comment out the two folling lines when running server locally to fix issues with localhost
#RewriteCond %{HTTPS} !=on
#RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
#RewriteRule (?i)^remote/(.*) php/controller.php?id=$1 [L]
#RewriteRule (?i)^remote php/controller.php [L]
RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule /(.*)$ /$1 [L]
Options -Indexes

2
FUNDING.yml Normal file
View File

@@ -0,0 +1,2 @@
github: [kasperrt]
custom: ["https://www.paypal.me/zoffmusic"]

121
README.md
View File

@@ -1,84 +1,87 @@
Zöff
Zoff
====
##### The server-side is required for this website, and it's found at: <a href="https://github.com/zoff-music/zoff-server">here</a>
Zoff (pronounced __søff__) is a shared (free) YouTube and SoundCloud based radio service, built upon the YouTube API, and SoundCloud API, with integrated casting with Chromecast.
##### Config
Zoff supports importing YouTube, SoundCloud and Spotify playlists, and has functionality that (tries to) export to YouTube, SoundCloud and Spotify.
To get the website to run as intended, please enabled mod_rewrite for apache2, and add ```AllowOverride All``` to the directory containing the webserver in Apache2 (it's usually /etc/apache2/sites-enabled/000-default.conf)
<a href="https://zoff.me"><img height="80" src="https://puu.sh/BlSwW/57061de17b.png"></a><a class="android-image-link" href="https://play.google.com/store/apps/details?id=zoff.me.zoff&amp;hl=no&amp;pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1"><img alt="Get it on Google Play" height="65" src="https://puu.sh/BcWup/f560259c3f.png"></a>
<a style="padding-bottom:20px;" class="apple-image-link" href="https://itunes.apple.com/us/app/zoff/id1402037061?ls=1&amp;mt=8"><img height="65" alt="Get it on the AppStore" src="https://puu.sh/BcWvt/09002407c3.png"></a>
## Install
Prerequisites:
```
MongoDB : https://www.mongodb.org/
NodeJS : https://nodejs.org/en/
npm : https://www.npmjs.com/
```
Clone this repository into a folder, and navigate to it. Use ```$ npm install``` in the project folder.
For the server to run, you have to have the files
```
api_key.js
mongo_config.js
```
in ```/server/config```. There are ```*.example.js``` files for all the ones mentioned above. If you're going to deploy the server with a certificate, you also need to create the ```cert_config.js``` in ```/server/config/```. If you want the mailing to work, take a look at ```mailconfig.example.js``` and ```recaptcha.example.js```. You'll need ```mailconfig.js``` and ```recaptcha.js``` for this to work.
If you want to use Google Analytics, have a look at ```analytics.example.js``` in ```server/config/```.
Use ```$ npm start``` to start the server. (Alternative you can use the ```pm2.json``` in the project-root, if you prefer pm2 for running the apps.)
More info in <a href="https://github.com/zoff-music/zoff/blob/master/server/README.md">server/ README</a>
### About
ff is a shared (free) YouTube based radio service, built upon the YouTube API.
Zöff is mainly a webbased service. The website uses <a href="https://nodejs.org/">NodeJS</a> with <a href="http://socket.io/">Socket.IO</a>, <a href="https://www.mongodb.org/">MongoDB</a> and PHP on the backend, with JavaScript, jQuery and <a href="http://materializecss.com/">Materialize</a> on the frontend.
Zoff is mainly a webbased service. The website uses <a href="https://nodejs.org/">NodeJS</a> with <a href="http://socket.io/">Socket.IO</a>, <a href="https://www.mongodb.org/">MongoDB</a> and express on the backend, with JavaScript and <a href="http://materializecss.com/">Materialize</a> on the frontend.
The team consists of Kasper Rynning-Tønnesen and Nicolas Almagro Tonne, and the project has been worked on since late 2014.
### Contact
The team can be reached on <a href="mailto:contact@zoff.no?Subject=Contact%20Zoff">contact@zoff.no</a>
The team can be reached on <a href="mailto:contact@zoff.me?Subject=Contact%20Zoff">contact@zoff.me</a>
###Screenshots of desktop version:
### Screenshots of desktop version:
![Frontpage desktop](http://i.imgur.com/f9MoSDN.png)
![Frontpage desktop](https://puu.sh/xCI8P/bbfbdd694c.png)
![Channel desktop](http://puu.sh/ivYKz/b1b65b339c.jpg)
![Channel desktop](https://puu.sh/xCHXj/3f7d826329.png)
![Channel desktop 2](http://puu.sh/ivYVo/9036795b95.jpg)
![Channel settings](https://puu.sh/BCii4/f6594fc481.png)
![Channel join](https://puu.sh/zf1Ap/16587c0749.png)
![Channel search desktop](https://puu.sh/AhKTR/c1e6b5d8d2.png)
![Channel host mode desktop](https://puu.sh/AAGrK/953d11b2a7.png)
### Embedded player:
![embedded](https://puu.sh/BCQOs/9393bc5d09.png)
### Screenshots of the mobile version:
![Frontpage mobile](http://lh5.googleusercontent.com/-_rATUkLCLH8/VUKTzZ19TqI/AAAAAAAABLc/ab9ZiJtLy4g/w330-h586-no/Screenshot_2015-04-30-22-30-43.png) ![Channel mobile](http://lh5.googleusercontent.com/-YaH8pUMzjRM/VUKTpr7ZpdI/AAAAAAAABLQ/ABOOB-1RWcw/w330-h586-no/Screenshot_2015-04-30-22-39-44.png) ![Channel mobile 2](http://lh5.googleusercontent.com/-wVKAxHBwIAI/VUKToHhHxgI/AAAAAAAABLI/RyCteTkdvDY/w330-h586-no/Screenshot_2015-04-30-22-36-00.png)
### Android exclusive screens:
<div style="text-align:center;">
<img src="http://i.imgur.com/2LMOnUe.png" alt="android1" height="600px">
<img src="http://i.imgur.com/mIOrtng.png" alt="android2" height="400px">
<img src="http://i.imgur.com/aWlEmIx.png" alt="frontpage" height="600px">
<br>
<img src="https://puu.sh/xCI6X/1aead5e1b6.png" alt="channel" height="600px">
<img src="https://puu.sh/AhKUE/f93daa8a46.png" alt="channel search" height="600px">
</div>
### Events
Emitted events between the server and client
```
socket.emit("end", VIDEO_ID); Tells the server the song is clientside
socket.emit("pos"); Asks server where in the song it should be
socket.emit('list', CHANNEL_NAME); Tells the server the client wants the list
socket.emit("add", [VIDEO_ID, VIDEO_TITLE, sha256(PASSWORD), VIDEO_DURATION]); Sends info about a song the client wants to add
socket.emit("change_channel"); Tells the server to disconnect the user from the current channel, is used for remote controlling on the host side
socket.emit("all,chat", TEXT); Sends chat text to all chat
socket.emit("chat", TEXT); Sends chat text to channelchat
socket.emit('vote', [CHANNEL_NAME, VIDEO_ID, VOTE_TYPE, PASSWORD]); Sends info about song the user wants to vote on. If VOTE_TYPE is del, its deleting the song, if its pos, its just voting
socket.emit('skip', [CHANNEL_NAME, PASSWORD]); Sends skip message to server
socket.emit("password", [PASSWORD, CHANNEL_NAME]); Sends password for instant log in to server
socket.emit('frontpage_lists'); Tells the server the client wants frontpage lists
socket.emit("id", [CHANNEL_ID, "play", "mock"]); Sends message to the host channel for play
socket.emit("id", [CHANNEL_ID, "pause", "mock"]); Sends message to the host channel for pause
socket.emit("id", [CHANNEL_ID, "skip", "mock"]); Sends message to the host channel for skip
socket.emit("id", [CHANNEL_ID, "volume", VALUE]); Sends message to the host channel to change volume
socket.emit("id", [CHANNEL_ID, "channel", NEW_CHANNEL_NAME]); Sends message to the host channel to change channel
socket.on("toast", STRING) Recieves a string from server for what type of toast to be triggered
socket.on("pw", STRING) Recieves the password for the channel if the user sent the right in the first place
socket.on("conf", [ARRAY]) Recieves configuration array from server
socket.on("chat.all", [CLIENT_NAME, STRING, CLIENT_CHANNEL_NAME]) Recieves chat message from allchat
socket.on("chat", [CLIENT_NAME, STRING]) Recieves chat message from channelchat
socket.on("id", STRING) Recieves the ID of the current client, used for remote listening
socket.on(id, [ARRAY]) Recieves the messages sent on CHANNEL_ID above
socket.on("channel", [TYPE, [TYPE_SPECIFIC_VALUE]]) Recieves updates from channel. [0] is one of the following: list, added, deleted, vote, song_change
socket.on("get_list") Recieves message from the server that its ready to send the playlist and info
socket.on('playlists', [ARRAY]) Recieves the playlists for the frontpage
socket.on("np", [NOW_PLAYING, CONFIGURATION, SERVER_TIME]) Recieves array of now playing song. Is triggered on song-change
socket.on("viewers", VALUE) Recieves number of viewers on the current channel
```
### Legal
Copyright © 2016
Nicolas Almagro Tonne and Kasper Rynning-Tønnesen
Creative Commons License
Zöff is licensed under a
<a href="http://creativecommons.org/licenses/by-nc-nd/3.0/no/">Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Norway License.</a>.
Do not redistribute without permission from the developers.
Zoff is licensed under a
<a href="http://creativecommons.org/licenses/by-nc-nd/3.0/no/">Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Norway License.</a>.
Do not redistribute without permission from the developers.
Copyright © 2019
Kasper Rynning-Tønnesen and Nicolas Almagro Tonne

View File

@@ -1,22 +0,0 @@
<html>
<head>
<meta name="author" content="Nicolas 'Nixo' Almagro Tonne &amp; Kasper 'KasperRT' Rynning-Tønnesen"/>
<meta name="description" content="The Shared (free) YouTube radio. Being built around the YouTube search and video API it enables the creation of collaborative and shared live playlists, with billions of videos and songs to choose from, all for free and without registration. Enjoy!"/>
<meta charset="UTF-8"/>
</head>
<body>
<script>
function receiveMessage(event)
{
if(event.data == "lower") {
window.setVolume(10);
}else if(event.data == "reset") {
window.setVolume(100);
}
}
window.addEventListener("message", receiveMessage, false);
</script>
<div id="song-title"></div><div id="container" style="display:inline-flex;"><div id="player-container"><div id="player"></div><div id="controls" class="noselect"><div id="zoffbutton" title="Visit the channel!"></div><div id="playpause"><i id="play" class="mdi-av-play-arrow hide"></i><i id="pause" class="mdi-av-pause"></i></div><div id="duration">00:00 / 00:00</div><div id="volume-button"><i id="v-mute" class="mdi-av-volume-off"></i><i id="v-low" class="mdi-av-volume-mute"></i><i id="v-medium" class="mdi-av-volume-down"></i><i id="v-full" class="mdi-av-volume-up"></i></div><div id="volume"></div><div id="viewers"></div><div id="bar"></div></div></div><div id="playlist"><div id="wrapper"><div id="preloader" class="progress channel_preloader"><div class="indeterminate"></div></div><div id="list-song-html"><div id="list-song" class="card left-align list-song"><span class="clickable vote-container" title="Vote!"><a class="clickable center-align votebg"><div class="lazy card-image cardbg list-image" style=""></div></a><span class="card-content"><span class="flow-text truncate list-title"></span><span class="vote-span"><span class="list-votes"></span><span class="highlighted vote-text">&nbsp;votes</span></span></span></span></div></div></div></div></div><script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script><script type="text/javascript" src="//cdn.socket.io/socket.io-1.3.5.js"></script><script src="static/dist/embed.min.js"></script>
</body>
</html>

View File

@@ -1,56 +1,184 @@
var gulp = require('gulp'),
gutil = require('gulp-util'),
uglify = require('gulp-uglifyjs'),
concat = require('gulp-concat');
var gulp = require("gulp"),
uglify = require("gulp-uglify"),
//sourcemaps = require('gulp-sourcemaps'),
concat = require("gulp-concat"),
cleanCSS = require("gulp-clean-css");
gulp.task('js', function () {
gulp.src(['static/js/*.js', '!static/js/embed*', '!static/js/remotecontroller.js'])
.pipe(uglify({
mangle: true,
compress: true,
enclose: true
}))
.pipe(concat('main.min.js'))
.pipe(gulp.dest('static/dist'));
gulp.task("css", function() {
return gulp
.src([
"server/public/assets/css/style.css",
"server/public/assets/css/globals.css",
"server/public/assets/css/animations.css",
"server/public/assets/css/mobile.css"
])
.pipe(concat("style.css"))
.pipe(cleanCSS({ compatibility: "ie8" }))
.pipe(gulp.dest("server/public/assets/dist"));
});
gulp.task('embed', function () {
gulp.src(['static/js/player.js', 'static/js/helpers.js', 'static/js/playercontrols.js', 'static/js/list.js', 'static/js/embed.js', '!static/js/nochan*', '!static/js/remotecontroller.js'])
.pipe(uglify({
mangle: true,
compress: true,
enclose: true
}))
.pipe(concat('embed.min.js'))
.pipe(gulp.dest('static/dist'));
gulp.task("css-embed", function() {
return gulp
.src("server/public/assets/css/embed.css")
.pipe(cleanCSS({ compatibility: "ie8" }))
.pipe(gulp.dest("server/public/assets/dist"));
});
/*
gulp.task('nochan', function () {
gulp.src(['static/js/nochan.js', 'static/js/helpers.js'])
.pipe(uglify({
mangle: true,
compress: true,
enclose: true
}))
.pipe(concat('frontpage.min.js'))
.pipe(gulp.dest('static/dist'));
});*/
gulp.task('remotecontroller', function () {
gulp.src(['static/js/remotecontroller.js'])
.pipe(uglify({
mangle: true,
compress: true,
enclose: true
}))
.pipe(concat('remote.min.js'))
.pipe(gulp.dest('static/dist'));
gulp.task("js", function() {
return (
gulp
.src([
"server/VERSION.js",
"server/config/api_key.js",
"server/public/assets/js/*.js",
"!server/public/assets/js/embed*",
"!server/public/assets/js/token*",
"!server/public/assets/js/remotecontroller.js",
"!server/public/assets/js/callback.js"
])
//.pipe(sourcemaps.init())
.pipe(concat("main.min.js"))
.pipe(
uglify({
mangle: true,
compress: true,
enclose: true
})
)
//.pipe(sourcemaps.write('maps'))
.pipe(gulp.dest("server/public/assets/dist"))
);
});
gulp.task('default', function(){
gulp.watch('static/js/*.js', ['js']);
gulp.watch('static/js/*.js', ['embed']);
//gulp.watch('static/js/*.js', ['nochan']);
gulp.watch('static/js/remotecontroller.js', ['remotecontroller']);
});
gulp.task("embed", function() {
return (
gulp
.src([
"server/VERSION.js",
"server/config/api_key.js",
"server/public/assets/js/player.js",
"server/public/assets/js/functions.js",
"server/public/assets/js/helpers.js",
"server/public/assets/js/playercontrols.js",
"server/public/assets/js/list.js",
"server/public/assets/js/embed.js",
"!server/public/assets/js/frontpage*",
"!server/public/assets/js/remotecontroller.js",
"server/public/assets/js/hostcontroller.js"
])
//.pipe(sourcemaps.init())
.pipe(concat("embed.min.js"))
.pipe(
uglify({
mangle: true,
compress: true,
enclose: true
})
)
//.pipe(sourcemaps.write('maps'))
.pipe(gulp.dest("server/public/assets/dist"))
);
});
gulp.task("token", function() {
return (
gulp
.src([
"server/public/assets/js/token*",
"server/public/assets/js/helpers.js"
])
//.pipe(sourcemaps.init())
.pipe(concat("token.min.js"))
.pipe(
uglify({
mangle: true,
compress: true,
enclose: true
})
)
//.pipe(sourcemaps.write('maps'))
.pipe(gulp.dest("server/public/assets/dist"))
);
});
gulp.task("callback", function() {
return (
gulp
.src([
"server/VERSION.js",
"server/config/api_key.js",
"server/public/assets/js/callback.js"
])
//.pipe(sourcemaps.init())
.pipe(concat("callback.min.js"))
.pipe(
uglify({
mangle: true,
compress: true,
enclose: true
})
)
//.pipe(sourcemaps.write('maps'))
.pipe(gulp.dest("server/public/assets/dist"))
);
});
gulp.task("build", done => {
gulp.series(
"css",
"css-embed",
"js",
"embed",
"remotecontroller",
"callback",
"token"
)();
done();
});
gulp.task("remotecontroller", function() {
return (
gulp
.src([
"server/VERSION.js",
"server/config/api_key.js",
"server/public/assets/js/remotecontroller.js",
"server/public/assets/js/helpers.js"
])
////.pipe(sourcemaps.init())
.pipe(concat("remote.min.js"))
.pipe(
uglify({
mangle: true,
compress: true,
enclose: true
})
)
//.pipe(sourcemaps.write('maps'))
.pipe(gulp.dest("server/public/assets/dist"))
);
});
gulp.task("default", function() {
gulp.watch(["server/VERSION.js", "server/public/assets/js/*.js"], ["js"]);
gulp.watch(["server/public/assets/css/*.css"], ["css"]);
gulp.watch(["server/public/assets/css/*.css"], ["css-embed"]);
gulp.watch(
["server/public/assets/js/token*.js", "server/public/assets/js/helpers.js"],
["token"]
);
gulp.watch(["server/VERSION.js", "server/public/assets/js/*.js"], ["embed"]);
gulp.watch(
[
"server/VERSION.js",
"server/public/assets/js/callback.js",
"server/public/assets/js/helpers.js"
],
["callback"]
);
//gulp.watch('server/public/assets/js/*.js', ['nochan']);
gulp.watch(
["server/VERSION.js", "server/public/assets/js/remotecontroller.js"],
["remotecontroller"]
);
});

278
index.php
View File

@@ -1,278 +0,0 @@
<!DOCTYPE html>
<?php
$guid=substr(base64_encode(crc32($_SERVER['HTTP_USER_AGENT'].$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_ACCEPT_LANGUAGE'])), 0, 8);
if(isset($_GET['chan'])) {header('Location: '.$_GET['chan']); exit;}
$list = explode("/", htmlspecialchars(strtolower($_SERVER["REQUEST_URI"])));
if($list[1]==""||!isset($list[1])||count($list)<=1){$list="";include('php/nochan.php');die();}
else $list=preg_replace("/[^A-Za-z0-9 ]/", '', $list[1]);
?>
<html lang="en">
<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#">
<?php include("php/header.php"); ?>
<script type="text/javascript" src="/static/dist/main.min.js"></script>
</head>
<body id="channelpage" class="noselect cursor-default">
<header>
<div class="navbar-fixed">
<nav id="nav">
<div class="nav-wrapper">
<a href="/" class="brand-logo brand-logo-navigate hide-on-med-and-down noselect">
<img id="zicon" src="static/images/squareicon_small.png" alt="zöff" title="Zöff" />
</a>
<div class="brand-logo truncate zbrand">
<a href="/" class="hide-on-large-only brand-logo-navigate">Zöff</a>
<span class="hide-on-large-only">/</span>
<span id="chan" class="chan clickable" title="Show big URL"><?php echo(ucfirst($list));?></span>
</div>
<ul class="title-container">
<li class="song-title cursor-pointer truncate" id="song-title">
Loading...
</li>
<li class="search-container hide" id="search-wrapper">
<input id="search" class="search_input" type="text" title="Search for songs..." placeholder="Find song on YouTube..." onsubmit="null;" autocomplete="off" />
</li>
</ul>
<ul class="right control-list noselect">
<li id="search_loader" class="valign-wrapper hide">
<div class="valign">
<div class="preloader-wrapper small active">
<div class="spinner-layer spinner-blue">
<div class="circle-clipper left">
<div class="circle"></div>
</div><div class="gap-patch">
<div class="circle"></div>
</div><div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-red">
<div class="circle-clipper left">
<div class="circle"></div>
</div><div class="gap-patch">
<div class="circle"></div>
</div><div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-yellow">
<div class="circle-clipper left">
<div class="circle"></div>
</div><div class="gap-patch">
<div class="circle"></div>
</div><div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-green">
<div class="circle-clipper left">
<div class="circle"></div>
</div><div class="gap-patch">
<div class="circle"></div>
</div><div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
</div>
</div>
</li>
<li>
<a class="nav-btn" href="#find" id="search-btn">
<i class="mdi-action-search"></i>
<span class="hover-text">Find</span>
</a>
</li>
<li>
<a class="nav-btn" href="#skip" id="skip">
<i class="mdi-av-skip-next"></i>
<span class="hover-text">Skip</span>
</a>
</li>
<li>
<a class="nav-btn hide-on-small-only" href="#stir" id="shuffle">
<i class="mdi-av-shuffle"></i>
<span class="hover-text">Stir</span>
</a>
</li>
<li>
<a class="nav-btn" href="#settings" data-activates="settings-bar" id="settings">
<i class="mdi-action-settings"></i>
<span class="hover-text">Conf</span>
</a>
</li>
</ul>
<ul class="side-nav" id="settings-bar">
<?php include("php/panel.php");?>
</ul>
<div id="results" class="search_results hide">
<div id="temp-results-container">
<div id="temp-results" class="result-object">
<div id="result" class="result">
<img class="thumb" src="/static/images/loading.png" alt="Thumb"/>
<div class="search-title truncate"></div>
<span class="result_info"></span>
<div class="waves-effect waves-orange btn-flat" id="add-many" title="Add several videos">
<i class="mdi-av-playlist-add"></i>
</div>
</div>
</div>
</div>
<div id="empty-results-container">
<div id='empty-results' class='valign-wrapper'>
<span class='valign'>No results found..</span>
</div>
</div>
</div>
</div>
</nav>
</div>
<div id="help" class="modal">
<div class="modal-content">
<h4>So you need help?</h4>
<p>When listening on a channel, there are some different buttons you can click.</p>
<p>If you click the cogwheel, you'll open the settings panel. Here you can change channel settings, decide if you want the computer you're on can be remote-controlled, and import playlists from YouTube.</p>
<p>The search-icon, opens up a search inputfield. If you start typing here, the site will automagically search for your input!</p>
<p>If you click the button next to the search icon, you'll skip on a song. The one next to that one, is shuffleling of the list. Next one there again is to open the chat.</p>
<p>Clicking a song in the playlist, gives it a vote. If you're logged in, you'll have a delete button at your disposal.</p>
<p>Also, whenever you're logged in, you'll have two tabs in the top of the playlist thats called "Playlist" and "Suggested". The playlist obviously shows the playlist. But the suggested tab, shows 5 songs that YouTube recommends based on the current song. There might also be user recommended songs. To add any of these, just click them as you'd click a song to vote.</p>
</div>
<div class="modal-footer">
<a href="#!" class=" modal-action modal-close waves-effect waves-green btn-flat">Close</a>
</div>
</div>
<div id="embed" class="modal">
<div class="modal-content">
<h4>Embed code</h4>
<p>Copy the code in the textarea, and paste on your website.</p>
<p>
<input type="checkbox" id="autoplay" checked="checked" />
<label for="autoplay">Autoplay</label>
</p>
<textarea id="embed-area"></textarea>
</div>
<div class="modal-footer">
<a href="#!" class=" modal-action modal-close waves-effect waves-green btn-flat">Close</a>
</div>
</div>
</header>
<div id="channel-load" class="progress">
<div class="indeterminate" id="channel-load-move"></div>
</div>
<main class="container center-align main">
<div id="main-row" class="row">
<div id="video-container" class="col s12 m9 video-container no-opacity click-through">
<!--
width: calc(100% - 261px);
display: inline;
-->
<div id="player" class="ytplayer"></div>
<div id="main_components">
<div id="player_overlay" class="hide valign-wrapper">
<div id="player_overlay_text" class="valign center-align">
Waiting for Video
</div>
</div>
<div id="controls" class="noselect">
<div id="playpause">
<i id="play" class="mdi-av-play-arrow hide"></i>
<i id="pause" class="mdi-av-pause"></i>
</div>
<div id="duration"></div>
<div id="fullscreen">
<i class="mdi-navigation-fullscreen"></i>
</div>
<div id="volume-button">
<i id="v-mute" class="mdi-av-volume-off"></i>
<i id="v-low" class="mdi-av-volume-mute"></i>
<i id="v-medium" class="mdi-av-volume-down"></i>
<i id="v-full" class="mdi-av-volume-up"></i>
</div>
<div id="volume"></div>
<div id="viewers"></div>
<div id="bar"></div>
</div>
</div>
</div>
<div id="playlist" class="col s12 m3">
<div id="top-button" title="Scroll to the top" class="rounded-bottom hide top-button-with-tabs hide-on-small-only">Top</div>
<div id="bottom-button" title="Scroll to the bottom" class="rounded-top hide hide-on-small-only">Bottom</div>
<ul class="tabs playlist-tabs" style="width:96%">
<li class="tab col s3"><a class="playlist-tab-links playlist-link active" href="#wrapper">Playlist</a></li>
<li class="tab col s3"><a class="playlist-tab-links chat-link" href="#chat">Chat</a></li>
</ul>
<ul class="tabs playlist-tabs-loggedIn hide" style="width: 96%;">
<li class="tab col s3"><a class="playlist-tab-links playlist-link active" href="#wrapper">Playlist</a></li>
<li class="tab col s3"><a class="playlist-tab-links suggested-link" href="#suggestions">Suggested</a></li>
<li class="tab col s3"><a class="playlist-tab-links chat-link" href="#chat">Chat</a></li>
</ul>
<div id="wrapper" class="tabs_height">
<div id="list-song-html">
<div id="list-song" class="card left-align list-song">
<div class="clickable vote-container" title="Vote!">
<a class="clickable center-align votebg">
<span class="lazy card-image cardbg list-image" style="background-image:url('/static/images/loading.png');"></span>
</a>
<span class="card-content">
<span class="flow-text truncate list-title"></span>
<span class="vote-span">
<span class="list-votes"></span>
<span class="highlighted vote-text">&nbsp;votes</span>
</span>
</span>
</div>
<div class="card-action center-align list-remove hide">
<a title="Remove song" id="del" class="waves-effect btn-flat clickable">Delete</a>
</div>
</div>
</div>
</div>
<div id="suggestions" class="tabs_height" style="display:none;">
<p class="suggest-title-info">YouTube Suggests:</p>
<div class="suggest_bar" id="suggest-song-html">
</div>
<p class="suggest-title-info" id="user_suggests">Users Suggests:</p>
<div class="suggest_bar" id="user-suggest-html">
</div>
</div>
<div id="chatPlaylist" class="tabs_height" style="display:none;">
<ul class="" id="chat-bar">
<li id="chat-log">
<ul class="inherit-height">
<li class="active inherit-height">
<!--<ul id="chat inherit-height">-->
<div class="row inherit-height">
<div class="col s12">
<ul class="tabs chatTabs">
<li class="tab col s3 chat-tab-li"><a class="active chat-tab truncate" href="#channelchat"><?php echo $list; ?></a></li>
<li class="tab col s3 chat-tab-li"><a class="chat-tab" href="#all_chat">All</a></li>
</ul>
</div>
<div id="channelchat" class="col s12 inherit-height"><ul id="chatchannel" class="inherit-height"></ul></div>
<div id="all_chat" class="col s12 inherit-height"><ul id="chatall" class="inherit-height"></ul></div>
</div>
<!--</ul>-->
</li>
</ul>
</li>
<li id="chat-input">
<form action="#" id="chatForm">
<input id="text-chat-input" name="input" type="text" autocomplete="off" placeholder="Chat" maxlength="150" />
</form>
</li>
</ul>
</div>
</div>
</div>
<div id="playbar">
</div>
</main>
<?php include("php/footer.php"); ?>
</body>
</html>

View File

@@ -1,14 +0,0 @@
{
"short_name": "Zöff",
"name": "Zöff",
"icons": [
{
"src": "static/images/144x144.png",
"sizes": "144x144",
"type": "image/png"
}
],
"start_url": "/",
"display": "standalone",
"orientation": "portrait"
}

6367
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

64
package.json Normal file
View File

@@ -0,0 +1,64 @@
{
"name": "zoff",
"version": "2.0.2",
"description": "Zoff, the shared YouTube based radio services",
"main": "server/app.js",
"scripts": {
"start": "npm install --only=dev && npm install && $(npm bin)/gulp build && node server/app.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/zoff-music/zoff.git"
},
"author": {
"name": "Kasper Rynning Tønnesen",
"email": "kasper@kasperrt.no"
},
"license": "ISC",
"bugs": {
"url": "https://github.com/zoff-music/zoff/issues"
},
"devDependencies": {
"gulp": "^4.0.0",
"gulp-concat": "^2.6.1",
"gulp-uglify": "^3.0.2"
},
"homepage": "https://github.com/zoff-music/zoff#readme",
"dependencies": {
"bad-words": "^1.6.5",
"bcrypt-nodejs": "0.0.3",
"body-parser": "^1.18.3",
"color-thief-jimp": "^2.0.2",
"compression": "^1.7.3",
"connect-mongo": "^2.0.3",
"cookie-parser": "^1.4.4",
"cors": "^2.8.5",
"express": "^4.16.4",
"express-handlebars": "^3.0.2",
"express-recaptcha": "^3.0.1",
"express-session": "^1.15.6",
"farmhash": "^3.0.0",
"feature-policy": "^0.2.0",
"gulp-clean-css": "^4.2.0",
"gulp-sourcemaps": "^2.6.5",
"gulp-uglify-es": "^1.0.4",
"helmet": "^3.21.1",
"jimp": "^0.2.28",
"mongodb": "^2.2.36",
"mongojs": "^2.6.0",
"mongojs-paginate": "^1.2.0",
"mongoose": "^5.7.5",
"mpromise": "^0.5.5",
"nodemailer": "^4.7.0",
"passport": "^0.4.0",
"passport-local": "^1.0.0",
"redis": "^2.8.0",
"referrer-policy": "^1.1.0",
"request": "^2.88.0",
"socket.io": "^2.2.0",
"socket.io-redis": "^5.2.0",
"sticky-session": "^1.1.2",
"uniqid": "5.0.3"
}
}

View File

@@ -1,93 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#">
<?php include("header.php"); ?>
<link rel="chrome-webstore-item" href="https://chrome.google.com/webstore/detail/jemjlblambcgjmmhheaklfnphncdmfmb" />
</head>
<body class="noselect cursor-default">
<header>
<nav id="fp-nav">
<div class="nav-wrapper">
<a href="//zoff.no" class="brand-logo hide-on-small-only">
<img id="zicon" src="/static/images/squareicon_small.png" alt="zöff" title="Zöff" />
</a>
<a href="//zoff.no" class="brand-logo hide-on-med-and-up">Zöff</a>
<ul id="nav-mobile" class="right hide-on-med-and-down">
<li><a class="modal-trigger waves-effect waves-red" title="Need help with the site?" onclick="$('#help').openModal()">Help</a></li>
<li><a class="waves-effect green" title="Remote control a Zöff player" href="https://remote.zoff.no">Remote</a></li>
<li><a class="modal-trigger waves-effect waves-orange" onclick="$('#about').openModal()">About</a></li>
<li><a class="modal-trigger waves-effect waves-yellow" onclick="$('#legal').openModal()">Legal</a></li>
<li><a class="waves-effect waves-purple" href="https://github.com/zoff-music/">GitHub</a></li>
</ul>
</div>
</nav>
<div id="legal" class="modal">
<div class="modal-content">
<h4>Legal</h4>
<p>Copyright © 2015 <br>Nicolas Almagro Tonne and Kasper Rynning-Tønnesen
<br><br>
Creative Commons License<br>
Zöff is licensed under a <br><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/no/">Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Norway License.</a>
<br>
Do not redistribute without permission from the developers.
<br>
</div>
<div class="modal-footer">
<a href="#!" class=" modal-action modal-close waves-effect waves-green btn-flat">Close</a>
</div>
</div>
<div id="about" class="modal">
<div class="modal-content">
<h4>About</h4>
<p>Zöff is a shared (free) YouTube based radio service, built upon the YouTube API. <br><br>
Zöff is mainly a webbased service. The website uses <a href="https://nodejs.org/">NodeJS</a> with <a href="http://socket.io/">Socket.IO</a>, <a href="https://www.mongodb.org/">MongoDB</a> and PHP on the backend, with JavaScript, jQuery and <a href="http://materializecss.com/">Materialize</a> on the frontend. More about the project itself can be found on <a href="https://github.com/zoff-music/Zoff">GitHub</a><br><br>
The team consists of Kasper Rynning-Tønnesen and Nicolas Almagro Tonne, and the project has been worked on since late 2014.<br><br>
The team can be reached on <a href="mailto:contact@zoff.no?Subject=Contact%20Zoff">contact@zoff.no</a>
</p>
</div>
<div class="modal-footer">
<a href="#!" class=" modal-action modal-close waves-effect waves-green btn-flat">Close</a>
</div>
</div>
<div id="help" class="modal">
<div class="modal-content">
<h4>So you need help?</h4>
<p>To remote-controll a computer, just type in the ID for that computer. (This can be found in the settings panel on the computer you want to remote controll. There is also a QR code for you to scan.</p>
<p>When you've entered the ID for the computer you want to controll, you'll be able to change the volume, have the controlled computer vote for skipping, pause the video or play the video.</p>
<p>The inputfield you used to enter the ID (if you entered it), has now changed some. If you type in something here now, the controlled computer will change channel!</p>
</div>
<div class="modal-footer">
<a href="#!" class=" modal-action modal-close waves-effect waves-green btn-flat">Close</a>
</div>
</div>
</header>
<main class="center-align container remote-container">
<div class="section">
<h3 id="remote-text">Twitch Bot</h3>
<div class="row">
<div class="col s6">
<p>
Commands
</p>
<p>
join
</p>
<p>
leave
</p>
<p>
np
</p>
</div>
<div class="col s6">Sign up</div>
</div>
</div>
</main>
<?php include("footer.php"); ?>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jqueryui-touch-punch/0.2.3/jquery.ui.touch-punch.min.js"></script>
<!--<script type="text/javascript" src="/static/dist/remote.min.js"></script>-->
</body>
</html>

View File

@@ -1,117 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#">
<?php include("header.php"); ?>
<link rel="chrome-webstore-item" href="https://chrome.google.com/webstore/detail/jemjlblambcgjmmhheaklfnphncdmfmb" />
</head>
<body class="noselect cursor-default">
<header>
<nav id="fp-nav">
<div class="nav-wrapper">
<a href="//zoff.no" class="brand-logo hide-on-small-only">
<img id="zicon" src="/static/images/squareicon_small.png" alt="zöff" title="Zöff" />
</a>
<a href="//zoff.no" class="brand-logo hide-on-med-and-up">Zöff</a>
<ul id="nav-mobile" class="right hide-on-med-and-down">
<li><a class="modal-trigger waves-effect waves-red" title="Need help with the site?" onclick="$('#help').openModal()">Help</a></li>
<li><a class="waves-effect green" title="Remote control a Zöff player" href="https://remote.zoff.no">Remote</a></li>
<li><a class="modal-trigger waves-effect waves-orange" onclick="$('#about').openModal()">About</a></li>
<li><a class="modal-trigger waves-effect waves-yellow" onclick="$('#legal').openModal()">Legal</a></li>
<li><a class="waves-effect waves-purple" href="https://github.com/zoff-music/">GitHub</a></li>
</ul>
</div>
</nav>
<div id="legal" class="modal">
<div class="modal-content">
<h4>Legal</h4>
<p>Copyright © 2015 <br>Nicolas Almagro Tonne and Kasper Rynning-Tønnesen
<br><br>
Creative Commons License<br>
Zöff is licensed under a <br><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/no/">Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Norway License.</a>
<br>
Do not redistribute without permission from the developers.
<br>
</div>
<div class="modal-footer">
<a href="#!" class=" modal-action modal-close waves-effect waves-green btn-flat">Close</a>
</div>
</div>
<div id="about" class="modal">
<div class="modal-content">
<h4>About</h4>
<p>Zöff is a shared (free) YouTube based radio service, built upon the YouTube API. <br><br>
Zöff is mainly a web-based service. The website uses <a href="https://nodejs.org/">NodeJS</a> with <a href="http://socket.io/">Socket.IO</a>, <a href="https://www.mongodb.org/">MongoDB</a> and PHP on the backend, with JavaScript, jQuery and <a href="http://materializecss.com/">Materialize</a> on the frontend. More about the project itself can be found on <a href="https://github.com/zoff-music/Zoff">GitHub</a><br><br>
The team consists of Kasper Rynning-Tønnesen and Nicolas Almagro Tonne, and the project has been worked on since late 2014.<br><br>
The team can be reached on <a href="mailto:contact@zoff.no?Subject=Contact%20Zoff">contact@zoff.no</a>
</p>
</div>
<div class="modal-footer">
<a href="#!" class=" modal-action modal-close waves-effect waves-green btn-flat">Close</a>
</div>
</div>
<div id="help" class="modal">
<div class="modal-content">
<h4>So you need help?</h4>
<p>To remote-control a computer, just type in the ID for that computer. (This can be found in the settings panel on the computer you want to remote control. There is also a QR code for you to scan.</p>
<p>When you've entered the ID for the computer you want to control, you'll be able to change the volume, have the controled computer vote for skipping, pause the video or play the video.</p>
<p>The input field you used to enter the ID (if you entered it), has now changed some. If you type in something here now, the controled computer will change channel!</p>
</div>
<div class="modal-footer">
<a href="#!" class=" modal-action modal-close waves-effect waves-green btn-flat">Close</a>
</div>
</div>
</header>
<main class="center-align container remote-container">
<div class="section">
<h3 id="remote-text">Remote Controller</h3>
</div>
<div class="section">
<form action="#" class="row" id="remoteform">
<div class="input-field col s12">
<input
class="input-field"
type="text"
id="search"
name="chan"
title="Type channel name here to create or listen to a channel. Only alphanumerical chars. [a-zA-Z0-9]+"
autocomplete="off"
spellcheck="false"
maxlength="10"
data-length="10"
/>
<label for="search" id="forsearch">Type ID of host to be controlled</label>
</div>
</form>
<div class="rc" id="remote-controls">
<a id="playbutton" class="remote-button chan-link waves-effect btn green">
<i id="remote_play" class="mdi-av-play-arrow"></i>
</a>
<a id="pausebutton" class="remote-button chan-link waves-effect btn gray">
<i id="remote_pause" class="mdi-av-pause"></i>
</a>
<a id="skipbutton" class="remote-button chan-link waves-effect btn blue">
<i id="remote_skip" class="mdi-av-skip-next"></i>
</a>
</div>
<i class="mdi-av-volume-up slider-vol rc"></i>
<div class="rc" id="volume-control" title="Volume"></div>
</div>
<div class="section about-remote">
<b>Here you can control another Zöff player from any device.</b>
<br>
To find the ID of your player, click the Conf <i class="mdi-action-settings"></i> icon on the top right of the player page, then "Remote Control".
<br>You can either scan the QR code or type the ID manually.
</div>
</main>
<?php include("footer.php"); ?>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jqueryui-touch-punch/0.2.3/jquery.ui.touch-punch.min.js"></script>
<script type="text/javascript" src="/static/dist/remote.min.js"></script>
</body>
</html>

View File

@@ -1,138 +0,0 @@
<div id="contact" class="modal">
<div class="modal-content">
<h4>Want to contact us?</h4>
<div id="contact-container">
<form id="contact-form" method="post" onsubmit="return false;">
<div class="input-field">
<input id="contact-form-from" name="from" type="email" autocomplete="off" class="validate" />
<label for="contact-form-from" class="noselect">Email</label>
</div>
<div class="input-field">
<input id="contact-form-message" name="message" type="text" autocomplete="off">
<label for="contact-form-message" class="noselect">Message</label>
</div>
<button class="contact-button-submit" action="submit" id="submit-contact-form">Send</button>
<div class="valign hide" id="send-loader">
<div class="preloader-wrapper small active">
<div class="spinner-layer spinner-blue">
<div class="circle-clipper left">
<div class="circle"></div>
</div><div class="gap-patch">
<div class="circle"></div>
</div><div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-red">
<div class="circle-clipper left">
<div class="circle"></div>
</div><div class="gap-patch">
<div class="circle"></div>
</div><div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-yellow">
<div class="circle-clipper left">
<div class="circle"></div>
</div><div class="gap-patch">
<div class="circle"></div>
</div><div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-green">
<div class="circle-clipper left">
<div class="circle"></div>
</div><div class="gap-patch">
<div class="circle"></div>
</div><div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
<div class="modal-footer">
<a href="#!" class=" modal-action modal-close waves-effect waves-green btn-flat">Close</a>
</div>
</div>
<footer class="page-footer cursor-default">
<div class="container">
<div class="row">
<div class="col l6 s12">
<h5 class="white-text">Zöff</h5>
<p class="grey-text text-lighten-4">The shared YouTube radio</p>
<p class="grey-text text-lighten-4">
Being built around the YouTube search and video API
it enables the creation of collaborative and shared live playlists,
with billions of videos and songs to choose from, all for free and without registration.
<br />
Enjoy!
</p>
<ul id="footer-buttons">
<li>
<a class="modal-trigger waves-effect cyan darken-2 btn help-button-footer" title="Need help with the site?" onclick="$('#help').openModal()">
<i class="material-icons left footer-button-icon">info_outline</i>HELP
</a>
</li>
<li>
<a class="modal-trigger waves-effect blue-grey darken-2 btn help-button-footer hide-on-small-only" id="embed-button" title="Want to embed this channel?" onclick="$('#embed').openModal()">
<i class="material-icons left footer-button-icon">code</i>EMBED
</a>
</li>
<li>
<a class="modal-trigger waves-effect red darken-2 btn help-button-footer" id="contact-button" title="Contact us" onclick="$('#contact').openModal()">
<i class="mdi-communication-email left footer-button-icon"></i>CONTACT
</a>
</li>
</ul>
<p id="latest-commit" class="grey-text text-lighten-4 truncate"></p>
</div>
<div class="col l4 offset-l2 s12 valign-wrapper">
<ul>
<li>
<a href="https://github.com/zoff-music/">
<img title="Contribute on GitHub" src="/static/images/GitHub_Logo.png" alt="GitHub" />
</a>
<p>
<a id="facebook-code-link" class="waves-effect waves-light btn light-blue share shareface" href="https://www.facebook.com/sharer/sharer.php?u=http://<?php echo $_SERVER['HTTP_HOST'].'/'.$list; ?>" target="popup" onclick="window.open('https://www.facebook.com/sharer/sharer.php?u=http://<?php echo $_SERVER['HTTP_HOST'].'/'.$list; ?>','Share Playlist','width=600,height=300')">
<img class="left" src="/static/images/facebook.png" alt="Share on Facebook" />Share on&nbsp;Facebook
</a>
</p>
<p>
<a id="twitter-code-link" class="waves-effect waves-light btn light-blue share" href="http://twitter.com/intent/tweet?url=http://<?php echo $_SERVER['HTTP_HOST'].'/'.$list; ?>&amp;text=Check%20out%20this%20playlist%20<?php echo ucfirst($list); ?>%20on%20Z&ouml;ff!&amp;via=zoffmusic" target="popup" onclick="window.open('http://twitter.com/intent/tweet?url=http://<?php echo $_SERVER['HTTP_HOST'].'/'.$list; ?>&amp;text=Check%20out%20this%20playlist%20<?php echo ucfirst($list); ?>%20on%20Z&ouml;ff!&amp;via=zoffmusic','Share Playlist','width=600,height=300')">
<img class="left" src="/static/images/twitter.png" alt="Share on Twitter" />Share on&nbsp;Twitter
</a>
</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank" id="donate_form">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="JEXDYP59N5VWE">
<a title="Like what we made? Help us by donating (a) beer!" class="waves-effect waves-light btn orange light-blue share" onclick="document.getElementById('donate_form').submit();">
<i class="mdi-action-payment left footer-button-icon"></i>Donate
</a>
</form>
<p class="hide-on-small-only">
<a id="qr-code-link" target="_blank" href="//chart.googleapis.com/chart?chs=500x500&amp;cht=qr&amp;chl=http://<?php echo $_SERVER['HTTP_HOST'].'/'.$list; ?>&amp;choe=UTF-8&amp;chld=L%7C1" >
<img id="qr-code-image-link" class="card rounded" src="//chart.googleapis.com/chart?chs=150x150&amp;cht=qr&amp;chl=http://<?php echo $_SERVER['HTTP_HOST'].'/'.$list; ?>&amp;choe=UTF-8&amp;chld=L%7C1" alt="QRCode for link" title="QR code for this page, for easy sharing!" />
</a>
</p>
</li>
</ul>
</div>
</div>
</div>
<div class="footer-copyright">
<div class="container">
&copy; <?php echo date("Y"); ?>
<a href="http://nixo.no">Nixo</a> &amp;
<a href="http://kasperrt.no">KasperRT</a>
&nbsp;&nbsp;All Rights Reserved.
</div>
</div>
</footer>

View File

@@ -1,45 +0,0 @@
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Zöff |
| Project is on github: https://github.com/zoff-music/Zoff |
| Made by: Nicolas Almagro Tonne and Kasper Rynning-Tønnesen |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<title>Zöff</title>
<meta name="author" content="Nicolas 'Nixo' Almagro Tonne &amp; Kasper 'KasperRT' Rynning-Tønnesen"/>
<meta name="description" content="The Shared (free) YouTube radio. Being built around the YouTube search and video API it enables the creation of collaborative and shared live playlists, with billions of videos and songs to choose from, all for free and without registration. Enjoy!"/>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no"/>
<meta charset="UTF-8"/>
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="mobile-web-app-capable" content="yes">
<meta name="theme-color" content="#2D2D2D" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta property="og:image" content="/static/images/favicon.png" />
<meta property="og:title" content="Zöff"/>
<meta property="og:description" content="The Shared (free) YouTube radio. Being built around the YouTube search and video API it enables the creation of collaborative and shared live playlists, with billions of videos and songs to choose from, all for free and without registration. Enjoy!"/>
<meta property="og:type" content="website"/>
<link rel="manifest" href="/manifest.json">
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.min.css">
<link tyle="text/css" rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" />
<link type="text/css" rel="stylesheet" href="/static/css/materialize.min.css" />
<link rel="stylesheet" type="text/css" href="/static/css/style.css" title="Default" />
<link rel="icon" id="favicon" type="image/png" href="/static/images/favicon.png"/>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', '***REMOVED***', 'auto');
ga('send', 'pageview');
</script>
<script type="text/javascript" src="/static/dist/lib/jquery-2.1.3.min.js"></script>
<script type="text/javascript" src="/static/dist/lib/jquery-ui-1.10.3.min.js"></script>
<script type="text/javascript" src="/static/dist/lib/materialize.min.js"></script>
<script type="text/javascript" src="/static/dist/lib/socket.io-1.4.5.js"></script>
<script type="text/javascript" src="/static/dist/lib/jquery.lazyload.js"></script>
<script type="text/javascript" src="/static/dist/lib/color-thief.js"></script>
<script type="text/javascript" src="/static/dist/lib/sha256.js"></script>
<script type="text/javascript" src="/static/dist/lib/aes.js"></script>

View File

@@ -1,18 +0,0 @@
<?php
$url = file_get_contents("https://img.youtube.com/vi/".$_POST['id']."/mqdefault.jpg");
$image = new Imagick();
$image->readImageBlob($url);
$image->blurImage(30,50);
$output = $image->getimageblob();
$image->setImageFormat("jpeg");
file_put_contents ("../static/images/thumbnails/".$_POST['id'].".jpg", $image);
echo base64_encode($output);
?>

View File

@@ -1,22 +0,0 @@
<?php
if(isset($_POST['from']) && isset($_POST['message'])){
$from = htmlspecialchars($_POST['from']);
$message = htmlspecialchars($_POST['message']);
$headers = "From: " . $from . "\r\n";
if(filter_var($from, FILTER_VALIDATE_EMAIL) && $message != ""){
$result = mail("contact@zoff.no", "Contact from form", $message, $headers);
if($result == FALSE){
echo "failure";
}else{
echo "success";
}
}else{
echo "failure";
}
}
?>

View File

@@ -1,177 +0,0 @@
<?php
if(isset($_GET['chan'])){
$chan = htmlspecialchars($_GET['chan']);
header('Location: '.$chan);
}
?>
<html lang="en">
<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#">
<?php include("header.php"); ?>
<script type="text/javascript" src="/static/dist/main.min.js"></script>
</head>
<body class="noselect cursor-default">
<header>
<nav id="fp-nav">
<div class="nav-wrapper">
<a href="#" class="brand-logo hide-on-small-only noselect">
<img id="zicon" src="static/images/squareicon_small.png" alt="zöff" title="Zöff" />
</a>
<span id="frontpage-viewer-counter" class="hide-on-small-only noselect" title="Divided among all channels. Hidden or not"></span>
<a href="//zoff.no" class="brand-logo brand-mobile hide-on-med-and-up">Zöff</a>
<ul id="nav-mobile" class="right hide-on-med-and-down">
<li><a class="modal-trigger waves-effect waves-red" title="Need help with the site?" onclick="$('#help').openModal()">Help</a></li>
<li><a class="waves-effect green" title="Remote control a Zöff player" href="https://remote.zoff.no">Remote</a></li>
<li><a class="modal-trigger waves-effect waves-orange" onclick="$('#about').openModal()">About</a></li>
<li><a class="modal-trigger waves-effect waves-yellow" onclick="$('#legal').openModal()">Legal</a></li>
<li><a class="waves-effect waves-purple" href="https://github.com/zoff-music/">GitHub</a></li>
</ul>
</div>
</nav>
<div id="legal" class="modal">
<div class="modal-content">
<h4>Legal</h4>
<p>Copyright © 2015 <br>Nicolas Almagro Tonne and Kasper Rynning-Tønnesen
<br><br>
Creative Commons License<br>
Zöff is licensed under a <br><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/no/">Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Norway License.</a>
<br>
Do not redistribute without permission from the developers.
<br>
</div>
<div class="modal-footer">
<a href="#" class="modal-action modal-close waves-effect waves-green btn-flat">Close</a>
</div>
</div>
<div id="about" class="modal">
<div class="modal-content">
<h4>About</h4>
<p>Zöff is a shared (free) YouTube based radio service, built upon the YouTube API. <br><br>
Zöff is mainly a web-based service. The website uses <a href="https://nodejs.org/">NodeJS</a> with <a href="http://socket.io/">Socket.IO</a>, <a href="https://www.mongodb.org/">MongoDB</a> and PHP on the backend, with JavaScript, jQuery and <a href="http://materializecss.com/">Materialize</a> on the frontend. More about the project itself can be found on <a href="https://github.com/zoff-music/Zoff">GitHub</a><br><br>
The team consists of Kasper Rynning-Tønnesen and Nicolas Almagro Tonne, and the project has been worked on since late 2014.<br><br>
The team can be reached on <a href="mailto:contact@zoff.no?Subject=Contact%20Zoff">contact@zoff.no</a><br><br>
</p>
</div>
<div class="modal-footer">
<a href="#" class="modal-action modal-close waves-effect waves-green btn-flat">Close</a>
</div>
</div>
<div id="donation" class="modal">
<div class="modal-content">
<h4>Thanks!</h4>
<p>Thanks for your donation, we love you &lt;3
<br><br>
We will use the money for something awesome, just you wait and see!
<br><br>
We might also add your name somewhere in the code as a sign of gratitude, see if you can find it! (Might take a day or two for us to see the donation and implement it..)
</p>
</div>
<div class="modal-footer">
<a href="#" class="modal-action modal-close waves-effect waves-green btn-flat">I'm awesome! (Close)</a>
</div>
</div>
<div id="help" class="modal">
<div class="modal-content">
<h4>So you need help?</h4>
<p>At the center of the site, you'll see a input field. This is meant to navigate to new or existing channels. If you input something here that already doesn't exist, a new channel will be create at the blink of an eye! Remember to put a password on the list you've created, so no one else takes it from you! (It's on a first come, first serve basis). When you're ready to proceed, just click the listen button!</p>
<p>Underneath the input fields, there are several tiles. These are channels that already exists, and they can be clicked! To enter one of these channels and listen to it's content, it is just to click the tile.</p>
</div>
<div class="modal-footer">
<a href="#" class=" modal-action modal-close waves-effect waves-green btn-flat">Close</a>
</div>
</div>
</header>
<div class="section mega">
<div id="mega-background"></div>
<h5>Create a radio channel, collaborate and listen</h5>
<form class="channel-finder" onsubmit="return false;">
<p class="prething">zoff.no/</p>
<input
class="input-field room-namer"
type="text"
id="searchFrontpage"
name="chan"
placeholder="chill"
title="Type channel name here to create or listen to a channel. Only alphanumerical chars. [a-zA-Z0-9]+"
autocomplete="off"
autofocus=""
list="searches"
required
pattern="[a-zA-Z0-9]+"
spellcheck="false"
maxlength="18"
/>
<datalist id="searches"></datalist>
<button class="listen-button" action="submit">Listen</button>
</form>
<div class="pitch outline">
<div>Live &amp; democratic playlists with YouTube Music</div>
<div>Play everywhere — No login required</div>
</div>
</div>
<div class="section mobile-search">
<form class="row" id="base" method="get" onsubmit="return false;">
<div class="input-field col s12">
<input
class="input-field"
type="text"
id="search-mobile"
name="chan"
title="Type channel name here to create or listen to a channel. Only alphanumerical chars. [a-zA-Z0-9]+"
autocomplete="off"
list="searches"
required pattern="[a-zA-Z0-9]+"
spellcheck="false"
maxlength="18"
data-length="18"
/>
<label for="search-mobile" class="noselect">Find or create radio channel</label>
<datalist id="searches">
</datalist>
</div>
</form>
</div>
<div id="channel-load" class="progress">
<div class="indeterminate" id="channel-load-move"></div>
</div>
<main class="center-align container">
<div id="main_section_frontpage" class="section">
<div id="preloader" class="progress">
<div class="indeterminate"></div>
</div>
<div id="channel-list-container">
<ul class="row" id="channels">
<li id="chan-card" class="col s12 m4 l3">
<div class="card">
<a class="chan-link">
<div class="chan-bg card-image cardbg"></div>
<div class="card-content">
<i class="mdi-action-star-rate pin"></i>
<p class="left-align">
<span class="chan-name flow-text truncate"></span>
<br>
<span class="highlighted">Viewers:&nbsp;</span>
<span class="chan-views"></span>
<br>
<span class="highlighted">Songs:&nbsp;</span>
<span class="chan-songs"></span>
</p>
</div>
<div class="card-action noselect">
<a class="chan-link waves-effect waves-orange btn-flat">Listen</a>
</div>
</a>
</div>
</li>
</ul>
</div>
</div>
</main>
<?php include("php/footer.php"); ?>
</body>
</html>

View File

@@ -1,204 +0,0 @@
<li class="no-padding">
<ul class="collapsible collapsible-accordion">
<li>
<a class="col s9 collapsible-header bold waves-effect admin-settings">
Channel Settings
<i class="mdi-image-tune"></i>
<div class="nav-btn close-settings clickable" title="Close" id="closeSettings">
<i class="mdi-navigation-close auto-margin"></i>
</div>
</a>
<div class="collapsible-body">
<form action="#" id="adminForm" onsubmit="return false;">
<ul>
<li class="white-bg">
<div class="input-field field-settings">
<i id="admin-lock" class="mdi-action-lock" title="Click to log out"></i>
<input placeholder="Enter channel password" id="password" type="password" class="validate" />
</div>
</li>
<li>
<span class="switch-text">
Add songs
</span>
<div class="switch"><label>
Anyone
<input name="addsongs" type="checkbox" class="conf" /><span class="lever"></span>
Admin
</label></div></li>
<li>
<span class="switch-text">
Vote
</span>
<div class="switch"><label>
Anyone
<input name="vote" type="checkbox" class="conf" /><span class="lever"></span>
Admin
</label></div></li>
<li><span class="switch-text">
Shuffle
</span>
<div class="switch"><label>
Anyone
<input name="shuffle" type="checkbox" class="conf" /><span class="lever"></span>
Admin
</label></div></li>
<li><span class="switch-text">
Skip
</span>
<div class="switch"><label>
Anyone
<input name="skip" type="checkbox" class="conf" /><span class="lever"></span>
Admin
</label></div></li>
<li><span class="switch-text">
Song length
</span>
<div class="switch"><label>
Any
<input name="longsongs" type="checkbox" class="conf" /><span class="lever"></span>
Short
</label></div></li>
<li><span class="switch-text">
Type
</span>
<div class="switch"><label>
Any
<input name="allvideos" type="checkbox" class="conf" /><span class="lever"></span>
Song
</label></div></li>
<li><span class="switch-text">
Frontpage
</span>
<div class="switch"><label>
Hide
<input name="frontpage" type="checkbox" class="conf" /><span class="lever"></span>
Display
</label></div></li>
<li><span class="switch-text">
After play
</span>
<div class="switch"><label>
Keep
<input name="removeplay" type="checkbox" class="conf" /><span class="lever"></span>
Remove
</label></div></li>
</ul>
</form>
</div>
</li>
</ul>
</li>
<li class="no-padding remote-panel">
<ul class="collapsible collapsible-accordion">
<li>
<a class="collapsible-header bold waves-effect">Remote Control
<i class="material-icons">settings_remote</i>
</a>
<div class="collapsible-body">
<ul>
<li>
<span class="switch-text">
Enable Remote
</span>
<div class="switch"><label>
Disabled
<input name="remote_switch" type="checkbox" class="remote_switch_class" checked /><span class="lever"></span>
Enabled
</label>
</div>
<a id="code-link" target="_blank">
<img id="code-qr" alt="QR code for control" title="Link to control this Zöff player" src="https://chart.googleapis.com/chart?chs=221x221&amp;cht=qr&amp;choe=UTF-8&amp;chld=L%7C1&amp;chl=http://zoff.no" />
<h4 id="code-text">ABBADUR</h4>
</a>
<a>
You can control this Zöff instance from another device by going to <b>https://remote.zoff.no/</b>
</a>
</li>
</ul>
</div>
</li>
</ul>
</li>
<li class="no-padding remote-panel">
<ul class="collapsible collapsible-accordion">
<li>
<a class="collapsible-header bold waves-effect import-a">Import Playlist
<i class="mdi-communication-import-export"></i>
</a>
<div class="collapsible-body">
<ul>
<li class="white-bg">
<div class="input-field field-settings">
<form action="#" id="listImport" onsubmit="return false;">
<i class="mdi-av-playlist-add import-icon"></i>
<input title="Input YouTube-playlist id here!" placeholder="Enter YouTube-list ID" id="import" type="text" class="validate" autocomplete="off" />
</form>
</div>
</li>
</ul>
</div>
</li>
</ul>
</li>
<li class="no-padding show-only-mobile">
<ul class="collapsible collapsible-accordion">
<li>
<a class="collapsible-header bold waves-effect import-a">Remote Controller
<i class="material-icons">settings_remote</i>
</a>
<div class="collapsible-body">
<ul id="remote-mobile-container">
<li class="white-bg">
<p id="remote_header">Control another client</p>
<form action="#" class="row" id="remoteform">
<div class="input-field col s12">
<input
class="input-field"
type="text"
id="remote_channel"
name="chan"
autocomplete="off"
spellcheck="false"
maxlength="10"
data-length="10"
placeholder="ID to remotecontroll"
/>
</div>
</form>
<button id="playbutton_remote" class="remote-button waves-effect btn green" disabled>
<i id="remote_play" class="mdi-av-play-arrow"></i>
</button>
<button id="pausebutton_remote" class="remote-button waves-effect btn gray" disabled>
<i id="remote_pause" class="mdi-av-pause"></i></button>
<button id="skipbutton_remote" class="remote-button waves-effect btn blue" disabled>
<i id="remote_skip" class="mdi-av-skip-next"></i>
</button>
<i class="mdi-av-volume-up slider-vol"></i>
<div class="" id="volume-control-remote" title="Volume"></div>
</li>
</ul>
</div>
</li>
</ul>
</li>
<!--
<li class="no-padding">
<h5 id="desc-title">List description</h5>
<span id="description"></span>
</li>
-->

View File

@@ -1,37 +0,0 @@
<html>
<head>
<title>promp</title>
</head>
<body>
<?php
$files = scandir('../oldFiles/');
foreach($files as $list) {
if($list != "." && $list != "..")
{
$file = file_get_contents("../oldFiles/".$list);
$data = json_decode($file);
if(count($data) > 0)
{
$array = array("nowPlaying" => array(), "songs" => array(), "conf" => array("startTime" => time(), "views" => 0, "skips" => array()));
for($i = 0; $i < count($data[0]); $i++)
{
if($i > 0)
{
$arr = "songs";
}
else{
$arr = "nowPlaying";
}
$array[$arr][$data[0][0]] = array("id" => $data[0][0], "title" => str_replace("\"", "\'", $data[3][0]), "votes" => 0, "added" => time(), "guids" => array());
array_shift($data[0]);
array_shift($data[3]);
}
file_put_contents("../oldFiles/".$list, json_encode($array));
echo $list."\n";
}
}
}
?>
</body>
</html>

15
pm2.json Normal file
View File

@@ -0,0 +1,15 @@
{
"apps": [
{
"name": "zoff",
"script": "./server/pm2.js",
"watch": true,
"instances": "max",
"exec_mode": "cluster",
"ignore_watch": [
"./node_modules",
"./server/public/assets/images/thumbnails"
]
}
]
}

224
server/EVENTS.md Normal file
View File

@@ -0,0 +1,224 @@
## Events
### To server
```
// Tells the server the song is over
'end', {
id: video_id,
channel: channel_name,
pass: Base64(channel_pass)
}
// Asks server where in the song it should be
'pos', {
channel: channel_name,
pass: Base64(hannel_pass)
}
// Tells the server the client wants the list
'list', {
channel: channel_name,
pass: Base64(channel_pass),
version: system_version (can be checked in VERSION.js)
}
// Sends info about a song the client wants to add
'add', {
id: VIDEO_ID,
title: VIDEO_TITLE,
adminpass: Base64(PASSWORD),
duration: VIDEO_DURATION,
list: channel_name,
pass: Base64(channel_pass)
}
'addPlaylist', {
channel: CHANNEL_NAME,
userpass: Base64(CHANNEL_PASSWORD),
adminpass: Base64(PASSWORD),
songs: [
{
id: song_id,
title: song_title,
duration: song_duration
}, ... { ... }
]
}
// Imports songs from another zoff-channel
'import_zoff', {
channel: CHANNELNAME,
new_channel: CHANNELNAME-TO-IMPORT-FROM,
adminpass: Base64(PASSWORD),
userpass: Bse64(CHANNEL_PASSWORD)
}
// Tells the server to disconnect the user from the current channel, is used for remote controlling on the host side
'change_channel', {
channel: channel_name
}
// Sends chat text to all chat
'all,chat', {
channel: channel_name,
data: input
}
// Sends chat text to channelchat
'chat',{
channel: channel_name,
data: input,
pass: Base64(channel_pass)
}
// Sends info about song the user wants to vote on. If VOTE_TYPE is del, its deleting the song, if its pos, its just voting
'vote', {
channel: CHANNEL_NAME,
id: VIDEO_ID,
type: VOTE_TYPE,
adminpass: Base64(PASSWORD)
}
// Sends shuffle to the server (Only works every 5 seconds per list)
'shuffle', {
adminpass: Base64(PASSWORD),
channel: CHANNELNAME,
pass: Base64(USER_PASSWORD)
}
// Sends skip message to server
'skip', {
pass: Base64(PASSWORD),
id:video_id,
channel: chan,
userpass: Base64(channel_pass)
}
// Sends password for instant log in to server
'password', {
password: Base64(PASSWORD),
channel: CHANNEL_NAME,
oldpass: Base64(old_pass_if_changing_password)
}
// Sends message to the host channel for play
'id', {
id: CHANNEL_ID,
type: "play",
value: "mock"
}
// Sends message to the host channel for pause
'id', {
id: CHANNEL_ID,
type: "pause",
value: "mock"
}
// Sends message to the host channel for skip
'id', {
id: CHANNEL_ID,
type: "skip",
value: "mock"
}
// Sends message to the host channel to change volume
'id', {
id: CHANNEL_ID,
type: "volume",
value: VALUE
}
// Sends message to the host channel to change channel
'id', {
id: CHANNEL_ID,
type: "channel",
value: NEW_CHANNEL_NAME
}
// Sends a video that triggered an error
'error_video', {
channel: CHANNEL_NAME,
id: VIDEO_ID,
title: VIDEO_TITLE
}
// Requests chat-history from the last 10 minutes
'get_history', {
channel: CHANNEL_NAME,
all: BOOLEAN (if true, it requests for all-chat),
pass: Base64(USERPASS)
}
```
### From server
```
// Receives a string from server for what type of toast to be triggered
'toast', STRING
// Receives a boolean if the password was correct
'pw', BOOLEAN
// Receives configuration array from server
'conf', [ARRAY]
// Receives chat message from allchat
'chat.all', {
from: name,
msg: message,
channel: channel,
icon: icon_src
}
// Receives chat-history for all and for current channel
'chat_history', {
all: BOOLEAN (if true, it is for all-chat),
data: CHAT_HISTORY
}
// Receives chat message from channelchat
'chat', {
from: name,
msg: message,
icon: icon_src
}
// Receives the ID of the current client, used for remote listening
'id', STRING
// Receives the messages sent on CHANNEL_ID above
id, {
type: STRING,
value: VALUE
}
// Receives updates from channel. type is one of the following: list, added, deleted, vote, song_change, changed_values (see further down for better explanation here)
'channel', {
type: TYPE,
value: value,
time: time_of_occurence
}
// Receives message from the server that its ready to send the playlist and info
'get_list'
// Receives array of now playing song. Is triggered on song-change
'np', {
np: NOW_PLAYING,
conf: CONFIGURATION,
time: SERVER_TIME
}
// Receives number of viewers on the current channel
'viewers', VALUE
// Receives a newly updated video, that was checked for errors (song_generated contains .id which is the current id of the video, and a .new_id for the new video to change the video to)
'channel', {
type: "changed_values",
value: song_generated
}
'update_required', {
description of what is wrong as an object
}
```

12
server/README.md Normal file
View File

@@ -0,0 +1,12 @@
## Apps
Under ``` /server/apps/ ```, there are two files, ``` admin.js ``` and ``` client.js ```.``` admin.js ``` are for the adminpanel, and ``` client.js ``` are for zoff itself.
## REST
[Rest API info](REST.md)
## Events
[Events sent form the server/to the server info](EVENTS.md)

192
server/REST.md Normal file
View File

@@ -0,0 +1,192 @@
## REST
All PUT, DELETE and POST endpoints have a 1-second waitlimit for each command per client. You'll get a response with Retry-After header for how long you have to wait. Shuffling in a player has a 5-second waitlimit, but per channel instead of per client.
If you want to skip the wait-times, create a token at <a href="https://zoff.me/api/apply">https://zoff.me/api/apply</a>. Tokens are added to all the POST, PUT, DELETE, requests as ``` token: TOKEN ```.
All requests return things on this form (results field is added if successful.)
```
{
status: STATUSCODE,
error: MESSAGE,
success: IF_SUCCESSFULL,
results: [RESULTS] (if something went wrong, there is one element in this array. This tells you what is wrong with the request, and what was expected)
}
```
Add song
```
POST /api/list/:channel_name/:video_id
{
"title": TITLE,
"duration": END_TIME - START_TIME,
"end_time": END_TIME,
"start_time": START_TIME,
"adminpass": PASSWORD, (leave this blank if there is no password/you don't know the password)
"userpass": USER_PASSWORD
"source": Either "youtube" or "soundcloud"
("thumbnail": thumbnail url for soundcloud elements (only used when source == "soundcloud"))
}
Returns 400 for bad request
Returns 403 for bad authentication (but will return a song object, with the type == "suggested", and the song will show up in the suggested tab for channel-admins)
Returns 409 if the song exists
Returns 429 if you're doing too much of this request, with a Retry-After int value in the header.
Returns 200 and the added song object if successful
```
Delete song
```
DELETE /api/list/:channel_name/:video_id
{
"adminpass": PASSWORD,
"userpass": USER_PASSWORD
}
Returns 400 for bad request
Returns 403 for bad authentication
Returns 404 if the song doesnt exist or is the currently playing song
Returns 429 if you're doing too much of this request, with a Retry-After int value in the header.
Returns 200 if successful
```
Vote on song
```
PUT /api/list/:channel_name/:video_id
{
"adminpass": PASSWORD,
"userpass": USER_PASSWORD
}
Returns 400 for bad request
Returns 403 for bad authentication
Returns 404 if the song doesnt exist
Returns 409 if you've already voted on that song
Returns 429 if you're doing too much of this request, with a Retry-After int value in the header.
Returns 200 and the added song object if successful
```
Change channel configurations
```
PUT /api/conf/:channel_name
{
"userpass": USER_PASSWORD,
"adminpass": PASSWORD,
"vote": BOOLEAN,
"addsongs": BOOLEAN,
"longsongs": BOOLEAN,
"frontpage": BOOLEAN (if you want to set userpassword, this MUST be false for it to work),
"allvideos": BOOLEAN,
"removeplay": BOOLEAN,
"skip": BOOLEAN,
"shuffle": BOOLEAN,
"userpass_changed": BOOLEAN (this must be true if you want to keep the userpassword you're sending)
}
Returns 400 for bad request
Returns 403 for bad authentication
Returns 404 if the list doesn't exist
Returns 429 if you're doing too much of this request, with a Retry-After int value in the header.
Returns 200 and the newly added configuration if successful
```
Get song in channel
```
GET /api/list/:channel_name/:video_id
Returns 403 for bad authentication (if you get this, the channel is protected, try getting the full channel with POST, and search through the object)
Returns 404 if the song doesn't exist
Returns 200 and the song
```
Get song in channel (protected)
```
// Important fetch_song is present, or else the request will try to add a song to the channel
POST /api/list/:channel_name/:video_id
{
"fetch_song": ANYTHING_HERE,
"userpass": USERPASS
}
Returns 400 for bad request
Returns 403 for bad authentication
Returns 404 if the song doesn't exist
Returns 200 and the song
```
Get list
```
GET /api/list/:channel_name/
Returns 403 for bad authentication (if you get this, the channel is protected, try getting the full channel with POST, and search through the object)
Returns 404 if the song doesn't exist
Returns 200 and the song
```
Get list (protected)
```
// Important fetch_song is present, or else the request will try to add a song to the channel
POST /api/list/:channel_name/
{
"userpass": USERPASS
}
Returns 400 for bad request
Returns 403 for bad authentication
Returns 404 if the list doesn't exist
Returns 200 and the song
```
Get channelsettings
```
GET /api/conf/:channel_name/
Returns 403 for bad authentication (if you get this, try POST with userpassword attached)
Returns 404 if the channel doesn't exist
Returns 200 and the objects in the channel
```
Get channelsettings (protected)
```
POST /api/conf/:channel_name/
{
"userpass": USERPASS
}
Returns 400 for bad request
Returns 403 for bad authentication
Returns 404 if the channel doesn't exist
Returns 200 and the objects in the channel
```
Get now playing song
```
GET /api/list/:channel_name/__np__
Returns 400 for bad request
Returns 403 for bad authentication (if you get this, try POST with userpassword attached)
Returns 404 if the channel doesn't exist
Returns 200 and the now playing object
```
Get now playing song (protected)
```
POST /api/list/:channel_name/__np__
{
"userpass": USERPASS
}
Returns 400 for bad request
Returns 403 for bad authentication (if you get this, try POST with userpassword attached)
Returns 404 if the channel doesn't exist
Returns 200 and the now playing object
```
Get all lists
```
GET /api/frontpages
Returns 200 and the frontpage-lists
```

5
server/VERSION.js Normal file
View File

@@ -0,0 +1,5 @@
VERSION = 6;
try {
module.exports = VERSION;
} catch (e) {}

157
server/app.js Normal file
View File

@@ -0,0 +1,157 @@
var cluster = require("cluster"),
net = require("net"),
path = require("path"),
//publicPath = path.join(__dirname, 'public'),
http = require("http"),
port = 8080,
farmhash = require("farmhash"),
uniqid = require("uniqid"),
num_processes = require("os").cpus().length;
publicPath = path.join(__dirname, "public");
pathThumbnails = __dirname;
try {
var redis = require("redis");
var client = redis.createClient({ host: "localhost", port: 6379 });
client.on("error", function(err) {
console.log("Couldn't connect to redis-server, assuming non-clustered run");
num_processes = 1;
startSingle(false, false);
client.quit();
});
client.on("connect", function() {
startClustered(true);
client.quit();
});
} catch (e) {
console.log("Couldn't connect to redis-server, assuming non-clustered run");
num_processes = 1;
startSingle(false, false);
}
function startClustered(redis_enabled) {
//Found https://stackoverflow.com/questions/40885592/use-node-js-cluster-with-socket-io-chat-application
if (cluster.isMaster) {
var workers = [];
var spawn = function(i) {
workers[i] = cluster.fork();
workers[i].on("exit", function(code, signal) {
if (code == 1) {
process.exit(1);
return;
}
console.log("respawning worker", i);
spawn(i);
});
};
for (var i = 0; i < num_processes; i++) {
spawn(i);
}
var worker_index = function(ip, len) {
//console.log(ip);
var s = "";
if (ip !== undefined) {
return farmhash.fingerprint32(ip) % len;
}
ip = uniqid.time();
for (var i = 0, _len = ip.length; i < _len; i++) {
if (!isNaN(ip[i])) {
s += ip[i];
}
}
return Number(s) % len;
};
var server = net
.createServer({ pauseOnConnect: true }, function(connection, a) {
var worker =
workers[worker_index(connection.address().address, num_processes)];
worker.send("sticky-session:connection", connection);
})
.listen(port);
} else {
startSingle(true, redis_enabled);
}
}
function startSingle(clustered, redis_enabled) {
var server;
var client = require("./apps/client.js");
try {
var cert_config = require(path.join(
path.join(__dirname, "config"),
"cert_config.js"
));
var fs = require("fs");
var privateKey = fs.readFileSync(cert_config.privateKey).toString();
var certificate = fs.readFileSync(cert_config.certificate).toString();
var ca = fs.readFileSync(cert_config.ca).toString();
var credentials = {
key: privateKey,
cert: certificate,
ca: ca
};
var https = require("https");
server = https.Server(credentials, routingFunction);
} catch (err) {
console.log("Starting without https (probably on localhost)");
server = http.createServer(routingFunction);
}
if (clustered) {
server.listen(onListen);
} else {
server.listen(port, onListen);
}
var socketIO = client.socketIO;
if (redis_enabled) {
var redis = require("socket.io-redis");
try {
socketIO.adapter(redis({ host: "localhost", port: 6379 }));
} catch (e) {
console.log("No redis-server to connect to..");
}
}
socketIO.listen(server);
process.on("message", function(message, connection) {
if (message !== "sticky-session:connection") {
return;
}
server.emit("connection", connection);
connection.resume();
});
}
function onListen() {
console.log("Started with pid [" + process.pid + "]");
}
function routingFunction(req, res, next) {
var client = require("./apps/client.js");
var admin = require("./apps/admin.js");
try {
var url = req.headers["x-forwarded-host"]
? req.headers["x-forwarded-host"]
: req.headers.host.split(":")[0];
var subdomain = req.headers["x-forwarded-host"]
? req.headers["x-forwarded-host"].split(".")
: req.headers.host.split(":")[0].split(".");
if (subdomain.length > 1 && subdomain[0] == "admin") {
admin(req, res, next);
} else {
client(req, res, next);
}
} catch (e) {
console.log("Bad request for " + req.headers.host + req.url, e);
res.statusCode = 500;
res.write("Bad request"); //write a response to the client
res.end(); //end the response
}
}

270
server/apps/admin.js Normal file
View File

@@ -0,0 +1,270 @@
var express = require("express");
var app = express();
const path = require("path");
const publicPath = path.join(__dirname + "", "../public");
var exphbs = require("express-handlebars");
var hbs = exphbs.create({
defaultLayout: publicPath + "/layouts/admin/main",
layoutsDir: publicPath + "/layouts",
partialsDir: publicPath + "/partials"
});
var passport = require("passport");
var mpromise = require("mpromise");
var LocalStrategy = require("passport-local").Strategy;
var mongoose = require("mongoose");
var mongo_db_cred = require(pathThumbnails + "/config/mongo_config.js");
var mongojs = require("mongojs");
var db = mongojs(mongo_db_cred.config);
var token_db = mongojs("tokens");
var bodyParser = require("body-parser");
var session = require("express-session");
var MongoStore = require("connect-mongo")(session);
var api = require(pathThumbnails + "/routing/admin/api.js");
var compression = require("compression");
var User = require(pathThumbnails + "/models/user.js");
var url = "mongodb://" + mongo_db_cred.host + "/" + mongo_db_cred.users;
mongoose.connect(url);
app.engine("handlebars", hbs.engine);
app.set("view engine", "handlebars");
app.use(compression({ filter: shouldCompress }));
function shouldCompress(req, res) {
if (req.headers["x-no-compression"]) {
// don't compress responses with this request header
return false;
}
// fallback to standard filter function
return compression.filter(req, res);
}
app.set("trust proxy", "127.0.0.1");
var bodyParser = require("body-parser");
var cookieParser = require("cookie-parser");
var referrerPolicy = require("referrer-policy");
var helmet = require("helmet");
var featurePolicy = require("feature-policy");
app.use(
featurePolicy({
features: {
fullscreen: ["*"],
//vibrate: ["'none'"],
payment: ["'none'"],
microphone: ["'none'"],
camera: ["'none'"],
speaker: ["*"],
syncXhr: ["'self'"]
//notifications: ["'self'"]
}
})
);
app.use(
helmet({
frameguard: false
})
);
app.use(referrerPolicy({ policy: "origin-when-cross-origin" }));
app.enable("view cache");
app.set("views", publicPath);
app.use(bodyParser.json()); // to support JSON-encoded bodies
app.use(
bodyParser.urlencoded({
extended: true
})
);
app.use(
session({
secret: mongo_db_cred.secret,
resave: true,
saveUninitialized: true,
store: new MongoStore({
url: url,
useNewUrlParser: true,
collection: "sessions",
ttl: mongo_db_cred.expire
})
})
); // session secret
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions
//app.use('/assets', express.static(publicPath + '/assets'));
passport.serializeUser(function(user, done) {
done(null, user.id);
});
// used to deserialize the user
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
passport.use(
"local-signup",
new LocalStrategy(
{
// by default, local strategy uses username and password, we will override with username
usernameField: "username",
passwordField: "password",
passReqToCallback: true // allows us to pass back the entire request to the callback
},
function(req, username, password, done) {
// asynchronous
// User.findOne wont fire unless data is sent back
process.nextTick(function() {
// find a user whose username is the same as the forms username
// we are checking to see if the user trying to login already exists
var token = req.body.token;
token_db
.collection("tokens")
.find({ token: token }, function(err, docs) {
if (docs.length == 1) {
token_db
.collection("tokens")
.remove({ token: token }, function(err, docs) {
User.findOne({ username: username }, function(err, user) {
// if there are any errors, return the error
if (err) return done(err);
// check to see if theres already a user with that username
if (user) {
return done(null, false);
} else {
// if there is no user with that username
// create the user
var newUser = new User();
// set the user's local credentials
newUser.username = username;
newUser.password = newUser.generateHash(password);
// save the user
newUser.save(function(err) {
if (err) throw err;
return done(null, newUser);
});
}
});
});
} else {
return done(null, false);
}
});
});
}
)
);
passport.use(
"local-login",
new LocalStrategy(
{
// by default, local strategy uses username and password, we will override with email
usernameField: "username",
passwordField: "password",
passReqToCallback: true // allows us to pass back the entire request to the callback
},
function(req, username, password, done) {
// callback with email and password from our form
// find a user whose email is the same as the forms email
// we are checking to see if the user trying to login already exists
User.findOne({ username: username }, function(err, user) {
// if there are any errors, return the error before anything else
if (err) return done(err);
// if no user is found, return the message
if (!user) return done(null, false); // req.flash is the way to set flashdata using connect-flash
// if the user is found but the password is wrong
if (!user.validPassword(password)) return done(null, false); // create the loginMessage and save it to session as flashdata
// all is well, return successful user
return done(null, user);
});
}
)
);
app.post(
"/signup",
passport.authenticate("local-signup", {
successRedirect: "/", // redirect to the secure profile section
failureRedirect: "/signup", // redirect back to the signup page if there is an error
failureFlash: true // allow flash messages
})
);
app.post(
"/login",
passport.authenticate("local-login", {
successRedirect: "/", // redirect to the secure profile section
failureRedirect: "/login#failed", // redirect back to the signup page if there is an error
failureFlash: true // allow flash messages
})
);
app.use("/login", isLoggedInTryingToLogIn, function(req, res) {
var data = {
where_get: "not_authenticated"
};
res.render("layouts/admin/not_authenticated", data);
});
app.use("/signup", isLoggedInTryingToLogIn, function(req, res) {
var data = {
where_get: "not_authenticated"
};
res.render("layouts/admin/not_authenticated", data);
});
app.use("/", api);
app.use("/logout", function(req, res) {
req.logout();
res.redirect("/login");
});
app.use("/assets/admin/authenticated", function(req, res, next) {
if (!req.isAuthenticated()) {
res.sendStatus(403);
return;
}
return next();
});
app.use("/assets", express.static(publicPath + "/assets"));
app.use("/", isLoggedIn, function(req, res) {
var data = {
where_get: "authenticated",
year: new Date().getYear() + 1900
};
res.render("layouts/admin/authenticated", data);
});
function isLoggedInTryingToLogIn(req, res, next) {
if (!req.isAuthenticated()) {
return next();
}
res.redirect("/");
}
function isLoggedIn(req, res, next) {
if (req.isAuthenticated()) return next();
res.redirect("/login");
}
//app.listen(default_port);
module.exports = app;

207
server/apps/client.js Executable file
View File

@@ -0,0 +1,207 @@
VERSION = require(pathThumbnails + "/VERSION.js");
var secure = false;
var path = require("path");
try {
var cert_config = require(path.join(
path.join(__dirname, "../config/"),
"cert_config.js"
));
var fs = require("fs");
var privateKey = fs.readFileSync(cert_config.privateKey).toString();
var certificate = fs.readFileSync(cert_config.certificate).toString();
var ca = fs.readFileSync(cert_config.ca).toString();
var credentials = {
key: privateKey,
cert: certificate,
ca: ca
};
secure = true;
} catch (err) {}
var add = "";
var express = require("express");
var app = express();
var compression = require("compression");
var exphbs = require("express-handlebars");
var cors = require("cors");
var Functions = require(pathThumbnails + "/handlers/functions.js");
var hbs = exphbs.create({
defaultLayout: publicPath + "/layouts/client/main",
layoutsDir: publicPath + "/layouts/client",
partialsDir: publicPath + "/partials",
helpers: {
if_equal: function(a, b, opts) {
if (a == b) {
return opts.fn(this);
} else {
return opts.inverse(this);
}
},
decodeString: function(s) {
if (s == undefined) return s;
return Functions.decodeChannelName(s);
}
}
});
var uniqid = require("uniqid");
app.use(compression({ filter: shouldCompress }));
function shouldCompress(req, res) {
if (req.headers["x-no-compression"]) {
// don't compress responses with this request header
return false;
}
// fallback to standard filter function
return compression.filter(req, res);
}
app.engine("handlebars", hbs.engine);
app.set("view engine", "handlebars");
app.enable("view cache");
app.set("views", publicPath);
app.set("trust proxy", "127.0.0.1");
var bodyParser = require("body-parser");
var cookieParser = require("cookie-parser");
var referrerPolicy = require("referrer-policy");
var helmet = require("helmet");
var featurePolicy = require("feature-policy");
app.use(
featurePolicy({
features: {
fullscreen: ["*"],
//vibrate: ["'none'"],
payment: ["'none'"],
microphone: ["'none'"],
camera: ["'none'"],
speaker: ["*"],
syncXhr: ["'self'"]
//notifications: ["'self'"]
}
})
);
app.use(
helmet({
frameguard: false
})
);
app.use(referrerPolicy({ policy: "origin-when-cross-origin" }));
app.use(bodyParser.json()); // to support JSON-encoded bodies
app.use(
bodyParser.urlencoded({
// to support URL-encoded bodies
extended: true
})
);
app.use(cookieParser());
//app.set('json spaces', 2);
io = require("socket.io")({
pingTimeout: 25000
//path: '/zoff',
//"origins": ("https://zoff.me:443*,https://zoff.me:8080*,zoff.me:8080*,https://remote.zoff.me:443*,https://remote.zoff.me:8080*,https://fb.zoff.me:443*,https://fb.zoff.me:8080*,https://admin.zoff.me:443*,https://admin.zoff.me:8080*, http://localhost:8080*")});
});
var socketIO = require(pathThumbnails + "/handlers/io.js");
socketIO();
app.socketIO = io;
/* Globally needed "libraries" and files */
var router = require(pathThumbnails + "/routing/client/router.js");
var api_file = require(pathThumbnails + "/routing/client/api.js");
var api = api_file.router;
api_file.sIO = app.socketIO;
var ico_router = require(pathThumbnails + "/routing/client/icons_routing.js");
app.get("/robots.txt", function(req, res) {
res.type("text/plain");
res.send("User-agent: *\nAllow: /$\nDisallow: /");
});
app.use(function(req, res, next) {
var cookie = req.cookies._uI;
var skipElements = [
"/_embed",
"/assets/manifest.json",
"/apple-touch-icon.png"
];
if (skipElements.indexOf(req.originalUrl) > -1) {
res.header("Access-Control-Allow-Origin", "*");
res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept"
);
next();
} else {
if (req.originalUrl.split("/").length > 3) {
res.header("Access-Control-Allow-Origin", "*");
res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept"
);
next();
} else {
if (cookie === undefined) {
try {
//console.error((new Date), "originalUrl", req.originalUrl);
//console.error((new Date), "couldn't fetch cookie for some reason, maybe no cookie exists?", req.get('origin'), "couldn't fetch cookie for some reason, maybe no cookie exists?");
} catch (e) {
//console.error((new Date), "couldn't fetch origin");
}
var user_name = Functions.hash_pass(
Functions.rndName(uniqid.time(), 15)
);
res.cookie("_uI", user_name, {
maxAge: 365 * 10000 * 3600000,
httpOnly: true,
secure: secure
//sameSite: true,
});
} else {
//process.stderr.write((new Date), "couldn't fetch cookie for some reason, maybe no cookie exists?", req, "couldn't fetch cookie for some reason, maybe no cookie exists?");
res.cookie("_uI", cookie, {
maxAge: 365 * 10000 * 3600000,
httpOnly: true,
secure: secure
//sameSite: true,
});
}
res.header("Access-Control-Allow-Origin", "*");
res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept"
);
next();
}
}
});
app.use("/service-worker.js", function(req, res) {
res.sendFile(publicPath + "/service-worker.js");
});
app.use("/", ico_router);
app.use("/", api);
app.use("/", cors(), router);
app.use("/assets/js", function(req, res, next) {
res.sendStatus(403);
return;
});
app.use("/assets/admin", function(req, res, next) {
res.sendStatus(403);
return;
});
app.use("/assets", express.static(publicPath + "/assets"));
app.use(function(req, res, next) {
res.status(404);
res.redirect("/404");
});
module.exports = app;

View File

@@ -0,0 +1,74 @@
var path = require('path');
var publicPath = path.join(__dirname, 'public');
var pathThumbnail = __dirname;
pathThumbnails = __dirname + "/../";
var time_regex = /P((([0-9]*\.?[0-9]*)Y)?(([0-9]*\.?[0-9]*)M)?(([0-9]*\.?[0-9]*)W)?(([0-9]*\.?[0-9]*)D)?)?(T(([0-9]*\.?[0-9]*)H)?(([0-9]*\.?[0-9]*)M)?(([0-9]*\.?[0-9]*)S)?)?/;
try {
var keys = require(path.join(__dirname, '../config/api_key.js'));
var key = keys.youtube;
var soundcloudKey = keys.soundcloud;
} catch(e) {
console.log("Error - missing file");
console.log("Seems you forgot to create the file api_key.js in /server/config/. Have a look at api_key.example.js.");
process.exit(1);
}
var Search = require(pathThumbnail + '/../handlers/search.js');
var request = require('request');
var db = require(pathThumbnail + '/../handlers/db.js');
var currentList = 0;
var listNames = [];
db.getCollectionNames(function(e, d) {
for(var i = 0; i < d.length; i++) {
if(d[i].indexOf("_") < 0) {
if(d[i].length > 0) {
if(d[i].substring(0, 1) == "." || d[i].substring(d[i].length - 1) == ".") continue;
}
listNames.push(d[i]);
}
}
console.log("Number of lists is " + listNames.length);
/*for(var i = 0; i < listNames.length; i++) {
getListItems(d[i]);
if(i > 1000) return;
}*/
recursivifyListLooping(listNames, 0);
});
function filterFunction(el) {
return el != null &&
el != "" &&
el != undefined &&
el.trim() != ''
}
function recursivifyListLooping(listNames, i) {
if(i > listNames.length) {
console.log("Done");
return;
}
console.log("List " + i + " of " + listNames.length);
getListItems(listNames, 0, function() {
console.log("done");
});
}
function getListItems(arr, i, callback) {
console.log("List " + i + " of " + listNames.length + " - " + arr[i]);
if(i >= arr.length) {
if(typeof(callback) == "function") callback();
return;
}
try {
db.collection(arr[i]).find(function(e, d) {
if(d.length > 0) {
Search.get_genres_list_recursive(d, arr[i], function(){
getListItems(arr, i + 1, callback);
});
} else {
getListItems(arr, i + 1, callback);
}
});
} catch(e) {
getListItems(arr, i + 1, callback);
}
}

View File

@@ -0,0 +1,3 @@
var key = [""];
module.exports = key;

View File

@@ -0,0 +1,8 @@
var api_key = {
youtube: "xxxx",
soundcloud: "xx" // This can be excluded if you don't have a soundcloud key
};
try {
module.exports = api_key;
} catch (e) {}

View File

@@ -0,0 +1,7 @@
var cert = {
privateKey: 'XX',
certificate: 'XX',
ca: 'XX'
}
module.exports = cert;

View File

@@ -0,0 +1,6 @@
var google = {
"analytics": "xxxx",
"adsense": "xxxx",
}
module.exports = google;

View File

@@ -0,0 +1,24 @@
/**
*
* Have a look at nodemailer's config on how to set this up https://nodemailer.com/about/
*
*/
var mail_config = {
port: 587,
host: 'smtp.example.com',
auth: {
user: 'ex@amp.le',
pass: 'example'
},
secure: true,
authMethod: 'PLAIN',
tls: {
ciphers:'SSLv3'
},
from: 'no-reply@zoff.me',
to: 'contact@zoff.me'
notify_mail: 'notify@mail.example',
};
module.exports = mail_config;

View File

@@ -0,0 +1,10 @@
var mongo_config = {
config: 'mydb',
secret: 'secret',
users: 'users',
host: 'localhost',
port: '27017',
expire: 86400,
};
module.exports = mongo_config;

View File

@@ -0,0 +1,6 @@
var recaptcha = {
site: "xxxx",
key: "xxxxx",
}
module.exports = recaptcha;

View File

@@ -0,0 +1,65 @@
var toShowConfig = {
addsongs: true,
adminpass: 1,
allvideos: 1,
frontpage: 1,
longsongs: 1,
removeplay: 1,
shuffle: 1,
skip: 1,
startTime: 1,
userpass: 1,
vote: 1,
toggleChat: { $ifNull: ["$toggleChat", true] },
strictSkip: { $ifNull: ["$strictSkip", false] },
strictSkipNumber: { $ifNull: ["$strictSkipNumber", 10] },
description: { $ifNull: ["$description", ""] },
thumbnail: { $ifNull: ["$thumbnail", ""] },
rules: { $ifNull: ["$rules", ""] },
_id: 0
};
var project_object = {
_id: 0,
id: 1,
added: 1,
now_playing: 1,
title: 1,
votes: 1,
start: 1,
duration: 1,
end: 1,
type: 1,
added_by: { $ifNull: ["$added_by", "Anonymous"] },
source: { $ifNull: ["$source", "youtube"] },
thumbnail: {
$ifNull: [
"$thumbnail",
{
$concat: ["https://img.youtube.com/vi/", "$id", "/mqdefault.jpg"]
}
]
},
tags: { $ifNull: ["$tags", []] }
};
var toShowChannel = {
start: 1,
end: 1,
added: 1,
id: 1,
title: 1,
votes: 1,
duration: 1,
type: 1,
_id: 0,
tags: 1,
now_playing: 1,
type: 1,
source: 1,
thumbnail: 1
};
module.exports.project_object = project_object;
module.exports.toShowConfig = toShowConfig;
module.exports.toShowChannel = toShowChannel;

929
server/handlers/chat.js Normal file
View File

@@ -0,0 +1,929 @@
var Functions = require(pathThumbnails + "/handlers/functions.js");
var crypto = require("crypto");
var Filter = require("bad-words");
var filter = new Filter({ placeHolder: "x" });
/*var filter = {
clean: function(str) {
return str;
}
}*/
var db = require(pathThumbnails + "/handlers/db.js");
function get_history(channel, all, socket) {
var query = {};
if (all) {
query = {
all: true
};
} else {
query = {
all: false,
channel: channel
};
}
//channel = channel.replace(/ /g,'');
var pass = "";
if (!query.all) {
Functions.getSessionAdminUser(
Functions.getSession(socket),
channel,
function(userpass) {
if (userpass != "" || pass == undefined) {
pass = userpass;
} else {
pass = crypto
.createHash("sha256")
.update(Functions.decrypt_string(pass))
.digest("base64");
}
db.collection(channel + "_settings").find({ id: "config" }, function(
err,
conf
) {
if (conf.length > 0) {
if (conf[0].userpass == "" || conf[0].userpass == pass) {
getAndSendLogs(channel, all, socket, pass, query);
}
}
});
}
);
} else {
getAndSendLogs(channel, all, socket, pass, query);
}
}
function getAndSendLogs(channel, all, socket, pass, query) {
//channel = channel.replace(/ /g,'');
db.collection("chat_logs")
.find(query, {
from: 1,
createdAt: 1,
all: 1,
channel: 1,
msg: 1,
icon: 1,
_id: 0
})
.sort({ createdAt: 1 })
.limit(20, function(err, docs) {
socket.emit("chat_history", { all: all, data: docs });
});
}
function getUserNameByGuid(guid, callback) {
db.collection("user_names").find({ guid: guid }, function(err, usernames) {
if (usernames.length == 1) {
callback(usernames[0].name);
return;
}
callback("Anonymous");
});
}
function chat(msg, guid, offline, socket) {
if (
typeof msg !== "object" ||
!msg.hasOwnProperty("data") ||
!msg.hasOwnProperty("channel") ||
typeof msg.data != "string" ||
typeof msg.channel != "string"
) {
var result = {
data: {
expected: "string",
got: msg.hasOwnProperty("data") ? typeof msg.data : undefined
},
channel: {
expected: "string",
got: msg.hasOwnProperty("channel") ? typeof msg.channel : undefined
},
pass: {
expected: "string",
got: msg.hasOwnProperty("pass") ? typeof msg.pass : undefined
}
};
socket.emit("update_required", result);
return;
}
var coll = msg.channel.toLowerCase(); //.replace(/ /g,'');
coll = Functions.removeEmojis(coll).toLowerCase();
//coll = filter.clean(coll);
checkIfUserIsBanned(coll, socket, guid, function() {
Functions.getSessionAdminUser(Functions.getSession(socket), coll, function(
userpass,
adminpass
) {
if (userpass != "" || msg.pass == undefined) {
msg.pass = userpass;
} else {
msg.pass = crypto
.createHash("sha256")
.update(Functions.decrypt_string(msg.pass))
.digest("base64");
}
db.collection(coll + "_settings").find(function(err, conf) {
if (
conf.length > 0 &&
(conf[0].hasOwnProperty("toggleChat") && !conf[0].toggleChat)
) {
socket.emit("chat", {
from: "System",
msg: ": Chat for this channel has been disabled.",
icon: "https://zoff.me/assets/images/favicon-32x32.png"
});
return;
} else if (
conf.length > 0 &&
(conf[0].userpass == undefined ||
conf[0].userpass == "" ||
(msg.hasOwnProperty("pass") && conf[0].userpass == msg.pass))
) {
var data = msg.data;
Functions.check_inlist(
coll,
guid,
socket,
offline,
function() {
if (data == "/who") {
db.collection("user_names").distinct(
"name",
{ channels: coll },
function(err, docs) {
var userAdd = "s";
if (docs.length == 1) userAdd = "";
socket.emit("chat", {
from: "System",
msg:
": User" +
userAdd +
" in channel are: " +
docs.join(", "),
icon: "https://zoff.me/assets/images/favicon-32x32.png"
});
}
);
} else if (
data !== "" &&
data !== undefined &&
data !== null &&
data.length < 151 &&
data.replace(/\s/g, "").length
) {
db.collection("user_names").find({ guid: guid }, function(
err,
docs
) {
if (docs.length == 1) {
var splitData = data.split(" ");
if (
(data.startsWith("/ban") && splitData.length >= 3) ||
(data.startsWith("/unban") && splitData.length >= 2)
) {
if (splitData[1].length > 0) {
var passToCompare = Functions.hash_pass(adminpass);
if (passToCompare == conf[0].adminpass) {
db.collection("user_names").find(
{ name: splitData[1] },
function(err, name) {
if (name.length == 1) {
if (
data.startsWith("/ban") &&
splitData.length >= 3
) {
var reason = splitData
.slice(2, splitData.length)
.join(" ");
var connection_id = name[0].connection_id;
var yourSelf = Functions.hash_pass(
socket.handshake.headers["user-agent"] +
socket.handshake.address +
socket.handshake.headers[
"accept-language"
]
);
if (connection_id != yourSelf) {
db.collection(coll + "_banned_chat").update(
{
connection_id: connection_id
},
{
connection_id: connection_id,
by: docs[0].name,
reason: reason
},
{
upsert: true
},
function(err, results) {
io.to(coll).emit("chat", {
from: "System",
msg:
": " +
docs[0].name +
" has banned " +
splitData[1] +
" for: " +
reason,
icon:
"https://zoff.me/assets/images/favicon-32x32.png"
});
return;
}
);
} else {
socket.emit("chat", {
from: "System",
msg:
": I'm sorry but you can't ban yourself..",
icon:
"https://zoff.me/assets/images/favicon-32x32.png"
});
return;
}
} else if (data.startsWith("/unban")) {
db.collection(coll + "_banned_chat").remove(
{ connection_id: name[0].connection_id },
function(err, results) {
if (
results.hasOwnProperty("n") &&
results.n == 1 &&
results.hasOwnProperty(
"deletedCount"
) &&
results.deletedCount == 1
) {
io.to(coll).emit("chat", {
from: "System",
msg:
": " +
docs[0].name +
" has unbanned " +
splitData[1],
icon:
"https://zoff.me/assets/images/favicon-32x32.png"
});
return;
} else {
socket.emit("chat", {
from: "System",
msg:
": Cannot find anyone with that username in this chat.",
icon:
"https://zoff.me/assets/images/favicon-32x32.png"
});
return;
}
}
);
} else if (
data.startsWith("/ban") &&
splitData.length < 3
) {
socket.emit("chat", {
from: "System",
msg:
": You are doing that command wrong. its /ban USERNAME",
icon:
"https://zoff.me/assets/images/favicon-32x32.png"
});
return;
}
} else {
socket.emit("chat", {
from: "System",
msg: ": No user by that name.",
icon:
"https://zoff.me/assets/images/favicon-32x32.png"
});
return;
}
}
);
} else {
socket.emit("chat", {
from: "System",
msg:
": You are not logged in as an admin to the channel, don't try any funnybusiness.",
icon:
"https://zoff.me/assets/images/favicon-32x32.png"
});
return;
}
} else {
socket.emit("chat", {
from: "System",
msg:
": You are doing that command wrong. its /ban USERNAME REASON or /unban USERNAME",
icon:
"https://zoff.me/assets/images/favicon-32x32.png"
});
return;
}
} else {
db.collection("registered_users").find(
{ _id: docs[0].name },
function(err, n) {
var icon = false;
if (n.length > 0 && n[0].icon) {
icon = n[0].icon;
}
db.collection("chat_logs").insert({
createdAt: new Date(),
all: false,
channel: coll,
from: docs[0].name,
msg: ": " + data,
icon: icon
});
io.to(coll).emit("chat", {
from: docs[0].name,
msg: ": " + data,
icon: icon
});
}
);
}
} else if (docs.length == 0) {
get_name(guid, {
announce: false,
channel: coll,
message: data,
all: false,
socket: socket
});
}
});
}
},
"place 1"
);
} else {
socket.emit("auth_required");
}
});
});
});
}
function all_chat(msg, guid, offline, socket) {
if (
typeof msg !== "object" ||
!msg.hasOwnProperty("channel") ||
!msg.hasOwnProperty("data") ||
typeof msg.data != "string" ||
typeof msg.channel != "string"
) {
var result = {
data: {
expected: "string",
got: msg.hasOwnProperty("data") ? typeof msg.data : undefined
},
channel: {
expected: "string",
got: msg.hasOwnProperty("channel") ? typeof msg.channel : undefined
}
};
socket.emit("update_required", result);
return;
}
var coll = msg.channel.toLowerCase(); //.replace(/ /g,'');
var data = msg.data;
coll = Functions.removeEmojis(coll).toLowerCase();
//coll = filter.clean(coll);
Functions.check_inlist(
coll,
guid,
socket,
offline,
function() {
if (
data !== "" &&
data !== undefined &&
data !== null &&
data.length < 151 &&
data.replace(/\s/g, "").length
) {
db.collection("user_names").find({ guid: guid }, function(err, docs) {
if (docs.length == 1) {
db.collection("registered_users").find(
{ _id: docs[0].name },
function(err, n) {
var icon = false;
if (n.length > 0 && n[0].icon) {
icon = n[0].icon;
}
db.collection("chat_logs").insert(
{
createdAt: new Date(),
all: true,
channel: coll,
from: docs[0].name,
msg: ": " + data,
icon: icon
},
function(err, docs) {}
);
io.sockets.emit("chat.all", {
from: docs[0].name,
msg: ": " + data,
channel: coll,
icon: icon
});
}
);
} else if (docs.length == 0) {
get_name(guid, {
announce: false,
channel: coll,
message: data,
all: true,
socket: socket
});
}
});
}
},
"place 2"
);
}
function checkIfChatEnabled(channel, socket, callback) {
if (channel == "" || channel == undefined) callback();
else {
db.collection(channel + "_settings").find(function(err, docs) {
if (
docs.length > 0 &&
(docs[0].hasOwnProperty("toggleChat") && !docs[0].toggleChat)
) {
socket.emit("chat", {
from: "System",
msg: ": Chat for this channel has been disabled.",
icon: "https://zoff.me/assets/images/favicon-32x32.png"
});
callback(false);
} else {
callback(true);
}
});
}
}
function checkIfUserIsBanned(channel, socket, guid, callback, callback_error) {
var connection_id = Functions.hash_pass(
socket.handshake.headers["user-agent"] +
socket.handshake.address +
socket.handshake.headers["accept-language"]
);
db.collection(channel + "_banned_chat").find(
{ $or: [{ connection_id: connection_id }, { connection_id: guid }] },
function(err, docs) {
if (docs.length == 0) callback();
else {
db.collection("user_names").findAndModify(
{
query: { guid, guid },
update: { $addToSet: { channels: channel } }
},
function(e, d) {
socket.emit("chat", {
from: "System",
msg:
": You can't chat in this channel, you are banned. The reason is: " +
docs[0].reason,
icon: "https://zoff.me/assets/images/favicon-32x32.png"
});
if (typeof callback_error == "function") callback_error();
else return;
}
);
}
}
);
}
function namechange(data, guid, socket, tried, callback) {
checkIfChatEnabled(data.channel, socket, function(enabled) {
if (!enabled) {
callback(false);
return;
}
checkIfUserIsBanned(
data.channel,
socket,
guid,
function() {
var pw = "";
var new_password;
var first = false;
Functions.getSessionChatPass(Functions.getSession(socket), function(
name,
pass
) {
var fetched = false;
if (data.hasOwnProperty("first") && data.first) {
pw = pass;
name = name;
data.name = name;
data.password = pass;
new_password = false;
if (name == "" || pass == "") {
if (typeof callback == "function") callback(true);
return;
}
fetched = true;
password = pw;
} else {
var name = data.name;
if (data.hasOwnProperty("first")) {
first = data.first;
}
if (data.hasOwnProperty("password")) {
pw = data.password;
new_password = false;
} else if (
data.hasOwnProperty("new_password") &&
data.hasOwnProperty("old_password")
) {
pw = data.old_password;
new_password = Functions.decrypt_string(data.new_password);
}
password = Functions.decrypt_string(pw);
password = Functions.hash_pass(password);
doubled = true;
}
if (name == "") {
if (typeof callback == "function") callback(true);
return;
}
db.collection("registered_users").find(
{ _id: name.toLowerCase() },
function(err, docs) {
var accepted_password = false;
var icon = false;
if (docs.length == 0) {
if (new_password) {
if (typeof callback == "function") callback(true);
return;
}
accepted_password = true;
Functions.setSessionChatPass(
Functions.getSession(socket),
name.toLowerCase(),
data.password,
function() {
db.collection("registered_users").update(
{ _id: name.toLowerCase() },
{ $set: { password: password } },
{ upsert: true },
function() {}
);
}
);
} else if (docs[0].password == password) {
if (docs[0].icon) {
icon = docs[0].icon;
}
accepted_password = true;
if (new_password) {
Functions.setSessionChatPass(
Functions.getSession(socket),
name.toLowerCase(),
data.new_password,
function() {
db.collection("registered_users").update(
{ _id: name.toLowerCase(), password: password },
{
$set: { password: Functions.hash_pass(new_password) }
},
function() {}
);
}
);
} else {
Functions.setSessionChatPass(
Functions.getSession(socket),
name.toLowerCase(),
fetched
? data.password
: Functions.hash_pass(
Functions.decrypt_string(data.password)
),
function() {}
);
}
}
if (accepted_password) {
db.collection("user_names").find({ guid: guid }, function(
err,
names
) {
if (
names.length > 0 ||
(docs.length != 0 && docs[0].password == password)
) {
var no_name = false;
if (names.length == 0) no_name = true;
if (!no_name) {
var old_name = names[0].name;
db.collection("user_names").update(
{ _id: "all_names" },
{ $pull: { names: old_name } },
function() {}
);
}
var connection_id = Functions.hash_pass(
socket.handshake.headers["user-agent"] +
socket.handshake.address +
socket.handshake.headers["accept-language"]
);
var updateElement = {
$set: {
name: name,
icon: icon,
connection_id: connection_id
}
};
if (data.hasOwnProperty("channel") && data.channel != "") {
updateElement["$addToSet"] = { channels: data.channel };
}
db.collection("user_names").update(
{ guid: guid },
updateElement,
{ upsert: true },
function(err, docs) {
db.collection("user_names").update(
{ _id: "all_names" },
{ $addToSet: { names: name } },
function(err, docs) {
//socket.emit('name', {type: "name", accepted: true});
if (old_name != name && !first && !no_name) {
if (
data.hasOwnProperty("channel") &&
typeof data.channel == "string"
) {
io.to(data.channel).emit("chat", {
from: old_name,
msg: " changed name to " + name
});
io.sockets.emit("chat.all", {
from: old_name,
msg: " changed name to " + name,
channel: data.channel
});
}
}
if (
callback != undefined &&
typeof callback == "function"
)
callback(true);
}
);
}
);
} else {
if (tried < 3 || tried == undefined) {
if (tried == undefined) {
tried = 1;
}
namechange(data, guid, socket, tried + 1);
}
}
});
} else {
Functions.removeSessionChatPass(
Functions.getSession(socket),
function() {
socket.emit("name", { type: "name", accepted: false });
}
);
}
}
);
});
},
callback
);
});
}
function removename(guid, coll, socket) {
//coll = coll.replace(/ /g,'');
checkIfChatEnabled(coll, socket, function(enabled) {
if (!enabled) return;
db.collection("user_names").find({ guid: guid }, function(err, docs) {
if (docs.length == 1) {
var old_name = docs[0].name;
Functions.removeSessionChatPass(
Functions.getSession(socket),
function() {
db.collection("user_names").update(
{ _id: "all_names" },
{ $pull: { names: old_name } },
function(err, updated) {
db.collection("user_names").remove({ guid: guid }, function(
err,
removed
) {
get_name(guid, {
announce: true,
old_name: old_name,
channel: coll,
socket: socket
});
});
}
);
}
);
}
});
});
}
function generate_name(guid, announce_payload, second, round, channel) {
if (round == undefined) round = 0;
var tmp_name = Functions.rndName(
second ? second : guid,
Math.floor(8 + round)
);
db.collection("registered_users").find({ _id: tmp_name }, function(
err,
docs
) {
if (docs.length == 0) {
db.collection("user_names").update(
{ _id: "all_names" },
{ $addToSet: { names: tmp_name } },
{ upsert: true },
function(err, updated) {
if (
updated.nModified == 1 ||
(updated.hasOwnProperty("upserted") &&
updated.hasOwnProperty("n") &&
updated.n == 1)
) {
var connection_id = Functions.hash_pass(
announce_payload.socket.handshake.headers["user-agent"] +
announce_payload.socket.handshake.address +
announce_payload.socket.handshake.headers["accept-language"]
);
var updateElement = {
$set: {
name: tmp_name,
icon: false,
connection_id: connection_id
}
};
if (channel != undefined && channel != "") {
updateElement["$addToSet"] = { channels: channel };
}
if (
announce_payload.hasOwnProperty("channel") &&
announce_payload.channel != ""
) {
updateElement["$addToSet"] = {
channels: announce_payload.channel
};
}
db.collection("user_names").update(
{ guid: guid },
updateElement,
{ upsert: true },
function(err, update) {
name = tmp_name;
if (announce_payload.announce) {
io.to(announce_payload.channel).emit("chat", {
from: announce_payload.old_name,
msg: " changed name to " + name
});
io.sockets.emit("chat.all", {
from: announce_payload.old_name,
msg: " changed name to " + name,
channel: announce_payload.channel
});
} else if (announce_payload.message && !announce_payload.all) {
io.to(announce_payload.channel).emit("chat", {
from: name,
msg: ": " + announce_payload.message
});
} else if (announce_payload.message && announce_payload.all) {
io.sockets.emit("chat.all", {
from: name,
msg: ": " + announce_payload.message,
channel: announce_payload.channel
});
}
}
);
} else {
generate_name(
guid,
announce_payload,
tmp_name,
round + 0.25,
channel
);
}
}
);
} else {
generate_name(guid, announce_payload, tmp_name, round + 0.25, channel);
}
});
}
function get_name(guid, announce_payload, first) {
if (!announce_payload.announce && announce_payload.hasOwnProperty("socket")) {
Functions.getSessionChatPass(
Functions.getSession(announce_payload.socket),
function(name, pass) {
if (name == "" || pass == "") {
get_name_generate(
guid,
announce_payload,
first,
announce_payload.channel
);
return;
}
db.collection("registered_users").find(
{ _id: name.toLowerCase() },
function(err, docs) {
if (
docs[0].password ==
Functions.hash_pass(Functions.decrypt_string(pass))
) {
var icon = false;
if (docs[0].icon) {
icon = docs[0].icon;
}
Functions.setSessionChatPass(
Functions.getSession(announce_payload.socket),
name.toLowerCase(),
pass,
function() {}
);
var connection_id = Functions.hash_pass(
announce_payload.socket.handshake.headers["user-agent"] +
announce_payload.socket.handshake.address +
announce_payload.socket.handshake.headers["accept-language"]
);
var updateElement = {
$set: { name: name, icon: icon, connection_id: connection_id }
};
if (
announce_payload.hasOwnProperty("channel") &&
announce_payload.channel != ""
)
updateElement["$addToSet"] = {
channel: announce_payload.channel
};
db.collection("user_names").update(
{ guid: guid },
updateElement,
{ upsert: true },
function(err, docs) {
db.collection("user_names").update(
{ _id: "all_names" },
{ $addToSet: { names: name } },
function(err, docs) {
name = name;
}
);
}
);
}
}
);
}
);
} else {
get_name_generate(guid, announce_payload, first, announce_payload.channel);
}
}
function get_name_generate(guid, announce_payload, first, channel) {
db.collection("user_names").find({ guid: guid }, function(err, docs) {
if (docs.length == 0) {
generate_name(guid, announce_payload, undefined);
} else {
name = docs[0].name;
}
});
}
module.exports.getUserNameByGuid = getUserNameByGuid;
module.exports.get_history = get_history;
module.exports.chat = chat;
module.exports.all_chat = all_chat;
module.exports.namechange = namechange;
module.exports.removename = removename;
module.exports.generate_name = generate_name;
module.exports.get_name = get_name;

84
server/handlers/db.js Normal file
View File

@@ -0,0 +1,84 @@
var path = require("path");
try {
var mongo_config = require(path.join(
path.join(__dirname, "../config/"),
"mongo_config.js"
));
} catch (e) {
console.log(
"(!) Missing file - /config/mongo_config.js. Have a look at /config/mongo_config.example.js. The server won't run without this existing."
);
process.exit(1);
}
var mongojs = require("mongojs");
var db = mongojs("mongodb://" + mongo_config.host + "/" + mongo_config.config);
var connected_db = mongojs(
"mongodb://" + mongo_config.host + "/user_credentials"
);
var ObjectId = mongojs.ObjectId;
db.collection("chat_logs").createIndex(
{ createdAt: 1 },
{ expireAfterSeconds: 600 },
function() {}
);
db.collection("timeout_api").createIndex(
{ createdAt: 1 },
{ expireAfterSeconds: 120 },
function() {}
);
db.collection("api_links").createIndex(
{ createdAt: 1 },
{ expireAfterSeconds: 86400 },
function() {}
);
db.on("connected", function(err) {
console.log("connected");
});
db.on("error", function(err) {
console.log("\n" + new Date().toString() + "\n Database error: ", err);
});
db.on("error", function(err) {
console.log("\n" + new Date().toString() + "\n Database error: ", err);
});
/* Resetting usernames, and connected users */
db.collection("unique_ids").update(
{ _id: "unique_ids" },
{ $set: { unique_ids: [] } },
{ multi: true, upsert: true },
function(err, docs) {}
);
db.collection("user_names").remove(
{ guid: { $exists: true } },
{ multi: true, upsert: true },
function(err, docs) {}
);
db.collection("user_names").update(
{ _id: "all_names" },
{ $set: { names: [] } },
{ multi: true, upsert: true },
function(err, docs) {}
);
db.collection("connected_users").update(
{ users: { $exists: true } },
{ $set: { users: [] } },
{ multi: true, upsert: true },
function(err, docs) {}
);
db.collection("connected_users").update(
{ _id: "total_users" },
{ $set: { total_users: [] } },
{ multi: true, upsert: true },
function(err, docs) {}
);
db.collection("frontpage_lists").update(
{ viewers: { $ne: 0 } },
{ $set: { viewers: 0 } },
{ multi: true, upsert: true },
function(err, docs) {}
);
module.exports = db;

View File

@@ -0,0 +1,145 @@
var Functions = require(pathThumbnails + "/handlers/functions.js");
var db = require(pathThumbnails + "/handlers/db.js");
function frontpage_lists(msg, socket) {
if (
msg == undefined ||
!msg.hasOwnProperty("version") ||
msg.version != VERSION ||
msg.version == undefined
) {
var result = {
version: {
expected: VERSION,
got: msg.hasOwnProperty("version") ? msg.version : undefined
}
};
socket.emit("update_required", result);
return;
}
db.collection("frontpage_lists").find({ frontpage: true }, function(
err,
docs
) {
db.collection("connected_users").find({ _id: "total_users" }, function(
err,
tot
) {
socket
.compress(true)
.emit("playlists", {
channels: docs,
viewers: tot[0].total_users.length
});
});
});
}
function get_frontpage_lists(callback) {
var project_object = {
_id: 1,
count: 1,
frontpage: 1,
id: 1,
title: 1,
viewers: 1,
accessed: 1,
pinned: { $ifNull: ["$pinned", 0] },
description: {
$ifNull: [
{
$cond: {
if: {
$or: [
{ $eq: ["$description", ""] },
{ $eq: ["$description", null] },
{ $eq: ["$description", undefined] }
]
},
then: "This list has no description",
else: "$description"
}
},
"This list has no description"
]
},
thumbnail: {
$ifNull: [
{
$cond: {
if: {
$or: [
{ $eq: ["$thumbnail", ""] },
{ $eq: ["$thumbnail", null] },
{ $eq: ["$thumbnail", undefined] }
]
},
then: {
$concat: ["https://img.youtube.com/vi/", "$id", "/mqdefault.jpg"]
},
else: "$thumbnail"
}
},
{ $concat: ["https://img.youtube.com/vi/", "$id", "/mqdefault.jpg"] }
]
}
};
db.collection("frontpage_lists").aggregate(
[
{
$match: {
frontpage: true,
count: { $gt: 3 }
}
},
{
$project: project_object
},
{
$sort: {
pinned: -1,
viewers: -1,
accessed: -1,
count: -1,
title: 1
}
}
],
callback
);
}
function update_frontpage(coll, id, title, thumbnail, source, callback) {
//coll = coll.replace(/ /g,'');
db.collection("frontpage_lists").find({ _id: coll }, function(e, doc) {
var updateObject = {
id: id,
title: title,
accessed: Functions.get_time()
};
if (
doc.length > 0 &&
((doc[0].thumbnail != "" &&
doc[0].thumbnail != undefined &&
(doc[0].thumbnail.indexOf("https://i1.sndcdn.com") > -1 ||
doc[0].thumbnail.indexOf("https://w1.sndcdn.com") > -1 ||
doc[0].thumbnail.indexOf("https://img.youtube.com") > -1)) ||
(doc[0].thumbnail == "" || doc[0].thumbnail == undefined))
) {
updateObject.thumbnail = thumbnail;
if (thumbnail == undefined) updateObject.thumbnail = "";
}
db.collection("frontpage_lists").update(
{ _id: coll },
{ $set: updateObject },
{ upsert: true },
function(err, returnDocs) {
if (typeof callback == "function") callback();
}
);
});
}
module.exports.get_frontpage_lists = get_frontpage_lists;
module.exports.frontpage_lists = frontpage_lists;
module.exports.update_frontpage = update_frontpage;

View File

@@ -0,0 +1,710 @@
var path = require("path");
try {
var mongo_config = require(path.join(
path.join(__dirname, "../config/"),
"mongo_config.js"
));
} catch (e) {
console.log(
"(!) Missing file - /config/mongo_config.js. Have a look at /config/mongo_config.example.js. The server won't run without this existing."
);
process.exit(1);
}
var mongojs = require("mongojs");
var connected_db = mongojs(
"mongodb://" + mongo_config.host + "/user_credentials"
);
var crypto = require("crypto");
var db = require(pathThumbnails + "/handlers/db.js");
var uniqid = require("uniqid");
var Filter = require("bad-words");
var filter = new Filter({ placeHolder: "x" });
var Chat = require(pathThumbnails + "/handlers/chat.js");
function encodeChannelName(str) {
var _fn = encodeURIComponent;
str = filter.clean(str);
var toReturn = _fn(str);
toReturn = toReturn.replace(/_/g, "%5F");
toReturn = toReturn.replace(/'/g, "%27");
toReturn = toReturn.replace(/%26amp%3B/g, "%26").replace(/%26amp%3b/g, "%26");
toReturn = toReturn.toLowerCase();
return toReturn;
}
function decodeChannelName(str) {
var _fn = decodeURIComponent;
str = str.toUpperCase();
var toReturn = _fn(str.replace(/%5F/g, "_").replace(/%27/g, "'"));
toReturn = filter.clean(toReturn);
return toReturn.toLowerCase();
}
function remove_unique_id(short_id) {
db.collection("unique_ids").update(
{ _id: "unique_ids" },
{ $pull: { unique_ids: short_id } },
function(err, docs) {}
);
}
function remove_name_from_db(guid, channel) {
// Use temporary, with caution. Can bottleneck in large quantity of users.
//
// Find a way of indexing users in lists in a clever way, to avoid the search here
db.collection("connected_users").find({ _id: "total_users" }, function(
err,
all_users
) {
var hasOne = all_users[0].total_users.some(function(v) {
return v.indexOf(guid) >= 0;
});
if (!hasOne) {
db.collection("user_names").find({ guid: guid }, function(err, user) {
if (user.length == 1) {
db.collection("user_names").update(
{ _id: "all_names" },
{ $pull: { names: user[0].name } },
function(err, updated) {
db.collection("user_names").remove({ guid: guid }, function(
err,
removed
) {});
}
);
}
});
} else {
if (channel == undefined || channel == "") return;
db.collection("user_names").update(
{ guid: guid },
{ $pull: { channels: channel } },
function(err, docs) {
//console.log("Pulled user from current channel");
}
);
}
});
}
function isUrl(str) {
var pattern = new RegExp(
"\\b(((ht|f)tp(s?)\\:\\/\\/|~\\/|\\/)|www.)" +
"(\\w+:\\w+@)?(([-\\w]+\\.)+(com|org|net|gov" +
"|mil|biz|info|mobi|name|aero|jobs|museum" +
"|travel|[a-z]{2}))(:[\\d]{1,5})?" +
"(((\\/([-\\w~!$+|.,=]|%[a-f\\d]{2})+)+|\\/)+|\\?|#)?" +
"((\\?([-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" +
"([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)" +
"(&(?:[-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" +
"([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)*)*" +
"(#([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)?\\b"
);
if (!pattern.test(str)) {
return false;
} else {
return true;
}
}
function getSession(socket) {
try {
/*var cookieParser = require("cookie-parser");
var cookie = require("cookie");
var parsedCookies = cookie.parse(socket.handshake.headers.cookie);
return parsedCookies["_uI"];*/
if (socket.cookie_id == undefined) throw "Undefined error";
return socket.cookie_id;
} catch (e) {
// Returning "sessiong"-based on place of connection
return hash_pass(
socket.handshake.headers["user-agent"] +
socket.handshake.address +
socket.handshake.headers["accept-language"]
);
//return "empty";
}
}
function remove_from_array(array, element) {
if (contains(array, element)) {
var index = array.indexOf(element);
if (index != -1) array.splice(index, 1);
}
}
function generate_channel_name(res) {
var trying_id = uniqid.time().toLowerCase();
db.collection("frontpage_lists").find(
{ frontpage: { $exists: true }, _id: trying_id },
{ _id: 1 },
function(err, docs) {
if (docs.length == 0) {
res.send(trying_id);
return;
}
generate_channel_name(res);
}
);
}
function get_short_id(socket) {
var new_short_id = uniqid.time().toLowerCase();
socket.join(new_short_id);
socket.emit("id", new_short_id);
}
function check_inlist(coll, guid, socket, offline, callback, double_check) {
if (coll == undefined) {
if (typeof callback == "function") callback();
return;
}
//coll = coll.replace(/ /g,'');
if (!offline && coll != undefined) {
db.collection("connected_users").update(
{ _id: coll },
{ $addToSet: { users: guid } },
{ upsert: true },
function(err, updated) {
if (updated.nModified > 0 || updated.upserted != undefined) {
db.collection("connected_users").find({ _id: coll }, function(
err,
new_doc
) {
db.collection("frontpage_lists").update(
{ _id: coll },
{ $set: { viewers: new_doc[0].users.length } },
function() {
if (
new_doc[0].users == undefined ||
new_doc[0].users.length == undefined
) {
io.to(coll).emit("viewers", 1);
} else {
io.to(coll).emit("viewers", new_doc[0].users.length);
}
Chat.namechange(
{ initial: true, first: true, channel: coll },
guid,
socket,
false,
function(enabled) {
db.collection("user_names").find({ guid: guid }, function(
err,
docs
) {
if (docs.length == 1) {
var icon = "";
if (docs[0].icon != undefined) icon = docs[0].icon;
db.collection("user_names").update(
{ guid: guid },
{ $addToSet: { channels: coll } },
function(err, doc) {}
);
if (enabled) {
socket.broadcast.to(coll).emit("chat", {
from: docs[0].name,
icon: icon,
msg: " joined"
});
}
} else if (docs.length == 0) {
//console.log("User doesn't have a name for some reason.");
//console.log("guid", guid);
//console.log("channel", coll);
//console.log("Trying to get a chat-name");
Chat.get_name(guid, {
announce: false,
socket: socket,
channel: coll
});
}
});
db.collection("connected_users").update(
{ _id: "total_users" },
{ $addToSet: { total_users: guid + coll } },
function(err, docs) {
if (
callback != undefined &&
typeof callback == "function"
)
callback();
}
);
}
);
}
);
});
} else {
db.collection("connected_users").find({ _id: coll }, function(
err,
new_doc
) {
io.to(coll).emit("viewers", new_doc[0].users.length);
});
if (callback != undefined && typeof callback == "function")
callback();
}
}
);
} else {
if (offline) {
db.collection("connected_users").update(
{ _id: "offline_users" },
{ $addToSet: { users: guid } },
function(err, docs) {}
);
} else {
db.collection("connected_users").update(
{ _id: coll },
{ $addToSet: { users: guid } },
function(err, docs) {}
);
}
//
if (coll != undefined && coll != "") {
db.collection("connected_users").update(
{ _id: "total_users" },
{ $addToSet: { total_users: guid + coll } },
function(err, docs) {}
);
}
if (callback != undefined && typeof callback == "function") callback();
}
}
function rndName(seed, len) {
var vowels = ["a", "e", "i", "o", "u"];
consts = [
"b",
"c",
"d",
"f",
"g",
"h",
"j",
"k",
"l",
"m",
"n",
"p",
"r",
"s",
"t",
"v",
"w",
"x",
"y"
];
len = Math.floor(len);
word = "";
is_vowel = false;
var arr;
try {
for (var i = 0; i < len; i++) {
if (is_vowel) arr = vowels;
else arr = consts;
is_vowel = !is_vowel;
word += arr[(seed[i % seed.length].charCodeAt() + i) % (arr.length - 1)];
}
} catch (e) {
return rndName(uniqid.time().toLowerCase(), len);
}
return word;
}
function removeEmojis(string) {
//https://stackoverflow.com/a/41164278/4266467
var regex = /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g;
return string.replace(regex, "");
}
function decrypt_string(pw) {
try {
return Buffer.from(pw, "base64").toString("ascii");
} catch (e) {
return "";
}
}
function get_time() {
var d = new Date();
var time = Math.floor(d.getTime() / 1000);
return time;
}
function contains(a, obj) {
try {
var i = a.length;
while (i--) {
if (a[i] === obj) {
return true;
}
}
return false;
} catch (e) {
return false;
}
}
function hash_pass(adminpass, hex) {
if (adminpass == undefined || adminpass == "") return "";
if (hex)
return crypto
.createHash("sha256")
.update(adminpass)
.digest("hex");
return crypto
.createHash("sha256")
.update(adminpass)
.digest("base64");
}
function setSessionAdminPass(id, adminpass, list, callback) {
try {
if (id == "empty" || id == undefined) {
callback();
return;
}
connected_db
.collection(id)
.update(
{ _id: list },
{ $set: { adminpass: hash_pass(decrypt_string(adminpass), true) } },
{ upsert: true },
function(e, d) {
callback();
return;
}
);
} catch (e) {}
}
function setSessionChatPass(id, name, pass, callback) {
try {
if (id == "empty" || id == undefined) {
callback();
return;
}
connected_db
.collection(id)
.update(
{ _id: "_chat_" },
{ $set: { password: pass, name: name } },
{ upsert: true },
function(e) {
callback();
return;
}
);
} catch (e) {
callback();
return;
}
}
function getSessionChatPass(id, callback) {
try {
if (id == "empty" || id == undefined) {
callback("", "", false);
return;
}
connected_db.collection(id).find({ _id: "_chat_" }, function(e, d) {
if (d.length > 0) {
var name = "";
var pass = "";
if (d[0].name != undefined) name = d[0].name;
if (d[0].password != undefined) pass = d[0].password;
callback(name, pass);
return;
} else {
callback("", "", false);
return;
}
});
} catch (e) {
callback();
return;
}
}
function setChromecastHost(id, other_id, list, callback) {
try {
if (
id == "empty" ||
id == undefined ||
other_id == "empty" ||
other_id == undefined
) {
callback();
return;
}
connected_db
.collection(id)
.update(
{ _id: list },
{ chromecast: true, id: other_id },
{ upsert: true },
function(e, docs) {
callback(true);
return;
}
);
} catch (e) {
callback(false);
}
}
function setSessionUserPass(id, userpass, list, callback) {
try {
if (id == "empty" || id == undefined || userpass == undefined) {
callback();
return;
}
connected_db
.collection(id)
.update(
{ _id: list },
{ $set: { userpass: userpass } },
{ upsert: true },
function(e, d) {
callback();
return;
}
);
} catch (e) {
callback();
}
}
function getSessionAdminUser(id, list, callback) {
try {
if (id == "empty" || id == undefined) {
callback("", "", false);
return;
}
connected_db.collection(id).find({ _id: list }, function(e, d) {
var userpass = "";
var adminpass = "";
if (d.length > 0) {
if (d[0].hasOwnProperty("chromecast") && d[0].chromecast) {
getSessionAdminUser(d[0].id, list, callback);
} else {
if (d[0].userpass != undefined) userpass = d[0].userpass;
if (d[0].adminpass != undefined) adminpass = d[0].adminpass;
callback(userpass, adminpass, true);
}
} else {
callback(userpass, adminpass, true);
}
});
} catch (e) {
callback("", "", false);
}
}
function removeSessionChatPass(id, callback) {
if (id == "empty" || id == undefined) {
callback();
return;
}
connected_db.collection(id).remove({ _id: "_chat_" }, function() {
callback();
return;
});
}
function removeSessionAdminPass(id, channel, callback) {
if (id == "empty" || id == undefined) {
callback();
return;
}
connected_db
.collection(id)
.update({ _id: channel }, { $set: { adminpass: "" } }, function() {
callback();
return;
});
}
function remove_from_chat_channel(coll, guid) {
db.collection("user_names").update(
{ guid: guid },
{ $pull: { channels: coll } },
function(err, docs) {}
);
}
function left_channel(coll, guid, short_id, in_list, socket, change, caller) {
if (!coll) {
if (!change) {
remove_name_from_db(guid, coll);
} else {
remove_from_chat_channel(coll, guid);
}
return;
}
//coll = coll.replace(/ /g,'');
db.collection("connected_users").update(
{ _id: coll },
{ $pull: { users: guid } },
function(err, updated) {
if (updated.nModified > 0) {
db.collection("connected_users").update(
{ _id: "total_users" },
{ $pull: { total_users: guid + coll } },
function(err, updated) {}
);
db.collection("connected_users").find({ _id: coll }, function(
err,
new_doc
) {
db.collection("frontpage_lists").update(
{ _id: coll, viewers: { $gt: 0 } },
{ $inc: { viewers: -1 } },
function(err, doc) {
db.collection("user_names").find({ guid: guid }, function(
err,
docs
) {
if (docs.length == 1) {
var icon = "";
if (docs[0].icon != undefined) icon = docs[0].icon;
io.to(coll).emit("chat", {
from: docs[0].name,
icon: icon,
msg: " left"
});
}
});
io.to(coll).emit("viewers", new_doc[0].users.length);
socket.leave(coll);
if (!change) {
remove_name_from_db(guid, coll);
} else {
remove_from_chat_channel(coll, guid);
}
}
);
});
} else {
db.collection("connected_users").update(
{ _id: "offline_users" },
{ $pull: { users: guid } },
function(err, updated) {
//if(updated.nModified > 0) {
db.collection("connected_users").update(
{ _id: "total_users" },
{ $pull: { total_users: guid + coll } },
function(err, updated) {}
);
if (!change) {
remove_name_from_db(guid, coll);
} else {
remove_from_chat_channel(coll, guid);
}
//}
}
);
}
}
);
remove_unique_id(short_id);
}
function checkTimeout(
type,
timeout,
channel,
guid,
conf_pass,
this_pass,
socket,
callback,
error_message,
error_callback
) {
if (conf_pass != "" && conf_pass == this_pass) {
callback();
return;
}
db.collection("timeout_api").find(
{
type: type,
guid: guid
},
function(err, docs) {
if (docs.length > 0) {
var date = new Date(docs[0].createdAt);
date.setSeconds(date.getSeconds() + timeout);
var now = new Date();
var retry_in = (date.getTime() - now.getTime()) / 1000;
if (retry_in > 0) {
if (typeof error_callback == "function") {
error_callback();
} else if (error_message) {
var sOrNot =
Math.ceil(retry_in) > 1 || Math.ceil(retry_in) == 0 ? "s" : "";
socket.emit(
"toast",
error_message + Math.ceil(retry_in) + " second" + sOrNot + "."
);
} else {
socket.emit("toast", "wait_longer");
}
return;
}
}
var now_date = new Date();
db.collection("timeout_api").update(
{ type: type, guid: guid },
{
$set: {
createdAt: now_date,
type: type,
guid: guid
}
},
{ upsert: true },
function(err, docs) {
callback();
return;
}
);
}
);
}
module.exports.checkTimeout = checkTimeout;
module.exports.left_channel = left_channel;
module.exports.setChromecastHost = setChromecastHost;
module.exports.decodeChannelName = decodeChannelName;
module.exports.encodeChannelName = encodeChannelName;
module.exports.isUrl = isUrl;
module.exports.removeEmojis = removeEmojis;
module.exports.getSessionChatPass = getSessionChatPass;
module.exports.setSessionChatPass = setSessionChatPass;
module.exports.removeSessionAdminPass = removeSessionAdminPass;
module.exports.removeSessionChatPass = removeSessionChatPass;
module.exports.setSessionAdminPass = setSessionAdminPass;
module.exports.setSessionUserPass = setSessionUserPass;
module.exports.getSessionAdminUser = getSessionAdminUser;
module.exports.getSession = getSession;
module.exports.generate_channel_name = generate_channel_name;
module.exports.remove_unique_id = remove_unique_id;
module.exports.remove_name_from_db = remove_name_from_db;
module.exports.remove_from_array = remove_from_array;
module.exports.get_short_id = get_short_id;
module.exports.check_inlist = check_inlist;
module.exports.rndName = rndName;
module.exports.decrypt_string = decrypt_string;
module.exports.get_time = get_time;
module.exports.contains = contains;
module.exports.hash_pass = hash_pass;

946
server/handlers/io.js Normal file
View File

@@ -0,0 +1,946 @@
var cookieParser = require("cookie-parser");
var cookie = require("cookie");
var Functions = require(pathThumbnails + "/handlers/functions.js");
var ListChange = require(pathThumbnails + "/handlers/list_change.js");
var Chat = require(pathThumbnails + "/handlers/chat.js");
var List = require(pathThumbnails + "/handlers/list.js");
var Suggestions = require(pathThumbnails + "/handlers/suggestions.js");
var ListSettings = require(pathThumbnails + "/handlers/list_settings.js");
var Frontpage = require(pathThumbnails + "/handlers/frontpage.js");
var Search = require(pathThumbnails + "/handlers/search.js");
var crypto = require("crypto");
var Filter = require("bad-words");
var filter = new Filter({ placeHolder: "x" });
/*var filter = {
clean: function(str) {
return str;
}
}*/
var db = require(pathThumbnails + "/handlers/db.js");
module.exports = function() {
io.on("connection", function(socket) {
try {
var parsedCookies = cookie.parse(socket.handshake.headers.cookie);
socket.cookie_id = parsedCookies["_uI"];
//return socket.guid;
} catch (e) {
socket.cookie_id = "empty";
}
socket.zoff_id = socket.id;
socket.emit("get_list");
var guid = socket.cookie_id;
if (guid == "empty" || guid == null || guid == undefined)
guid = Functions.hash_pass(
socket.handshake.headers["user-agent"] +
socket.handshake.address +
socket.handshake.headers["accept-language"]
);
socket.guid = guid;
socket.on("close", function() {});
socket.on("pinging", function() {
socket.emit("ok");
});
var ping_timeout;
var socketid = socket.zoff_id;
var coll;
var in_list = false;
var name = "";
var short_id;
Chat.get_name(guid, { announce: false, socket: socket });
var offline = false;
var chromecast_object = false;
socket.emit("guid", guid);
socket.on("self_ping", function(msg) {
var channel = msg.channel;
if (channel.indexOf("?") > -1) {
channel = channel.substring(0, channel.indexOf("?"));
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
//channel = channel.replace(/ /g,'');
if (offline) {
db.collection("connected_users").update(
{ _id: "offline_users" },
{ $addToSet: { users: guid } },
{ upsert: true },
function(err, docs) {}
);
} else {
db.collection("connected_users").update(
{ _id: channel },
{ $addToSet: { users: guid } },
{ upsert: true },
function(err, docs) {
db.collection("frontpage_lists").update(
{ _id: channel },
{ $inc: { viewers: 1 } },
{ upsert: true },
function() {}
);
}
);
}
if (channel != "" && channel != undefined) {
db.collection("connected_users").update(
{ _id: "total_users" },
{ $addToSet: { total_users: guid + channel } },
{ upsert: true },
function(err, docs) {}
);
}
});
socket.on("logout", function() {
Functions.removeSessionAdminPass(
Functions.getSession(socket),
coll,
function() {}
);
});
socket.on("next_song", function(obj) {
if (obj == undefined || !obj.hasOwnProperty("channel")) return;
db.collection(obj.channel + "_settings").find(function(e, docs) {
if (docs.length == 0) return;
var pass = "";
if (obj.hasOwnProperty("pass")) {
pass = crypto
.createHash("sha256")
.update(Functions.decrypt_string(obj.pass))
.digest("base64");
}
if (
docs.length > 0 &&
(docs[0].userpass == undefined ||
docs[0].userpass == "" ||
docs[0].userpass == pass)
) {
List.getNextSong(obj.channel, socket);
}
});
});
socket.on("chromecast", function(msg) {
try {
if (
typeof msg == "object" &&
msg.hasOwnProperty("guid") &&
msg.hasOwnProperty("socket_id") &&
msg.hasOwnProperty("channel") &&
typeof msg.guid == "string" &&
typeof msg.channel == "string" &&
typeof msg.socket_id == "string" &&
msg.channel != ""
) {
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
db.collection("connected_users").find({ _id: msg.channel }, function(
err,
connected_users_channel
) {
if (
connected_users_channel.length > 0 &&
connected_users_channel[0].users.indexOf(msg.guid) > -1
) {
coll = msg.channel.toLowerCase(); //.replace(/ /g,'');
coll = Functions.removeEmojis(coll).toLowerCase();
//coll = filter.clean(coll);
if (coll.indexOf("?") > -1) {
coll = coll.substring(0, coll.indexOf("?"));
}
Functions.setChromecastHost(
socket.cookie_id,
msg.socket_id,
msg.channel,
function(results) {}
);
//socket.cookie_id = msg.guid;
guid = msg.guid;
socketid = msg.socket_id;
socket.zoff_id = socketid;
in_list = true;
chromecast_object = true;
socket.join(coll);
}
});
}
} catch (e) {
return;
}
});
socket.on("get_id", function() {
socket.emit("id_chromecast", {
cookie_id: Functions.getSession(socket),
guid: guid
});
});
socket.on("error_video", function(msg) {
try {
msg.channel = Functions.encodeChannelName(msg.channel);
var _list = msg.channel; //.replace(/ /g,'');
if (_list.length == 0) return;
if (_list.indexOf("?") > -1) {
_list = _list.substring(0, _list.indexOf("?"));
msg.channel = _list;
}
coll = Functions.removeEmojis(_list).toLowerCase();
//coll = coll.replace(/_/g, "");
//coll = filter.clean(coll);
} catch (e) {
return;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
Search.check_error_video(msg, coll);
});
socket.on("get_spread", function() {
db.collection("connected_users").find({ _id: "total_users" }, function(
err,
tot
) {
db.collection("connected_users").find(
{ _id: "offline_users" },
function(err, off) {
db.collection("connected_users").find(
{ _id: { $ne: "total_users" }, _id: { $ne: "offline_users" } },
function(err, users_list) {
if (tot.length > 0 && off.length == 0) {
socket.emit("spread_listeners", {
offline: 0,
total: tot[0].total_users.length,
online_users: users_list
});
} else if (tot.length > 0 && off.length > 0) {
socket.emit("spread_listeners", {
offline: off[0].users.length,
total: tot[0].total_users.length,
online_users: users_list
});
}
}
);
}
);
});
});
socket.on("suggest_thumbnail", function(msg) {
if (msg.hasOwnProperty("channel") && msg.channel.indexOf("?") > -1) {
var _list = msg.channel.substring(0, msg.channel.indexOf("?"));
msg.channel = _list;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
Suggestions.thumbnail(msg, coll, guid, offline, socket);
});
socket.on("suggest_description", function(msg) {
if (msg.hasOwnProperty("channel") && msg.channel.indexOf("?") > -1) {
var _list = msg.channel.substring(0, msg.channel.indexOf("?"));
msg.channel = _list;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
Suggestions.description(msg, coll, guid, offline, socket);
});
socket.on("suggest_rules", function(msg) {
if (msg.hasOwnProperty("channel") && msg.channel.indexOf("?") > -1) {
var _list = msg.channel.substring(0, msg.channel.indexOf("?"));
msg.channel = _list;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
Suggestions.rules(msg, coll, guid, offline, socket);
});
socket.on("namechange", function(msg) {
if (msg.hasOwnProperty("channel") && msg.channel.indexOf("?") > -1) {
var _list = msg.channel.substring(0, msg.channel.indexOf("?"));
msg.channel = _list;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
Chat.namechange(msg, guid, socket);
});
socket.on("removename", function(msg) {
if (msg.hasOwnProperty("channel") && msg.channel.indexOf("?") > -1) {
var _list = msg.channel.substring(0, msg.channel.indexOf("?"));
msg.channel = _list;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
if (typeof msg != "object" || !msg.hasOwnProperty("channel")) {
var result = {
channel: {
expected: "string",
got: msg.hasOwnProperty("channel") ? typeof msg.channel : undefined
}
};
socket.emit("update_required", result);
return;
}
Chat.removename(guid, msg.channel, socket);
});
socket.on("offline", function(msg) {
if (msg.hasOwnProperty("channel") && msg.channel.indexOf("?") > -1) {
var _list = msg.channel.substring(0, msg.channel.indexOf("?"));
msg.channel = _list;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
if (
!msg.hasOwnProperty("status") ||
!msg.hasOwnProperty("channel") ||
typeof msg.status != "boolean" ||
typeof msg.channel != "string"
) {
var result = {
status: {
expected: "boolean",
got: msg.hasOwnProperty("status") ? typeof msg.status : undefined
},
channel: {
expected: "string",
got: msg.hasOwnProperty("channel") ? typeof msg.channel : undefined
}
};
socket.emit("update_required", result);
return;
}
var status = msg.status;
var channel = msg.channel; //.replace(/ /g,'');
if (status) {
in_list = false;
offline = true;
if (channel != "") coll = channel;
if (coll !== undefined) {
coll = Functions.removeEmojis(coll).toLowerCase();
//coll = filter.clean(coll);
db.collection("connected_users").findAndModify(
{
query: { _id: coll },
update: { $pull: { users: guid } },
upsert: true
},
function(err, updated, d) {
if (d.n == 1) {
var num = 0;
if (updated && updated.users) {
num = updated.users.length;
}
io.to(coll).emit("viewers", num);
db.collection("frontpage_lists").update(
{ _id: coll, viewers: { $gt: 0 } },
{ $inc: { viewers: -1 } },
function(err, docs) {}
);
db.collection("connected_users").update(
{ _id: "total_users" },
{ $pull: { total_users: guid + coll } },
function(err, docs) {
db.collection("connected_users").update(
{ _id: "offline_users" },
{ $addToSet: { users: guid } },
{ upsert: true },
function(err, docs) {
if (
docs.nModified == 1 &&
(coll != undefined && coll != "")
) {
db.collection("connected_users").update(
{ _id: "total_users" },
{ $addToSet: { total_users: guid + coll } },
function(err, docs) {}
);
}
}
);
}
);
}
Functions.remove_name_from_db(guid, coll);
}
);
}
Functions.remove_unique_id(short_id);
} else {
offline = false;
db.collection("connected_users").update(
{ _id: "offline_users" },
{ $pull: { users: guid } },
function(err, docs) {
Functions.check_inlist(
coll,
guid,
socket,
offline,
undefined,
"place 3"
);
}
);
}
});
socket.on("get_history", function(msg) {
if (msg.hasOwnProperty("channel") && msg.channel.indexOf("?") > -1) {
var _list = msg.channel.substring(0, msg.channel.indexOf("?"));
msg.channel = _list;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
if (
!msg.hasOwnProperty("channel") ||
!msg.hasOwnProperty("all") ||
typeof msg.channel != "string" ||
typeof msg.all != "boolean"
) {
var result = {
all: {
expected: "boolean",
got: msg.hasOwnProperty("all") ? typeof msg.all : undefined
},
channel: {
expected: "string",
got: msg.hasOwnProperty("channel") ? typeof msg.channel : undefined
},
pass: {
expected: "string",
got: msg.hasOwnProperty("pass") ? typeof msg.pass : undefined
}
};
socket.emit("update_required", result);
return;
}
Chat.get_history(msg.channel, msg.all, socket);
});
socket.on("chat", function(msg) {
if (msg.hasOwnProperty("channel") && msg.channel.indexOf("?") > -1) {
var _list = msg.channel.substring(0, msg.channel.indexOf("?"));
msg.channel = _list;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
Chat.chat(msg, guid, offline, socket);
});
socket.on("all,chat", function(data) {
if (data.hasOwnProperty("channel") && data.channel.indexOf("?") > -1) {
var _list = data.channel.substring(0, data.channel.indexOf("?"));
data.channel = _list;
}
if (data.hasOwnProperty("channel")) {
data.channel = Functions.encodeChannelName(data.channel);
}
Chat.all_chat(data, guid, offline, socket);
});
socket.on("frontpage_lists", function(msg) {
if (msg.hasOwnProperty("channel") && msg.channel.indexOf("?") > -1) {
var _list = msg.channel.substring(0, msg.channel.indexOf("?"));
msg.channel = _list;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
Frontpage.frontpage_lists(msg, socket);
});
socket.on("import_zoff", function(msg) {
if (msg.hasOwnProperty("channel") && msg.channel.indexOf("?") > -1) {
var _list = msg.channel.substring(0, msg.channel.indexOf("?"));
msg.channel = _list;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
ListChange.addFromOtherList(msg, guid, offline, socket);
});
socket.on("now_playing", function(list, fn) {
List.now_playing(list, fn, socket);
});
socket.on("id", function(arr) {
if (arr.hasOwnProperty("channel") && arr.channel.indexOf("?") > -1) {
var _list = arr.channel.substring(0, arr.channel.indexOf("?"));
arr.channel = _list;
}
if (arr.hasOwnProperty("channel")) {
arr.channel = Functions.encodeChannelName(arr.channel);
}
if (typeof arr == "object")
io.to(arr.id).emit(arr.id.toLowerCase(), {
type: arr.type,
value: arr.value
});
});
socket.on("join_silent", function(msg) {
if (msg.hasOwnProperty("channel") && msg.channel.indexOf("?") > -1) {
var _list = msg.channel.substring(0, msg.channel.indexOf("?"));
msg.channel = _list;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
} else {
return;
}
List.join_silent(msg, socket);
});
socket.on("list", function(msg) {
if (msg.hasOwnProperty("channel") && msg.channel.indexOf("?") > -1) {
var _list = msg.channel.substring(0, msg.channel.indexOf("?"));
msg.channel = _list;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
try {
//var _list = msg.channel.replace(/ /g,'');
var _list = msg.channel;
if (_list.length == 0) return;
if (_list.indexOf("?") > -1) {
_list = _list.substring(0, _list.indexOf("?"));
msg.channel = _list;
}
coll = Functions.removeEmojis(_list).toLowerCase();
//coll = coll.replace(/_/g, "");
//
//coll = filter.clean(coll);
} catch (e) {
return;
}
if (msg.hasOwnProperty("offline") && msg.offline) {
offline = true;
}
List.list(msg, guid, coll, offline, socket);
Functions.get_short_id(socket);
});
socket.on("end", function(obj) {
if (obj.hasOwnProperty("channel") && obj.channel.indexOf("?") > -1) {
var _list = obj.channel.substring(0, obj.channel.indexOf("?"));
obj.channel = _list;
}
if (obj.hasOwnProperty("channel")) {
obj.channel = Functions.encodeChannelName(obj.channel);
try {
coll = obj.channel.toLowerCase(); //.replace(/ /g,'');
if (coll.length == 0) return;
coll = Functions.removeEmojis(coll).toLowerCase();
//coll = coll.replace(/_/g, "");
//coll = filter.clean(coll);
} catch (e) {
return;
}
}
List.end(obj, coll, guid, offline, socket);
});
socket.on("addPlaylist", function(arr) {
if (arr.hasOwnProperty("channel") && arr.channel.indexOf("?") > -1) {
var _list = arr.channel.substring(0, arr.channel.indexOf("?"));
arr.channel = _list;
}
if (arr.hasOwnProperty("channel")) {
arr.channel = Functions.encodeChannelName(arr.channel);
}
ListChange.addPlaylist(arr, guid, offline, socket);
});
socket.on("add", function(arr) {
if (arr.hasOwnProperty("list") && arr.list.indexOf("?") > -1) {
var _list = arr.list.substring(0, arr.list.indexOf("?"));
arr.list = _list;
}
if (arr.hasOwnProperty("list")) {
arr.list = Functions.encodeChannelName(arr.list);
}
if (
coll !== undefined &&
((arr.hasOwnProperty("offsiteAdd") && !arr.offsiteAdd) ||
!arr.hasOwnProperty("offsiteAdd"))
) {
try {
coll = arr.list; //.replace(/ /g,'');
if (coll.length == 0) return;
coll = Functions.removeEmojis(coll).toLowerCase();
//coll = coll.replace(/_/g, "");
//coll = filter.clean(coll);
} catch (e) {
return;
}
} else if (arr.hasOwnProperty("offsiteAdd") && arr.offsiteAdd) {
arr.list = Functions.removeEmojis(arr.list).toLowerCase();
}
ListChange.add_function(arr, coll, guid, offline, socket);
});
socket.on("delete_all", function(msg) {
try {
if (msg.hasOwnProperty("channel") && msg.channel.indexOf("?") > -1) {
var _list = msg.channel.substring(0, msg.channel.indexOf("?"));
msg.channel = _list;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
coll = msg.channel.toLowerCase(); //.replace(/ /g,'');
if (coll.length == 0) return;
coll = Functions.removeEmojis(coll).toLowerCase();
//coll = coll.replace(/_/g, "");
//coll = filter.clean(coll);
} catch (e) {
return;
}
ListChange.delete_all(msg, coll, guid, offline, socket);
});
socket.on("vote", function(msg) {
if (msg.hasOwnProperty("channel") && msg.channel.indexOf("?") > -1) {
var _list = msg.channel.substring(0, msg.channel.indexOf("?"));
msg.channel = _list;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
if (coll !== undefined) {
try {
coll = msg.channel.toLowerCase(); //.replace(/ /g,'');
if (coll.length == 0) return;
coll = Functions.removeEmojis(coll).toLowerCase();
//coll = coll.replace(/_/g, "");
//coll = filter.clean(coll);
} catch (e) {
return;
}
}
ListChange.voteUndecided(msg, coll, guid, offline, socket);
});
socket.on("password", function(inp) {
if (inp.hasOwnProperty("channel") && inp.channel.indexOf("?") > -1) {
var _list = inp.channel.substring(0, inp.channel.indexOf("?"));
inp.channel = _list;
}
if (inp.hasOwnProperty("channel")) {
inp.channel = Functions.encodeChannelName(inp.channel);
}
//if(coll != undefined) coll.replace(/ /g,'');
ListSettings.password(inp, coll, guid, offline, socket);
});
socket.on("skip", function(list) {
if (list.hasOwnProperty("channel") && list.channel.indexOf("?") > -1) {
var _list = list.channel.substring(0, list.channel.indexOf("?"));
list.channel = _list;
coll = list.channel;
}
if (list.hasOwnProperty("channel")) {
list.channel = Functions.encodeChannelName(list.channel);
}
//if(coll != undefined) coll.replace(/ /g,'');
List.skip(list, guid, coll, offline, socket);
});
socket.on("conf", function(conf) {
if (conf.hasOwnProperty("channel") && conf.channel.indexOf("?") > -1) {
var _list = conf.channel.substring(0, conf.channel.indexOf("?"));
conf.channel = _list;
coll = conf.channel;
}
if (conf.hasOwnProperty("channel")) {
conf.channel = Functions.encodeChannelName(conf.channel);
coll = conf.channel;
}
//if(coll != undefined) coll.replace(/ /g,'');
ListSettings.conf_function(conf, coll, guid, offline, socket);
});
socket.on("shuffle", function(msg) {
if (msg.hasOwnProperty("channel") && msg.channel.indexOf("?") > -1) {
var _list = msg.channel.substring(0, msg.channel.indexOf("?"));
msg.channel = _list;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
try {
coll = msg.channel.toLowerCase(); //.replace(/ /g,'');
if (coll.length == 0) return;
coll = Functions.removeEmojis(coll).toLowerCase();
//coll = coll.replace(/_/g, "");
//coll = filter.clean(coll);
} catch (e) {
return;
}
ListChange.shuffle(msg, coll, guid, offline, socket);
});
socket.on("change_channel", function(obj) {
if (obj == undefined && coll != undefined) {
obj = {};
obj.channel = coll;
} else if (
obj != undefined &&
obj.hasOwnProperty("channel") &&
obj.channel.indexOf("?") > -1
) {
var _list = obj.channel.substring(0, obj.channel.indexOf("?"));
obj.channel = _list;
}
if (obj == undefined && coll == undefined) {
return;
}
if (obj.hasOwnProperty("channel")) {
obj.channel = Functions.encodeChannelName(obj.channel);
}
if (
coll === undefined &&
obj !== undefined &&
obj.channel !== undefined
) {
try {
coll = obj.channel.toLowerCase(); //.replace(/ /g,'');
if (coll.length == 0) return;
coll = Functions.removeEmojis(coll).toLowerCase();
//coll = coll.replace(/_/g, "");
//coll = filter.clean(coll);
} catch (e) {
return;
}
}
Functions.left_channel(
coll,
guid,
short_id,
in_list,
socket,
true,
"left 1"
);
in_list = false;
});
socket.on("disconnect", function() {
Functions.left_channel(
coll,
guid,
short_id,
in_list,
socket,
false,
"left 2"
);
});
socket.on("disconnected", function() {
Functions.left_channel(
coll,
guid,
short_id,
in_list,
socket,
false,
"left 3"
);
});
socket.on("left_channel", function(msg) {
if (msg.hasOwnProperty("channel") && msg.channel.indexOf("?") > -1) {
var _list = msg.channel.substring(0, msg.channel.indexOf("?"));
msg.channel = _list;
}
if (msg.hasOwnProperty("channel")) {
msg.channel = Functions.encodeChannelName(msg.channel);
}
if (
msg.hasOwnProperty("channel") &&
msg.channel != "" &&
typeof msg.channel == "string"
) {
coll = msg.channel; //.replace(/ /g,'');
coll = Functions.removeEmojis(coll).toLowerCase();
//coll = filter.clean(coll);
Functions.left_channel(
coll,
guid,
short_id,
in_list,
socket,
false,
"left 4"
);
}
});
socket.on("reconnect_failed", function() {
Functions.left_channel(
coll,
guid,
short_id,
in_list,
socket,
false,
"left 5"
);
});
socket.on("connect_timeout", function() {
Functions.left_channel(
coll,
guid,
short_id,
in_list,
socket,
false,
"left 6"
);
});
socket.on("error", function() {
Functions.left_channel(
coll,
guid,
short_id,
in_list,
socket,
false,
"left 7"
);
});
socket.on("pos", function(obj) {
if (
obj != undefined &&
obj.hasOwnProperty("channel") &&
obj.channel.indexOf("?") > -1
) {
var _list = obj.channel.substring(0, obj.channel.indexOf("?"));
obj.channel = _list;
}
if (obj != undefined && obj.hasOwnProperty("channel")) {
obj.channel = Functions.encodeChannelName(obj.channel);
}
if (obj == undefined && coll == undefined) {
return;
}
if (coll !== undefined) {
try {
coll = obj.channel.toLowerCase(); //.replace(/ /g,'');
if (coll.length == 0) return;
coll = Functions.removeEmojis(coll).toLowerCase();
//coll = coll.replace(/_/g, "");
//coll = filter.clean(coll);
} catch (e) {
return;
}
}
if (!obj.hasOwnProperty("channel") || typeof obj.channel != "string") {
var result = {
channel: {
expected: "string",
got: obj.hasOwnProperty("channel") ? typeof obj.channel : undefined
},
pass: {
expected: "string",
got: obj.hasOwnProperty("pass") ? typeof obj.pass : undefined
}
};
socket.emit("update_required", result);
return;
}
if (coll == undefined) return;
db.collection(coll + "_settings").find(function(err, docs) {
Functions.getSessionAdminUser(
Functions.getSession(socket),
coll,
function(userpass, adminpass) {
if (userpass != "" || obj.pass == undefined) {
obj.pass = userpass;
} else {
obj.pass = crypto
.createHash("sha256")
.update(Functions.decrypt_string(obj.pass))
.digest("base64");
}
if (
docs.length > 0 &&
(docs[0].userpass == undefined ||
docs[0].userpass == "" ||
(obj.hasOwnProperty("pass") && docs[0].userpass == obj.pass))
) {
Functions.check_inlist(
coll,
guid,
socket,
offline,
undefined,
"place 4"
);
List.send_play(coll, socket);
} else {
socket.emit("auth_required");
}
}
);
});
});
});
//send_ping();
};
/*
function send_ping() {
db.collection("connected_users").update({users: {$exists: true}}, {$set: {users: []}}, {multi: true}, function(err, docs){
db.collection("connected_users").update({"_id": "total_users"}, {$add: {total_users: 0}}, {multi: true}, function(err, docs){
db.collection("frontpage_lists").update({viewers: {$ne: 0}}, {$set: {"viewers": 0}}, {multi: true}, function(err, docs) {
io.emit("self_ping");
setTimeout(send_ping, 25000);
});
});
});
}*/

1293
server/handlers/list.js Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,396 @@
var Functions = require(pathThumbnails + "/handlers/functions.js");
var crypto = require("crypto");
var Filter = require("bad-words");
var filter = new Filter({ placeHolder: "x" });
/*var filter = {
clean: function(str) {
return str;
}
}*/
var projects = require(pathThumbnails + "/handlers/aggregates.js");
var db = require(pathThumbnails + "/handlers/db.js");
function password(inp, coll, guid, offline, socket) {
var sessionId = Functions.getSession(socket);
if (sessionId == "") sessionId = "empty";
if (inp !== undefined && inp !== null && inp !== "") {
if (
!inp.hasOwnProperty("password") ||
!inp.hasOwnProperty("channel") ||
typeof inp.password != "string" ||
typeof inp.channel != "string"
) {
var result = {
channel: {
expected: "string",
got: inp.hasOwnProperty("channel") ? typeof inp.channel : undefined
},
password: {
expected: "password",
got: inp.hasOwnProperty("password") ? typeof inp.password : undefined
}
};
socket.emit("update_required", result);
return;
}
pw = inp.password;
try {
coll = inp.channel;
if (coll.length == 0) return;
coll = Functions.removeEmojis(coll).toLowerCase();
//coll = coll.replace(/_/g, "");
//coll = filter.clean(coll);
} catch (e) {
return;
}
//coll = coll.replace(/ /g,'');
uncrypted = pw;
pw = Functions.hash_pass(Functions.decrypt_string(pw), true);
Functions.check_inlist(coll, guid, socket, offline, undefined, "place 8");
Functions.getSessionAdminUser(sessionId, coll, function(
userpass,
adminpass
) {
adminpass = Functions.hash_pass(adminpass);
db.collection(coll + "_settings").find(function(err, docs) {
if (docs !== null && docs.length !== 0) {
if (
docs[0].adminpass === "" ||
docs[0].adminpass == Functions.hash_pass(pw)
) {
Functions.setSessionAdminPass(
sessionId,
inp.password,
coll,
function() {
db.collection(coll + "_settings").update(
{ id: "config" },
{ $set: { adminpass: Functions.hash_pass(pw) } },
function(err, docs) {
if (adminpass != pw && adminpass != "") {
socket.emit("toast", "changedpass");
} else {
socket.emit("toast", "correctpass");
}
socket.emit("pw", true);
}
);
}
);
} else if (
docs[0].adminpass === "" ||
docs[0].adminpass == adminpass
) {
Functions.setSessionAdminPass(
sessionId,
inp.password,
coll,
function() {
db.collection(coll + "_settings").update(
{ id: "config" },
{ $set: { adminpass: Functions.hash_pass(pw) } },
function(err, docs) {
if (adminpass != pw) {
socket.emit("toast", "changedpass");
}
socket.emit("pw", true);
}
);
}
);
} else {
Functions.setSessionAdminPass(
Functions.getSession(socket),
"",
coll,
function() {
socket.emit("toast", "wrongpass");
socket.emit("pw", false);
}
);
}
}
});
});
} else {
var result = {
inp: {
expected: "string",
got: typeof inpt
}
};
socket.emit("update_required", result);
}
}
function conf_function(params, coll, guid, offline, socket) {
if (params !== undefined && params !== null && params !== "") {
if (coll !== undefined) {
try {
coll = params.channel; //.replace(/ /g,'');
if (coll.length == 0) return;
coll = Functions.removeEmojis(coll).toLowerCase();
//coll = coll.replace(/_/g, "");
//coll = filter.clean(coll);
} catch (e) {
return;
}
}
if (coll == "" || coll == undefined || coll == null) {
socket.emit("update_required");
return;
}
Functions.check_inlist(coll, guid, socket, offline, undefined, "place 9");
Functions.getSessionAdminUser(Functions.getSession(socket), coll, function(
userpass,
adminpass,
gotten
) {
if (gotten) {
params.adminpass = adminpass;
if (!params.userpass_changed) params.userpass = userpass;
}
if (
!params.hasOwnProperty("voting") ||
!params.hasOwnProperty("addsongs") ||
!params.hasOwnProperty("longsongs") ||
!params.hasOwnProperty("frontpage") ||
!params.hasOwnProperty("allvideos") ||
!params.hasOwnProperty("removeplay") ||
!params.hasOwnProperty("adminpass") ||
!params.hasOwnProperty("skipping") ||
!params.hasOwnProperty("shuffling") ||
!params.hasOwnProperty("channel") ||
typeof params.userpass != "string" ||
typeof params.adminpass != "string" ||
typeof params.voting != "boolean" ||
typeof params.addsongs != "boolean" ||
typeof params.longsongs != "boolean" ||
typeof params.frontpage != "boolean" ||
typeof params.allvideos != "boolean" ||
typeof params.removeplay != "boolean" ||
typeof params.skipping != "boolean" ||
typeof params.shuffling != "boolean" ||
typeof params.userpass_changed != "boolean"
) {
var result = {
adminpass: {
expected: "string",
got: params.hasOwnProperty("adminpass")
? typeof params.adminpass
: undefined
},
userpass: {
expected: "string",
got: params.hasOwnProperty("userpass")
? typeof params.userpass
: undefined
},
vote: {
expected: "boolean",
got: params.hasOwnProperty("vote") ? typeof params.vote : undefined
},
addsongs: {
expected: "boolean",
got: params.hasOwnProperty("addsongs")
? typeof params.addsongs
: undefined
},
longsongs: {
expected: "boolean",
got: params.hasOwnProperty("longsongs")
? typeof params.longsongs
: undefined
},
frontpage: {
expected: "boolean",
got: params.hasOwnProperty("frontpage")
? typeof params.frontpage
: undefined
},
skipping: {
expected: "boolean",
got: params.hasOwnProperty("skipping")
? typeof params.skipping
: undefined
},
shuffling: {
expected: "boolean",
got: params.hasOwnProperty("shuffling")
? typeof params.shuffling
: undefined
},
userpass_changed: {
expected: "boolean",
got: params.hasOwnProperty("userpass_changed")
? typeof params.userpass_changed
: undefined
}
};
socket.emit("update_required", result);
return;
}
var voting = params.voting;
var addsongs = params.addsongs;
var longsongs = params.longsongs;
var frontpage = params.frontpage;
var allvideos = params.allvideos;
var removeplay = params.removeplay;
var adminpass = params.adminpass;
var skipping = params.skipping;
var shuffling = params.shuffling;
var userpass = Functions.decrypt_string(params.userpass);
if (
(!params.userpass_changed && frontpage) ||
(params.userpass_changed && userpass == "")
) {
userpass = "";
} else if (params.userpass_changed && userpass != "") {
frontpage = false;
}
var description = "";
var hash;
if (params.description) description = params.description;
if (adminpass !== "" && !gotten) {
hash = Functions.hash_pass(
Functions.hash_pass(Functions.decrypt_string(adminpass), true)
);
} else if (adminpass !== "" && gotten) {
hash = Functions.hash_pass(adminpass);
} else {
hash = adminpass;
}
if (userpass != "") {
if (!params.userpass_changed && gotten) {
} else {
userpass = crypto
.createHash("sha256")
.update(userpass)
.digest("base64");
}
}
db.collection(coll + "_settings").find({ id: "config" }, function(
err,
docs
) {
if (
docs !== null &&
docs.length !== 0 &&
(docs[0].adminpass === "" || docs[0].adminpass == hash)
) {
var obj = {
addsongs: addsongs,
allvideos: allvideos,
frontpage: frontpage,
skip: skipping,
vote: voting,
removeplay: removeplay,
shuffle: shuffling,
longsongs: longsongs,
adminpass: hash,
desc: description
};
if (
params.hasOwnProperty("toggleChat") &&
docs[0].adminpass != "" &&
docs[0].adminpass != undefined &&
docs[0].adminpass == hash
) {
obj.toggleChat = params.toggleChat;
}
if (
params.hasOwnProperty("strictSkip") &&
docs[0].adminpass != "" &&
docs[0].adminpass != undefined &&
docs[0].adminpass == hash
) {
obj.strictSkip = params.strictSkip;
}
if (
params.hasOwnProperty("strictSkipNumber") &&
docs[0].adminpass != "" &&
docs[0].adminpass != undefined &&
docs[0].adminpass == hash
) {
try {
obj.strictSkipNumber = parseInt(params.strictSkipNumber);
} catch (e) {}
}
if (params.userpass_changed) {
obj["userpass"] = userpass;
} else if (frontpage) {
obj["userpass"] = "";
}
db.collection(coll + "_settings").update(
{ id: "config" },
{
$set: obj
},
function(err, docs) {
Functions.setSessionUserPass(
Functions.getSession(socket),
obj["userpass"],
coll,
function() {
db.collection(coll + "_settings").aggregate(
[
{
$match: {
id: "config"
}
},
{
$project: projects.toShowConfig
}
],
function(err, docs) {
if (docs[0].adminpass !== "") docs[0].adminpass = true;
if (
docs[0].hasOwnProperty("userpass") &&
docs[0].userpass != ""
)
docs[0].userpass = true;
else docs[0].userpass = false;
io.to(coll).emit("conf", docs);
socket.emit("toast", "savedsettings");
db.collection("frontpage_lists").update(
{ _id: coll },
{
$set: {
frontpage: frontpage,
accessed: Functions.get_time()
}
},
{ upsert: true },
function(err, docs) {}
);
}
);
}
);
}
);
} else {
socket.emit("toast", "wrongpass");
}
});
});
} else {
var result = {
params: {
expected: "object",
got: typeof params
}
};
socket.emit("update_required", result);
}
}
module.exports.password = password;
module.exports.conf_function = conf_function;

View File

@@ -0,0 +1,47 @@
var path = require("path");
function requested_change(type, string, channel) {
try {
//channel = channel.replace(/ /g,'');
var nodemailer = require("nodemailer");
var mailconfig = require(path.join(__dirname, "../config/mailconfig.js"));
let transporter = nodemailer.createTransport(mailconfig);
transporter.verify(function(error, success) {
if (error) {
return;
} else {
var message =
"A " +
type +
" change was requested on <b>" +
channel +
"</b><br><br>New supposed value is: <br><br><b>" +
string +
"</b><br><br><br> \
Go to <a href='https://admin.zoff.me/'>https://admin.zoff.me/</a> to accept or decline the request.";
var msg = {
from: mailconfig.from,
to: mailconfig.notify_mail,
subject: "ZOFF: Requested new " + type,
text: message,
html: message
};
transporter.sendMail(msg, (error, info) => {
if (error) {
transporter.close();
return;
}
transporter.close();
});
}
});
} catch (e) {
console.log(
"(!) Missing file - /config/mailconfig.js Have a look at /config/mailconfig.example.js. "
);
}
}
module.exports.requested_change = requested_change;

674
server/handlers/search.js Normal file
View File

@@ -0,0 +1,674 @@
var path = require("path");
var time_regex = /P((([0-9]*\.?[0-9]*)Y)?(([0-9]*\.?[0-9]*)M)?(([0-9]*\.?[0-9]*)W)?(([0-9]*\.?[0-9]*)D)?)?(T(([0-9]*\.?[0-9]*)H)?(([0-9]*\.?[0-9]*)M)?(([0-9]*\.?[0-9]*)S)?)?/;
try {
var keys = require(path.join(__dirname, "../config/api_key.js"));
var key = keys.youtube;
var soundcloudKey = keys.soundcloud;
} catch (e) {
console.log(
"(!) Missing file - /config/api_key.js Have a look at /config/api_key.example.js. The server won't run without this existing."
);
process.exit(1);
}
var request = require("request");
var db = require(pathThumbnails + "/handlers/db.js");
var countryCodes = ["US", "NO", "SE", "DK", "CA", "EU", "UK"];
function check_if_error_or_blocked(id, channel, errored, callback) {
if (!errored) {
callback(false);
return;
}
db.collection(channel).find({ id: id, now_playing: true }, function(
err,
song
) {
if (song.length == 0) {
callback(false);
return;
}
var song_info = song[0];
if (song_info.source != "soundcloud") {
request(
{
type: "GET",
url:
"https://www.googleapis.com/youtube/v3/videos?part=id,status,contentDetails&key=" +
key +
"&id=" +
song_info.id
},
function(error, response, body) {
try {
var resp = JSON.parse(body);
if (resp.pageInfo.totalResults == 0) {
callback(true);
return;
} else if (!resp.items[0].status.embeddable) {
callback(true);
return;
} else if (
resp.items[0].contentDetails.hasOwnProperty("licensedContent") &&
resp.items[0].contentDetails.licensedContent
) {
callback(true);
return;
} else if (
resp.items[0].contentDetails.hasOwnProperty(
"regionRestriction"
) &&
resp.items[0].contentDetails.regionRestriction.hasOwnProperty(
"blocked"
) &&
resp.items[0].contentDetails.regionRestriction.blocked.length > 0
) {
var any = resp.items[0].contentDetails.blocked.some(function(
element
) {
return countryCodes.indexOf(element) > -1;
});
if (any) {
callback(true);
return;
}
}
callback(false);
return;
} catch (e) {
callback(true);
return;
}
}
);
} else {
request(
{
type: "GET",
url:
"http://api.soundcloud.com/tracks/" +
song_info.id +
"?client_id=" +
soundcloudKey
},
function(error, response, body) {
try {
var resp = JSON.parse(body);
if (resp.sharing != "public" || resp.embeddable_by != "all") {
callback(true);
return;
}
callback(false);
return;
} catch (e) {
callback(true);
return;
}
}
);
}
});
}
function filterFunction(el) {
return el != null && el != "" && el != undefined && el.trim() != "";
}
function get_genres_soundcloud(song, channel) {
request(
"http://api.soundcloud.com/tracks/" +
song.id +
"?client_id=" +
soundcloudKey,
function(err, response, body) {
if (err) {
console.log("error start", err, song, "error end");
return;
}
try {
var object = JSON.parse(body);
if (
!object.hasOwnProperty("genre") ||
!object.hasOwnProperty("tag_list")
)
return;
var genre = object.genre + ",";
genre = genre
.toLowerCase()
.split(",")
.concat(object.tag_list.toLowerCase().split('"'));
genre = genre.filter(filterFunction);
db.collection(channel).update(
{ id: song.id },
{
$set: {
tags: genre
}
},
function(e, d) {}
);
} catch (e) {
console.log("errored 2", e);
}
}
);
}
function get_genres_list(list, channel) {
var youtube_array = "";
var i = 0;
try {
for (var i = 0; i < list.length; i++) {
if (!list[i].hasOwnProperty("id")) continue;
if (list[i].source == undefined || list[i].source == "youtube") {
youtube_array += list[i].id + ",";
} else if (
list[i].source != undefined &&
list[i].source == "soundcloud"
) {
get_genres_soundcloud(list[i], channel);
}
}
if (youtube_array.length > 0) {
if (youtube_array > 49) {
var subList = [];
for (var i = 0; i < youtube_array.length; i++) {
subList.push(youtube_array[i]);
if (subList.length > 49) {
get_genres_youtube(subList.join(","), channel);
subList = [];
}
}
get_genres_youtube(subList.join(","), channel);
subList = [];
} else {
get_genres_youtube(youtube_array, channel);
}
}
} catch (e) {
console.log("errored", e);
return;
}
}
function start_soundcloud_get(arr, channel, callback) {
get_genres_soundcloud_recursive(arr, channel, 0, callback);
}
function get_genres_soundcloud_recursive(arr, channel, i, callback) {
if (i >= arr.length) {
if (typeof callback == "function") callback();
return;
}
var song = arr[i];
request(
"http://api.soundcloud.com/tracks/" +
song.id +
"?client_id=" +
soundcloudKey,
function(err, response, body) {
if (err) {
console.log("error start", err, song, "error end");
get_genres_soundcloud_recursive(arr, channel, i + 1, callback);
return;
}
try {
var object = JSON.parse(body);
if (
!object.hasOwnProperty("genre") ||
!object.hasOwnProperty("tag_list")
) {
get_genres_soundcloud_recursive(arr, channel, i + 1, callback);
return;
}
var genre = object.genre + ",";
genre = genre
.toLowerCase()
.split(",")
.concat(object.tag_list.toLowerCase().split('"'));
genre = genre.filter(filterFunction);
db.collection(channel).update(
{ id: song.id },
{
$set: {
tags: genre
}
},
function(e, d) {
get_genres_soundcloud_recursive(arr, channel, i + 1, callback);
}
);
} catch (e) {
console.log("errored 2", e);
get_genres_soundcloud_recursive(arr, channel, i + 1, callback);
}
}
);
}
function get_genres_list_recursive(list, channel, callback) {
var youtube_array = [];
var soundcloud_array = [];
for (var i = 0; i < list.length; i++) {
if (!list[i].hasOwnProperty("id")) continue;
if (list[i].source == undefined || list[i].source == "youtube") {
youtube_array.push(list[i]);
} else if (list[i].source != undefined && list[i].source == "soundcloud") {
soundcloud_array.push(list[i]);
}
}
start_youtube_get(youtube_array, channel, function() {
start_soundcloud_get(soundcloud_array, channel, function() {
if (typeof callback == "function") callback();
});
});
}
function start_youtube_get(arr, channel, callback) {
get_genres_youtube_recursive(arr, channel, 0, callback);
}
function get_genres_youtube_recursive(arr, channel, i, callback) {
if (i >= arr.length) {
if (typeof callback == "function") callback();
return;
}
var ids = [];
for (var y = i; y < arr.length; y++) {
if (ids.length >= 48) {
break;
}
ids.push(arr[y].id);
}
request(
{
type: "GET",
url:
"https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id,topicDetails&key=" +
key +
"&id=" +
ids.join(",")
},
function(error, response, body) {
if (error) {
get_genres_youtube_recursive(arr, channel, i + ids.length, callback);
return;
}
var resp = JSON.parse(body);
if (!resp.hasOwnProperty("items")) {
get_genres_youtube_recursive(arr, channel, i + ids.length, callback);
return;
}
if (resp.items.length > 0) {
for (var z = 0; z < resp.items.length; z++) {
if (!resp.items[z].hasOwnProperty("topicDetails")) continue;
var genre = resp.items[z].topicDetails.topicCategories;
genre = genre.join(",");
genre = genre.replace(
new RegExp("https://en.wikipedia.org/wiki/", "g"),
""
);
genre = genre
.replace(/_/g, " ")
.toLowerCase()
.split(",");
genre = genre.filter(filterFunction);
//console.log(resp.items[i].id + " - ", genre);
db.collection(channel).update(
{ id: resp.items[z].id },
{
$set: {
tags: genre
}
},
function(e, d) {}
);
}
get_genres_youtube_recursive(arr, channel, i + ids.length, callback);
} else {
get_genres_youtube_recursive(arr, channel, i + ids.length, callback);
}
}
);
}
function get_genres_youtube(ids, channel) {
request(
{
type: "GET",
url:
"https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id,topicDetails&key=" +
key +
"&id=" +
ids
},
function(error, response, body) {
if (error) {
return;
}
var resp = JSON.parse(body);
if (!resp.hasOwnProperty("items")) {
return;
}
if (resp.items.length > 0) {
for (var i = 0; i < resp.items.length; i++) {
if (!resp.items[i].hasOwnProperty("topicDetails")) continue;
var genre = resp.items[i].topicDetails.topicCategories;
genre = genre.join(",");
genre = genre.replace(
new RegExp("https://en.wikipedia.org/wiki/", "g"),
""
);
genre = genre
.replace(/_/g, " ")
.toLowerCase()
.split(",");
genre = genre.filter(filterFunction);
//console.log(resp.items[i].id + " - ", genre);
db.collection(channel).update(
{ id: resp.items[i].id },
{
$set: {
tags: genre
}
},
function(e, d) {}
);
}
}
}
);
}
function get_correct_info(song_generated, channel, broadcast, callback) {
//channel = channel.replace(/ /g,'');
request(
{
type: "GET",
url:
"https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id,topicDetails&key=" +
key +
"&id=" +
song_generated.id
},
function(error, response, body) {
try {
var resp = JSON.parse(body);
if (resp.items.length == 1) {
var duration = parseInt(
durationToSeconds(resp.items[0].contentDetails.duration)
);
var title = resp.items[0].snippet.localized.title;
var genre = resp.items[0].topicDetails.topicCategories;
genre = genre.join(",");
genre = genre.replace(
new RegExp("https://en.wikipedia.org/wiki/", "g"),
""
);
genre = genre
.replace(/_/g, " ")
.toLowerCase()
.split(",");
genre = genre.filter(filterFunction);
//console.log(genre + " - ", song_generated.id);
if (
title != song_generated.title ||
duration < parseInt(song_generated.duration)
) {
if (title != song_generated.title) {
song_generated.title = title;
}
if (duration < parseInt(song_generated.duration)) {
song_generated.duration = duration;
song_generated.start = 0;
song_generated.end = duration;
}
db.collection(channel).update(
{ id: song_generated.id },
{
$set: {
duration: song_generated.duration,
start: song_generated.start,
end: song_generated.end,
title: song_generated.title,
tags: genre
}
},
function(err, docs) {
if (broadcast && docs.nModified == 1) {
song_generated.new_id = song_generated.id;
//if(song_generated.type == "video")
if (typeof callback == "function") {
callback(song_generated, true);
} else {
io.to(channel).emit("channel", {
type: "changed_values",
value: song_generated
});
}
} else {
if (typeof callback == "function") {
callback(song_generated, true);
}
}
}
);
} else {
db.collection(channel).update(
{ id: song_generated.id },
{
$set: {
tags: genre
}
},
function(e, d) {
if (typeof callback == "function") {
callback(song_generated, true);
}
}
);
}
} else {
findSimilar(song_generated, channel, broadcast, callback);
}
} catch (e) {
if (typeof callback == "function") {
callback({}, false);
}
}
}
);
}
function check_error_video(msg, channel) {
if (
!msg.hasOwnProperty("id") ||
!msg.hasOwnProperty("title") ||
typeof msg.id != "string" ||
typeof msg.title != "string"
) {
var result = {
id: {
expected: "string",
got: msg.hasOwnProperty("id") ? typeof msg.id : undefined
},
title: {
expected: "string",
got: msg.hasOwnProperty("title") ? typeof msg.title : undefined
}
};
return;
}
if (msg.source == "soundcloud") return;
//channel = channel.replace(/ /g,'');
request(
{
type: "GET",
url:
"https://www.googleapis.com/youtube/v3/videos?part=id&key=" +
key +
"&id=" +
msg.id
},
function(error, response, body) {
try {
var resp = JSON.parse(body);
if (resp.pageInfo.totalResults == 0) {
findSimilar(msg, channel, true, undefined);
}
} catch (e) {
console.log(msg.id, key, e, body);
}
}
);
}
function findSimilar(msg, channel, broadcast, callback) {
//channel = channel.replace(/ /g,'');
var yt_url =
"https://www.googleapis.com/youtube/v3/search?key=" +
key +
"&videoEmbeddable=true&part=id&type=video&order=viewCount&safeSearch=none&maxResults=5&q=" +
encodeURIComponent(msg.title);
request(
{
method: "GET",
url: yt_url
},
function(error, response, body) {
var resp = JSON.parse(body);
if (resp.items.length > 0) {
var vid_url =
"https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id&key=" +
key +
"&id=";
for (var i = 0; i < resp.items.length; i++) {
vid_url += resp.items[i].id.videoId + ",";
}
request(
{
type: "GET",
url: vid_url
},
function(error, response, body) {
var resp = JSON.parse(body);
var found = false;
var element = {};
for (var i = 0; i < resp.items.length; i++) {
if (
similarity(resp.items[i].snippet.localized.title, msg.title) >
0.75
) {
found = true;
element = {
title: resp.items[i].snippet.localized.title,
duration: parseInt(
durationToSeconds(resp.items[i].contentDetails.duration)
),
id: resp.items[i].id,
start: 0,
end: parseInt(
durationToSeconds(resp.items[i].contentDetails.duration)
)
};
break;
}
}
if (found) {
db.collection(channel).update(
{ id: msg.id },
{
$set: element
},
function(err, docs) {
if (
docs &&
docs.hasOwnProperty("nModified") &&
docs.nModified == 1 &&
broadcast
) {
element.new_id = element.id;
element.id = msg.id;
if (!callback) {
io.to(channel).emit("channel", {
type: "changed_values",
value: element
});
}
}
if (typeof callback == "function") {
msg.title = element.title;
msg.id = element.id;
msg.duration = element.duration;
msg.start = element.start;
msg.end = element.end;
callback(msg, true);
}
}
);
} else if (typeof callback == "function") {
callback({}, false);
}
}
);
}
}
);
}
function similarity(s1, s2) {
var longer = s1;
var shorter = s2;
if (s1.length < s2.length) {
longer = s2;
shorter = s1;
}
var longerLength = longer.length;
if (longerLength == 0) {
return 1.0;
}
return (
(longerLength - editDistance(longer, shorter)) / parseFloat(longerLength)
);
}
function editDistance(s1, s2) {
s1 = s1.toLowerCase();
s2 = s2.toLowerCase();
var costs = new Array();
for (var i = 0; i <= s1.length; i++) {
var lastValue = i;
for (var j = 0; j <= s2.length; j++) {
if (i == 0) costs[j] = j;
else {
if (j > 0) {
var newValue = costs[j - 1];
if (s1.charAt(i - 1) != s2.charAt(j - 1))
newValue = Math.min(Math.min(newValue, lastValue), costs[j]) + 1;
costs[j - 1] = lastValue;
lastValue = newValue;
}
}
}
if (i > 0) costs[s2.length] = lastValue;
}
return costs[s2.length];
}
function durationToSeconds(duration) {
var matches = duration.match(time_regex);
hours = parseInt(matches[12]) || 0;
minutes = parseInt(matches[14]) || 0;
seconds = parseInt(matches[16]) || 0;
return hours * 60 * 60 + minutes * 60 + seconds;
}
module.exports.check_if_error_or_blocked = check_if_error_or_blocked;
module.exports.get_genres_list_recursive = get_genres_list_recursive;
module.exports.get_genres_soundcloud = get_genres_soundcloud;
module.exports.get_genres_youtube = get_genres_youtube;
module.exports.get_genres_list = get_genres_list;
module.exports.check_error_video = check_error_video;
module.exports.get_correct_info = get_correct_info;

View File

@@ -0,0 +1,284 @@
var Functions = require(pathThumbnails + "/handlers/functions.js");
var Notifications = require(pathThumbnails + "/handlers/notifications.js");
var crypto = require("crypto");
var db = require(pathThumbnails + "/handlers/db.js");
function thumbnail(msg, coll, guid, offline, socket) {
if (
msg.thumbnail != undefined &&
msg.channel &&
msg.channel != undefined &&
Functions.isUrl(msg.thumbnail)
) {
if (typeof msg.channel != "string" || typeof msg.thumbnail != "string") {
var result = {
channel: {
expected: "string",
got: msg.hasOwnProperty("channel") ? typeof msg.channel : undefined
},
pass: {
expected: "string",
got: msg.hasOwnProperty("pass") ? typeof msg.pass : undefined
},
thumbnail: {
expected: "string",
got: msg.hasOwnProperty("thumbnail")
? typeof msg.thumbnail
: undefined
},
adminpass: {
expected: "string",
got: msg.hasOwnProperty("adminpass")
? typeof msg.adminpass
: undefined
}
};
socket.emit("update_required", result);
return;
}
//coll = coll.replace(/ /g,'');
Functions.getSessionAdminUser(Functions.getSession(socket), coll, function(
userpass,
adminpass
) {
if (userpass != "" || msg.pass == undefined) {
msg.pass = userpass;
} else if (msg.hasOwnProperty("pass")) {
msg.pass = crypto
.createHash("sha256")
.update(Functions.decrypt_string(msg.pass))
.digest("base64");
}
if (adminpass != "" || msg.adminpass == undefined) {
msg.adminpass = Functions.hash_pass(adminpass);
} else {
msg.adminpass = Functions.hash_pass(
Functions.hash_pass(Functions.decrypt_string(msg.adminpass), true)
);
}
if (msg.thumbnail != "") {
msg.thumbnail = msg.thumbnail.replace(/^https?\:\/\//i, "");
if (msg.thumbnail.substring(0, 2) != "//")
msg.thumbnail = "//" + msg.thumbnail;
}
var channel = msg.channel.toLowerCase();
var hash = msg.adminpass;
db.collection(channel + "_settings").find({ id: "config" }, function(
err,
docs
) {
if (
docs.length > 0 &&
(docs[0].userpass == undefined ||
docs[0].userpass == "" ||
(msg.hasOwnProperty("pass") && docs[0].userpass == msg.pass))
) {
if (
docs !== null &&
docs.length !== 0 &&
docs[0].adminpass !== "" &&
docs[0].adminpass == hash
) {
db.collection("suggested_thumbnails").update(
{ channel: channel },
{ $set: { thumbnail: msg.thumbnail } },
{ upsert: true },
function(err, docs) {
Notifications.requested_change(
"thumbnail",
msg.thumbnail,
channel
);
socket.emit("toast", "suggested_thumbnail");
}
);
}
} else {
socket.emit("auth_required");
}
});
});
} else {
socket.emit("toast", "thumbnail_denied");
}
}
function description(msg, coll, guid, offline, socket) {
if (msg.description && msg.channel && msg.description.length < 100) {
if (typeof msg.channel != "string" || typeof msg.description != "string") {
var result = {
channel: {
expected: "string",
got: msg.hasOwnProperty("channel") ? typeof msg.channel : undefined
},
pass: {
expected: "string",
got: msg.hasOwnProperty("pass") ? typeof msg.pass : undefined
},
description: {
expected: "string",
got: msg.hasOwnProperty("description")
? typeof msg.description
: undefined
},
adminpass: {
expected: "string",
got: msg.hasOwnProperty("adminpass")
? typeof msg.adminpass
: undefined
}
};
socket.emit("update_required", result);
return;
}
//coll = coll.replace(/ /g,'');
Functions.getSessionAdminUser(Functions.getSession(socket), coll, function(
userpass,
adminpass,
gotten
) {
if (userpass != "" || msg.pass == undefined) {
msg.pass = userpass;
} else if (msg.hasOwnProperty("pass")) {
msg.pass = crypto
.createHash("sha256")
.update(Functions.decrypt_string(msg.pass))
.digest("base64");
}
if (adminpass != "" || msg.adminpass == undefined) {
msg.adminpass = Functions.hash_pass(adminpass);
} else {
msg.adminpass = Functions.hash_pass(
Functions.hash_pass(Functions.decrypt_string(msg.adminpass), true)
);
}
var channel = msg.channel.toLowerCase();
var hash = msg.adminpass;
db.collection(channel + "_settings").find({ id: "config" }, function(
err,
docs
) {
if (
docs.length > 0 &&
(docs[0].userpass == undefined ||
docs[0].userpass == "" ||
(msg.hasOwnProperty("pass") && docs[0].userpass == msg.pass))
) {
if (
docs !== null &&
docs.length !== 0 &&
docs[0].adminpass !== "" &&
docs[0].adminpass == hash
) {
db.collection("suggested_descriptions").update(
{ channel: channel },
{ $set: { description: msg.description } },
{ upsert: true },
function(err, docs) {
Notifications.requested_change(
"description",
msg.description,
channel
);
socket.emit("toast", "suggested_description");
}
);
}
} else {
socket.emit("auth_required");
}
});
});
} else {
socket.emit("toast", "description_denied");
}
}
function rules(msg, coll, guid, offline, socket) {
if (msg.rules && msg.channel && msg.rules.length < 250) {
if (typeof msg.channel != "string" || typeof msg.rules != "string") {
var result = {
channel: {
expected: "string",
got: msg.hasOwnProperty("channel") ? typeof msg.channel : undefined
},
pass: {
expected: "string",
got: msg.hasOwnProperty("pass") ? typeof msg.pass : undefined
},
rules: {
expected: "string",
got: msg.hasOwnProperty("rules") ? typeof msg.rules : undefined
},
adminpass: {
expected: "string",
got: msg.hasOwnProperty("adminpass")
? typeof msg.adminpass
: undefined
}
};
socket.emit("update_required", result);
return;
}
//coll = coll.replace(/ /g,'');
Functions.getSessionAdminUser(Functions.getSession(socket), coll, function(
userpass,
adminpass,
gotten
) {
if (userpass != "" || msg.pass == undefined) {
msg.pass = userpass;
} else if (msg.hasOwnProperty("pass")) {
msg.pass = crypto
.createHash("sha256")
.update(Functions.decrypt_string(msg.pass))
.digest("base64");
}
if (adminpass != "" || msg.adminpass == undefined) {
msg.adminpass = Functions.hash_pass(adminpass);
} else {
msg.adminpass = Functions.hash_pass(
Functions.hash_pass(Functions.decrypt_string(msg.adminpass), true)
);
}
var channel = msg.channel.toLowerCase();
var hash = msg.adminpass;
db.collection(channel + "_settings").find({ id: "config" }, function(
err,
docs
) {
if (
docs.length > 0 &&
(docs[0].userpass == undefined ||
docs[0].userpass == "" ||
(msg.hasOwnProperty("pass") && docs[0].userpass == msg.pass))
) {
if (
docs !== null &&
docs.length !== 0 &&
docs[0].adminpass !== "" &&
docs[0].adminpass == hash
) {
db.collection("suggested_rules").update(
{ channel: channel },
{ $set: { rules: msg.rules } },
{ upsert: true },
function(err, docs) {
Notifications.requested_change("rules", msg.rules, channel);
socket.emit("toast", "suggested_rules");
}
);
}
} else {
socket.emit("auth_required");
}
});
});
} else {
socket.emit("toast", "rules_denied");
}
}
module.exports.thumbnail = thumbnail;
module.exports.description = description;
module.exports.rules = rules;

24
server/models/user.js Normal file
View File

@@ -0,0 +1,24 @@
// app/models/user.js
// load the things we need
var mongoose = require("mongoose");
var bcrypt = require("bcrypt-nodejs");
// define the schema for our user model
var userSchema = mongoose.Schema({
username: String,
password: String
});
// methods ======================
// generating a hash
userSchema.methods.generateHash = function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};
// checking if password is valid
userSchema.methods.validPassword = function(password) {
return bcrypt.compareSync(password, this.password);
};
// create the model for users and expose it to our app
module.exports = mongoose.model("User", userSchema);

82
server/pm2.js Normal file
View File

@@ -0,0 +1,82 @@
var cluster = require("cluster"),
net = require("net"),
path = require("path"),
//publicPath = path.join(__dirname, 'public'),
http = require("http"),
port = 8080,
//farmhash = require('farmhash'),
uniqid = require("uniqid"),
num_processes = require("os").cpus().length;
publicPath = path.join(__dirname, "public");
pathThumbnails = __dirname;
var redis = require("redis");
var client = redis.createClient({ host: "localhost", port: 6379 });
startSingle(true, true);
function startSingle(clustered, redis_enabled) {
var server;
var client = require("./apps/client.js");
try {
var cert_config = require(path.join(
path.join(__dirname, "config"),
"cert_config.js"
));
var fs = require("fs");
var privateKey = fs.readFileSync(cert_config.privateKey).toString();
var certificate = fs.readFileSync(cert_config.certificate).toString();
var ca = fs.readFileSync(cert_config.ca).toString();
var credentials = {
key: privateKey,
cert: certificate,
ca: ca
};
var https = require("https");
server = https.Server(credentials, routingFunction);
} catch (err) {
console.log("Starting without https (probably on localhost)");
server = http.createServer(routingFunction);
}
server.listen(port, onListen);
var socketIO = client.socketIO;
var redis = require("socket.io-redis");
try {
socketIO.adapter(redis({ host: "localhost", port: 6379 }));
} catch (e) {
console.log("No redis-server to connect to..");
}
socketIO.listen(server);
}
function onListen() {
console.log("Started with pid [" + process.pid + "]");
}
function routingFunction(req, res, next) {
var client = require("./apps/client.js");
var admin = require("./apps/admin.js");
try {
var url = req.headers["x-forwarded-host"]
? req.headers["x-forwarded-host"]
: req.headers.host.split(":")[0];
var subdomain = req.headers["x-forwarded-host"]
? req.headers["x-forwarded-host"].split(".")
: req.headers.host.split(":")[0].split(".");
if (subdomain.length > 1 && subdomain[0] == "admin") {
admin(req, res, next);
} else {
client(req, res, next);
}
} catch (e) {
console.log("Bad request for " + req.headers.host + req.url, e);
res.statusCode = 500;
res.write("Bad request"); //write a response to the client
res.end(); //end the response
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,37 @@
window.addEventListener("DOMContentLoaded", function() {
document
.getElementById("login_button")
.addEventListener("click", function(event) {
event.preventDefault();
document.querySelector("#login_form").submit();
});
document
.getElementById("login_form")
.addEventListener("submit", function(event) {
if (this.password.value == "" || this.username.value == "") {
e.preventDefault();
}
});
if (
window.location.pathname == "/signup/" ||
window.location.pathname == "/signup"
) {
document
.querySelector("#login_form")
.insertAdjacentHTML(
"afterbegin",
"<input type='text' name='token' placeholder='Token' required autocomplete='off' />"
);
document.querySelector("#login_form").setAttribute("action", "/signup");
}
if (window.location.hash == "#failed") {
window.location.hash = "";
M.toast({
html: "Couldn't find a user with that username or password..",
displayLength: 4000,
classes: "red lighten"
});
}
});

View File

@@ -0,0 +1,63 @@
@keyframes snow {
0% {
background-position: 0px 0px, 0px 0px, 0px 0px;
}
100% {
background-position: 500px 500px, 400px 400px, 300px 300px;
}
}
@-moz-keyframes snow {
0% {
background-position: 0px 0px, 0px 0px, 0px 0px;
}
100% {
background-position: 500px 500px, 400px 400px, 300px 300px;
}
}
@-webkit-keyframes snow {
0% {
background-position: 0px 0px, 0px 0px, 0px 0px;
}
100% {
background-position: 500px 500px, 400px 400px, 300px 300px;
}
}
@-ms-keyframes snow {
0% {
background-position: 0px 0px, 0px 0px, 0px 0px;
}
100% {
background-position: 500px 500px, 400px 400px, 300px 300px;
}
}
/*
*
*
* Source: https://codepen.io/NickyCDK/pen/AIonk
*
*/
#snow {
pointer-events: none;
background: none;
font-family: Androgyne;
background-image: url("/assets/images/s1.png"), url("/assets/images/s2.png"),
url("/assets/images/s3.png");
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
z-index: 1;
-webkit-animation: snow 10s linear infinite;
-moz-animation: snow 10s linear infinite;
-ms-animation: snow 10s linear infinite;
animation: snow 10s linear infinite;
}
#snow.snow-channel {
z-index: 9999;
width: calc(100% - 0.75rem);
height: calc(100% - 32px);
}

View File

@@ -0,0 +1,716 @@
.card-image {
height: 100px;
width: 100px;
background-position: center;
background-size: 180%;
height: 100% !important;
}
.side_away {
-webkit-transition: all 0.3s !important;
-moz-transition: all 0.3s !important;
-o-transition: all 0.3s !important;
transition: all 0.3s !important;
}
.prev.playbar,
.skip.playbar {
float: left;
font-size: 24px;
cursor: pointer;
height: 32px;
line-height: 31px;
padding-top: 3px;
}
.site_loader {
position: absolute;
top: 0;
left: 0;
margin: auto;
bottom: 0;
right: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 9;
}
.prev,
.skip {
display: flex;
justify-content: center;
align-items: center;
}
#playpause,
.prev.playbar,
.skip.playbar {
padding: 0 2.5px;
}
.playbar-btn:hover {
background-color: rgba(0, 0, 0, 0.6);
color: hsla(0, 0%, 100%, 0.5);
}
.hide {
display: none !important;
}
.playbar-btn {
cursor: pointer;
transition: background-color 0.2s;
}
#controls,
.playbar {
color: #fff;
}
#player_loader_container {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
}
#player_overlay {
position: relative;
height: calc(100% - 32px);
top: 0px;
left: 0px;
width: 60vw;
margin-bottom: 5px;
}
.soundcloud_info_container {
position: absolute;
bottom: 20px;
right: 0px;
padding-left: 20px;
display: flex;
align-items: center;
background: rgba(0, 0, 0, 0.7);
}
.soundcloud_info_container a {
margin: 0 10px;
}
.card {
cursor: pointer;
background-color: rgba(255, 255, 255, 0.04) !important;
}
#empty-channel-message {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
color: white;
font-size: 2em;
}
.noselect {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.video_only {
width: 100vw !important;
height: 100vh !important;
}
#player {
width: 60vw;
height: calc(100vh - 32px);
padding-top: 51px;
}
#pageButtons {
text-align: center;
padding-top: 15px;
display: flex;
justify-content: space-around;
}
.prev_page,
.next_page {
cursor: pointer;
}
#wrapper {
height: calc(100% - 46px);
}
.prev_page_hide,
.next_page_hide {
visibility: visible !important;
color: gray;
}
.list-song {
background-color: rgba(255, 255, 255, 0.04) !important;
}
#list-song-html {
display: none;
}
#song-title {
display: none;
}
#zoffchannel {
display: none;
}
.list-image,
.list-suggested-image {
width: 34%;
height: 66px;
float: left;
}
.list-image:after {
-webkit-transition: all 0.3s;
transition: all 0.3s;
font-family: "Material Icons";
content: "thumb_up";
speak: none;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
text-rendering: auto;
-webkit-font-smoothing: antialiased;
color: white;
font-size: -webkit-xxx-large;
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
background: rgba(0, 0, 0, 0.8);
opacity: 0;
/* transition: all .1s ease; */
display: flex;
align-items: center;
justify-content: center;
}
.list-suggested-image:after {
font-family: "Material-Design-Icons";
speak: none;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
text-rendering: auto;
-webkit-font-smoothing: antialiased;
content: "\e625"; /*"\e800";*/
color: white;
font-size: 65px;
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
background: rgba(0, 0, 0, 0.8);
opacity: 0;
transition: all 0.1s ease;
}
.vote-container:hover .list-image:after,
.add-suggested:hover .list-suggested-image:after {
opacity: 1;
}
.vote-span {
opacity: 0.7;
padding: 0 0 0 10px;
color: white !important;
}
.list-song {
background-color: rgba(255, 255, 255, 0.04);
color: white;
font: 12px Arial, sans-serif;
-webkit-transition: height 0.3s;
-moz-transition: height 0.3s;
-o-transition: height 0.3s;
transition: height 0.3s;
height: 66px;
width: 100%;
}
.list-song .card-content {
padding: 0;
}
.list-title {
font-size: 13px !important;
display: block;
color: white;
font-size: 1em;
text-align: left;
padding: 0 10px 0 10px;
line-height: 2.6rem;
}
.card-image {
cursor: pointer;
}
.card {
margin: 2.5px 0 2.5px 0 !important;
}
.card:hover {
box-shadow: 0 5px 5px 0 rgba(0, 0, 0, 0.16), 0 5px 10px 0 rgba(0, 0, 0, 0.12);
}
#playlist {
height: 100vh;
width: 40vw;
overflow: hidden;
padding-left: 10px;
padding-right: 10px;
padding-top: 5px;
}
#zoffbutton {
cursor: pointer;
background-image: url(/assets/images/z.svg);
width: 90px;
height: 50px;
background-position: 50%;
background-size: 85%;
background-repeat: no-repeat;
}
.progress {
background-color: rgba(0, 0, 0, 0) !important;
}
.indeterminate {
background-color: white !important;
}
#controls {
background: inherit;
position: relative;
opacity: 0;
height: 32px;
width: 60vw;
color: white;
margin-top: -5px;
}
#playpause,
#duration,
#volume-button {
float: left;
color: white;
}
.margin-playbar {
margin-left: 10px;
}
#seekToDuration {
position: absolute;
background: #2d2d2d;
color: white;
padding: 10px 8px;
z-index: 2000;
background-color: #2d2d2d;
border-radius: 2px;
color: #fff;
min-height: 36px;
text-align: center;
max-width: calc(100% - 4px);
pointer-events: none;
}
#playpause,
#volume-button {
font-size: 23px;
}
#playpause:hover,
#volume-button:hover,
#fullscreen:hover {
color: rgba(255, 255, 255, 0.5);
}
#fullscreen {
float: right;
color: white;
margin-right: 15px;
}
#duration,
#viewers {
margin-top: 5px;
font-family: "Roboto", sans-serif;
font-weight: 300;
margin-left: 15px;
margin-right: 10px;
}
.channel-info-container {
align-items: center;
display: flex;
position: absolute;
bottom: 50px;
left: 0px;
background: rgba(0, 0, 0, 0.5);
padding-left: 5px;
padding-right: 25px;
}
.channel-title {
margin-left: -20px;
}
#viewers {
float: right;
display: flex;
align-items: center;
}
#play,
#pause,
#volume-button,
#fullscreen {
font-size: 20px;
cursor: pointer;
}
.ui-slider-vertical {
width: 0.8em;
height: 100px;
}
.ui-slider {
position: relative;
text-align: left;
}
.ui-slider-vertical .ui-slider-range-min {
bottom: 0;
}
.ui-slider-vertical .ui-slider-range {
left: 0;
width: 100%;
border-radius: 0px !important;
}
.ui-slider .ui-slider-range {
position: absolute;
z-index: 1;
font-size: 0.7em;
display: block;
border: 0;
background-position: 0 0;
}
.ui-slider-vertical .ui-slider-handle {
left: -0.3em;
margin-left: 0;
margin-bottom: -0.6em;
}
.ui-slider .ui-slider-handle {
position: absolute;
z-index: 2;
width: 1.2em;
height: 1.2em;
cursor: default;
-ms-touch-action: none;
touch-action: none;
}
.ui-slider-horizontal .ui-slider-range-min {
left: 0;
}
.ui-slider-horizontal .ui-slider-range {
top: 0;
height: 100%;
}
.ui-slider .ui-slider-range {
position: absolute;
z-index: 1;
font-size: 0.7em;
display: block;
border: 0;
background-position: 0 0;
}
.ui-slider-horizontal .ui-slider-handle {
top: -0.3em;
margin-left: -0.6em;
}
#volume {
border-radius: 10px;
cursor: pointer;
float: left;
position: relative;
left: 10px;
margin: 13px auto;
height: 5px;
width: 75px;
/*background-color:rgba(0, 0, 0, 0.5);*/
background: rgba(0, 0, 0, 0.5) 50% 50% repeat-x;
border: none;
outline: none;
/*border-radius: 2px;*/
}
#volume.vertical {
border-radius: 0px;
}
#volume .volume-slid {
border-radius: 10px;
background: white;
height: 5px;
width: 0%;
}
#volume .volume-slid.vertical {
width: 100%;
height: 0%;
border-radius: 0px;
bottom: 0px;
position: absolute;
}
#volume .volume-handle {
height: 15px;
width: 15px;
background: white;
border-radius: 15px;
border: 1px solid lightgrey;
margin-top: -9.75px;
position: absolute;
left: 0%;
margin-left: -5.75px;
transition: background 0.2s ease, box-shadow 0.2s ease;
}
#volume .volume-handle.vertical {
bottom: 0%;
display: none;
}
#volume .volume-handle.ui-state-active {
box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.01),
0 0 0 7px rgba(255, 255, 255, 0.3);
position: absolute;
width: 14px;
height: 14px;
border-radius: 21px;
background: #dadada;
}
#toast-container {
left: 2%;
cursor: pointer;
width: 70vw;
display: flex;
flex-direction: column;
align-items: baseline;
/*pointer-events:none;*/
}
.toast {
word-break: normal;
cursor: pointer;
}
.play {
background-size: auto;
width: 55px;
height: 27px;
}
.pause {
background-size: auto;
width: 55px;
height: 27px;
}
.hide {
display: none !important;
}
#bar {
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
}
html {
overflow: hidden;
}
#pageButtons {
background: inherit;
}
#pageButtons,
#pageButtons a {
color: white !important;
width: 100%;
justify-content: space-evenly;
align-items: center;
}
#pageButtons a,
#pageButtons span {
padding-left: 1px;
padding-right: 1px;
}
#pageNumber {
cursor: default;
color: white;
padding: 0;
display: inline-flex;
align-items: center;
height: 36px;
justify-content: center;
width: 100%;
}
.prev_page,
.next_page,
.last_page,
.first_page {
cursor: pointer;
}
.prev_page_hide,
.next_page_hide,
.last_page_hide,
.first_page_hide {
visibility: visible !important;
color: gray;
cursor: default;
height: 32px;
line-height: 36px;
width: 100%;
justify-content: center;
}
.prev_page_hide,
.prev_page,
.first_page,
.first_page_hide {
padding: 0 1px;
height: 32px;
line-height: 36px;
}
.next_page_hide,
.next_page,
.last_page,
.last_page_hide {
padding: 0 0px;
display: flex;
}
.first_page,
.first_page_hide {
padding: 0 0 0 10px;
}
.last_page,
.last_page_hide {
padding: 0 10px 0 0;
}
body {
background: #2d2d2d;
}
.vote-container {
height: 100%;
width: 100%;
}
.card-duration {
border-top-right-radius: 4px;
position: absolute;
bottom: 0px;
left: 0px;
background: rgba(0, 0, 0, 0.7);
color: white;
padding: 0 5px;
}
#song-title {
position: absolute;
z-index: 9;
color: white;
background: rgba(0, 0, 0, 0.5);
font-size: 1.5rem;
padding: 10px;
width: 60vw;
}
/*
.last_page, .last_page_hide, .first_page, .first_page_hide{
display: none !important;
}
*/
#wrapper {
background: inherit;
/*height: 94%;*/
}
@media only screen and (max-width: 992px) and (min-width: 601px) {
#toast-container {
bottom: 90px;
}
}
@media only screen and (max-width: 736px) and (max-width: 500px),
only screen and (max-device-width: 736px) and (orientation: landscape) {
#player-container {
/*display: none;*/
position: absolute;
width: 100vw;
height: 200px;
bottom: 0px;
}
#controls {
width: 100vw;
margin-top: 0px;
}
#player {
width: 100vw;
height: 170px;
display: block;
}
#player_overlay {
position: relative;
width: 100vw;
margin-bottom: 0px;
}
#playlist {
width: 100vw;
height: calc(100vh - 208px);
}
#toast-container {
min-width: 96%;
bottom: auto;
}
#song-title {
width: 100vw;
font-size: 1.2rem;
top: calc(100vh - 200px);
}
}

View File

@@ -0,0 +1,58 @@
.material-icons {
display: none;
width: 24px;
}
html {
background: #2d2d2d;
}
body {
background: white;
}
a {
outline: 0 !important;
}
body {
display: flex;
min-height: 100vh;
flex-direction: column;
overflow-x: hidden;
-webkit-transition: background-color 1s;
-moz-transition: background-color 1s;
-ms-transition: background-color 1s;
-o-transition: background-color 1s;
transition: background-color 1s;
overflow-y: scroll !important;
}
input[type="text"]:focus:not([readonly]),
input[type="password"]:focus:not([readonly]),
input[type="email"]:focus:not([readonly]),
input[type="url"]:focus:not([readonly]),
input[type="time"]:focus:not([readonly]),
input[type="date"]:focus:not([readonly]),
input[type="datetime-local"]:focus:not([readonly]),
input[type="tel"]:focus:not([readonly]),
input[type="number"]:focus:not([readonly]),
input[type="search"]:focus:not([readonly]),
textarea.materialize-textarea:focus:not([readonly]) {
border-bottom: 1px solid #9d9d9d;
box-shadow: 0 1px 0 0 #9d9d9d;
}
nav ul li:hover,
nav ul li.active {
background-color: rgba(0, 0, 0, 0.1);
}
.full-height {
height:100vh;
}
* {
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-moz-tap-highlight-color: rgba(0, 0, 0, 0);
}

View File

@@ -0,0 +1,858 @@
@media only screen and (min-width: 993px) {
.toast {
float: left;
}
nav .zbrand {
left: 0px !important;
}
}
@media screen and (-webkit-min-device-pixel-ratio: 0) {
#wrapper {
padding-right: 0vh !important;
width: 100% !important;
overflow: hidden;
}
}
@media only screen and (max-width: 992px) {
nav .brand-logo {
left: 0%;
transform: translateX(0%);
-webkit-transform: translateX(0%);
padding-left: 0px;
}
.zbrand {
/*max-width: 35%;*/
}
}
@media (min-width: 600px),
(min-width: 961px),
(min-width: 1025px),
(min-width: 1281px) {
#controls {
background: none !important;
}
}
@media only screen and (max-width: 736px) and (max-width: 600px),
only screen and (max-device-width: 736px) and (orientation: landscape) {
.autocomplete-content.dropdown-content {
width: 95vw !important;
}
.mobile-overflow {
overflow: visible;
}
.footer-buttons,
.footer-buttons li a {
width: 100%;
}
#main-row {
margin-right: -3px !important;
background: inherit;
}
.admin_panel {
margin-top: 25px !important;
}
#suggestions {
height: auto !important;
/*padding-bottom: 0px;*/
}
.margin-playbar {
margin-left: 10px;
}
#chat-container {
height: calc(100vh - 48px - 64px - 120px);
margin-bottom: 18px;
}
#player_bottom_overlay {
top: 7px;
}
.mobile-delete {
height: 100%;
position: absolute;
display: flex;
justify-content: center;
align-items: center;
width: 60px;
top: 0px;
right: -60px;
/* overflow: visible; */
z-index: -99999999;
}
#main-container {
/*padding-bottom: 20px;*/
}
#fireplace_player {
display: none !important;
}
.addedJoinBox {
display: none;
}
#playbar {
display: block;
position: fixed;
bottom: 0px;
z-index: 1000;
left: 0;
right: 0;
}
.list-title {
width: 66%;
}
.hamburger-sidenav {
margin: 20px 10px 12px 10px;
}
#main_section_frontpage {
margin-top: -20px;
padding-top: 0px;
}
.delete_button,
.del_suggested,
.del_user_suggested {
bottom: -9px;
/* line-height: inherit; */
height: auto;
display: flex;
align-items: center;
border-top: none;
padding: 0px !important;
margin: 0px !important;
}
.vote-container:hover .list-image:after,
.add-suggested:hover .list-suggested-image:after {
opacity: 1;
content: "thumb_up";
}
.list-image:after,
.list-suggested-image:after {
content: none;
}
.delete_button .material-icons,
.del_suggested .material-icons,
.del_user_suggested .material-icons {
font-size: 2.5rem;
}
#remote-sidebar-buttons-container {
text-align: center;
}
.slider-vol-mobile {
display: none !important;
}
#frontpage-viewer-counter {
right: 56px;
width: 62px;
left: inherit;
text-align: right;
}
.brand-logo {
left: 0 !important;
padding-left: 0px !important;
-webkit-transform: translateX(0%) !important;
-moz-transform: translateX(0%) !important;
-ms-transform: translateX(0%) !important;
-o-transform: translateX(0%) !important;
transform: translateX(0%) !important;
}
#player_overlay {
height: calc(30vh);
bottom: -33px !important;
top: 7px;
width: 100vw;
height: 200px;
pointer-events: all;
display: none;
}
#wrapper {
min-height: 75px;
}
.click-through {
pointer-events: none;
}
.zicon {
height: 100%;
}
/*.list-remove{
margin-top:-68px;
}*/
#settings-bar {
overflow-x: hidden;
}
#remote-mobile-container {
margin-left: -7px;
}
#remote_channel {
color: #2d2d2d;
/*width:90%;*/
}
.show-only-mobile {
display: block;
}
#volume-control-remote {
display: none;
}
#remote_header {
color: #2d2d2d;
font-size: 1.5em;
padding: 10px;
text-align: center;
}
#all_chat,
#channelchat {
height: calc(100vh - 352px);
}
#fp-nav {
width: 100%;
}
#search-wrapper {
width: 100vw;
}
#search-wrapper:hover,
#song-title:hover {
/*background: inherit;*/
}
#toast-container {
left: 0% !important;
width: 100vw;
bottom: 55px;
}
.empty-inner-results {
height: 100vh !important;
}
#empty-results {
height: calc(100vh - 112px);
}
.search_input {
padding-right: 50px;
width: calc(100vw - 78px);
}
.playlist-tabs-loggedIn,
.playlist-tabs {
width: calc(100%) !important;
}
#wrapper.tabs_height {
height: calc(100vh - 48px - 64px - 134px);
overflow: initial;
}
.client-wrapper {
height: calc(100vh - 48px - 64px - 36px) !important;
}
/*.client-results-height {
margin-top: 50px !important;
}*/
.client-pagination-height {
height: 80px;
}
.brand-mobile {
padding-left: 0px !important;
}
#player {
height: calc(100%);
display: none;
width: 100vw;
}
.pointer-events-all-mobile {
pointer-events: all !important;
}
.small-display {
display: block !important;
}
.small-display-hide {
display: none !important;
}
.hide-on-small-only {
display: none;
}
#controls {
/*opacity: 1;*/
overflow: initial;
background-color: rgb(70, 70, 70);
height: 50px;
margin-top: inherit;
bottom: 0px;
position: fixed;
pointer-events: all;
-webkit-transition: background-color 0.5s ease;
-moz-transition: background-color 0.5s ease;
-o-transition: background-color 0.5s ease;
transition: background-color 0.5s ease;
}
#chat-container {
padding-left: 10px;
}
#play,
#pause,
#volume-button i,
#fullscreen i,
.castButton-unactive i,
.castButton-active i,
.playbar-btn i {
font-size: 31px;
font-size: 31px !important;
margin-top: 8px;
line-height: 31px;
}
.skip.playbar,
.prev.playbar,
#playpause {
padding-top: 0px;
height: 51px;
}
.castButton-unactive,
.castButton-active {
margin-right: 10px;
padding-right: 10px;
padding-left: 0px;
}
/*#volume{
display: none;
}*/
.volume-container {
position: absolute;
right: 0%;
width: 37px;
top: -127px;
height: 127px;
left: auto;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background: inherit;
}
.volume-container-cast {
right: 39px;
}
#volume {
width: 10px;
height: 100px;
left: 0px;
}
.ui-widget-header {
background: rgb(255, 255, 255);
}
#viewers {
margin-top: 8px;
font-size: 20px;
font-weight: 400;
}
.footer-copyright {
margin-bottom: 10px;
}
#duration {
font-size: 20px;
font-weight: 400;
margin-top: 9px;
letter-spacing: -0.7px;
margin-left: 10px;
}
#volume-button {
float: right;
/* margin-right: 5px; */
padding-right: 3px;
margin-left: 0px;
padding-left: 3px;
height: 51px;
padding-top: 0px;
width: 37px;
}
#fullscreen {
float: right;
}
.castButton {
width: 39px;
height: 51px;
padding-top: 0em;
}
.label-for-mobile-frontpage {
display: initial;
width: auto !important;
margin-left: auto !important;
}
.mega {
background: white;
}
#bar {
background-color: rgba(0, 0, 0, 1);
}
.channel-finder .input-field {
padding: 0 0.75rem;
}
.mega form {
display: block;
width: auto;
margin-bottom: 0px;
}
.mega input {
color: black;
text-shadow: none;
margin-left: 0px !important;
padding-left: 0px !important;
}
.room-namer.autocomplete {
margin-left: 0px !important;
margin-top: auto !important;
}
#channel-share-modal {
width: 100%;
}
#autocomplete-input {
width: 100%;
border-bottom: 1px solid #9e9e9e !important;
}
#autocomplete-input::-webkit-input-placeholder {
/* WebKit browsers */
color: #fff;
}
#autocomplete-input:-moz-placeholder {
/* Mozilla Firefox 4 to 18 */
color: #fff;
opacity: 1;
}
#autocomplete-input::-moz-placeholder {
/* Mozilla Firefox 19+ */
color: #fff;
opacity: 1;
}
#autocomplete-input:-ms-input-placeholder {
/* Internet Explorer 10+ */
color: #fff;
}
.room-namer::-webkit-input-placeholder {
/*color:rgb(155, 155, 155) !important;*/
-webkit-transition: opacity 0.5s;
color: transparent !important;
}
#mega-background,
.mega h5,
#snow,
.pitch,
.channel-finder .input-field .prefix,
.listen-button {
display: none !important;
}
.channel-finder .input-field {
display: initial;
/* width: 69%; */
justify-content: center;
}
/*.mega {display:none;}*/
.mobile-search {
display: block;
}
.toast {
height: auto;
}
.remote-panel {
display: none;
}
.navbar-fixed,
#nav {
/*position: relative;*/
}
.navbar-fixed {
height: 100px;
margin-bottom: 25px;
}
.control-list {
position: absolute !important;
/*width: 120px;*/
}
.client-control-list {
width: auto;
}
.page-footer {
padding-top: 40px !important;
}
.padding-bottom-novideo {
padding-bottom: 40px;
}
.padding-bottom-extra {
padding-bottom: 210px;
}
.main,
#main-row,
.video-container,
#playlist {
height: auto !important;
margin-bottom: 2px;
margin-top: -6px;
}
.main {
max-width: 99%;
background: inherit;
}
#pageButtons {
margin-left: -11px;
width: 100vw;
position: relative;
padding-bottom: 3px;
}
#search_loader {
height: 56px;
}
#playlist {
/*margin-left: 10px;*/
background: inherit;
width: calc(100% - 10px);
overflow: hidden;
}
#player {
pointer-events: none;
margin-top: 7px;
}
.search-container,
.song-title {
background: inherit;
}
.row .col.s12 {
width: 100% !important;
}
#main-row.row #video-container.video-container {
position: fixed;
display: block !important;
width: 106vw !important;
height: 200px !important;
z-index: 10;
bottom: 55px;
}
#video-container.video-container.frontpage-player {
width: auto !important;
}
.chan {
text-shadow: 0px 0px 0px rgba(0, 0, 0, 0.42);
width: calc(100vw - 170px) !important;
max-width: calc(100% - 87.5px - 130px);
font-size: 2rem;
padding-right: 0px;
overflow: hidden;
/* display: block; */
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.chan-client {
max-width: calc(100% - 87.5px - 170px);
}
.control-list li a {
min-width: 0px;
width: 37px;
padding: 0 0 0 0px;
}
nav .zbrand {
-webkit-transform: initial;
transform: initial;
display: flex;
max-width: initial;
width: 100vw;
-webkit-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),
0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12),
0 3px 1px -2px rgba(0, 0, 0, 0.2);
}
.title-container {
background-color: rgba(0, 0, 0, 0.1);
display: block;
top: 56px !important;
width: 100vw;
background: #2d2d2d;
}
.title-container li {
/*width: 100%;*/
}
#inner-results {
height: calc(100vh - 54px - 64px - 123px);
overflow-y: scroll;
overflow-x: hidden;
}
.thumb-and-info {
flex-direction: column;
}
.result_info {
opacity: 0.8;
margin-top: 0px;
height: 21px;
margin-right: 0px;
padding: 0px;
line-height: initial;
border-top-right-radius: 3px;
display: flex;
align-items: center;
justify-content: center;
width: 55px;
margin-left: 10px;
margin-top: -16px;
}
.search_results {
margin-top: 45px;
background: #000;
}
.results-tabs .indicator {
margin-top: 50px;
}
#results,
#results_soundcloud {
background-color: #000;
margin-top: -8px;
}
#results {
max-height: calc(100vh - 165px);
}
#results_soundcloud {
height: calc(100vh - 64px - 54px);
}
#results_soundcloud #inner-results {
height: calc(100vh - 54px - 64px - 47px);
}
.result {
margin: 0;
width: 99%;
}
.result-get-more-info {
background: black;
position: absolute;
right: 0px;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
width: 45px;
}
.result-info-no-buttons {
width: calc(100% - 200px);
}
.result-object {
-webkit-transform: translateX(0%);
transform: translateX(0%);
overflow: hidden;
}
.result {
-webkit-transition: margin 0.5s;
-moz-transition: margin 0.5s;
transition: margin 0.5s;
}
#user_password {
width: 80% !important;
}
#addToListInput {
top: -85px;
right: 35px;
}
#addToOtherList {
padding: 0 10px;
}
.result-object-slid {
/*-webkit-transform: translateX(calc(-100% + 45px)) !important;
transform: translateX(calc(-100% + 45px)) !important;*/
margin-left: -94%;
}
.result-start-end-container {
/*visibility: hidden;
pointer-events: none;*/
margin-left: 120%;
position: relative;
top: -10px;
}
.result-info-buttons {
margin-top: 20px;
width: 150px;
}
.result .search-title {
white-space: nowrap;
width: calc(100vw - 165px);
margin-top: -5px;
z-index: 9999;
}
.result img {
margin: -3px 10px;
height: 50px;
width: 88.88px;
}
.result .add-many {
margin-top: 15px;
}
}
@media only screen and (max-device-width: 736px) and (orientation: landscape) {
.video-container {
width: 315px !important;
/* height: auto !important; */
right: -5px;
bottom: 20px;
}
}
@media only screen and (max-width: 768px) {
#results {
background-color: #000;
/*margin-top:56px;*/
}
.title-container {
top: 64px;
top: 0px;
}
}
@media only screen and (min-width: 769px) {
.navbar-fixed {
height: 64px;
}
nav .zbrand {
/*display: inline-block;*/
/*top:-22px;*/
/*left:100px;*/
}
.title-container li {
/*width: 71%;*/
}
#wrapper {
height: 100%;
width: 100%;
overflow: auto;
opacity: 1;
overflow: hidden;
padding-right: 0.5rem !important;
}
#playlist {
/*padding:0px 15px;*/
height: 90%;
height: calc(100vh - 64px);
overflow: hidden;
padding-right: 0px;
/*padding-right: 0px;*/
/*padding:0px 0px 0px 0px;*/
}
}

3434
server/public/assets/css/style.css Executable file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,175 @@
<!DOCTYPE html>
<html>
<head>
<title>Zoff OAuth Callback</title>
<script src="https://connect.soundcloud.com/sdk/sdk-3.3.0.js"></script>
<script type="text/javascript" src="/assets/dist/callback.min.js"></script>
<meta charset="UTF-8" />
<style>
@-webkit-keyframes uil-ring-anim {
0% {
-ms-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-ms-transform: rotate(360deg);
-moz-transform: rotate(360deg);
-webkit-transform: rotate(360deg);
-o-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@-webkit-keyframes uil-ring-anim {
0% {
-ms-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-ms-transform: rotate(360deg);
-moz-transform: rotate(360deg);
-webkit-transform: rotate(360deg);
-o-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@-moz-keyframes uil-ring-anim {
0% {
-ms-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-ms-transform: rotate(360deg);
-moz-transform: rotate(360deg);
-webkit-transform: rotate(360deg);
-o-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@-ms-keyframes uil-ring-anim {
0% {
-ms-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-ms-transform: rotate(360deg);
-moz-transform: rotate(360deg);
-webkit-transform: rotate(360deg);
-o-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@-moz-keyframes uil-ring-anim {
0% {
-ms-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-ms-transform: rotate(360deg);
-moz-transform: rotate(360deg);
-webkit-transform: rotate(360deg);
-o-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@-webkit-keyframes uil-ring-anim {
0% {
-ms-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-ms-transform: rotate(360deg);
-moz-transform: rotate(360deg);
-webkit-transform: rotate(360deg);
-o-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@-o-keyframes uil-ring-anim {
0% {
-ms-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-ms-transform: rotate(360deg);
-moz-transform: rotate(360deg);
-webkit-transform: rotate(360deg);
-o-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes uil-ring-anim {
0% {
-ms-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-ms-transform: rotate(360deg);
-moz-transform: rotate(360deg);
-webkit-transform: rotate(360deg);
-o-transform: rotate(360deg);
transform: rotate(360deg);
}
}
.uil-ring-css {
background: none;
width: 190px;
height: 190px;
transform: scale(1);
position: absolute;
left: 0;
right: 0;
margin: auto;
top: 0;
bottom: 0;
}
.uil-ring-css > div {
position: absolute;
width: 150px;
height: 150px;
border: 20px solid black;
border-radius: 50%;
border-bottom-color: transparent;
border-left-color: transparent;
transform: rotate(-45deg);'
-ms-animation: uil-ring-anim 1s linear infinite;
-moz-animation: uil-ring-anim 1s linear infinite;
-webkit-animation: uil-ring-anim 1s linear infinite;
-o-animation: uil-ring-anim 1s linear infinite;
animation: uil-ring-anim 1s linear infinite;
}
h4 {
text-align: center;
font-family: sans-serif;
font-size: 2rem;
}
</style>
</head>
<body>
<h4>Loading..</h4>
<div class="uil-ring-css"><div></div></div>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,46 @@
<svg id="livetype" xmlns="http://www.w3.org/2000/svg" width="119.66407" height="40" viewBox="0 0 119.66407 40">
<title>Download_on_the_App_Store_Badge_US-UK_RGB_blk_4SVG_092917</title>
<g>
<g>
<g>
<path d="M110.13477,0H9.53468c-.3667,0-.729,0-1.09473.002-.30615.002-.60986.00781-.91895.0127A13.21476,13.21476,0,0,0,5.5171.19141a6.66509,6.66509,0,0,0-1.90088.627A6.43779,6.43779,0,0,0,1.99757,1.99707,6.25844,6.25844,0,0,0,.81935,3.61816a6.60119,6.60119,0,0,0-.625,1.90332,12.993,12.993,0,0,0-.1792,2.002C.00587,7.83008.00489,8.1377,0,8.44434V31.5586c.00489.3105.00587.6113.01515.9219a12.99232,12.99232,0,0,0,.1792,2.0019,6.58756,6.58756,0,0,0,.625,1.9043A6.20778,6.20778,0,0,0,1.99757,38.001a6.27445,6.27445,0,0,0,1.61865,1.1787,6.70082,6.70082,0,0,0,1.90088.6308,13.45514,13.45514,0,0,0,2.0039.1768c.30909.0068.6128.0107.91895.0107C8.80567,40,9.168,40,9.53468,40H110.13477c.3594,0,.7246,0,1.084-.002.3047,0,.6172-.0039.9219-.0107a13.279,13.279,0,0,0,2-.1768,6.80432,6.80432,0,0,0,1.9082-.6308,6.27742,6.27742,0,0,0,1.6172-1.1787,6.39482,6.39482,0,0,0,1.1816-1.6143,6.60413,6.60413,0,0,0,.6191-1.9043,13.50643,13.50643,0,0,0,.1856-2.0019c.0039-.3106.0039-.6114.0039-.9219.0078-.3633.0078-.7246.0078-1.0938V9.53613c0-.36621,0-.72949-.0078-1.09179,0-.30664,0-.61426-.0039-.9209a13.5071,13.5071,0,0,0-.1856-2.002,6.6177,6.6177,0,0,0-.6191-1.90332,6.46619,6.46619,0,0,0-2.7988-2.7998,6.76754,6.76754,0,0,0-1.9082-.627,13.04394,13.04394,0,0,0-2-.17676c-.3047-.00488-.6172-.01074-.9219-.01269-.3594-.002-.7246-.002-1.084-.002Z" style="fill: #a6a6a6"/>
<path d="M8.44483,39.125c-.30468,0-.602-.0039-.90429-.0107a12.68714,12.68714,0,0,1-1.86914-.1631,5.88381,5.88381,0,0,1-1.65674-.5479,5.40573,5.40573,0,0,1-1.397-1.0166,5.32082,5.32082,0,0,1-1.02051-1.3965,5.72186,5.72186,0,0,1-.543-1.6572,12.41351,12.41351,0,0,1-.1665-1.875c-.00634-.2109-.01464-.9131-.01464-.9131V8.44434S.88185,7.75293.8877,7.5498a12.37039,12.37039,0,0,1,.16553-1.87207,5.7555,5.7555,0,0,1,.54346-1.6621A5.37349,5.37349,0,0,1,2.61183,2.61768,5.56543,5.56543,0,0,1,4.01417,1.59521a5.82309,5.82309,0,0,1,1.65332-.54394A12.58589,12.58589,0,0,1,7.543.88721L8.44532.875H111.21387l.9131.0127a12.38493,12.38493,0,0,1,1.8584.16259,5.93833,5.93833,0,0,1,1.6709.54785,5.59374,5.59374,0,0,1,2.415,2.41993,5.76267,5.76267,0,0,1,.5352,1.64892,12.995,12.995,0,0,1,.1738,1.88721c.0029.2832.0029.5874.0029.89014.0079.375.0079.73193.0079,1.09179V30.4648c0,.3633,0,.7178-.0079,1.0752,0,.3252,0,.6231-.0039.9297a12.73126,12.73126,0,0,1-.1709,1.8535,5.739,5.739,0,0,1-.54,1.67,5.48029,5.48029,0,0,1-1.0156,1.3857,5.4129,5.4129,0,0,1-1.3994,1.0225,5.86168,5.86168,0,0,1-1.668.5498,12.54218,12.54218,0,0,1-1.8692.1631c-.2929.0068-.5996.0107-.8974.0107l-1.084.002Z"/>
</g>
<g id="_Group_" data-name="&lt;Group&gt;">
<g id="_Group_2" data-name="&lt;Group&gt;">
<g id="_Group_3" data-name="&lt;Group&gt;">
<path id="_Path_" data-name="&lt;Path&gt;" d="M24.76888,20.30068a4.94881,4.94881,0,0,1,2.35656-4.15206,5.06566,5.06566,0,0,0-3.99116-2.15768c-1.67924-.17626-3.30719,1.00483-4.1629,1.00483-.87227,0-2.18977-.98733-3.6085-.95814a5.31529,5.31529,0,0,0-4.47292,2.72787c-1.934,3.34842-.49141,8.26947,1.3612,10.97608.9269,1.32535,2.01018,2.8058,3.42763,2.7533,1.38706-.05753,1.9051-.88448,3.5794-.88448,1.65876,0,2.14479.88448,3.591.8511,1.48838-.02416,2.42613-1.33124,3.32051-2.66914a10.962,10.962,0,0,0,1.51842-3.09251A4.78205,4.78205,0,0,1,24.76888,20.30068Z" style="fill: #fff"/>
<path id="_Path_2" data-name="&lt;Path&gt;" d="M22.03725,12.21089a4.87248,4.87248,0,0,0,1.11452-3.49062,4.95746,4.95746,0,0,0-3.20758,1.65961,4.63634,4.63634,0,0,0-1.14371,3.36139A4.09905,4.09905,0,0,0,22.03725,12.21089Z" style="fill: #fff"/>
</g>
</g>
<g>
<path d="M42.30227,27.13965h-4.7334l-1.13672,3.35645H34.42727l4.4834-12.418h2.083l4.4834,12.418H43.438ZM38.0591,25.59082h3.752l-1.84961-5.44727h-.05176Z" style="fill: #fff"/>
<path d="M55.15969,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H48.4302v1.50586h.03418a3.21162,3.21162,0,0,1,2.88281-1.60059C53.645,21.34766,55.15969,23.16406,55.15969,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C52.30227,29.01563,53.24953,27.81934,53.24953,25.96973Z" style="fill: #fff"/>
<path d="M65.12453,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H58.395v1.50586h.03418A3.21162,3.21162,0,0,1,61.312,21.34766C63.60988,21.34766,65.12453,23.16406,65.12453,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C62.26711,29.01563,63.21438,27.81934,63.21438,25.96973Z" style="fill: #fff"/>
<path d="M71.71047,27.03613c.1377,1.23145,1.334,2.04,2.96875,2.04,1.56641,0,2.69336-.80859,2.69336-1.91895,0-.96387-.67969-1.541-2.28906-1.93652l-1.60937-.3877c-2.28027-.55078-3.33887-1.61719-3.33887-3.34766,0-2.14258,1.86719-3.61426,4.51855-3.61426,2.624,0,4.42285,1.47168,4.4834,3.61426h-1.876c-.1123-1.23926-1.13672-1.9873-2.63379-1.9873s-2.52148.75684-2.52148,1.8584c0,.87793.6543,1.39453,2.25488,1.79l1.36816.33594c2.54785.60254,3.60645,1.626,3.60645,3.44238,0,2.32324-1.85059,3.77832-4.79395,3.77832-2.75391,0-4.61328-1.4209-4.7334-3.667Z" style="fill: #fff"/>
<path d="M83.34621,19.2998v2.14258h1.72168v1.47168H83.34621v4.99121c0,.77539.34473,1.13672,1.10156,1.13672a5.80752,5.80752,0,0,0,.61133-.043v1.46289a5.10351,5.10351,0,0,1-1.03223.08594c-1.833,0-2.54785-.68848-2.54785-2.44434V22.91406H80.16262V21.44238H81.479V19.2998Z" style="fill: #fff"/>
<path d="M86.065,25.96973c0-2.84863,1.67773-4.63867,4.29395-4.63867,2.625,0,4.29492,1.79,4.29492,4.63867,0,2.85645-1.66113,4.63867-4.29492,4.63867C87.72609,30.6084,86.065,28.82617,86.065,25.96973Zm6.69531,0c0-1.9541-.89551-3.10742-2.40137-3.10742s-2.40039,1.16211-2.40039,3.10742c0,1.96191.89453,3.10645,2.40039,3.10645S92.76027,27.93164,92.76027,25.96973Z" style="fill: #fff"/>
<path d="M96.18606,21.44238h1.77246v1.541h.043a2.1594,2.1594,0,0,1,2.17773-1.63574,2.86616,2.86616,0,0,1,.63672.06934v1.73828a2.59794,2.59794,0,0,0-.835-.1123,1.87264,1.87264,0,0,0-1.93652,2.083v5.37012h-1.8584Z" style="fill: #fff"/>
<path d="M109.3843,27.83691c-.25,1.64355-1.85059,2.77148-3.89844,2.77148-2.63379,0-4.26855-1.76465-4.26855-4.5957,0-2.83984,1.64355-4.68164,4.19043-4.68164,2.50488,0,4.08008,1.7207,4.08008,4.46582v.63672h-6.39453v.1123a2.358,2.358,0,0,0,2.43555,2.56445,2.04834,2.04834,0,0,0,2.09082-1.27344Zm-6.28223-2.70215h4.52637a2.1773,2.1773,0,0,0-2.2207-2.29785A2.292,2.292,0,0,0,103.10207,25.13477Z" style="fill: #fff"/>
</g>
</g>
</g>
<g id="_Group_4" data-name="&lt;Group&gt;">
<g>
<path d="M37.82619,8.731a2.63964,2.63964,0,0,1,2.80762,2.96484c0,1.90625-1.03027,3.002-2.80762,3.002H35.67092V8.731Zm-1.22852,5.123h1.125a1.87588,1.87588,0,0,0,1.96777-2.146,1.881,1.881,0,0,0-1.96777-2.13379h-1.125Z" style="fill: #fff"/>
<path d="M41.68068,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C44.57522,13.99463,45.01369,13.42432,45.01369,12.44434Z" style="fill: #fff"/>
<path d="M51.57326,14.69775h-.92187l-.93066-3.31641h-.07031l-.92676,3.31641h-.91309l-1.24121-4.50293h.90137l.80664,3.436h.06641l.92578-3.436h.85254l.92578,3.436h.07031l.80273-3.436h.88867Z" style="fill: #fff"/>
<path d="M53.85354,10.19482H54.709v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915h-.88867V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z" style="fill: #fff"/>
<path d="M59.09377,8.437h.88867v6.26074h-.88867Z" style="fill: #fff"/>
<path d="M61.21779,12.44434a2.13346,2.13346,0,1,1,4.24756,0,2.1338,2.1338,0,1,1-4.24756,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C64.11232,13.99463,64.5508,13.42432,64.5508,12.44434Z" style="fill: #fff"/>
<path d="M66.4009,13.42432c0-.81055.60352-1.27783,1.6748-1.34424l1.21973-.07031v-.38867c0-.47559-.31445-.74414-.92187-.74414-.49609,0-.83984.18213-.93848.50049h-.86035c.09082-.77344.81836-1.26953,1.83984-1.26953,1.12891,0,1.76563.562,1.76563,1.51318v3.07666h-.85547v-.63281h-.07031a1.515,1.515,0,0,1-1.35254.707A1.36026,1.36026,0,0,1,66.4009,13.42432Zm2.89453-.38477v-.37646l-1.09961.07031c-.62012.0415-.90137.25244-.90137.64941,0,.40527.35156.64111.835.64111A1.0615,1.0615,0,0,0,69.29543,13.03955Z" style="fill: #fff"/>
<path d="M71.34816,12.44434c0-1.42285.73145-2.32422,1.86914-2.32422a1.484,1.484,0,0,1,1.38086.79h.06641V8.437h.88867v6.26074h-.85156v-.71143h-.07031a1.56284,1.56284,0,0,1-1.41406.78564C72.0718,14.772,71.34816,13.87061,71.34816,12.44434Zm.918,0c0,.95508.4502,1.52979,1.20313,1.52979.749,0,1.21191-.583,1.21191-1.52588,0-.93848-.46777-1.52979-1.21191-1.52979C72.72121,10.91846,72.26613,11.49707,72.26613,12.44434Z" style="fill: #fff"/>
<path d="M79.23,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C82.12453,13.99463,82.563,13.42432,82.563,12.44434Z" style="fill: #fff"/>
<path d="M84.66945,10.19482h.85547v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915H87.605V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z" style="fill: #fff"/>
<path d="M93.51516,9.07373v1.1416h.97559v.74854h-.97559V13.2793c0,.47168.19434.67822.63672.67822a2.96657,2.96657,0,0,0,.33887-.02051v.74023a2.9155,2.9155,0,0,1-.4834.04541c-.98828,0-1.38184-.34766-1.38184-1.21582v-2.543h-.71484v-.74854h.71484V9.07373Z" style="fill: #fff"/>
<path d="M95.70461,8.437h.88086v2.48145h.07031a1.3856,1.3856,0,0,1,1.373-.80664,1.48339,1.48339,0,0,1,1.55078,1.67871v2.90723H98.69v-2.688c0-.71924-.335-1.0835-.96289-1.0835a1.05194,1.05194,0,0,0-1.13379,1.1416v2.62988h-.88867Z" style="fill: #fff"/>
<path d="M104.76125,13.48193a1.828,1.828,0,0,1-1.95117,1.30273A2.04531,2.04531,0,0,1,100.73,12.46045a2.07685,2.07685,0,0,1,2.07617-2.35254c1.25293,0,2.00879.856,2.00879,2.27V12.688h-3.17969v.0498a1.1902,1.1902,0,0,0,1.19922,1.29,1.07934,1.07934,0,0,0,1.07129-.5459Zm-3.126-1.45117h2.27441a1.08647,1.08647,0,0,0-1.1084-1.1665A1.15162,1.15162,0,0,0,101.63527,12.03076Z" style="fill: #fff"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/assets/images/mstile-150x150.png"/>
<TileColor>#2d2d2d</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

Before

Width:  |  Height:  |  Size: 697 B

After

Width:  |  Height:  |  Size: 697 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 726 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

View File

Before

Width:  |  Height:  |  Size: 786 B

After

Width:  |  Height:  |  Size: 786 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.0" width="1024.000000pt" height="1024.000000pt" viewBox="0 0 1024.000000 1024.000000" preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,1024.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M4855 10233 c-394 -26 -679 -71 -1020 -158 -1295 -331 -2412 -1169
-3115 -2335 -83 -138 -254 -475 -314 -620 -161 -385 -269 -757 -335 -1155 -19
-117 -23 -146 -36 -270 -4 -33 -9 -71 -11 -85 -24 -154 -24 -766 0 -970 2 -14
7 -56 11 -95 4 -38 8 -77 10 -85 1 -8 6 -40 9 -70 4 -30 11 -77 16 -105 5 -27
12 -66 15 -85 3 -19 22 -106 41 -194 54 -241 111 -432 219 -726 34 -95 135
-321 203 -455 276 -547 649 -1040 1108 -1465 79 -74 256 -224 320 -271 32 -24
61 -46 64 -49 11 -13 182 -132 291 -203 351 -231 772 -433 1191 -571 237 -78
556 -156 783 -191 113 -17 352 -45 445 -51 205 -15 757 -8 858 10 9 2 46 7 82
11 98 10 201 24 305 41 66 11 276 57 389 85 636 160 1269 465 1808 871 325
245 606 515 892 858 127 153 329 446 452 655 389 662 622 1424 681 2226 14
199 7 727 -12 842 -2 12 -9 67 -15 122 -35 308 -117 677 -222 990 -212 637
-535 1207 -982 1730 -586 685 -1383 1220 -2251 1510 -373 125 -793 212 -1150
240 -44 4 -91 9 -105 11 -27 6 -560 11 -625 7z"/>
</g>
<path id="letterZ"
fill="white" stroke="none" stroke-width="1"
d="M 424.00,88.47
C 448.68,98.55 455.10,132.92 436.83,151.91
427.76,161.34 418.44,163.14 406.00,163.00
389.20,162.80 374.05,150.57 370.52,134.00
369.82,130.73 369.99,126.41 370.00,123.00
370.03,104.41 381.95,90.48 400.00,86.46
407.48,85.43 416.95,85.60 424.00,88.47 Z
M 652.00,88.47
C 676.68,98.55 683.10,132.92 664.83,151.91
655.76,161.34 646.44,163.14 634.00,163.00
617.20,162.80 602.05,150.57 598.52,134.00
597.82,130.73 597.99,126.41 598.00,123.00
598.03,104.41 609.95,90.48 628.00,86.46
635.48,85.43 644.95,85.60 652.00,88.47 Z
M 750.00,231.00
C 750.00,231.00 750.00,275.00 750.00,275.00
749.98,285.27 746.65,286.97 740.63,295.00
740.63,295.00 723.13,318.00 723.13,318.00
723.13,318.00 643.88,422.00 643.88,422.00
643.88,422.00 445.88,682.00 445.88,682.00
445.88,682.00 378.88,770.00 378.88,770.00
378.88,770.00 345.00,814.00 345.00,814.00
345.00,814.00 753.00,814.00 753.00,814.00
753.00,814.00 753.00,865.00 753.00,865.00
753.00,865.00 270.00,865.00 270.00,865.00
270.00,865.00 270.00,821.00 270.00,821.00
270.02,810.30 274.03,808.20 280.35,800.00
280.35,800.00 297.87,777.00 297.87,777.00
297.87,777.00 379.35,670.00 379.35,670.00
379.35,670.00 581.12,405.00 581.12,405.00
581.12,405.00 648.12,317.00 648.12,317.00
648.12,317.00 674.00,283.00 674.00,283.00
674.00,283.00 304.00,283.00 304.00,283.00
304.00,283.00 304.00,231.00 304.00,231.00
304.00,231.00 750.00,231.00 750.00,231.00 Z" />
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

Before

Width:  |  Height:  |  Size: 980 B

After

Width:  |  Height:  |  Size: 980 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg"
width="1600" height="1024"
viewBox="0 0 1600 1024">
<path id="letterZ"
fill="white" stroke="none" stroke-width="1"
d="M 424.00,88.47
C 448.68,98.55 455.10,132.92 436.83,151.91
427.76,161.34 418.44,163.14 406.00,163.00
389.20,162.80 374.05,150.57 370.52,134.00
369.82,130.73 369.99,126.41 370.00,123.00
370.03,104.41 381.95,90.48 400.00,86.46
407.48,85.43 416.95,85.60 424.00,88.47 Z
M 652.00,88.47
C 676.68,98.55 683.10,132.92 664.83,151.91
655.76,161.34 646.44,163.14 634.00,163.00
617.20,162.80 602.05,150.57 598.52,134.00
597.82,130.73 597.99,126.41 598.00,123.00
598.03,104.41 609.95,90.48 628.00,86.46
635.48,85.43 644.95,85.60 652.00,88.47 Z
M 750.00,231.00
C 750.00,231.00 750.00,275.00 750.00,275.00
749.98,285.27 746.65,286.97 740.63,295.00
740.63,295.00 723.13,318.00 723.13,318.00
723.13,318.00 643.88,422.00 643.88,422.00
643.88,422.00 445.88,682.00 445.88,682.00
445.88,682.00 378.88,770.00 378.88,770.00
378.88,770.00 345.00,814.00 345.00,814.00
345.00,814.00 753.00,814.00 753.00,814.00
753.00,814.00 753.00,865.00 753.00,865.00
753.00,865.00 270.00,865.00 270.00,865.00
270.00,865.00 270.00,821.00 270.00,821.00
270.02,810.30 274.03,808.20 280.35,800.00
280.35,800.00 297.87,777.00 297.87,777.00
297.87,777.00 379.35,670.00 379.35,670.00
379.35,670.00 581.12,405.00 581.12,405.00
581.12,405.00 648.12,317.00 648.12,317.00
648.12,317.00 674.00,283.00 674.00,283.00
674.00,283.00 304.00,283.00 304.00,283.00
304.00,283.00 304.00,231.00 304.00,231.00
304.00,231.00 750.00,231.00 750.00,231.00 Z" />
<path id="shadeZ"
fill="black" stroke="none" style="fill-opacity:0.3;" stroke-width="1"
d="M 465.00,125.00
C 465.00,125.00 506.00,166.00 506.00,166.00
506.00,166.00 547.00,207.00 547.00,207.00
547.00,207.00 569.00,230.00 569.00,230.00
569.00,230.00 463.00,230.00 463.00,230.00
460.91,230.00 457.94,230.12 456.00,229.40
452.15,227.98 444.26,219.26 441.00,216.00
441.00,216.00 406.00,181.00 406.00,181.00
398.41,173.41 380.82,156.95 375.70,149.00
372.76,144.44 369.02,137.43 371.00,132.00
372.13,138.21 374.82,143.10 378.82,147.96
393.72,166.06 420.54,167.00 436.56,149.83
445.06,140.72 448.84,128.30 446.53,116.00
445.68,111.45 443.46,107.35 442.00,103.00
442.00,103.00 465.00,125.00 465.00,125.00 Z
M 1586.67,1021.33
C 1586.67,1021.33 426.33,1024.00 426.33,1024.00
426.33,1024.00 270.00,864.00 270.00,864.00
270.00,864.00 753.00,864.00 753.00,864.00
753.00,864.00 753.00,813.00 753.00,813.00
753.00,813.00 345.00,813.00 345.00,813.00
345.00,813.00 372.63,776.00 372.63,776.00
372.63,776.00 436.63,692.00 436.63,692.00
436.63,692.00 644.37,419.00 644.37,419.00
644.37,419.00 722.87,316.00 722.87,316.00
722.87,316.00 740.37,293.00 740.37,293.00
746.87,284.35 749.98,283.01 750.00,272.00
750.00,272.00 750.00,230.00 750.00,230.00
750.00,230.00 691.00,230.00 691.00,230.00
688.91,230.00 685.94,230.12 684.00,229.40
680.15,227.98 672.26,219.26 669.00,216.00
669.00,216.00 629.00,176.00 629.00,176.00
621.24,168.24 607.66,155.97 602.46,147.00
599.98,142.71 597.21,136.91 599.00,132.00
600.13,138.21 602.82,143.10 606.82,147.96
621.72,166.06 648.54,167.00 664.56,149.83
673.06,140.72 676.84,128.30 674.53,116.00
673.68,111.45 671.46,107.35 670.00,103.00
676.59,107.72 1586.66,1019.24 1586.67,1021.33 Z
M 675.00,281.00
C 675.00,281.00 638.37,330.00 638.37,330.00
638.37,330.00 561.58,431.00 561.58,431.00
561.58,431.00 514.00,494.00 514.00,494.00
514.00,494.00 304.00,281.00 304.00,281.00
304.00,281.00 675.00,281.00 675.00,281.00 Z" />
</svg>

After

Width:  |  Height:  |  Size: 4.6 KiB

351
server/public/assets/js/admin.js Executable file
View File

@@ -0,0 +1,351 @@
var Admin = {
beginning: true,
logged_in: false,
update_strict_skip: function(value) {
var form = document.getElementById("adminSettingsForm");
form.strictSkipNumber = value;
Admin.submitAdmin(form, false);
},
pw: function(msg) {
Admin.logged_in = msg;
if (!msg) return;
w_p = false;
M.Modal.init(document.getElementById("channel_info"));
if (Admin.logged_in) {
Helper.removeClass(".info_change_li", "hide");
Helper.removeClass("#user_suggests", "hide");
Helper.removeClass("#user-suggest-html", "hide");
if (
Helper.html(".suggested-badge") != "0" &&
Helper.html(".suggested-badge") != ""
) {
Helper.removeClass(".suggested-badge", "hide");
}
if (conf != undefined && conf.strictSkip) {
Helper.removeClass(".strict-skip-input", "hide");
}
} else {
Admin.hideUserSuggested();
Helper.addClass(".strict-skip-input", "hide");
}
Helper.removeClass(".delete-context-menu", "context-menu-disabled");
names = [
"vote",
"addsongs",
"longsongs",
"frontpage",
"allvideos",
"removeplay",
"skip",
"shuffle",
"userpass",
"toggleChat",
"strictSkip"
];
//Crypt.set_pass(chan.toLowerCase(), Crypt.tmp_pass);
for (var i = 0; i < names.length; i++) {
document.getElementsByName(names[i])[0].removeAttribute("disabled");
}
Helper.removeClass(".card-action", "hide");
Helper.addClass("#admin-lock", "clickable");
document.getElementById("admin-lock").innerHTML = "lock_open";
if (!Helper.mobilecheck()) {
Helper.tooltip("#admin-lock", {
delay: 5,
position: "left",
html: "Logout"
});
}
document.getElementById("password").value = "";
document
.getElementById("password")
.setAttribute("placeholder", "Change admin password");
Helper.removeClass(".user-password-li", "hide");
Helper.removeClass(".chat-toggle-li", "hide");
Helper.removeClass(".delete-all", "hide");
if (document.getElementsByClassName("password_protected")[0].checked) {
Helper.removeClass(".change_user_pass", "hide");
}
if (Helper.html("#admin-lock") != "lock_open") {
Helper.addClass("#admin-lock", "clickable");
document.getElementById("admin-lock").innerHTML = "lock_open";
if (!Helper.mobilecheck()) {
Helper.tooltip("#admin-lock", {
delay: 5,
position: "left",
html: "Logout"
});
}
}
},
hideUserSuggested: function() {
Helper.addClass("#user_suggests", "hide");
Helper.addClass("#user-suggest-html", "hide");
Helper.addClass(".suggested-badge", "hide");
},
conf: function(msg) {
if (msg[0].adminpass == "") {
////Crypt.remove_pass(chan.toLowerCase());
}
Admin.set_conf(msg[0]);
if (msg[0].adminpass !== "" && Admin.beginning) {
//emit("password", {password: Crypt.crypt_pass(Crypt.get_pass(chan.toLowerCase())), channel: chan.toLowerCase()});
Admin.beginning = false;
}
},
pass_save: function() {
if (!w_p) {
//emit('password', {password: Crypt.crypt_pass(CryptoJS.SHA256(document.getElementById("password").value).toString()), channel: chan.toLowerCase(), oldpass: Crypt.crypt_pass(Crypt.get_pass(chan.toLowerCase()))});
emit("password", {
password: Crypt.crypt_pass(document.getElementById("password").value),
channel: chan.toLowerCase()
});
} else {
//emit('password', {password: Crypt.crypt_pass(CryptoJS.SHA256(document.getElementById("password").value).toString()), channel: chan.toLowerCase()});
emit("password", {
password: Crypt.crypt_pass(document.getElementById("password").value),
channel: chan.toLowerCase()
});
}
},
log_out: function() {
before_toast();
/*if(Crypt.get_pass(chan.toLowerCase())) {*/
//Crypt.remove_pass(chan.toLowerCase());
if (Admin.logged_in) {
socket.emit("logout");
M.toast({ html: "Logged out", displayLength: 4000 });
Admin.display_logged_out();
} else {
M.toast({ html: "Not logged in", displayLength: 4000 });
}
},
display_logged_out: function() {
Admin.logged_in = false;
w_p = true;
adminpass = "";
names = [
"vote",
"addsongs",
"longsongs",
"frontpage",
"allvideos",
"removeplay",
"skip",
"shuffle",
"toggleChat",
"strictSkip"
];
document.getElementById("password").value = "";
Helper.addClass(".info_change_li", "hide");
for (i = 0; i < names.length; i++) {
document.getElementsByName(names[i])[0].setAttribute("disabled", true);
}
if (Helper.html("#admin-lock") != "lock") {
if (!Helper.mobilecheck()) {
Helper.tooltip("#admin-lock", "destroy");
}
Helper.removeClass("#admin-lock", "clickable");
document.getElementById("admin-lock").innerHTML = "lock";
}
Helper.addClass(".strict-skip-input", "hide");
Helper.addClass(".user-password-li", "hide");
Helper.addClass(".chat-toggle-li", "hide");
Helper.addClass(".delete-all", "hide");
if (document.getElementsByClassName("password_protected")[0].checked) {
Helper.removeClass(".change_user_pass", "hide");
}
Helper.addClass(".change_user_pass", "hide");
Admin.hideUserSuggested();
Helper.removeClass("#admin-lock", "clickable");
document
.getElementById("password")
.setAttribute("placeholder", "Enter admin password");
Helper.addClass(".delete-context-menu", "context-menu-disabled");
},
save: function(userpass) {
Admin.submitAdmin(
document.getElementById("adminSettingsForm").elements,
userpass
);
},
set_conf: function(conf_array) {
conf = conf_array;
music = conf_array.allvideos;
longsongs = conf_array.longsongs;
names = [
"vote",
"addsongs",
"longsongs",
"frontpage",
"allvideos",
"removeplay",
"skip",
"shuffle",
"userpass",
"toggleChat",
"strictSkip"
];
if (!conf.hasOwnProperty("toggleChat")) conf.toggleChat = true;
toggleChat = conf.toggleChat;
hasadmin = conf_array.adminpass != "";
var show_disabled = true;
if ((hasadmin && Admin.logged_in) || !hasadmin) {
show_disabled = false;
}
for (var i = 0; i < names.length; i++) {
document.getElementsByName(names[i])[0].checked =
conf_array[names[i]] === true;
if (show_disabled) {
document
.getElementsByName(names[i])[0]
.setAttribute("disabled", show_disabled);
} else {
document.getElementsByName(names[i])[0].removeAttribute("disabled");
}
}
document.getElementById("strict-input-number").value =
conf.strictSkipNumber;
if (hasadmin && !Admin.logged_in) {
if (Helper.html("#admin-lock") != "lock") Admin.display_logged_out();
} else if (!hasadmin) {
document
.getElementById("password")
.setAttribute("placeholder", "Create admin password");
} else {
if (document.getElementsByClassName("password_protected")[0].checked) {
Helper.removeClass(".change_user_pass", "hide");
}
}
if (Admin.logged_in) {
if (conf != undefined && conf.strictSkip) {
Helper.removeClass(".strict-skip-input", "hide");
}
}
if (conf != undefined && !conf.strictSkip) {
Helper.addClass(".strict-skip-input", "hide");
}
if (!document.getElementsByClassName("password_protected")[0].checked) {
Helper.addClass(".change_user_pass", "hide");
//Crypt.remove_userpass(chan.toLowerCase());
}
var updated = false;
if (conf_array.thumbnail != undefined && conf_array.thumbnail != "") {
document.getElementById("thumbnail_image").innerHTML =
"<img id='thumbnail_image_channel' src='" +
conf_array.thumbnail +
"' alt='thumbnail' />";
document.getElementById("thumbnail_input").value = conf_array.thumbnail;
updated = true;
}
if (conf_array.description != undefined && conf_array.description != "") {
document.getElementById("description_area").innerHTML =
conf_array.description;
document.getElementById("description_input").value =
conf_array.description;
updated = true;
}
if (conf_array.rules != undefined && conf_array.rules != "") {
var existingRules = document.querySelector(".rules-container");
if (existingRules) existingRules.remove();
var rules = conf_array.rules.split("\n");
var elementToAdd =
"<li class='rules-container'><div class='row'><div class='col s10 offset-s1'><h4 class='center-align'>Rules</h4>";
for (var i = 0; i < rules.length; i++) {
elementToAdd += "<p class='initial-line-height'>" + rules[i] + "</p>";
}
elementToAdd += "</div></div>";
document
.querySelector(".channel_info_container")
.insertAdjacentHTML("afterend", elementToAdd);
document.getElementById("rules_input").value = conf_array.rules;
updated = true;
}
if (updated) M.updateTextFields();
},
submitAdmin: function(form, userpass_changed) {
voting = form.vote.checked;
addsongs = form.addsongs.checked;
longsongs = form.longsongs.checked;
frontpage = form.frontpage.checked;
allvideos = form.allvideos.checked;
removeplay = form.removeplay.checked;
skipping = form.skip.checked;
shuffling = form.shuffle.checked;
toggleChat = form.toggleChat.checked;
strictSkip = form.strictSkip.checked;
if (form.strictSkipNumber) {
strictSkipNumber = form.strictSkipNumber;
} else {
strictSkipNumber = conf.strictSkipNumber;
}
var pass_send = userpass_changed && !form.userpass.checked ? "" : userpass;
configs = {
channel: chan.toLowerCase(),
voting: voting,
addsongs: addsongs,
longsongs: longsongs,
frontpage: frontpage,
allvideos: allvideos,
removeplay: removeplay,
adminpass: adminpass == "" ? "" : Crypt.crypt_pass(adminpass),
skipping: skipping,
shuffling: shuffling,
toggleChat: toggleChat,
strictSkip: strictSkip,
userpass: Crypt.crypt_pass(pass_send),
userpass_changed: userpass_changed,
strictSkipNumber: strictSkipNumber
};
emit("conf", configs);
},
hide_settings: function() {
var sidenavElem = document.getElementsByClassName("sidenav")[0];
M.Sidenav.getInstance(sidenavElem).close();
},
shuffle: function() {
if (!offline) {
//var u = Crypt.crypt_pass(Crypt.get_userpass(chan.toLowerCase()), true);
//if(u == undefined) u = "";
emit("shuffle", { channel: chan.toLowerCase() });
} else {
for (var x = 0; x < full_playlist.length; x++) {
var num = Math.floor(Math.random() * 1000000);
full_playlist[x].added = num;
}
List.sortList();
List.populate_list(full_playlist);
}
},
get_admin: function() {
return [w_p, hasadmin];
}
};

View File

@@ -0,0 +1,120 @@
window.addEventListener("load", function() {
var query = getQueryHash(window.location.hash);
var redirect =
window.location.protocol + "//" + window.location.hostname + "/api/oauth";
var client_id;
var response;
var scope;
if (query.spotify) {
client_id = "b934ecdd173648f5bcd38738af529d58";
response = "token";
scope =
"playlist-read-private ugc-image-upload playlist-read-collaborative user-read-private playlist-modify-public playlist-modify-private";
state = query.nonce;
window.location.href =
"https://accounts.spotify.com/authorize?client_id=" +
client_id +
"&scope=" +
scope +
"&show_dialog=false&response_type=" +
response +
"&redirect_uri=" +
redirect +
"&state=" +
state;
} else if (query.youtube) {
client_id =
"944988770273-butsmlr1aotlsskk8lmgvh0etqqekigf.apps.googleusercontent.com";
response = "token";
scope = "https://www.googleapis.com/auth/youtube";
state = query.nonce;
//window.opener.callback(query);
window.location.href =
"https://accounts.google.com/o/oauth2/v2/auth?client_id=" +
client_id +
"&response_type=" +
response +
"&state=" +
state +
"&redirect_uri=" +
redirect +
"&scope=" +
scope;
} else if (query.soundcloud) {
/*
SC.initialize({
client_id: api_key.soundcloud,
redirect_uri: 'https://zoff.me/api/oauth'
});
// initiate auth popup
console.log("asd ok", api_key.soundcloud);
SC.connect().then(function() {
return SC.get('/me');
}).then(function(me) {
console.log(me);
//alert('Hello, ' + me.username);
}).catch(function(e) {
console.log(e);
});*/
var redirect_uri = encodeURIComponent("https://zoff.me/api/oauth");
var response_type = "code";
var scope = "non-expiring";
var state = query.nonce;
var url =
"https://soundcloud.com/connect?client_id=" +
api_key.soundcloud +
"&redirect_uri=" +
redirect_uri +
"&state=" +
state +
"&display=page&response_type=code&scope=" +
scope;
//console.log(url);
window.location.href = url;
} else {
var query_parameters;
if (window.location.search.length > 0) {
query_parameters = getQueryHash(window.location.search);
} else {
query_parameters = getQueryHash(window.location.hash);
}
try {
window.opener.callback(query_parameters);
} catch (e) {
window.setTimeout(window.opener.SC_player.connectCallback, 1);
}
}
});
function getQueryHash(url) {
if (window.location.search.length > 0) {
if (url.substring(url.length - 1) == "#") {
url = url.substring(0, url.length - 1);
}
var temp_arr = url.substring(1).split("&");
var done_obj = {};
var splitted;
for (var i in temp_arr) {
splitted = temp_arr[i].split("=");
if (splitted.length == 2) {
done_obj[splitted[0]] = splitted[1];
}
}
return done_obj;
} else {
var temp_arr = url.substring(1).split("&");
var done_obj = {};
var splitted;
for (var i in temp_arr) {
splitted = temp_arr[i].split("=");
if (splitted.length == 2) {
done_obj[splitted[0]] = splitted[1];
}
}
return done_obj;
}
}

View File

@@ -0,0 +1,925 @@
var Channel = {
init: function() {
if (window.location.hash == "#small" || inIframe()) {
small_player = true;
document.querySelector("footer").style.display = "none";
}
if (client) {
Helper.addClass(".tabs", "hide");
Helper.removeClass("#wrapper", "tabs_height");
Helper.addClass("#wrapper", "client-wrapper");
if (!Helper.mobilecheck()) {
Helper.tooltip(".skip_next_client", {
delay: 5,
position: "bottom",
html: "Skip"
});
}
Helper.addClass("#chan", "chan-client");
Helper.addClass("#results", "client-results-height");
Helper.addClass(".pagination-results", "client-pagination-height");
Helper.addClass(".control-list", "client-control-list");
} else {
if (!api_key.hasOwnProperty("soundcloud")) soundcloud_enabled = false;
if (cast_ready_connect || chromecastAvailable || chromecastReady) {
Helper.addClass(".volume-container", "volume-container-cast");
}
if (!embed) {
document
.querySelector("#main-container")
.insertAdjacentHTML(
"beforeend",
"<a id='hide-playlist' class='hide-on-small-only hide-playlist-button' href='#!'><i class='material-icons'>keyboard_arrow_right</i></div>"
);
document.querySelector("#hide-playlist").style.left =
document.querySelector("#video-container").offsetWidth -
document.querySelector("#hide-playlist").offsetWidth +
"px";
}
//Player.soundcloud_player = document.querySelector("#soundcloud_player");
}
List.calculate_song_heights();
Admin.logged_in = false;
Admin.display_logged_out();
number_suggested = 0;
var no_socket = true;
//chan = Helper.decodeChannelName(Helper.html("#chan"));
var _p = window.location.pathname;
if (_p.substring(0, 1) == "/") _p = _p.substring(1);
if (_p.substring(_p.length - 1) == "/") _p = _p.substring(0, _p.length - 1);
chan = Helper.decodeChannelName(_p);
mobile_beginning = Helper.mobilecheck();
var side = Helper.mobilecheck() ? "left" : "right";
if (window.location.hostname != "localhost") {
var page = window.location.pathname;
if (page.substring(page.length - 1) != "/") page += "/";
ga("send", "pageview", page);
}
window.onpopstate = function(e) {
Channel.onepage_load();
};
if (window.location.hostname == "fb.zoff.me") {
Helper.addClass("footer", "hide");
}
if (window.location.hostname != "fb.zoff.me") Channel.share_link_modifier();
if (
window.location.hostname == "zoff.me" ||
window.location.hostname == "fb.zoff.me"
)
add = "https://zoff.me";
else add = window.location.hostname;
if (Player !== undefined && !client) {
Player.stopInterval = false;
}
if (!client) {
//Helper.tabs('.playlist-tabs');
Helper.tabs(".playlist-tabs-loggedIn", {
onShow: function(e) {
if (this.index == 2) {
document.getElementById("text-chat-input").focus();
Chat.channel_received = 0;
Chat.all_received = 0;
Helper.addClass(
document.querySelector(".chat-link span.badge.new.white"),
"hide"
);
document
.getElementById("favicon")
.setAttribute("href", "/assets/images/favicon.png");
chat_active = true;
unseen = false;
chat_unseen = false;
document
.getElementsByClassName("chat-link")[0]
.setAttribute("style", "color: white !important;");
blinking = false;
//Helper.css("#chat-container", "display", "block");
//Helper.css("#wrapper", "display", "none");
//Helper.css("#suggestions", "display", "none");
document.getElementById("text-chat-input").focus();
Helper.css("#pageButtons", "display", "none");
scrollChat();
window.scrollTo(0, 0);
}
}
});
if (window.location.hash == "#chat-container") {
M.Tabs.getInstance(
document.querySelector(".playlist-tabs-loggedIn")
).select("chat-container");
} else if (window.location.hash == "#suggestions") {
M.Tabs.getInstance(
document.querySelector(".playlist-tabs-loggedIn")
).select("suggestions");
} else if (window.location.hash == "#wrapper") {
M.Tabs.getInstance(
document.querySelector(".playlist-tabs-loggedIn")
).select("wrapper");
}
Helper.tabs(".chatTabs");
}
Helper.tabs(".results-tabs");
var sidenavElem = document.getElementsByClassName("sidenav")[0];
M.Sidenav.init(sidenavElem, {
menuWidth: 310,
edge: side,
closeOnClick: false,
draggable: Helper.mobilecheck(),
onOpenStart: function(el) {
Helper.addClass(".hamburger-sidenav", "open");
},
onCloseStart: function(el) {
Helper.removeClass(".hamburger-sidenav", "open");
}
});
M.Collapsible.init(
document.getElementsByClassName("settings-collapsible")[0],
{
accordion: true
}
);
if (!client) {
M.Modal.init(document.getElementById("embed"), {
onCloseStart: function() {
document.querySelector(".embed-preview").innerHTML = "";
}
});
} else {
Helper.removeElement("#embed");
Helper.removeElement(".embed-button-footer");
Helper.removeElement(".tabs");
}
M.Modal.init(document.getElementById("advanced_filter"), {
onCloseEnd: function() {
document.querySelector(".filter-results").innerHTML = "";
document.getElementById("filtersearch_input").value = "";
document.getElementById("filtersearch_input").blur();
},
onOpenEnd: function() {
document.getElementById("filtersearch_input").focus();
}
});
M.FormSelect.init(document.querySelector(".category-advanced-select"));
M.Modal.init(document.getElementById("help"));
M.Modal.init(document.getElementById("contact"));
M.Modal.init(document.getElementById("channel-share-modal"));
M.Modal.init(document.getElementById("delete_song_alert"), {
dismissible: false
});
M.Modal.init(document.getElementById("user_password"), {
dismissible: false
});
Channel.spotify_is_authenticated(spotify_authenticated);
result_html = document.getElementById("temp-results-container");
pagination_buttons_html =
"<div class='pagination-results'>" +
document.getElementsByClassName("pagination-results")[0].cloneNode(true)
.innerHTML +
"</div>";
empty_results_html = Helper.html("#empty-results-container");
not_import_html = Helper.html(".not-imported-container");
not_export_html = Helper.html(".not-exported-container");
Helper.setHtml(".not-imported-container", "");
Helper.setHtml(".not-exported-container", "");
if (socket === undefined) {
no_socket = false;
if (window.location.port != "") {
add = add + ":" + window.location.port + "/";
}
socket = io.connect(
"" + add,
connection_options
);
socket.on("update_required", function(msg) {
if (window.location.hostname == "localhost") {
console.error(msg);
return;
}
window.location.reload(true);
});
}
Crypt.init();
setup_auth_listener();
if (Crypt.get_offline()) {
document.getElementsByClassName("offline_switch_class")[0].checked = true;
change_offline(true, offline);
}
if (
!Helper.mobilecheck() &&
(document.querySelectorAll("#alreadychannel").length === 0 ||
!Hostcontroller.old_id ||
document.getElementById("code-text").innerText.toUpperCase() ==
"ABBADUR")
)
setup_host_initialization();
setup_suggested_listener();
if (!Helper.mobilecheck()) {
showOnSmallNotMobile();
}
if (
document.querySelectorAll("#alreadychannel").length === 0 ||
Helper.mobilecheck()
) {
setup_now_playing_listener();
get_list_listener();
if (!client) {
setup_viewers_listener();
}
} else {
Helper.css("#channel-load", "display", "none");
Helper.css("#player", "opacity", "1");
Helper.css("#controls", "opacity", "1");
Helper.css(".playlist", "opacity", "1");
if (!client) {
Player.readyLooks();
Playercontrols.initYoutubeControls(Player.player);
Playercontrols.initSlider();
if (player_ready) {
try {
Player.player.setVolume(Crypt.get_volume());
} catch (e) {}
try {
if (scUsingWidget)
Player.soundcloud_player.setVolume(
embed ? 1 : Crypt.get_volume()
);
else
Player.soundcloud_player.setVolume(
embed ? 1 : Crypt.get_volume() / 100
);
} catch (e) {}
}
Helper.removeClass(".video-container", "no-opacity");
var codeURL = "https://remote." + window.location.hostname + "/" + id;
Helper.setHtml("#code-text", id);
document
.getElementById("code-qr")
.setAttribute(
"src",
"https://chart.googleapis.com/chart?chs=221x221&cht=qr&choe=UTF-8&chld=L|1&chl=" +
codeURL
);
document.getElementById("code-link").setAttribute("href", codeURL);
}
}
if (!client) {
if (!Helper.mobilecheck()) {
var port = window.location.port;
if (port != "") port = ":" + port;
var shareCodeUrl =
window.location.protocol +
"//client." +
window.location.hostname +
port +
"/r/" +
btoa(encodeURIComponent(chan.toLowerCase()));
document
.getElementById("share-join-qr")
.setAttribute(
"src",
"https://chart.googleapis.com/chart?chs=221x221&cht=qr&choe=UTF-8&chld=L|1&chl=" +
shareCodeUrl
);
Helper.setHtml(
"#channel-name-join",
"client." +
window.location.hostname +
port +
"/" +
encodeURIComponent(chan.toLowerCase())
);
}
} else {
Helper.removeElement(".video-container");
Helper.removeElement(".offline-panel");
Helper.removeElement(".remote-panel");
Helper.removeElement(".mobile-remote-panel");
Helper.removeElement(".import-panel");
Helper.removeElement(".export-panel");
}
if (no_socket || Helper.mobilecheck()) {
emit_list();
}
if (!Helper.mobilecheck()) {
if (!client) {
Helper.tooltip("#chan", {
delay: 5,
position: "bottom",
html: "Show join URL"
});
}
Helper.tooltip("#viewers", {
delay: 5,
position: "top",
html: "Viewers"
});
Helper.tooltip("#addToOtherList", {
delay: 5,
position: "top",
html: "Add to other playlist"
});
Helper.tooltip("#fullscreen", {
delay: 5,
position: "top",
html: "Fullscreen"
});
Helper.tooltip(".search-btn-container", {
delay: 5,
position: "bottom",
html: "Search"
});
Helper.tooltip(".shuffle-btn-container", {
delay: 5,
position: "bottom",
html: "Shuffle"
});
Helper.tooltip("#settings", {
delay: 5,
position: "bottom",
html: "Settings"
});
}
if (!client) {
window.onYouTubeIframeAPIReady = Player.onYouTubeIframeAPIReady;
if (
Player.player === "" ||
Player.player === undefined ||
Helper.mobilecheck()
)
Player.loadPlayer();
} else {
Player.loadSoundCloudPlayer();
}
//}
if (Helper.mobilecheck()) {
if (!client) {
Mobile_remote.initiate_volume();
}
Helper.addClass(".close-settings", "hide");
} else {
if (!client) {
Channel.window_width_volume_slider();
}
}
setup_admin_listener();
setup_list_listener();
if (!client) {
setup_chat_listener();
get_history();
}
if (client || Helper.mobilecheck()) {
get_list_ajax();
get_np_ajax();
}
try {
if (
!Helper.msieversion() &&
!Helper.mobilecheck() &&
!client &&
Notification != undefined
)
Notification.requestPermission();
} catch (e) {}
document.getElementsByClassName("search_input")[0].focus();
Helper.sample();
if (!Helper.mobilecheck() && !client) {
Helper.tooltip(".castButton", {
delay: 5,
position: "top",
html: "Cast Zoff to TV"
});
}
addListener("click", ".sp-choose-link", function(e) {
event.preventDefault();
document.getElementsByClassName("sp-choose")[0].click();
});
//$("#results" ).hover( function() { Helper.removeClass(".result", "hoverResults"); i = 0; }, function(){ });
document.getElementById("search").focus();
Helper.css("#embed-button", "display", "inline-block");
document.getElementById("search").setAttribute("placeholder", "Search...");
if (!client) {
Helper.addClass("footer", "padding-bottom-novideo");
document.getElementById("embed-area").value = embed_code(
embed_autoplay,
embed_width,
embed_height,
color,
embed_videoonly,
embed_localmode
);
}
if (
!/chrom(e|ium)/.test(navigator.userAgent.toLowerCase()) &&
!Helper.mobilecheck() &&
!client
) {
Helper.css(".castButton", "display", "none");
}
Helper.log([
"chromecastAvailable " + chromecastAvailable,
"chromecastReady " + chromecastReady
]);
if (chromecastAvailable && !client) {
hide_native(1);
} else if (chromecastReady && !client) {
initializeCastApi();
} else if (!client) {
window["__onGCastApiAvailable"] = function(loaded, errorInfo) {
if (loaded) {
setTimeout(function() {
chromecastReady = true;
initializeCastApi();
}, 1000);
} else {
chromecastReady = true;
}
};
}
Channel.listeners(true);
Channel.add_context_menu();
if (!Helper.mobilecheck() && navigator.userAgent.match(/iPad/i) == null) {
setTimeout(function() {
Channel.set_title_width();
}, 100);
}
},
set_title_width: function(start) {
if (window.innerWidth > 600) {
var add_width = document.getElementsByClassName("brand-logo")[0]
.offsetWidth;
if (start) {
add_width = window.innerWidth * 0.15;
}
var test_against_width =
window.innerWidth -
document.getElementsByClassName("control-list")[0].offsetWidth -
add_width -
11;
title_width = test_against_width;
document.getElementsByClassName("title-container")[0].style.width =
title_width + "px";
} else {
document.getElementsByClassName("title-container")[0].style.width =
"100%";
}
},
spotify_is_authenticated: function(bool) {
if (bool) {
Helper.log([
"Spotify is authenticated",
"access_token: " + access_token_data.access_token,
"token_type:" + access_token_data.token_type,
"expires_in: " + access_token_data.expires_in
]);
Helper.css(".spotify_authenticated", "display", "block");
Helper.css(".spotify_unauthenticated", "display", "none");
} else {
Helper.log(["Spotify is not authenticated"]);
Helper.css(".spotify_authenticated", "display", "none");
Helper.css(".spotify_unauthenticated", "display", "flex");
}
},
add_context_menu: function() {
addListener("contextmenu", ".vote-container", function(e) {
if (hostMode) {
return;
}
this.preventDefault();
this.preventDefault();
var that = this;
contextListener(e, that);
});
addListener("contextmenu", ".add-suggested", function(e) {
this.preventDefault();
var that = this;
contextListener(e, that);
});
addListener("click", ".list-remove", function(e) {
this.preventDefault();
var that = this;
contextListener(e, that);
});
},
share_link_modifier: function() {
document
.getElementById("facebook-code-link")
.setAttribute(
"href",
"https://www.facebook.com/sharer/sharer.php?u=https://zoff.me/" +
chan.toLowerCase()
);
document
.getElementById("facebook-code-link")
.setAttribute(
"onclick",
"window.open('https://www.facebook.com/sharer/sharer.php?u=https://zoff.me/" +
chan.toLowerCase() +
"', 'Share Playlist','width=600,height=300'); return false;"
);
document
.getElementById("twitter-code-link")
.setAttribute(
"href",
"https://twitter.com/intent/tweet?url=https://zoff.me/" +
chan.toLowerCase() +
"&amp;text=Check%20out%20this%20playlist%20" +
chan.toLowerCase() +
"%20on%20Zoff!&amp;via=zoffmusic"
);
document
.getElementById("twitter-code-link")
.setAttribute(
"onclick",
"window.open('https://twitter.com/intent/tweet?url=https://zoff.me/" +
chan.toLowerCase() +
"/&amp;text=Check%20out%20this%20playlist%20" +
chan.toLowerCase() +
"%20on%20Zoff!&amp;via=zoffmusic','Share Playlist','width=600,height=300'); return false;"
);
},
window_width_volume_slider: function() {
if (window.innerWidth <= 600 && slider_type == "horizontal") {
slider_type = "vertical";
Playercontrols.initSlider();
} else if (window.innerWidth > 600 && slider_type == "vertical") {
slider_type = "horizontal";
Playercontrols.initSlider();
Helper.removeClass(".volume-container", "hide");
}
},
listeners: function(on) {
var scrollListener = function(e) {
if (!programscroll) {
userscroll = true;
if (
document.getElementById("chatchannel").scrollTop +
document.getElementById("chatchannel").offsetHeight >=
document.getElementById("chatchannel").scrollHeight
) {
userscroll = false;
}
}
};
var scrollAllListener = function(e) {
if (!programscroll) {
userscroll = true;
if (
document.getElementById("chatall").scrollTop +
document.getElementById("chatall").offsetHeight >=
document.getElementById("chatall").scrollHeight
) {
userscroll = false;
}
}
};
if (!client) {
if (on) {
document
.getElementById("chatchannel")
.addEventListener("scroll", scrollListener);
document
.getElementById("chatall")
.addEventListener("scroll", scrollListener);
} else {
document
.getElementById("chatchannel")
.removeEventListener("scroll", scrollListener);
document
.getElementById("chatall")
.removeEventListener("scroll", scrollAllListener);
}
}
},
onepage_load: function() {
if (changing_to_frontpage) return;
if (user_auth_started) {
clearTimeout(durationTimeout);
Player.stopInterval = true;
user_auth_avoid = true;
if (!Helper.mobilecheck()) {
Helper.tooltip(".castButton", "destroy");
Helper.tooltip("#viewers", "destroy");
Helper.tooltip("#addToOtherList", "destroy");
//$('.castButton-unactive').tooltip("destroy");
Helper.tooltip("#offline-mode", "destroy");
Helper.tooltip("#admin-lock", "destroy");
}
}
var url_split = window.location.href.split("/");
if (
url_split[3].substr(0, 1) != "#!" &&
url_split[3] !== "" &&
!(url_split.length == 5 && url_split[4].substr(0, 1) == "#")
) {
socket.emit("change_channel", {
channel: channel_before_move
});
Admin.beginning = true;
chan = url_split[3].replace("#", "");
document.getElementById("chan").innerHTML = Helper.upperFirst(chan);
var add = "";
w_p = true;
//if(private_channel) add = Crypt.getCookie("_uI") + "_";
socket.emit("list", {
version: parseInt(_VERSION),
channel: add + chan.toLowerCase()
});
} else if (url_split[3] === "") {
Admin.display_logged_out();
if (hostMode) {
Helper.removeClass("#main-row", "fullscreened");
document.querySelector(".host_switch_class").checked = false;
enable_host_mode(false);
}
var channel_before_move = chan.toLowerCase();
clearTimeout(timed_remove_check);
changing_to_frontpage = true;
user_change_password = false;
clearTimeout(width_timeout);
if (fireplace_initiated) {
fireplace_initiated = false;
Player.fireplace.destroy();
Helper.css("#fireplace_player", "display", "none");
}
Helper.css("#channel-load", "display", "block");
window.scrollTo(0, 0);
//Player.stopInterval = true;
Admin.beginning = true;
began = false;
durationBegun = false;
Helper.css("#embed-button", "display", "none");
if (!Helper.mobilecheck()) {
Helper.tooltip(".castButton", "destroy");
Helper.tooltip("#addToOtherList", "destroy");
Helper.tooltip("#viewers", "destroy");
Helper.tooltip("#offline-mode", "destroy");
Helper.tooltip("search-btn", "destroy");
Helper.tooltip("#fullscreen", "destroy");
if (
M.Tooltip.getInstance(document.getElementById("admin-lock")) !=
undefined
) {
Helper.tooltip("#admin-lock", "destroy");
}
Helper.tooltip(".search-btn-container", "destroy");
Helper.tooltip(".shuffle-btn-container", "destroy");
Helper.tooltip("#settings", "destroy");
}
Helper.removeElement("#seekToDuration");
M.Sidenav.getInstance(
document.getElementsByClassName("sidenav")[0]
).destroy();
if (!client) {
if (!Helper.mobilecheck()) {
Helper.tooltip("#chan", "destroy");
}
var tap_1 = document.querySelectorAll(".tap-target");
if (tap_1.length > 0 && M.TapTarget.getInstance(tap_1[0])) {
M.TapTarget.getInstance(tap_1[0]).close();
}
}
clearTimeout(tap_target_timeout);
//before_toast();
if (Helper.mobilecheck() || user_auth_avoid || client) {
Helper.log(["Removing all listeners"]);
//socket.emit("change_channel");
//removeAllListeners();
//socket.removeEventListener(id);
socket.emit("left_channel", {
channel: channel_before_move
});
socket.emit("change_channel", {
channel: channel_before_move
});
chan = "";
socket.removeEventListener("np");
socket.removeEventListener("id");
socket.removeEventListener(id);
//socket.disconnect();
}
socket.removeEventListener("chat.all");
socket.removeEventListener("chat");
socket.removeEventListener("conf");
socket.removeEventListener("pw");
socket.removeEventListener("toast");
//socket.removeEventListener("id");
socket.removeEventListener("channel");
socket.removeEventListener("auth_required");
socket.removeEventListener("auth_accepted");
socket.removeEventListener("suggested");
socket.removeEventListener("color");
socket.removeEventListener("chat_history");
Helper.ajax({
url: "/",
method: "GET",
success: function(e) {
if (!client) {
document.querySelector("#hide-playlist").remove();
if (hiddenPlaylist)
document.querySelector("main").style.maxWidth = "";
hiddenPlaylist = false;
document
.getElementById("volume-button")
.removeEventListener("click", Playercontrols.mute_video);
document
.getElementById("playpause")
.removeEventListener("click", Playercontrols.play_pause);
document
.getElementById("fullscreen")
.removeEventListener("click", Playercontrols.fullscreen);
}
Channel.listeners(false);
if (Helper.mobilecheck() || user_auth_avoid) {
video_id = "";
song_title = "";
}
document
.querySelectorAll("meta[name=theme-color]")[0]
.setAttribute("content", "#2D2D2D");
if (!Helper.mobilecheck() && !user_auth_avoid) {
Helper.removeElement("#playbar");
Helper.removeElement("#main_components");
Helper.addClass("#player_overlay", "player_bottom");
Helper.addClass("#player", "player_bottom");
Helper.addClass(".video-container", "frontpage-player");
Helper.addClass("#main-row", "frontpage_modified_heights");
Helper.css("#player", "opacity", "1");
Helper.removeClass("#video-container", "no-opacity");
document
.getElementById("main-row")
.insertAdjacentHTML(
"afterbegin",
"<div id='player_bottom_overlay' class='player player_bottom'></div>"
);
document
.getElementById("player_bottom_overlay")
.insertAdjacentHTML(
"afterbegin",
"<a id='closePlayer' title='Close Player'><i class='material-icons'>close</i></a>"
);
document
.getElementById("player_bottom_overlay")
.setAttribute("data-channel", channel_before_move.toLowerCase());
Helper.removeElement("#playlist");
} else {
try {
Player.player.destroy();
} catch (error) {}
try {
Player.soundcloud_dead = true;
Player.soundcloud_player.kill();
} catch (error) {}
Player.player = "";
document.title = "Zoff";
}
var response = document.createElement("div");
response.innerHTML = e;
var newList = response.querySelector("#lists-script").innerHTML;
newList = newList
.trim()
.replace("window.lists = ", "")
.replace("window.lists=", "");
newList = newList.substring(0, newList.length);
window.lists = JSON.parse(newList);
response.querySelector("#lists-script").remove();
Helper.removeElement("#sidenav-overlay");
document.getElementsByTagName("main")[0].className =
"center-align container";
Helper.removeClass("#main-container", "channelpage");
document.getElementById("main-container").setAttribute("style", "");
document.getElementsByTagName(
"header"
)[0].innerHTML = response.querySelectorAll("header")[0].outerHTML;
document
.getElementsByTagName("header")[0]
.insertAdjacentHTML(
"afterend",
response.querySelectorAll(".section.mega")[0].outerHTML
);
//document.getElementsByTagName("header")[0].insertAdjacentHTML("afterend", response.querySelectorAll(".section.mobile-search")[0].innerHTML);
if (Helper.mobilecheck() || user_auth_avoid) {
document.getElementsByTagName(
"main"
)[0].innerHTML = response.querySelectorAll("main")[0].innerHTML;
} else {
document
.getElementsByTagName("main")[0]
.insertAdjacentHTML(
"beforeend",
response.querySelectorAll("#main_section_frontpage")[0]
.outerHTML
);
}
Helper.removeClass(".page-footer", "padding-bottom-extra");
Helper.removeClass(".page-footer", "padding-bottom-novideo");
document
.getElementById("favicon")
.setAttribute("href", "/assets/images/favicon-32x32.png");
Helper.log(["Socket", socket]);
if (document.querySelectorAll("#alreadyfp").length == 1) {
Frontpage.init();
} else {
fromChannel = true;
frontpage = true;
Frontpage.init();
}
changing_to_frontpage = false;
if (
document.querySelectorAll("#alreadychannel").length === 0 &&
!user_auth_avoid
) {
document
.getElementsByTagName("head")[0]
.insertAdjacentHTML(
"beforeend",
"<div id='alreadychannel'></div"
);
} else if (user_auth_avoid) {
Helper.removeElement("#alreadychannel");
}
Helper.css("#channel-load", "display", "none");
user_auth_avoid = false;
}
});
}
}
};
function get_history() {
if (socket && socket.id) {
/*var p = Crypt.get_userpass();
if(p == undefined) p = "";
var c = Crypt.crypt_pass(p, true);
if(c == undefined) c = "";*/
socket.emit("get_history", { channel: chan.toLowerCase(), all: false });
socket.emit("get_history", { channel: chan.toLowerCase(), all: true });
} else {
setTimeout(function() {
get_history();
}, 50);
}
}

311
server/public/assets/js/chat.js Executable file
View File

@@ -0,0 +1,311 @@
var Chat = {
channel_received: 0,
all_received: 0,
chat_admin_help: [
"/ban USERNAME REASON to ban user",
"/unban USERNAME to unban a user"
],
chat_help: [
"/login <new name> <password> to register and save a password for a nickname, or to log in with a password on a name.",
"/login <name> <new_password> <old_password> to change the password on a nickname",
"/logout to logout",
"/who to see the names of the people in the channel",
"Want your own icon besides your name? If you donate 5$ or more, we'll add a picture of your choosing (following our guidelines) besides your name!"
],
namechange: function(data, first, initial) {
var input = data.split(" ");
if (input.length == 2) {
var name = input[0];
var password = input[1];
password = Crypt.crypt_chat_pass(password);
socket.emit("namechange", {
name: name,
channel: chan.toLowerCase(),
password: password,
first: first
});
} else if (input.length == 3) {
var name = input[0];
var new_password = input[1];
var old_password = input[2];
new_password = Crypt.crypt_chat_pass(new_password);
old_password = Crypt.crypt_chat_pass(old_password);
socket.emit("namechange", {
name: name,
channel: chan.toLowerCase(),
new_password: new_password,
old_password: old_password
});
} else if (first) {
var to_send = { initial: initial, first: true };
if (chan != undefined && chan != "") {
to_send.channel = chan.toLowerCase();
}
socket.emit("namechange", to_send);
}
},
removename: function() {
socket.emit("removename", { channel: chan.toLowerCase() });
Crypt.remove_name();
},
chat: function(data) {
if (data.value.length > 150) return;
if (
data.value.startsWith("/name ") ||
data.value.startsWith("/removename")
) {
data.value = "/help";
Chat.chat(data);
return;
} else if (data.value.startsWith("/login ")) {
Chat.namechange(data.value.substring(7), false);
} else if (data.value.startsWith("/help")) {
var add = "";
if (
document.querySelector(".chat-tab-li a.active").getAttribute("href") ==
"#all_chat"
) {
if (document.querySelector("#chatall").children.length > 100) {
document.querySelector("#chatall").children[0].remove();
}
add = "chatall";
} else {
if (document.querySelector("#chatchannel").children.length > 100) {
document.querySelector("#chatchannel").children[0].remove();
}
add = "chatchannel";
}
var help = Chat.chat_help;
if (Admin.logged_in) help = help.concat(Chat.chat_admin_help);
for (var x = 0; x < help.length; x++) {
var color = Helper.intToARGB(Helper.hashCode("System"));
if (color.length < 6) {
for (x = color.length; x < 6; x++) {
color = "0" + color;
}
}
var _time = new Date();
var time =
Helper.pad(_time.getHours()) + ":" + Helper.pad(_time.getMinutes());
color = Helper.hexToRgb(color.substring(0, 6));
var color_temp = Helper.rgbToHsl([color.r, color.g, color.b], false);
document
.querySelector("#" + add)
.insertAdjacentHTML(
"beforeend",
"<li title='Zoff''><span class='time_color'>" +
time +
"</span> <img class='chat-icon' src='https://zoff.me/assets/images/favicon-32x32.png' alt='System'><span style='color:" +
color_temp +
";'>System</span>: </li>"
);
var in_text = document.createTextNode(help[x]);
document
.querySelector("#" + add)
.children[
document.querySelector("#" + add).children.length - 1
].appendChild(in_text);
document.getElementById("" + add).scrollTop = document.getElementById(
"" + add
).scrollHeight;
}
} else if (data.value.startsWith("/logout")) {
Chat.removename();
} else if (
document.querySelector(".chat-tab-li a.active").getAttribute("href") ==
"#all_chat"
) {
socket.emit("all,chat", {
channel: chan.toLowerCase(),
data: data.value
});
} else {
socket.emit("chat", { channel: chan.toLowerCase(), data: data.value });
}
data.value = "";
return;
},
createChatElement: function(
allchat,
channel,
time,
icon,
color,
from,
message
) {
var liElement = document.createElement("li");
liElement.innerHTML +=
"<span class='time_color'>" + time + "</span> " + icon;
var nameElement = document.createElement("span");
nameElement.innerText = from;
nameElement.style.color = color;
liElement.appendChild(nameElement);
if (allchat) {
liElement.title = channel;
liElement.innerHTML +=
"<span class='channel-info-all-chat'> " + channel + "</span>";
}
var in_text = document.createTextNode(message);
liElement.appendChild(in_text);
return liElement;
},
allchat: function(inp, time_sent, disable_blink) {
if (inp.msg.substring(0, 1) == ":" && !chat_active && !disable_blink) {
Chat.all_received += 1;
document
.querySelector("#favicon")
.getAttribute("href", "/assets/images/highlogo.png");
unseen = true;
chat_unseen = true;
Helper.removeClass(
document.querySelector(".chat-link span.badge.new.white"),
"hide"
);
var to_display =
Chat.channel_received + Chat.all_received > 9
? "9+"
: Chat.channel_received + Chat.all_received;
Helper.setHtml(
document.querySelector(".chat-link span.badge.new.white"),
to_display
);
}
if (document.hidden) {
document
.getElementById("favicon")
.setAttribute("href", "/assets/images/highlogo.png");
}
if (document.querySelector("#chatall").children.length > 100) {
document.querySelector("#chatall").children[0].remove();
}
var color = Helper.intToARGB(Helper.hashCode(inp.from));
if (color.length < 6) {
for (x = color.length; x < 6; x++) {
color = "0" + color;
}
}
var icon_add = "";
if (inp.hasOwnProperty("icon") && inp.icon !== false && inp.icon != "") {
icon_add =
"<img class='chat-icon' src='" + inp.icon + "' alt='" + inp.from + "'>";
}
color = Helper.hexToRgb(color.substring(0, 6));
var color_temp = Helper.rgbToHsl([color.r, color.g, color.b], false);
var _time = new Date();
if (time_sent) {
_time = new Date(time_sent);
}
var time =
Helper.pad(_time.getHours()) + ":" + Helper.pad(_time.getMinutes());
var element = Chat.createChatElement(
true,
Helper.decodeChannelName(inp.channel),
time,
icon_add,
color_temp,
inp.from,
inp.msg
);
//document.querySelector("#chatall").insertAdjacentHTML("beforeend", element);
document.querySelector("#chatall").appendChild(element);
if (!userscroll) {
programscroll = true;
document.getElementById("chatall").scrollTop = document.getElementById(
"chatall"
).scrollHeight;
programscroll = false;
}
},
channelchat: function(data, time_sent, disable_blink) {
if (
data.msg.substring(0, 1) == ":" &&
!chat_active &&
!disable_blink &&
data.from.toLowerCase() != "system"
) {
document
.querySelector("#favicon")
.setAttribute("href", "/assets/images/highlogo.png");
unseen = true;
chat_unseen = true;
Chat.channel_received += 1;
//blink_interval = setTimeout(Chat.chat_blink, 1000);
Helper.removeClass(
document.querySelector(".chat-link span.badge.new.white"),
"hide"
);
var to_display =
Chat.channel_received + Chat.all_received > 9
? "9+"
: Chat.channel_received + Chat.all_received;
Helper.setHtml(
document.querySelector(".chat-link span.badge.new.white"),
to_display
);
}
if (document.querySelector("#chatchannel").children.length > 100) {
document.querySelector("#chatchannel").children[0].remove();
}
var icon_add = "";
if (data.hasOwnProperty("icon") && data.icon !== false && data.icon != "") {
icon_add =
"<img class='chat-icon' src='" +
data.icon +
"' alt='" +
data.from +
"'>";
}
var color = Helper.intToARGB(Helper.hashCode(data.from));
if (color.length < 6) {
for (x = color.length; x < 6; x++) {
color = "0" + color;
}
}
color = Helper.hexToRgb(color.substring(0, 6));
var color_temp = Helper.rgbToHsl([color.r, color.g, color.b], false);
var _time = new Date();
if (time_sent) {
_time = new Date(time_sent);
}
var time =
Helper.pad(_time.getHours()) + ":" + Helper.pad(_time.getMinutes());
//document.querySelector("#chatchannel").insertAdjacentHTML("beforeend", "<li><span class='time_color'>" + time + "</span> " + icon_add + "<span style='color:"+color_temp+";'>"+data.from+"</span></li>");
//var in_text = document.createTextNode(data.msg);
//document.querySelector("#chatchannel").children[document.querySelector("#chatchannel").children.length - 1].appendChild(in_text);
var element = Chat.createChatElement(
false,
null,
time,
icon_add,
color_temp,
data.from,
data.msg
);
//document.querySelector("#chatall").insertAdjacentHTML("beforeend", element);
document.querySelector("#chatchannel").appendChild(element);
if (!userscroll) {
programscroll = true;
document.getElementById(
"chatchannel"
).scrollTop = document.getElementById("chatchannel").scrollHeight;
programscroll = false;
}
}
};

358
server/public/assets/js/crypt.js Executable file
View File

@@ -0,0 +1,358 @@
var Crypt = {
conf_pass: undefined,
user_pass: undefined,
tmp_pass_user: "",
tmp_pass: "",
init: function() {
if (window.location.pathname != "/") {
if (location.protocol != "https:") {
document.cookie =
chan.toLowerCase() +
"=;path=/" +
chan.toLowerCase() +
";expires=" +
new Date(0).toUTCString();
} else {
document.cookie =
chan.toLowerCase() +
"=;path=/" +
chan.toLowerCase() +
";secure;expires=" +
new Date(0).toUTCString();
}
}
try {
conf_arr = Crypt.decrypt(Crypt.getCookie("_opt"), "_opt");
} catch (err) {
conf_arr = Crypt.decrypt(Crypt.create_cookie("_opt"), "_opt");
}
if (window.location.pathname != "/") {
change_intelligent(Crypt.get_intelligent_list_enabled());
if (!conf_arr.hasOwnProperty("color")) {
Crypt.set_background_color("dynamic", true);
} else {
document.querySelector(".backround_switch_class").checked =
conf_arr.color == "dynamic";
if (conf_arr.color != "dynamic") {
Helper.removeClass(".background_color_container", "hide");
document.querySelector("#background_color_choser").value =
conf_arr.color;
}
}
Hostcontroller.change_enabled(conf_arr.remote);
if (conf_arr.width != 100) Player.set_width(conf_arr.width);
}
},
set_background_color: function(value, first) {
conf_arr.color = value;
if (value != "dynamic" && !first) {
Helper.css("#main-container", "background-color", value);
Helper.css("#nav", "background-color", value);
Helper.css(".title-container", "background-color", value);
document
.querySelector("meta[name=theme-color]")
.setAttribute("content", value);
Helper.css("#controls", "background", value);
} else if (!first) {
var url = "https://img.youtube.com/vi/" + Player.np.id + "/mqdefault.jpg";
if (videoSource == "soundcloud") url = Player.np.thumbnail;
getColor(url);
}
Crypt.encrypt(conf_arr, "_opt");
},
get_background_color: function(value) {
if (!conf_arr.hasOwnProperty("color")) {
Crypt.set_background_color("dynamic");
}
return conf_arr.color;
},
get_intelligent_list_enabled: function() {
if (conf_arr.hasOwnProperty("intelligent")) {
return conf_arr.intelligent;
} else {
conf_arr.intelligent = false;
Crypt.encrypt(conf_arr, "_opt");
return false;
}
},
set_intelligent_list_enabled: function(enabled) {
conf_arr.intelligent = enabled;
if (Helper.mobilecheck()) {
intelligentList = enabled;
}
Crypt.encrypt(conf_arr, "_opt");
},
decrypt: function(cookie, name) {
if (Crypt.getCookie(name) === undefined) {
cookie = Crypt.create_cookie(name);
}
if (cookie == undefined && name == "_opt")
return {
volume: 100,
width: 100,
remote: true,
name: "",
offline: false
};
/*var key = btoa("0103060703080703080701") + btoa("0103060703080703080701");
key = key.substring(0,32);
key = btoa(key);
var decrypted = CryptoJS.AES.decrypt(
cookie,key,
{
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
);*/
//return $.parseJSON(decrypted.toString(CryptoJS.enc.Utf8));
return JSON.parse(atob(cookie));
},
decrypt_pass: function(pass) {
if (socket) {
/*var key = btoa(socket.id) + btoa(socket.id);
key = key.substring(0,32);
key = btoa(key);
var decrypted = CryptoJS.AES.decrypt(
pass,key,
{
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
);
return decrypted.toString(CryptoJS.enc.Utf8);*/
return atob(pass);
}
return false;
},
encrypt: function(json_formated, cookie) {
var to_encrypt = JSON.stringify(json_formated);
/*var key = btoa("0103060703080703080701") + btoa("0103060703080703080701");
key = key.substring(0,32);
key = btoa(key);
var encrypted = CryptoJS.AES.encrypt(
to_encrypt,
key,
{
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
);*/
var encrypted = btoa(to_encrypt);
var CookieDate = new Date();
CookieDate.setFullYear(CookieDate.getFullYear() + 1);
if (location.protocol != "https:") {
document.cookie =
cookie +
"=" +
encrypted.toString() +
";expires=" +
CookieDate.toGMTString() +
";path=/;";
} else {
document.cookie =
cookie +
"=" +
encrypted.toString() +
";secure;expires=" +
CookieDate.toGMTString() +
";path=/;";
}
},
get_volume: function() {
return Crypt.decrypt(Crypt.getCookie("_opt"), "_opt").volume;
//return conf_arr.volume;
},
get_offline: function() {
var temp_offline = Crypt.decrypt(Crypt.getCookie("_opt"), "_opt").offline;
if (temp_offline != undefined) {
return Crypt.decrypt(Crypt.getCookie("_opt"), "_opt").offline;
} else {
Crypt.set_offline(false);
return false;
}
},
set_volume: function(val) {
conf_arr.volume = val;
Crypt.encrypt(conf_arr, "_opt");
},
create_cookie: function(name) {
if (name == "_opt")
cookie_object = {
volume: 100,
width: 100,
remote: true,
name: "",
offline: false
};
else cookie_object = { passwords: {} };
var string_it = JSON.stringify(cookie_object);
/*var key = btoa("0103060703080703080701") + btoa("0103060703080703080701");
key = key.substring(0,32);
key = btoa(key);
var encrypted = CryptoJS.AES.encrypt(
string_it,
key,
{
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
);*/
var encrypted = btoa(string_it);
var CookieDate = new Date();
CookieDate.setFullYear(CookieDate.getFullYear() + 1);
if (location.protocol != "https:") {
document.cookie =
name +
"=" +
encrypted.toString() +
";expires=" +
CookieDate.toGMTString() +
";path=/;";
} else {
document.cookie =
name +
"=" +
encrypted.toString() +
";secure;expires=" +
CookieDate.toGMTString() +
";path=/;";
}
//document.cookie = name+"="+encrypted.toString()+";expires="+CookieDate.toGMTString()+";path=/;"
//document.cookie = na"="+encrypted.toString()+";expires="+CookieDate.toGMTString()+";path=/;"
return Crypt.getCookie(name);
},
/*set_pass: function(chan, pass) {
Crypt.conf_pass.passwords[chan] = pass;
Crypt.encrypt(Crypt.conf_pass, chan);
},
remove_pass:function(chan) {
delete Crypt.conf_pass.passwords[chan];
Crypt.encrypt(Crypt.conf_pass, chan.toLowerCase());
},
set_userpass: function(chan, pass) {
Crypt.conf_pass.passwords["userpass"] = pass;
Crypt.encrypt(Crypt.conf_pass, chan);
},
remove_userpass:function(chan) {
delete Crypt.conf_pass.passwords["userpass"];
Crypt.encrypt(Crypt.conf_pass, chan.toLowerCase());
},*/
set_name: function(name, pass) {
conf_arr.name = encodeURIComponent(name).replace(/\W/g, "");
conf_arr.chat_pass = pass;
Crypt.encrypt(conf_arr, "_opt");
},
set_offline: function(enabled) {
conf_arr.offline = enabled;
Crypt.encrypt(conf_arr, "_opt");
},
remove_name: function() {
conf_arr.name = "";
conf_arr.chat_pass = "";
Crypt.encrypt(conf_arr, "_opt");
},
get_pass: function(chan) {
if (Crypt.conf_pass !== undefined) return Crypt.conf_pass.passwords[chan];
return undefined;
},
get_userpass: function(chan) {
if (Crypt.conf_pass !== undefined)
return Crypt.conf_pass.passwords["userpass"];
return "";
},
set_remote: function(val) {
conf_arr.remote = val;
Crypt.encrypt(conf_arr, "_opt");
},
get_remote: function(val) {
return conf_arr.remote;
},
crypt_chat_pass: function(pass) {
/*var key = btoa(socket.id) + btoa(socket.id);
key = key.substring(0,32);
key = btoa(key);
var iv = btoa(Crypt.makeiv());
var encrypted = CryptoJS.AES.encrypt(
pass,
CryptoJS.enc.Base64.parse(key),
{
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: CryptoJS.enc.Base64.parse(iv),
}
);*/
//window.encrypted = encrypted;
return btoa(pass);
//return encrypted.toString() + "$" + iv;
},
crypt_pass: function(pass, userpass) {
if (userpass) {
Crypt.tmp_pass_user = pass;
} else {
Crypt.tmp_pass = pass;
}
//return Crypt.crypt_chat_pass(pass);
return btoa(pass);
},
makeiv: function() {
var text = "";
var possible =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < 16; i++)
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
},
get_width: function() {
return conf_arr.width;
},
set_width: function(val) {
conf_arr.width = val;
Crypt.encrypt(conf_arr, "_opt");
},
getCookie: function(name) {
var value = "; " + document.cookie;
var parts = value.split("; " + name + "=");
if (parts.length == 2)
return parts
.pop()
.split(";")
.shift();
}
};

534
server/public/assets/js/embed.js Executable file
View File

@@ -0,0 +1,534 @@
var slider_type = "horizontal";
var timed_remove_check;
var gotten_np = false;
var song_title = "";
var paused = false;
var intelligentList = false;
var client = false;
var _VERSION;
try {
_VERSION = localStorage.getItem("VERSION");
if (_VERSION == null || _VERSION == undefined) throw "Some error";
} catch (e) {
_VERSION = 6;
}
var SC_widget;
var scUsingWidget = false;
var zoff_api_token = "DwpnKVkaMH2HdcpJT2YPy783SY33byF5/32rbs0+xdU=";
if (
window.location.hostname == "localhost" ||
window.location.hostname == "client.localhost"
) {
var zoff_api_token = "AhmC4Yg2BhaWPZBXeoWK96DAiAVfbou8TUG2IXtD3ZQ=";
}
var SC_player;
var durationTimeout;
var intelligentQueue = [];
var deleted_elements = 0;
var sc_need_initialization = true;
var sc_initialized = false;
var startTime = 0;
var small = false;
var small_player = false;
var full_playlist = [];
var hostMode = false;
var soundcloud_enabled = true;
var socket_connected = false;
var dynamicListeners = {};
var player_ready = false;
var previousSoundcloud;
var buffering = false;
var prev_chan_list = "";
var local_new_channel = false;
var empty_clear = false;
var fix_too_far = false;
var beginning = false;
var soundcloud_loading = false;
var videoSource = "";
var list_html = document.getElementById("list-song-html").innerHTML;
var w_p = true;
var lazy_load = false;
var end_programmatically = false;
var embed = true;
var vol = 100;
var adminpass = "";
var mobile_beginning = false;
var durationBegun = false;
var chromecastAvailable = false;
var private_channel = false;
var was_stopped = false;
var offline = false;
var began = false;
var seekTo;
var socket;
var video_id;
var embedOptions = getSearch(window.location.search);
var chan = Helper.decodeChannelName(embedOptions["channel"]);
var autoplay = embedOptions["autoplay"];
var videoonly = embedOptions["videoonly"];
var color = "#" + embedOptions["color"];
var localmode = embedOptions["localmode"];
var dragging = false;
var user_auth_started = false;
var user_auth_avoid = false;
var connection_options = {
"sync disconnect on unload": true,
secure: true,
"force new connection": true
};
var Crypt = {
crypt_pass: function(pass) {
return pass;
},
get_background_color: function() {
return "dynamic";
}
};
function receiveMessage(event) {
if (event.data == "parent") {
window.parentWindow = event.source;
window.parentOrigin = event.origin;
}
if (event.data == "lower") {
window.setVolume(10);
} else if (event.data == "reset") {
window.setVolume(100);
} else if (event.data == "get_info") {
window.parentWindow.postMessage(
{ type: "np", title: song_title },
window.parentOrigin
);
window.parentWindow.postMessage(
{ type: "controller", id: Hostcontroller.old_id },
window.parentOrigin
);
try {
if (full_playlist.length > 0) {
Player.sendNext({
title: full_playlist[0].title,
videoId: full_playlist[0].id
});
}
} catch (e) {}
}
}
window.addEventListener("message", receiveMessage, false);
window.addEventListener("DOMContentLoaded", function() {});
var Channel = {
set_title_width: function() {},
window_width_volume_slider: function() {}
};
function getSearch(elem) {
var result = {};
var search = window.location.search.split("&");
for (var i = 0; i < search.length; i++) {
var currElement = search[i].split("=");
var key = currElement[0].replace("?", "");
var value = currElement[1];
if (value == "true") value = true;
else if (value == "false") value = false;
result[key] = value;
}
return result;
}
window.addEventListener("load", function() {
if (autoplay) {
Helper.css("#player", "visibility", "hidden");
}
if (videoonly) {
Helper.addClass("#wrapper", "hide");
Helper.addClass("#controls", "hide");
Helper.addClass("#player", "video_only");
Helper.addClass("#player_overlay", "video_only");
Helper.css("#zoffbutton", "bottom", "0px");
Helper.css("#song-title", "width", "100vw");
}
M.Modal.init(document.getElementById("locked_channel"), {
dismissible: false
});
add = "https://zoff.me";
//if(window.location.hostname == "localhost") add = "localhost";
//add = "localhost";
socket = io.connect(
"" + add,
connection_options
);
if (localmode) {
change_offline(true, false);
}
socket.on("auth_required", function() {
M.Modal.getInstance(document.getElementById("locked_channel")).open();
});
document.querySelector(".channel-info-container").href =
"https://zoff.me/" + chan.toLowerCase();
document.querySelector(".channel-title").innerText = "/" + chan.toLowerCase();
socket.on("get_list", function() {
socket_connected = true;
setTimeout(function() {
socket.emit("list", {
version: VERSION,
channel: chan.toLowerCase(),
pass: ""
});
}, 1000);
});
socket.on("self_ping", function() {
if (chan != undefined && chan.toLowerCase() != "") {
socket.emit("self_ping", { channel: chan.toLowerCase() });
}
});
socket.on("viewers", function(view) {
viewers = view;
if (song_title !== undefined) Player.getTitle(song_title, viewers);
});
Player.loadPlayer();
setup_host_initialization();
setup_now_playing_listener();
setup_list_listener();
if (autoplay) {
startWaitTimerPlay();
}
List.calculate_song_heights();
window.onYouTubeIframeAPIReady = Player.onYouTubeIframeAPIReady;
socket.on("toast", toast);
Playercontrols.initSlider();
document
.getElementById("playpause")
.addEventListener("click", Playercontrols.play_pause);
window.setVolume = setVolume;
//Helper.css("#controls", "background-color", color);
document.querySelector("body").style.backgroundColor = color;
if (embedOptions.hasOwnProperty("control") && embedOptions.control) {
Hostcontroller.change_enabled(true);
} else {
Hostcontroller.change_enabled(false);
}
});
window.addEventListener("resize", function() {
resizeFunction();
});
function resizePlaylistPlaying() {}
function startWaitTimerPlay() {
setTimeout(function() {
if (videoSource == "youtube") {
Player.player.playVideo();
} else if (videoSource == "soundcloud") {
Player.soundcloud_player.play();
}
}, 5000);
}
function setup_host_listener(id) {
socket.on(id, Hostcontroller.host_on_action);
}
function setup_host_initialization() {
socket.on("id", Hostcontroller.host_listener);
}
function setup_now_playing_listener() {
socket.on("np", Player.now_playing_listener);
}
function setup_list_listener() {
socket.on("channel", function(msg) {
Helper.addClass(".site_loader", "hide");
List.channel_function(msg);
});
}
function setVolume(val) {
Playercontrols.visualVolume(val);
Playercontrols.setVolume(val);
}
function updateChromecastMetadata() {}
function loadChromecastVideo() {}
function toast(msg) {
switch (msg) {
case "suggested_thumbnail":
if (embed) return;
msg = "The thumbnail has been suggested!";
break;
case "faulty_start_end":
if (embed) return;
break;
case "wait_longer":
if (embed) return;
break;
case "suggested_description":
if (embed) return;
break;
case "thumbnail_denied":
if (embed) return;
break;
case "description_denied":
if (embed) return;
break;
case "addedsong":
if (embed) return;
break;
case "addedplaylist":
if (embed) return;
break;
case "savedsettings":
if (embed) return;
break;
case "wrongpass":
if (embed) return;
break;
case "deleted_songs":
if (embed) return;
break;
case "shuffled":
if (embed) return;
break;
case "deletesong":
if (embed) return;
break;
case "voted":
msg = Helper.rnd([
"You voted!",
"You vote like a boss",
"Voting is the key to democracy",
"May you get your song to the very top!",
"I love that song! I vouch for you.",
"Only you vote that good",
"I like the way you vote...",
"Up the video goes!",
"Voted Zoff for president",
"Only 999 more to go!"
]);
break;
case "alreadyvoted":
msg = Helper.rnd([
"You can't vote twice on that song!",
"I see you have voted on that song before",
"One vote per person!",
"I know you want to hear your song, but have patience!",
"I'm sorry, but I can't let you vote twice, Dave."
]);
break;
case "skip":
if (embed) return;
break;
case "listhaspass":
if (embed) return;
break;
case "noskip":
if (embed) return;
break;
case "alreadyskip":
if (embed) return;
break;
case "notyetskip":
if (embed) return;
break;
case "correctpass":
if (embed) return;
break;
case "changedpass":
if (embed) return;
break;
case "suggested":
if (embed) return;
break;
case "alreadyplay":
if (embed) return;
break;
}
before_toast();
M.toast({ html: msg, displayLength: 4000 });
}
function emit() {
if (!embed) {
lastCommand = [];
for (var i = 0; i < arguments.length; i++) {
lastCommand.push(arguments[i]);
}
}
if (arguments.length == 1) {
socket.emit(arguments[0]);
} else {
socket.emit(arguments[0], arguments[1]);
}
}
function change_offline(enabled, already_offline) {
offline = enabled;
socket.emit("offline", {
status: enabled,
channel: chan != undefined ? chan.toLowerCase() : ""
});
if (!Helper.mobilecheck()) {
if (
document.querySelectorAll("#offline-mode").length == 1 &&
M.Tooltip.getInstance(document.getElementById("offline-mode"))
) {
Helper.tooltip("#offline-mode", "destroy");
}
}
var mouseEnter = function(e) {
Helper.removeClass("#seekToDuration", "hide");
};
var mouseLeave = function(e) {
dragging = false;
Helper.addClass("#seekToDuration", "hide");
};
var mouseDown = function(e) {
var acceptable = ["bar", "controls", "duration"];
if (acceptable.indexOf(e.target.id) >= 0) {
dragging = true;
}
};
var mouseUp = function(e) {
dragging = false;
};
if (enabled) {
Helper.addClass("#viewers", "hide");
Helper.removeClass(".margin-playbar", "margin-playbar");
Helper.addClass(".prev playbar", "margin-playbar");
Helper.removeClass(".prev playbar", "hide");
if (window.location.pathname != "/") {
document
.getElementById("controls")
.addEventListener("mouseenter", mouseEnter, false);
document
.getElementById("controls")
.addEventListener("mouseleave", mouseLeave, false);
document
.getElementById("controls")
.addEventListener("mousedown", mouseDown, false);
document
.getElementById("controls")
.addEventListener("mouseup", mouseUp, false);
document
.getElementById("controls")
.addEventListener("mousemove", seekToMove);
document
.getElementById("controls")
.addEventListener("click", seekToClick);
document
.querySelector("#main_components")
.insertAdjacentHTML(
"beforeend",
"<div id='seekToDuration' class='hide'>00:00/01:00</div>"
);
var controlElement = document.querySelector("#controls");
Helper.css("#seekToDuration", "bottom", "50px");
Helper.addClass("#controls", "ewresize");
}
if (
full_playlist != undefined &&
!already_offline &&
full_playlist.length > 0
) {
for (var x = 0; x < full_playlist.length; x++) {
full_playlist[x].votes = 0;
}
List.sortList();
List.populate_list(full_playlist);
}
}
}
function before_toast() {
/*if($('.toast').length > 0) {
var toastElement = $('.toast').first()[0];
var toastInstance = toastElement.M_Toast;
toastInstance.remove();
}*/
M.Toast.dismissAll();
//Materialize.Toast.removeAll();
}
document.addEventListener(
"click",
function(e) {
handleEvent(e, e.target, false, "click");
},
false
);
addListener("click", ".channel-info-container", function(e) {
this.preventDefault();
Player.pauseVideo();
window.open("https://zoff.me/" + chan.toLowerCase() + "/", "_blank");
});
addListener("click", ".vote-container", function(e) {
var that = e;
var id = that.getAttribute("data-video-id");
List.vote(id, "pos");
});
addListener("click", ".prev_page", function(e) {
event.preventDefault();
List.dynamicContentPage(-1);
});
addListener("click", "#player_overlay", function(event) {
if (videoSource == "soundcloud") Playercontrols.play_pause();
});
addListener("click", ".next_page", function(e) {
event.preventDefault();
List.dynamicContentPage(1);
});
addListener("click", ".prev", function(event) {
this.preventDefault();
if (!offline) return;
List.skip(false);
});
addListener("click", ".skip", function(event) {
this.preventDefault();
//if(!offline) return;
List.skip(true);
});
addListener("click", ".last_page", function(e) {
event.preventDefault();
List.dynamicContentPage(10);
});
addListener("click", ".first_page", function(e) {
event.preventDefault();
List.dynamicContentPage(-10);
});

View File

@@ -0,0 +1,699 @@
var channel_list;
var frontpage = true;
var socket;
var rotation_timeout;
var Frontpage = {
blob_list: [],
winter: new Date().getMonth() >= 10 ? true : false,
pride: function() {
return new Date().getMonth() == 5;
},
times_rotated: 0,
all_channels: [],
frontpage_function: function() {
frontpage = true;
Helper.log(["Frontpage fetch", msg]);
Frontpage.all_channels = window.lists;
var msg = window.lists;
delete window.lists;
window.lists = undefined;
//document.querySelector("#lists-script").remove();
if (msg.length == 0) {
//Helper.css("#preloader", "display", "none");
document
.getElementById("channel-list-container")
.insertAdjacentHTML("beforeend", "<p>No channels yet</p>");
} else {
Frontpage.populate_channels(msg, true, false);
}
//Frontpage.set_viewers(msg.viewers);
},
populate_channels: function(lists, popular, set) {
//document.getElementById("channels").innerHTML = "";
var num = 0;
if (!set) Frontpage.add_backdrop(lists, 0);
else if (set) {
document.getElementById("channels").innerHTML = "";
if (popular) {
lists = lists.sort(
Helper.predicate(
{
name: "pinned",
reverse: true
},
{
name: "viewers",
reverse: true
},
{
name: "accessed",
reverse: true
},
{
name: "count",
reverse: true
}
)
);
} else {
lists = lists.sort(
Helper.predicate(
{
name: "viewers",
reverse: true
},
{
name: "count",
reverse: true
}
)
);
}
if (!Helper.mobilecheck()) {
clearTimeout(rotation_timeout);
Frontpage.add_backdrop(lists, 0);
}
pre_card = channel_list;
Helper.log(["Pre_card: ", pre_card]);
for (var x in lists) {
var chan = Helper.decodeChannelName(lists[x]._id);
if (num < 12 || !popular) {
var id = lists[x].id;
var viewers = lists[x].viewers;
var description = lists[x].description;
var img;
img =
"background-image:url('https://img.youtube.com/vi/" +
id +
"/hqdefault.jpg');";
if (lists[x].thumbnail && lists[x].thumbnail != "") {
img = "background-image:url('" + lists[x].thumbnail + "');";
}
var song_count = lists[x].count;
var card = document.createElement("div");
card.innerHTML += pre_card;
//card.innerHTML = card.children[0];
if (song_count > 3) {
if (lists[x].pinned == 1) {
card
.querySelector(".pin")
.setAttribute("style", "display:block;");
//card.find(".card").attr("title", "Featured list");
} else {
/*card.find(".pin").attr("style", "display:none;");
card.find(".card").attr("title", "");
card.querySelector(".pin").remove();*/
}
card.querySelector(".chan-name").innerText = chan;
card.querySelector(".chan-name").setAttribute("title", chan);
card.querySelector(".chan-views").innerText = viewers;
card.querySelector(".chan-songs").innerText = song_count;
card.querySelector(".chan-bg").setAttribute("style", img);
card.querySelector(".chan-link").setAttribute("href", chan + "/");
if (
description != "" &&
description != undefined &&
!Helper.mobilecheck() &&
description != "This list has no description"
) {
card.querySelector(".card-title").innerText = chan;
card.querySelector(".description_text").innerText = description;
description = "";
} else {
card.querySelector(".card-reveal").remove();
Helper.removeClass(card.querySelector(".card"), "sticky-action");
}
document
.getElementById("channels")
.insertAdjacentHTML("beforeend", card.children[0].innerHTML);
} else {
num--;
}
}
num++;
}
}
var options_list = lists.slice();
options_list = options_list.sort(Frontpage.sortFunction_active);
var data = {};
for (var x in options_list) {
data[Helper.decodeChannelName(options_list[x]._id)] = null;
}
if (
document.querySelectorAll(".pin").length == 1 &&
!Helper.mobilecheck()
) {
Helper.tooltip(
document.querySelectorAll(".pin")[0].parentElement.parentElement
.parentElement,
{
delay: 5,
position: "top",
html: "Featured playlist"
}
);
}
var to_autocomplete = document.querySelectorAll("input.autocomplete")[0];
//if(Helper.mobilecheck()) to_autocomplete = "input.mobile-search";
M.Autocomplete.init(to_autocomplete, {
data: data,
limit: 5, // The max amount of results that can be shown at once. Default: Infinity.
onAutocomplete: function(val) {
Frontpage.to_channel(Helper.encodeChannelName(val), false);
}
});
//document.getElementById("preloader").style.display = "none";
document.getElementById("channels").style.display = "block";
//Materialize.fadeInImage('#channels');
//$("#channels").fadeIn(800);
//document.getElementById("autocomplete-input").focus();
num = 0;
},
sortFunction: function(a, b) {
var o1 = a.viewers;
var o2 = b.viewers;
var p1 = a.count;
var p2 = b.count;
if (o1 < o2) return 1;
if (o1 > o2) return -1;
if (p1 < p2) return 1;
if (p1 > p2) return -1;
return 0;
},
sortFunction_active: function(a, b) {
var o1 = a.accessed;
var o2 = b.accessed;
var p1 = a.count;
var p2 = b.count;
if (o1 < o2) return 1;
if (o1 > o2) return -1;
if (p1 < p2) return 1;
if (p1 > p2) return -1;
return 0;
},
getCookie: function(cname) {
var name = cname + "=";
var ca = document.cookie.split(";");
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == " ") c = c.substring(1);
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
}
return "";
},
add_backdrop: function(list, i) {
if (i >= list.length || i >= 20) i = 0;
if (list[i] == undefined) return;
var id = list[i].id;
if (Frontpage.blob_list[i] !== undefined) {
//$(".room-namer").css("opacity", 0);
setTimeout(function() {
if (frontpage) {
Helper.css(
"#mega-background",
"background",
"url(data:image/png;base64," + Frontpage.blob_list[i] + ")"
);
Helper.css("#mega-background", "background-size", "cover");
Helper.css("#mega-background", "background-repeat", "no-repeat");
Helper.css("#mega-background", "opacity", 1);
document
.querySelector(".autocomplete")
.setAttribute("placeholder", Helper.decodeChannelName(list[i]._id));
//$(".room-namer").css("opacity", 1);
}
}, 500);
} else {
var img = new Image();
img.src = "/assets/images/thumbnails/" + id + ".jpg";
img.onerror = function(e) {
// Failed to load
var add = "";
if (window.location.hostname == "fb.zoff.me") {
add = "https://zoff.me";
}
Helper.ajax({
type: "POST",
data: { id: id },
url: add + "/api/imageblob",
headers: { "Content-Type": "application/json;charset=UTF-8" },
success: function(data) {
setTimeout(function() {
try {
Helper.css(
"#mega-background",
"background",
"url(/assets/images/thumbnails/" + data + ")"
);
Helper.css("#mega-background", "background-size", "cover");
Helper.css(
"#mega-background",
"background-repeat",
"no-repeat"
);
Helper.css("#mega-background", "opacity", 1);
document
.querySelector(".autocomplete")
.setAttribute(
"placeholder",
Helper.decodeChannelName(list[i]._id)
);
} catch (e) {}
}, 500);
},
error: function() {
try {
document
.querySelector(".autocomplete")
.setAttribute(
"placeholder",
Helper.decodeChannelName(list[i]._id)
);
} catch (e) {
console.log("This is a weird error...", e);
}
}
});
};
img.onload = function() {
// Loaded successfully
try {
Helper.css("#mega-background", "background", "url(" + img.src + ")");
Helper.css("#mega-background", "background-size", "cover");
Helper.css("#mega-background", "background-repeat", "no-repeat");
Helper.css("#mega-background", "opacity", 1);
document
.querySelector(".autocomplete")
.setAttribute("placeholder", Helper.decodeChannelName(list[i]._id));
} catch (e) {}
};
}
rotation_timeout = setTimeout(function() {
if (Frontpage.times_rotated == 50 && frontpage) {
Frontpage.times_rotated = 0;
i = 0;
//Frontpage.get_frontpage_lists();
} else if (frontpage) {
Frontpage.times_rotated += 1;
Frontpage.add_backdrop(list, i + 1);
}
}, 6000);
},
get_frontpage_lists: function() {
var add = "";
if (window.location.hostname == "fb.zoff.me") {
add = "https://zoff.me";
}
Frontpage.frontpage_function();
/*Helper.ajax({
url: add + "/api/frontpages",
method: "POST",
data: {
token: zoff_api_token,
},
success: function(response){
response = JSON.parse(response);
Frontpage.frontpage_function(response.results);
},
error: function() {
M.toast({html: "Couldn't fetch lists, trying again in 3 seconds..", displayLength: 3000, classes: "red lighten connect_error"});
retry_frontpage = setTimeout(function(){
Frontpage.get_frontpage_lists();
}, 3000);
},
});*/
},
start_snowfall: function() {
setTimeout(function() {
var x = Math.floor(Math.random() * window.innerWidth + 1);
var snow = document.createElement("div");
var parent = document.getElementsByClassName("mega")[0];
snow.className = "snow";
//snow.attr("left", x);
snow.style.left = x + "px";
snow.style.top = "0px";
parent.appendChild(snow);
Frontpage.fall_snow(snow);
Frontpage.start_snowfall();
}, 800);
},
fall_snow: function(corn) {
corn.style.top = parseInt(corn.style.top.replace("px", "")) + 2 + "px";
if (
parseInt(corn.style.top.replace("px", "")) <
document.getElementById("mega-background").offsetHeight - 2.5
) {
setTimeout(function() {
Frontpage.fall_snow(corn);
}, 50);
} else {
corn.remove();
}
},
set_viewers: function(viewers) {
document.querySelector("#frontpage-viewer-counter").innerHTML =
"<i class='material-icons frontpage-viewers'>visibility</i>" + viewers;
},
to_channel: function(new_channel, popstate) {
Helper.css("#channel-load", "display", "block");
window.scrollTo(0, 0);
frontpage = false;
new_channel = new_channel.toLowerCase();
clearTimeout(rotation_timeout);
if (Helper.mobilecheck()) {
Helper.log(["removing all listeners"]);
removeAllListeners();
}
Helper.css("#main-container", "background-color", "#2d2d2d");
if (!Helper.mobilecheck()) {
Helper.tooltip("#frontpage-viewer-counter", "destroy");
Helper.tooltip(".generate-channel-name", "destroy");
Helper.tooltip("#offline-mode", "destroy");
Helper.tooltip("#client-mode-button", "destroy");
if (document.querySelectorAll(".pin").length == 1) {
Helper.tooltip(
document.querySelectorAll(".pin")[0].parentElement.parentElement
.parentElement,
"destroy"
);
}
}
currently_showing_channels = 1;
clearTimeout(retry_frontpage);
Helper.ajax({
url: "/" + new_channel,
method: "get",
data: { channel: new_channel },
success: function(e) {
if (Player.player !== "") {
//Player.player.destroy();
socket.emit("change_channel", { channel: chan.toLowerCase() });
}
var _player = document.querySelectorAll("#frontpage_player");
if (_player.length > 0) _player[0].innerHTML = "";
if (Helper.mobilecheck()) {
//Helper.log("disconnecting");
//socket.disconnect();
socket.removeAllListeners();
}
var old_chan = chan;
if (!popstate) {
window.history.pushState(
"to the channel!",
"Title",
"/" + new_channel
);
if (prev_chan_list == "") prev_chan_list = new_channel;
if (prev_chan_player == "") prev_chan_player = new_channel;
chan = new_channel;
}
var response = document.createElement("div");
response.innerHTML = e;
M.FormSelect.getInstance(
document.querySelector("#view_channels_select")
).destroy();
//$('select').formSelect('destroy');
Helper.removeElement(".mega");
Helper.removeElement(".mobile-search");
document.getElementsByTagName("main")[0].className =
"container center-align main";
Helper.addClass("#main-container", "channelpage");
document.getElementsByTagName(
"header"
)[0].innerHTML = response.querySelectorAll("header")[0].innerHTML;
if (
document.querySelectorAll("#alreadychannel").length === 0 ||
Helper.mobilecheck() ||
Player.player === undefined
) {
document.getElementsByTagName(
"main"
)[0].innerHTML = response.querySelectorAll("main")[0].innerHTML;
} else {
document
.getElementById("main-row")
.insertAdjacentHTML(
"beforeend",
response.querySelectorAll("#playlist")[0].outerHTML
);
if (!client)
document
.getElementById("video-container")
.insertAdjacentHTML(
"beforeend",
response.querySelectorAll("#main_components")[0].outerHTML
);
document
.getElementById("main-row")
.insertAdjacentHTML("beforeend", "<div id='playbar'></div>");
Helper.removeClass("#player", "player_bottom");
Helper.removeClass("#player_overlay", "player_bottom");
Helper.removeClass(".video-container", "frontpage-player");
Helper.removeClass("#main-row", "frontpage_modified_heights");
Helper.removeElement("#main_section_frontpage");
Helper.removeElement("#closePlayer");
Helper.removeElement("#player_bottom_overlay");
}
document
.getElementById("search")
.setAttribute("placeholder", "Search...");
Helper.addClass(".page-footer", "padding-bottom-novideo");
from_frontpage = true;
//Player.stopInterval =true;
//clearTimeout(durationTimeout);
if (document.querySelectorAll("#alreadychannel").length == 1) {
if (old_chan != new_channel) local_new_channel = true;
Channel.init();
} else {
fromFront = true;
Channel.init();
}
if (document.querySelectorAll("#alreadyfp").length === 0)
document
.getElementsByTagName("head")[0]
.insertAdjacentHTML("beforeend", "<div id='alreadyfp'></div>");
}
});
},
init: function() {
var date = new Date();
Frontpage.blob_list = [];
if (date.getMonth() == 3 && date.getDate() == 1) {
Helper.css(".mega", "-webkit-transform", "rotate(180deg)");
Helper.css(".mega", "-moz-transform", "rotate(180deg)");
//Materialize.toast('<p id="aprilfools">We suck at pranks..<a class="waves-effect waves-light btn light-green" style="pointer-events:none;">Agreed</a></p>', 100000);
}
if (window.location.hostname != "localhost") {
var page = window.location.pathname;
if (page.substring(page.length - 1) != "/") page += "/";
ga("send", "pageview", page);
}
window.onpopstate = function(e) {
var url_split = window.location.href.split("/");
if (url_split[3] !== "" && url_split[3].substring(0, 1) != "#") {
Frontpage.to_channel(url_split[3], true);
}
};
if (window.location.hostname == "fb.zoff.me") {
Helper.addClass("footer", "hide");
}
channel_list = document
.querySelector(".hidden-channel-list")
.cloneNode(true).innerHTML;
try {
document.querySelector(".hidden-channel-list").remove();
} catch (e) {}
Frontpage.share_link_modifier();
if (
window.location.hostname == "zoff.me" ||
window.location.hostname == "fb.zoff.me"
)
add = "https://zoff.me";
else add = window.location.hostname;
if (socket === undefined) {
no_socket = false;
if (window.location.port != "") {
add = add + ":" + window.location.port + "/";
}
socket = io.connect(
"" + add,
connection_options
);
socket.on("update_required", function(msg) {
if (window.location.hostname == "localhost") {
console.log(msg);
return;
}
window.location.reload(true);
});
}
if (
document.querySelectorAll("#alreadyfp").length === 0 ||
Helper.mobilecheck() ||
!socket._callbacks.$playlists ||
user_auth_avoid
) {
setup_playlist_listener();
}
/*M.Modal.init(document.getElementById("about"));
M.Modal.init(document.getElementById("help"));
M.Modal.init(document.getElementById("contact"));*/
var elem = document.querySelector("select");
document.querySelector(".no-jump-select").remove();
M.FormSelect.init(elem);
Helper.log(["Sending frontpage_lists", "Socket"]);
Crypt.init();
if (Crypt.get_offline()) {
change_offline(true, offline);
} else {
if (!Helper.mobilecheck()) {
Helper.tooltip("#offline-mode", {
delay: 5,
position: "bottom",
html: "Enable local mode"
});
}
}
if (!Helper.mobilecheck()) {
Helper.tooltip("#frontpage-viewer-counter", {
delay: 5,
position: "bottom",
html: "Total Viewers"
});
Helper.tooltip("#client-mode-button", {
delay: 5,
position: "bottom",
html: "Client mode"
});
Helper.tooltip(".generate-channel-name", {
delay: 5,
position: "bottom",
html: "Generate name"
});
}
Frontpage.get_frontpage_lists();
Helper.css("#channel-load", "display", "none");
//Materialize.toast("<a href='/remote' style='color:white;'>Try out our new feature, remote!</a>", 8000)
if (window.location.hash == "#donation") {
window.location.hash = "#";
M.Modal.init(document.getElementById("donation"));
M.Modal.getInstance(document.getElementById("donation")).open();
}
//var pad = 0;
/*$(".zicon").on("click", function(e) {
e.preventDefault();
pad += 10;
Helper.css(".zicon", "padding-left", pad + "vh");
if(pad >= 80)
window.location.href = 'http://etys.no';
});*/
if (!Helper.mobilecheck() && Frontpage.winter) {
document
.getElementsByClassName("mega")[0]
.insertAdjacentHTML("afterbegin", '<div id="snow"></div>');
}
if (Frontpage.pride()) {
Helper.addClass("#fp-nav", "pride-background");
}
if (Helper.mobilecheck()) {
//$('input#autocomplete-input').characterCounter();
}
window["__onGCastApiAvailable"] = function(loaded, errorInfo) {
if (loaded) {
chromecastReady = true;
} else {
}
};
},
share_link_modifier: function() {
document
.getElementById("facebook-code-link")
.setAttribute(
"href",
"https://www.facebook.com/sharer/sharer.php?u=https://zoff.me/"
);
document
.getElementById("facebook-code-link")
.setAttribute(
"onclick",
"window.open('https://www.facebook.com/sharer/sharer.php?u=https://zoff.me/', 'Share Zoff','width=600,height=300'); return false;"
);
document
.getElementById("twitter-code-link")
.setAttribute(
"href",
"https://twitter.com/intent/tweet?url=https://zoff.me/&amp;text=Check%20out%20Zoff!&amp;via=zoffmusic"
);
document
.getElementById("twitter-code-link")
.setAttribute(
"onclick",
"window.open('https://twitter.com/intent/tweet?url=https://zoff.me/&amp;text=Check%20out%20Zoff!&amp;via=zoffmusic','Share Playlist','width=600,height=300'); return false;"
);
//$("#qr-code-link").attr("href", "//chart.googleapis.com/chart?chs=500x500&cht=qr&chl=https://zoff.me/&choe=UTF-8&chld=L%7C1");
//$("#qr-code-image-link").attr("src", "//chart.googleapis.com/chart?chs=150x150&cht=qr&chl=https://zoff.me/&choe=UTF-8&chld=L%7C1");
}
};
String.prototype.capitalizeFirstLetter = function() {
return this.charAt(0).toUpperCase() + this.slice(1);
};

Some files were not shown because too many files have changed in this diff Show More