diff --git a/CHANGELOG b/CHANGELOG index c02e7665e1fe5de08762c1cc24ad77dad397b045..1b98df96e32ad596bff153a67d670a4eefa27f78 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,17 @@ Changelog ---------------- +0.5.2 (2018-02-26) +------------------ + +- Fixed broken file import due to wrong url (#73) +- More accurate mimetype detection +- Fixed really small size on small screens +- Added masonry layout for artists, requests and radios (#68) +- We now have a favicon! +- Fixed truncated play icon (#65) + + 0.5.1 (2018-02-24) ------------------ diff --git a/api/funkwhale_api/__init__.py b/api/funkwhale_api/__init__.py index d3e404f122db7601939f9f3cea1ce64a6cc60383..2df7e2034219375fac6f0dffd0865f54d6c4f589 100644 --- a/api/funkwhale_api/__init__.py +++ b/api/funkwhale_api/__init__.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- -__version__ = '0.5.1' +__version__ = '0.5.2' __version_info__ = tuple([int(num) if num.isdigit() else num for num in __version__.replace('-', '.', 1).split('.')]) diff --git a/api/funkwhale_api/music/utils.py b/api/funkwhale_api/music/utils.py index a75cf5de8508efaa5df587eb17b01a2e87f1214f..df659cb8057b3c519610ff0a70f2524b973d220f 100644 --- a/api/funkwhale_api/music/utils.py +++ b/api/funkwhale_api/music/utils.py @@ -1,4 +1,5 @@ import magic +import mimetypes import re from django.db.models import Q @@ -42,7 +43,13 @@ def get_query(query_string, search_fields): def guess_mimetype(f): b = min(100000, f.size) - return magic.from_buffer(f.read(b), mime=True) + t = magic.from_buffer(f.read(b), mime=True) + if t == 'application/octet-stream': + # failure, we try guessing by extension + mt, _ = mimetypes.guess_type(f.path) + if mt: + t = mt + return t def compute_status(jobs): diff --git a/api/tests/music/test_utils.py b/api/tests/music/test_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..0a4f4b99424c34557fb846866b6e1b2958244a88 --- /dev/null +++ b/api/tests/music/test_utils.py @@ -0,0 +1,19 @@ +from funkwhale_api.music import utils + + +def test_guess_mimetype_try_using_extension(factories, mocker): + mocker.patch( + 'magic.from_buffer', return_value='audio/mpeg') + f = factories['music.TrackFile'].build( + audio_file__filename='test.ogg') + + assert utils.guess_mimetype(f.audio_file) == 'audio/mpeg' + + +def test_guess_mimetype_try_using_extension_if_fail(factories, mocker): + mocker.patch( + 'magic.from_buffer', return_value='application/octet-stream') + f = factories['music.TrackFile'].build( + audio_file__filename='test.mp3') + + assert utils.guess_mimetype(f.audio_file) == 'audio/mpeg' diff --git a/front/index.html b/front/index.html index 55e32a7ee20612128e338e3b58096b4f13e90408..da815d61914ac3753686b60147c5f673ba846a78 100644 --- a/front/index.html +++ b/front/index.html @@ -3,6 +3,8 @@ <head> <meta charset="utf-8"> <title>Funkwhale</title> + <link rel="shortcut icon" type="image/png" href="/static/favicon.png"/> + <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <div id="app"></div> diff --git a/front/package.json b/front/package.json index 042e332d0eb91d81df9c27fe13b82b0e16013d3a..d6bdb8c56caaeb8da80213800537ed255b5c960a 100644 --- a/front/package.json +++ b/front/package.json @@ -20,6 +20,7 @@ "js-logger": "^1.3.0", "jwt-decode": "^2.2.0", "lodash": "^4.17.4", + "masonry-layout": "^4.2.1", "moment": "^2.20.1", "moxios": "^0.4.0", "raven-js": "^3.22.3", @@ -27,6 +28,7 @@ "showdown": "^1.8.6", "vue": "^2.3.3", "vue-lazyload": "^1.1.4", + "vue-masonry": "^0.10.16", "vue-router": "^2.3.1", "vue-upload-component": "^2.7.4", "vuedraggable": "^2.14.1", diff --git a/front/src/App.vue b/front/src/App.vue index 8453aa33941813d6c451fa2184d05e7f9c669486..3e39d7262ccec891711e7d6a16c8454a53559aaa 100644 --- a/front/src/App.vue +++ b/front/src/App.vue @@ -59,7 +59,7 @@ export default { html, body { @include media("<desktop") { - font-size: 200%; + font-size: 90%; } } #app { diff --git a/front/src/components/audio/album/Card.vue b/front/src/components/audio/album/Card.vue index 968b828a49df356baf3ab104edc6e7fa5c811bc5..ea42f06a8392871cca63b6d5fbe62d5f26d75455 100644 --- a/front/src/components/audio/album/Card.vue +++ b/front/src/components/audio/album/Card.vue @@ -17,7 +17,7 @@ <table class="ui very basic fixed single line compact unstackable table"> <tbody> <tr v-for="track in tracks"> - <td> + <td class="play-cell"> <play-button class="basic icon" :track="track" :discrete="true"></play-button> </td> <td colspan="6"> @@ -67,7 +67,7 @@ export default { data () { return { backend: backend, - initialTracks: 4, + initialTracks: 5, showAllTracks: false } }, @@ -85,6 +85,9 @@ export default { <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped lang="scss"> +table.fixed td.play-cell { + overflow: auto; +} tr { .favorite-icon:not(.favorited) { display: none; diff --git a/front/src/components/audio/artist/Card.vue b/front/src/components/audio/artist/Card.vue index 9a82d6c8f315e09ab6d6ce2fb08c491ec31183e9..a5111434546e43c233d717616aa4363c7e6a36f3 100644 --- a/front/src/components/audio/artist/Card.vue +++ b/front/src/components/audio/artist/Card.vue @@ -54,8 +54,8 @@ export default { data () { return { backend: backend, - initialAlbums: 3, - showAllAlbums: false + initialAlbums: 30, + showAllAlbums: true } }, computed: { diff --git a/front/src/components/library/Artist.vue b/front/src/components/library/Artist.vue index c2834e1de87b11fd3fdd2f9e4e8a65c5c1045e75..7724428cac36ced03671c461dd76bea3acdd6364 100644 --- a/front/src/components/library/Artist.vue +++ b/front/src/components/library/Artist.vue @@ -30,7 +30,7 @@ </div> <div class="ui vertical stripe segment"> <h2>Albums by this artist</h2> - <div class="ui stackable three column grid"> + <div class="ui stackable doubling three column grid"> <div class="column" :key="album.id" v-for="album in albums"> <album-card :mode="'rich'" class="fluid" :album="album"></album-card> </div> diff --git a/front/src/components/library/Artists.vue b/front/src/components/library/Artists.vue index c9bea5efc0c4667f9c625a62bf12f9b820c1dbf5..3cf123447128d8198853036ab1be5c0b52ebbc0a 100644 --- a/front/src/components/library/Artists.vue +++ b/front/src/components/library/Artists.vue @@ -34,8 +34,16 @@ </div> </div> <div class="ui hidden divider"></div> - <div v-if="result" class="ui stackable three column grid"> + <div + v-if="result" + v-masonry + transition-duration="0" + item-selector=".column" + percent-position="true" + stagger="0" + class="ui stackable three column doubling grid"> <div + v-masonry-tile v-if="result.results.length > 0" v-for="artist in result.results" :key="artist.id" diff --git a/front/src/components/library/Radios.vue b/front/src/components/library/Radios.vue index 1952908ff8a5a56a6731c4ca3b6c74803beca8d5..303ce100ecf35ec46be8d6909b03398dbe125826 100644 --- a/front/src/components/library/Radios.vue +++ b/front/src/components/library/Radios.vue @@ -36,8 +36,16 @@ </div> </div> <div class="ui hidden divider"></div> - <div v-if="result" class="ui stackable three column grid"> + <div + v-if="result" + v-masonry + transition-duration="0" + item-selector=".column" + percent-position="true" + stagger="0" + class="ui stackable three column doubling grid"> <div + v-masonry-tile v-if="result.results.length > 0" v-for="radio in result.results" :key="radio.id" diff --git a/front/src/components/library/import/FileUpload.vue b/front/src/components/library/import/FileUpload.vue index 35b7b636ad79200d36e68c9b53a0fff8918edd3d..1b90adc9d71b2d0425603d0cbb9f98de0b51a905 100644 --- a/front/src/components/library/import/FileUpload.vue +++ b/front/src/components/library/import/FileUpload.vue @@ -29,7 +29,7 @@ </button> </div> <div class="ui hidden divider"></div> - <p> + <p v-if="batch"> Once all your files are uploaded, simply head over <router-link :to="{name: 'library.import.batches.detail', params: {id: batch.id }}">import detail page</router-link> to check the import status. </p> <table class="ui single line table"> @@ -73,7 +73,7 @@ export default { data () { return { files: [], - uploadUrl: 'import-jobs/', + uploadUrl: '/api/v1/import-jobs/', batch: null } }, diff --git a/front/src/components/requests/Card.vue b/front/src/components/requests/Card.vue index deb9c3fe093a58cc6913805ad4fcbe9bed4da58d..17fecde5294a1e26d78467d8efc780b1b023b19f 100644 --- a/front/src/components/requests/Card.vue +++ b/front/src/components/requests/Card.vue @@ -5,10 +5,10 @@ <div class="description"> <div v-if="request.albums" v-html="$options.filters.markdown(request.albums)"></div> - <div v-if="request.comment" class="ui comments"> + <div class="ui comments"> <comment :user="request.user" - :content="request.comment" + :content="request.comment || ''" :date="request.creation_date"></comment> </div> </div> @@ -24,7 +24,7 @@ @click="createImport" v-if="request.status === 'pending' && importAction && $store.state.auth.availablePermissions['import.launch']" class="ui mini basic green right floated button">Create import</button> - + </div> </div> </template> diff --git a/front/src/components/requests/RequestsList.vue b/front/src/components/requests/RequestsList.vue index cb3e9af00bc40d0301b23dcb446576a567e7f153..33ba04f53c61a47e59fcd991185d3961ad12e693 100644 --- a/front/src/components/requests/RequestsList.vue +++ b/front/src/components/requests/RequestsList.vue @@ -34,8 +34,16 @@ </div> </div> <div class="ui hidden divider"></div> - <div v-if="result" class="ui stackable three column grid"> + <div + v-if="result" + v-masonry + transition-duration="0" + item-selector=".column" + percent-position="true" + stagger="0" + class="ui stackable three column doubling grid"> <div + v-masonry-tile v-if="result.results.length > 0" v-for="request in result.results" :key="request.id" diff --git a/front/src/main.js b/front/src/main.js index 2e351310a15e218d1e9438c12d7c8e8ba1b37426..caf924188086270a8d0e598c9a5307d3fa57c1e2 100644 --- a/front/src/main.js +++ b/front/src/main.js @@ -9,6 +9,7 @@ import Vue from 'vue' import App from './App' import router from './router' import axios from 'axios' +import {VueMasonryPlugin} from 'vue-masonry' import VueLazyload from 'vue-lazyload' import store from './store' import config from './config' @@ -24,7 +25,9 @@ window.$ = window.jQuery = require('jquery') // play really nice with webpack and I want to get rid of Google Fonts // require('./semantic/semantic.css') require('semantic-ui-css/semantic.js') +require('masonry-layout') +Vue.use(VueMasonryPlugin) Vue.use(VueLazyload) Vue.config.productionTip = false diff --git a/front/static/favicon.png b/front/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..089442fab7cb4e68cec9de87d421b64495e3263a Binary files /dev/null and b/front/static/favicon.png differ