...
 
Commits (6)
> 1%
last 2 versions
not ie <= 8
> 1% in de
not dead
......@@ -9,7 +9,16 @@ module.exports = {
],
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'indent': 'off',
'vue/script-indent': [
'warn',
2,
{
'baseIndent': 1,
'switchCase': 1
}
]
},
parserOptions: {
parser: 'babel-eslint'
......
.DS_Store
node_modules
/dist
/build
# local env files
.env.local
......@@ -8,14 +7,3 @@ node_modules
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*
......@@ -10,5 +10,6 @@ RUN npm run build
# stage-2: copy static files to nginx image
FROM nginx:alpine
EXPOSE 5000
COPY system-files/nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=build /usr/src/app/dist /usr/share/nginx/html
COPY system-files/nginx-defaultsite.conf /etc/nginx/conf.d/thekno.conf
COPY system-files/nginx-spa.conf /etc/nginx/conf.d/thekno-spa.include
COPY --from=build /usr/src/app/build/dist /usr/share/thekno/html
# saumselig
# thekno
## Project setup
```
......
Audio files are taken from [wowa.me](https://www.wowa.me/) and were released into the public domain.
Encoding commands:
```sh
ffmpeg -i $filename.mp3 -codec:a libopus -b:a 32000 -vbr on -compression_level 10 $filename.ogg
ffmpeg -i $filename.mp3 -codec:a libmp3lame -qscale:a 9 $filename_lq.mp3
```
export default [
{
'id': 1,
'series_id': 1,
'title': null,
'description': null,
'start_time': '2019-03-24T00:00:00+01:00',
'end_time': '2019-03-24T01:59:59+01:00',
'recording_ids': [1, 2]
},
{
'id': 2,
'series_id': 2,
'title': null,
'description': null,
'start_time': '2019-03-24T21:00:00+01:00',
'end_time': '2019-03-24T21:59:59+01:00',
'recording_ids': [3, 4]
},
{
'id': 3,
'series_id': 4,
'title': null,
'description': null,
'start_time': '2019-03-15T18:00:00+01:00',
'end_time': '2019-03-15T19:59:59+01:00',
'recording_ids': [3, 1]
},
{
'id': 4,
'series_id': 1,
'title': null,
'description': null,
'start_time': '2019-03-17T00:00:00+01:00',
'end_time': '2019-03-17T01:59:59+01:00',
'recording_ids': [4, 2]
},
{
'id': 5,
'series_id': 2,
'title': null,
'description': null,
'start_time': '2019-03-17T21:00:00+01:00',
'end_time': '2019-03-17T21:59:59+01:00',
'recording_ids': [3, 2]
},
{
'id': 6,
'series_id': 3,
'title': null,
'description': null,
'start_time': '2019-03-18T16:00:00+01:00',
'end_time': '2019-03-18T17:59:59+01:00',
'recording_ids': [2, 4, 3, 1]
},
{
'id': 7,
'series_id': 5,
'title': null,
'description': null,
'start_time': '2019-03-18T19:00:00+01:00',
'end_time': '2019-03-18T20:59:59+01:00',
'recording_ids': [3, 1, 2]
},
{
'id': 8,
'series_id': 4,
'title': null,
'description': null,
'start_time': '2019-03-22T18:00:00+01:00',
'end_time': '2019-03-22T19:59:59+01:00',
'recording_ids': [4, 1, 3]
},
{
'id': 9,
'series_id': 4,
'title': null,
'description': null,
'start_time': '2019-03-08T18:00:00+01:00',
'end_time': '2019-03-08T19:59:59+01:00',
'recording_ids': [1, 2, 3]
},
{
'id': 10,
'series_id': 1,
'title': null,
'description': null,
'start_time': '2019-03-10T00:00:00+01:00',
'end_time': '2019-03-10T01:59:59+01:00',
'recording_ids': [3, 2, 4]
}
]
const licenseCcBy4 = {
'name': 'Creative Commons Attribution 4.0 International',
'spdx_identifier': 'CC-BY-4.0',
'url': 'https://spdx.org/licenses/CC-BY-4.0.html'
}
const licenseCcByNcSa4 = {
'name': 'Creative Commons Attribution Non Commercial Share Alike 4.0 International',
'spdx_identifier': 'CC-BY-NC-SA-4.0',
'url': 'https://spdx.org/licenses/CC-BY-NC-SA-4.0.html'
}
const licenseCcBySa4 = {
'name': 'Creative Commons Attribution Share Alike 4.0 International',
'spdx_identifier': 'CC-BY-SA-4.0',
'url': 'https://spdx.org/licenses/CC-BY-SA-4.0.html'
}
const licenseCcZero1 = {
'name': 'Creative Commons Zero v1.0 Universal',
'spdx_identifier': 'CC0-1.0',
'url': 'https://spdx.org/licenses/CC0-1.0.html'
}
const audioBadBehaviour = {
'description': null,
'sources': [
{
'container': null,
'codec': 'audio/mpeg',
'bitrate': 81.6,
'src': require('./audio/bad_behaviors_lq.mp3')
},
{
'container': 'audio/ogg',
'codec': 'audio/opus',
'bitrate': 32.7,
'src': require('./audio/bad_behaviors.ogg')
}
]
}
const audioHospitalized = {
'description': null,
'sources': [
{
'container': null,
'codec': 'audio/mpeg',
'bitrate': 76.7,
'src': require('./audio/hospitalized_lq.mp3')
},
{
'container': 'audio/ogg',
'codec': 'audio/opus',
'bitrate': 31.3,
'src': require('./audio/hospitalized.ogg')
}
]
}
const audioJazzMezzo = {
'description': null,
'sources': [
{
'container': null,
'codec': 'audio/mpeg',
'bitrate': 76.9,
'src': require('./audio/jazz_mezzo_lq.mp3')
},
{
'container': 'audio/ogg',
'codec': 'audio/opus',
'bitrate': 35.4,
'src': require('./audio/jazz_mezzo.ogg')
}
]
}
export default [
{
'id': 1,
'license': licenseCcBy4,
'description': null,
'audio': [
audioBadBehaviour
]
},
{
'id': 2,
'license': licenseCcZero1,
'description': null,
'audio': [
audioHospitalized
]
},
{
'id': 3,
'license': licenseCcByNcSa4,
'description': null,
'audio': [
audioJazzMezzo,
audioHospitalized
]
},
{
'id': 4,
'license': licenseCcBySa4,
'description': null,
'audio': [
audioHospitalized
]
}
]
export default [
{
'id': 1,
'name': 'Sternradio',
'teaser': 'Gute Musik und anspruchsvolle Tresengespräche jede Nacht von Samstag auf Sonntag, 0-2 Uhr.',
'description': null,
'cover_image': {
'alt': 'Illustriertes Bild mit Sternradio-Logo samt großem Stern in der Mitte und jeweils links und rechts davon die Schriftzüge "Stern" und "Radio". Darunter ein Schallplattenspieler.',
'sources': [
{ 'size': 'sm', 'width': 320, 'height': 160, 'src': require('./images/sternradio.jpg') },
{ 'size': 'md', 'width': 800, 'height': 400, 'src': require('./images/sternradio.jpg') },
{ 'size': 'lg', 'width': 1200, 'height': 600, 'src': require('./images/sternradio.jpg') }
]
}
},
{
'id': 2,
'name': 'Metaltörn',
'teaser': 'Die Metaltörner sind Metalenthusiasten aus Rostock und Umgebung. Unser Ziel ist es, eine starke Metal-Subkultur hier vor Ort zu schaffen und zu unterstützen.',
'description': null,
'cover_image': {
'alt': 'Verwirrter junger Mann hält E-Gitarre in den Armen und leckt an deren Hals.',
'sources': [
{ 'size': 'sm', 'width': 320, 'height': 160, 'src': require('./images/metaltoern.jpg') },
{ 'size': 'md', 'width': 800, 'height': 400, 'src': require('./images/metaltoern.jpg') },
{ 'size': 'lg', 'width': 1200, 'height': 600, 'src': require('./images/metaltoern.jpg') }
]
}
},
{
'id': 3,
'name': 'BEATBETRIEB',
'teaser': 'Seit Jahren sind wir daran interessiert Musik aufzuspüren, die neu und innovativ ist. Nicht auf anderen Sendern zu finden und den Menschen in Rostock ein gutes Gefühl gibt.',
'description': 'Musik ist eine Brücke zwischen Menschen, ein Träger von Gefühlen und Meinungen und charakteristisches Zeichen von Radio LOHRO. Seit Jahren sind wir daran interessiert Musik aufzuspüren, die neu und innovativ ist. Nicht auf anderen Sendern zu finden und den Menschen in Rostock ein gutes Gefühl gibt. Der BeatBetrieb fasst dies in Worte und gibt der Musik abseits der massentauglichen Wege einen Platz.',
'cover_image': {
'alt': 'Wand mit mehreren Werbe-Plakaten von Beatbetrieb',
'sources': [
{ 'size': 'sm', 'width': 320, 'height': 160, 'src': require('./images/beatbetrieb.jpg') },
{ 'size': 'md', 'width': 800, 'height': 400, 'src': require('./images/beatbetrieb.jpg') },
{ 'size': 'lg', 'width': 1200, 'height': 600, 'src': require('./images/beatbetrieb.jpg') }
]
}
},
{
'id': 4,
'name': 'Cup of Soul',
'teaser': 'Jeden Freitag von 18-20 Uhr verwöhnen wir Euch mit herrlichem Soul, großartigem Funk und der besten artverwandten Musik.',
'description': null,
'cover_image': {
'alt': 'Illustriertes Bild im 50er Stil auf dem eine Frau eine Schallplatte mit der Zange hält und vor einem Herd steht, dessen Heizflächen Plattenteller sind.',
'sources': [
{ 'size': 'sm', 'width': 320, 'height': 160, 'src': require('./images/cup_of_soul.jpg.jpg') },
{ 'size': 'md', 'width': 800, 'height': 400, 'src': require('./images/cup_of_soul.jpg') },
{ 'size': 'lg', 'width': 1200, 'height': 600, 'src': require('./images/cup_of_soul.jpg') }
]
}
},
{
'id': 5,
'name': 'Jazz & Blues',
'teaser': 'Jazz und Blues lokal und international',
'description': null,
'cover_image': {
'alt': 'Blechblasinstrument',
'sources': [
{ 'size': 'sm', 'width': 320, 'height': 160, 'src': require('./images/jazz_bluez.jpg') },
{ 'size': 'md', 'width': 800, 'height': 400, 'src': require('./images/jazz_bluez.jpg') },
{ 'size': 'lg', 'width': 1200, 'height': 600, 'src': require('./images/jazz_bluez.jpg') }
]
}
}
]
{
"name": "saumselig",
"name": "thekno",
"version": "0.1.0",
"lockfileVersion": 1,
"requires": true,
......@@ -11733,6 +11733,15 @@
"integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
"dev": true
},
"yaml-loader": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/yaml-loader/-/yaml-loader-0.5.0.tgz",
"integrity": "sha512-p9QIzcFSNm4mCw/m5NdyMfN4RE4aFZJWRRb01ERVNGCym8VNbKtw3OYZXnvUIkim6U/EjqE/2yIh9F/msShH9A==",
"dev": true,
"requires": {
"js-yaml": "^3.5.2"
}
},
"yargs": {
"version": "12.0.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz",
......
{
"name": "saumselig",
"name": "thekno",
"version": "0.1.0",
"private": true,
"scripts": {
......@@ -7,7 +7,7 @@
"build": "vue-cli-service build --modern",
"test": "npm run lint",
"lint": "vue-cli-service lint",
"docker": "docker build . -t vue-app && docker run -d -p 5000:5000 vue-app"
"docker": "docker build . -t thekno && docker run -d -p 5000:5000 thekno"
},
"dependencies": {
"vue": "^2.6.9",
......@@ -34,6 +34,7 @@
"vue-cli-plugin-i18n": "^0.5.2",
"vue-cli-plugin-vuetify": "^0.5.0",
"vue-template-compiler": "^2.6.9",
"vuetify-loader": "^1.0.5"
"vuetify-loader": "^1.0.5",
"yaml-loader": "^0.5.0"
}
}
......@@ -5,13 +5,13 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>saumselig</title>
<title>thekno</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Material+Icons">
</head>
<body>
<noscript>
<strong>We're sorry but saumselig doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
<strong>We're sorry but thekno doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
......
# nginx default site for Docker image
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 5000 default_server;
listen [::]:5000 default_server;
root /usr/share/thekno/html;
location /api/ {
proxy_pass https://thek.lohro.de;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
include /etc/nginx/conf.d/thekno-spa.include;
}
# nginx default configuration for Vue single page app
location / {
# try to resolve files and always fallback to the index.html file
try_files $uri $uri/ /index.html;
location ~* "\.(?:[0-9a-f]{8,32})\.(?:[0-9a-z]+)$" {
# cache immutable files (indicated by the contained hash) indefinitely
add_header Cache-Control "public, immutable, max-age=365000000";
}
location ~* "\.(?:[0-9a-z]+)$" {
# normal files should always be revalidated by the cache
# no-cache is somewhat un-intuitive:
# it means that the resource is allowed to be stored in the cache,
# but that the cache must ask us, if it’s still up-to-date
add_header Cache-Control "public, no-cache";
}
}
server {
listen 5000;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
module.exports = {
outputDir: 'build/dist',
pluginOptions: {
i18n: {
locale: 'en',
......@@ -6,5 +7,17 @@ module.exports = {
localeDir: 'locales',
enableInSFC: true
}
},
chainWebpack: config => {
config.module
.rule('i18n')
.resourceQuery(/blockType=i18n/)
.type('javascript/auto')
.use('i18n')
.loader('@kazupon/vue-i18n-loader')
.end()
.use('yaml')
.loader('yaml-loader')
.end()
}
}