This commit is contained in:
JosephK 2019-02-06 11:24:48 +01:00
commit 2e38b5b77e
30 changed files with 3078 additions and 3003 deletions

View file

@ -17,44 +17,5 @@ export default {
components: {
HeaderComponent,
},
mounted() {
// Stats Matomo
if (!(navigator.doNotTrack === 'yes'
|| navigator.doNotTrack === '1'
|| navigator.msDoNotTrack === '1'
|| window.doNotTrack === '1')) {
var _paq = _paq || []; // eslint-disable-line
// Conformité CNIL
_paq.push([function piwikCNIL() {
const self = this;
function getOriginalVisitorCookieTimeout() {
const now = new Date();
const nowTs = Math.round(now.getTime() / 1000);
const visitorInfo = self.getVisitorInfo();
const createTs = parseInt(visitorInfo[2], 10);
const cookieTimeout = 33696000; // 13 mois en secondes
const originalTimeout = (createTs + cookieTimeout) - nowTs;
return originalTimeout;
}
this.setVisitorCookieTimeout(getOriginalVisitorCookieTimeout());
}]);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
// Code Piwik JS
(function piwikJS() {
const u = 'https://stats.framasoft.org/';
_paq.push(['setTrackerUrl', [u, 'p.php'].join('')]);
_paq.push(['setSiteId', 68]);
const d = document;
const g = d.createElement('script');
const s = d.getElementsByTagName('script')[0];
g.type = 'text/javascript'; g.defer = true; g.async = true;
g.src = [u, 'p.js'].join(''); s.parentNode.insertBefore(g, s);
}());
}
},
}
</script>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 830 KiB

After

Width:  |  Height:  |  Size: 577 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 834 KiB

After

Width:  |  Height:  |  Size: 581 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 561 KiB

After

Width:  |  Height:  |  Size: 491 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -5,7 +5,7 @@ html {
}
body {
font-family: 'Open Sans', 'sans-serif';
font-family: 'Open Sans', sans-serif;
font-size: 16px;
}
@ -163,6 +163,7 @@ body {
.install a[href="https://github.com/Chocobozzz/PeerTube/#production"],
.how-it-works a[href^="#"],
.how-it-works a[href*="/faq"],
.intro a.frama_campaign,
.faq .col-sm-12 > p a[href="https://framacolibri.org/c/qualite/peertube"],
.getting-started .col-sm-12 > p a[href*="framatube.org"],
.button {
@ -181,11 +182,13 @@ body {
.intro a[href^="#"]:hover,
.install a:hover,
.how-it-works a[href^="#"]:hover,
.intro a.frama_campaign:hover,
.button {
opacity: 1;
}
.intro a[href="#getting-started"],
.intro a.frama_campaign,
.how-it-works a[href="#getting-started"] {
margin-right: 4px;
color: #fff;
@ -193,6 +196,7 @@ body {
}
.intro a[href="#how-it-works"],
.intro a.frama_campaign,
.install a[href="https://github.com/Chocobozzz/PeerTube/#production"],
.how-it-works a[href*="/faq"],
.faq .col-sm-12 > p a[href="https://framacolibri.org/c/qualite/peertube"],
@ -319,8 +323,24 @@ a.button {
margin-top: 20px;
}
.intro .col-md-push-6 .button {
margin-bottom:10px;
.intro .col-md-push-6 {
.button {
margin-bottom:10px;
}
img {
display: inline-block;
}
}
.release {
a {
color: #F1680D;
}
a.frama_campaign {
margin-right: 7px;
}
}
@media (min-width: 1200px) {

View file

@ -95,8 +95,8 @@ export default {
data() {
return {
prez: [...Array(9).keys()].map(i => (i < 1)),
content: [...Array(4).keys()].map(i => false),
tech: [...Array(3).keys()].map(i => false),
content: [...Array(5).keys()].map(i => false),
tech: [...Array(4).keys()].map(i => false),
}
},
methods: {

View file

@ -5,8 +5,9 @@
<div class="col-sm-12 text-center">
<h1 v-html="$t('home.title')"></h1>
<h2 v-html="$t('home.intro.title')"></h2>
<div class="col-md-6 well col-md-push-6">
<div class="embed-responsive embed-responsive-16by9">
<div class="col-md-6 col-md-push-6 release">
<div class="alert alert-info">
<!-- <div class="embed-responsive embed-responsive-16by9">
<iframe v-if="$t('lang') === 'fr'"
class="embed-responsive-item" allowfullscreen
src="https://framatube.org/videos/embed/9db9f3f1-9b54-44ed-9e91-461d262d2205"
@ -15,15 +16,22 @@
class="embed-responsive-item" allowfullscreen
src="https://framatube.org/videos/embed/217eefeb-883d-45be-b7fc-a788ad8507d3"
></iframe>
</div> -->
<p>
<img alt="PeerTube" :src="`${$root['/']}icons/favicon.png`"> <span v-html="$t('home.release.announce')"></span>
</p>
<p class="text-left" v-html="$t('home.release.title')"></p>
<a class="frama_campaign" href="https://framasoft.org" v-html="$t('home.release.button')"></a>
<a href="https://github.com/Chocobozzz/PeerTube#package-create-your-own-instance" v-html="$t('home.release.install')"></a>
</div>
</div>
<div class="col-md-6 col-md-pull-6">
<img :src="`${$root['/']}img/notebook.jpg`" class="img-responsive" alt="">
</div>
<p>
<a href="#getting-started" v-html="$t('home.intro.getting-started')"></a>
<a href="#how-it-works" v-html="$t('home.intro.how-it-works')"></a>
</p>
<a href="#getting-started" v-html="$t('home.intro.getting-started')"></a>
<a href="#how-it-works" v-html="$t('home.intro.how-it-works')"></a>
</p>
</div>
</div>
</section>
@ -70,27 +78,23 @@
<div class="embed-responsive embed-responsive-16by9">
<iframe v-if="$t('lang') === 'fr'"
class="embed-responsive-item"
src="https://framatube.org/videos/embed/a8ea95b8-0396-49a6-8f30-e25e25fb2828"
src="https://framatube.org/videos/embed/0900bd2e-7306-4c39-b48b-2d0cd611742e"
allowfullscreen
></iframe>
<iframe v-else
class="embed-responsive-item"
src="https://framatube.org/videos/embed/0900bd2e-7306-4c39-b48b-2d0cd611742e"
src="https://framatube.org/videos/embed/217eefeb-883d-45be-b7fc-a788ad8507d3"
allowfullscreen
></iframe>
</div>
<p><a :href="$root.link.tube" v-html="$t('home.getting-started.watch.framatube')"></a></p>
<h3 v-html="$t('home.getting-started.register.title')"></h3>
<h3 id="register" v-html="$t('home.getting-started.register.title')"></h3>
<p v-html="$t('home.getting-started.register.list')"></p>
<div id="instances-list" class="list-group"></div>
<div id="instances-list-error"
class="alert alert-danger"
style="display: none"
v-html="$t('home.getting-started.register.error')"
></div>
<InstancesComponent></InstancesComponent>
<div class="alert alert-info" v-html="$t('home.getting-started.register.email')"></div>
</div>
@ -104,7 +108,7 @@
<p v-html="$t('home.install.text[0]')"></p>
<p v-html="$t('home.install.text[1]')"></p>
<p>
<a href="https://github.com/Chocobozzz/PeerTube/#production"
<a href="https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/production.md"
target="_blank"
v-html="$t('home.install.btn')"
></a>
@ -153,11 +157,11 @@
</template>
<script>
import InstancesComponent from '../partials/Instances.vue'
export default {
mounted() {
/* eslint-disable */
require('../../instances.js');
/* eslint-enable */
components: {
InstancesComponent
}
}
</script>

View file

@ -0,0 +1,99 @@
<template>
<div >
<div v-if="error" id="instances-list-error" class="alert alert-danger" v-html="$t('home.getting-started.register.instances.error')"></div>
<div id="instances-list" class="list-group" >
<a v-for="instance of instances" v-bind:title="instance.host" v-bind:href="instance.url" class="list-group-item" target="_blank">
<div class="left-div">
<h4 class="list-group-item-heading">
<span class="instance-name">{{ instance.name }}</span>
<small class="instance-host">{{ instance.host }}</small>
</h4>
<p v-if="instance.shortDescription" class="list-group-item-text">
{{ instance.shortDescription }}
</p>
</div>
<div class="right-div">
<li v-if="instance.totalInstanceFollowers">{{ instance.totalInstanceFollowers }} {{ $t('home.getting-started.register.instances.followers') }}</li>
<li v-if="instance.totalInstanceFollowing">{{ $t('home.getting-started.register.instances.follows') }} {{ instance.totalInstanceFollowing }} {{ $t('home.getting-started.register.instances.instances') }}</li>
<li v-if="instance.userVideoQuota">{{ instance.userVideoQuotaBytes }} {{ $t('home.getting-started.register.instances.per_user') }}</li>
</div>
</a>
</div>
</div>
</template>
<script>
import axios from 'axios'
export default {
name: 'peertube-instances',
data() {
return {
error: false,
instances: []
}
},
methods: {
// Thanks https://stackoverflow.com/a/6274381
shuffle (a) {
for (let i = a.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[a[i], a[j]] = [a[j], a[i]]
}
return a
},
bytes (value) {
// https://github.com/danrevah/ngx-pipes/blob/master/src/pipes/math/bytes.ts
const dictionaryBytes = [
{ max: 1024, type: this.$t('home.getting-started.register.instances.bytes.B') },
{ max: 1048576, type: this.$t('home.getting-started.register.instances.bytes.KB') },
{ max: 1073741824, type: this.$t('home.getting-started.register.instances.bytes.MB') },
{ max: 1.0995116e12, type: this.$t('home.getting-started.register.instances.bytes.GB') }
]
if (value === -1) return this.$t('home.getting-started.register.instances.no_quota')
const format = dictionaryBytes.find(function (d) { return value < d.max }) || dictionaryBytes[dictionaryBytes.length - 1]
const calc = Math.floor(value / (format.max / 1024)).toString()
return calc + format.type
}
},
mounted() {
const options = {
method: 'GET',
params: {
start: 0,
count: 100,
signup: true,
healthy: true
}
}
axios('https://instances.joinpeertube.org/api/v1/instances', options)
.then(response => {
this.instances = this.shuffle(response.data.data)
this.instances.forEach(i => {
i.url = 'https://' + i.host
if (i.userVideoQuota) {
i.userVideoQuotaBytes = this.bytes(i.userVideoQuota)
}
})
})
.catch(err => {
console.error(err)
this.error = true
})
}
}
</script>

View file

@ -1,8 +1,8 @@
import Vue from 'vue';
import VueMatomo from 'vue-matomo';
import VueRouter from 'vue-router';
import VueI18n from 'vue-i18n';
import vueHeadful from 'vue-headful';
import jQuery from 'jquery';
import App from './App.vue';
import Home from './components/pages/Home.vue';
@ -11,9 +11,6 @@ import './assets/scss/bootstrap.scss';
import '../node_modules/fork-awesome/css/fork-awesome.css';
import './assets/scss/main.scss';
window.jQuery = jQuery;
window.$ = jQuery;
Vue.use(VueRouter);
Vue.use(VueI18n);
Vue.component('vue-headful', vueHeadful);
@ -143,6 +140,53 @@ const router = new VueRouter({
base: `${__dirname}${process.env.BASE_URL}`,
});
// Stats Matomo
if (!(navigator.doNotTrack === 'yes'
|| navigator.doNotTrack === '1'
|| navigator.msDoNotTrack === '1'
|| window.doNotTrack === '1')
) {
Vue.use(VueMatomo, {
// Configure your matomo server and site
host: 'https://stats.framasoft.org/',
siteId: 68,
// Enables automatically registering pageviews on the router
router,
// Require consent before sending tracking information to matomo
// Default: false
requireConsent: false,
// Whether to track the initial page view
// Default: true
trackInitialView: true,
// Changes the default .js and .php endpoint's filename
// Default: 'piwik'
trackerFileName: 'p',
enableLinkTracking: true,
});
const _paq = _paq || []; // eslint-disable-line
// Conformité CNIL
_paq.push([function piwikCNIL() {
const self = this;
function getOriginalVisitorCookieTimeout() {
const now = new Date();
const nowTs = Math.round(now.getTime() / 1000);
const visitorInfo = self.getVisitorInfo();
const createTs = parseInt(visitorInfo[2], 10);
const cookieTimeout = 33696000; // 13 mois en secondes
const originalTimeout = (createTs + cookieTimeout) - nowTs;
return originalTimeout;
}
this.setVisitorCookieTimeout(getOriginalVisitorCookieTimeout());
}]);
}
new Vue({ // eslint-disable-line no-new
el: '#app',
router,

View file

@ -1,117 +0,0 @@
/* eslint-disable */
$(function () {
const instancesApi = 'https://instances.joinpeertube.org/api/v1/instances'
const data = {
start: 0,
count: 100,
signup: true,
healthy: true
}
const instancesListElement = $('#instances-list')
$.get(instancesApi, data)
.done(function (res) {
const instances = shuffle(res.data)
const lis = []
instances.forEach(function (instance) {
const el = createInstanceElement(instance)
lis.push(el)
})
instancesListElement.append(lis)
})
.fail(function () {
$('#instances-list-error').css('display', 'block')
})
function createInstanceElement (instance) {
const a = $('<a>', {
class: 'list-group-item',
href: 'https://' + instance.host,
target: '_blank',
title: instance.host
})
const leftDiv = $('<div>', {
class: 'left-div'
})
const rightDiv = $('<div>', {
class: 'right-div'
})
const h4 = $('<h4>', {
class: 'list-group-item-heading'
})
const spanName = $('<span>', {
text: instance.name,
class: 'instance-name'
})
const spanHost = $('<small>', {
text: instance.host,
class: 'instance-host'
})
h4.append(spanName, spanHost)
leftDiv.append(h4)
if (instance.shortDescription) {
const p = $('<p>', {
class: 'list-group-item-text',
text: instance.shortDescription
})
leftDiv.append(p)
}
if (instance.totalInstanceFollowers) {
const li = $('<li>', {
text: instance.totalInstanceFollowers + ' followers'
})
rightDiv.append(li)
}
if (instance.totalInstanceFollowing) {
const li = $('<li>', {
text: 'Follows ' + instance.totalInstanceFollowing + ' instances'
})
rightDiv.append(li)
}
if (instance.userVideoQuota) {
const li = $('<li>', {
text: bytes(instance.userVideoQuota) + ' per user'
})
rightDiv.append(li)
}
a.append(leftDiv, rightDiv)
return a
}
// Thanks https://stackoverflow.com/a/6274381
function shuffle (a) {
for (var i = a.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[a[i], a[j]] = [a[j], a[i]]
}
return a
}
// https://github.com/danrevah/ngx-pipes/blob/master/src/pipes/math/bytes.ts
const dictionaryBytes = [
{ max: 1024, type: 'B' },
{ max: 1048576, type: 'KB' },
{ max: 1073741824, type: 'MB' },
{ max: 1.0995116e12, type: 'GB' }
]
function bytes (value) {
if (value === -1) return 'No quota'
const format = dictionaryBytes.find(function (d) { return value < d.max }) || dictionaryBytes[dictionaryBytes.length - 1]
const calc = Math.floor(value / (format.max / 1024)).toString()
return calc + format.type
}
})

View file

@ -8,9 +8,9 @@ menu:
faq: F.A.Q.
help: Support
docs: Documentation
code: Code source
code: Source code
instances: Instances
hall-of-fame: Tableau dhonneur
hall-of-fame: Hall of fame
link:
forumPT: https://framacolibri.org/c/peertube
wArticle: https://en.wikipedia.org/wiki
@ -20,6 +20,12 @@ home:
title: A decentralized video hosting network, based on free/libre software
getting-started: Get started
how-it-works: How it works
release:
announce: PeerTube v1.0 🎉
title: <a href="https://framablog.org/2018/10/15/peertube-1-0-the-free-libre-and-federated-video-platform/">
The first version of PeerTube is out!</a> Help us to pursue its development.
button: Support
install: Install PeerTube
why:
power:
title: Take back the power… and the responsibilities!
@ -60,10 +66,21 @@ home:
register:
title: Register
list: 'List of instances on which you can register:'
error: NousWe are sorry, but we failed to fetch the list of available instances.
error: We are sorry, but we failed to fetch the list of available instances.
Please try again later.
email: 'This is like picking an e-mail hosting provider: the domain will be
part of your username!'
instances:
per_user: per user
followers: followers
instances: instances
follows: follows
bytes:
B: B
KB: KB
MB: MB
GB: GB
no_quota: No quota
install:
title: Install your own
text:
@ -322,6 +339,26 @@ faq:
- Its best to contact and talk directly with hosting providers, to understand
their business model, vision, etc. Because only you can determine what makes
you trust such or such host, and thus entrust your videos to them.
pornography:
title: There are many porn videos on PeerTube!
text:
- No. In October 2018, on an average instance federating with ~200 instances
and indexing ~16000 videos, only ~200 videos are tagged as NSFW
(i. e. the content is sensitive, which could be something else than pornography).
Therefore, they represent only ~1% of all the videos.
- "Moreover, each administrator decides with which instances he wants to federate:
he has the full control of the content he wants to display on his instance.
It's up to him to choose the policy regarding this kind of videos. He can decide to:
<ul><li>Display them</li><li>Blur the title and thumbnail</li><li>Hide them</li></ul>"
- By default, this configuration is set to "Hide them". If some administrators decide
to display them with a blur filter for example, it's <strong>their</strong> choice.
- Finally, any user can override this configuration, and decides if he want to display,
blur or hide these videos for himself.
- "PeerTube is just a software: it's not Framasoft (non-profit that develops PeerTube)
that's responsible for the content published on some instances."
- "It's up to everyone to be responsible: parents, visitors, uploaders, PeerTube administrators
to respect the law and avoid any problematic situations."
forum: Discuss on our forum
tech:
install:
@ -334,6 +371,54 @@ faq:
slow down all federations.'
- 'Dont bother the developer to help you install your instance: we have a <a
href="@:link.forumPT">support forum</a> for that.'
moderation:
title: 'PeerTube v1.0 does not seem to me to contain all the tools
necessary for a good management of my instance.'
text:
- '<blockquote>"Its outrageous and unconscious: youre releasing PeerTubes version 1
when it doesnt contain the necessary tools to effectively manage videos claimed
by rights holders, or to effectively manage the issue of online harassment in comments,
or to effectively manage monetization through advertising, or to (insert here your
request to PeerTube). It will never work! What do you intend to do about it?"</blockquote>'
- 'Youre right. PeerTube 1.0 is not the perfect tool, far from it. And we never promised
that this version 1.0 would be a tool that would include all the features corresponding
to all cases.'
- 'PeerTube 1.0 is the realization of the commitment we made in October 2017 to take
PeerTube from an alpha version (personal project and proof of concept that a federated
video platform could work) to a 1.0 version in October 2018 (which does not mean
"final version", but "version considered stable and distributable").'
- 'Remember that PeerTube has only one (almost) full time developer and a
small handful of very involved volunteers. It is not a product developed by a
start-up with a full time team (dev, design, UX, marketing, support, etc.)
and significant financial support. It is a Community free software, the development
of which will continue over the months and, we hope, in the years to come.'
- 'We are well aware of the shortcomings of PeerTube 1.0, especially in the moderation
tools area (videos, comments, etc.). And we intend to work on these weaknesses. '
- 'We have chosen to do so as follows: on the one hand we will work primarily in
the coming months to improve these tools within PeerTube itself (in the <i>core</i> of
the software). On the other hand, we will also focus, in parallel, a large part
of PeerTubes development effort during 2019 on the integration of a plugin system,
which can be developed by the communities.'
- 'Indeed, we do not claim to have the science behind it and know how best to manage
each of the tools according to each of the needs.
For example: with regard to the question of DMCA requests, cases vary according
to geographical jurisdictions (European law is different from French law,
itself different from Canadian law, itself different from American law, etc.).
Concerning the tools for moderating comments, here again, we cannot decree ourselves
experts of the subject, because this is simply not the case.'
- 'By acting both on the <i>core</i>, but also by allowing the development of plugins,
we believe that PeerTube will, in the long term, be able to respond much better to
these issues and allow different communities to adapt PeerTube to their needs.'
- 'We are working as quickly as possible to improve PeerTube, but we are doing so with
the resources we have, which means <strong>very</strong> limited.'
- 'In the meantime, as an user if you feel that PeerTube 1.0 does not currently
meet your needs, its simple: dont use it right now :) (we remind you that we
dont make money developing PeerTube, and that if we obviously hope for its success,
the survival of our association doesnt depend on it).'
- 'As an administrator, if you are afraid of DMCA requests, there is an option to limit
the opening of registrations to people you know. You will then be able to reopen
registrations without verification once these verification tools have been integrated,
or you have developed them.'
code:
title: How do I contribute to PeerTubes code?
text:

View file

@ -20,6 +20,12 @@ home:
title: Lhébergement de vidéos décentralisé, en réseau, basé sur du logiciel libre
getting-started: Pour commencer
how-it-works: Comment ça fonctionne
release:
announce: PeerTube v1.0 🎉
title: <a href="https://framablog.org/2018/10/15/peertube-1-0-la-plateforme-de-videos-libre-et-federee/">
La première version de PeerTube est sortie !</a> Aidez-nous à poursuivre son développement.
button: Soutenir
install: Installer PeerTube
why:
power:
title: Reprenez le pouvoir… et les responsabilités!
@ -67,6 +73,17 @@ home:
instances. Merci de réessayer plus tard.
email: 'Cest comme choisir un fournisseur demail: le nom de domaine fera
partie de votre identifiant!'
instances:
per_user: par utilisateur
followers: abonnés
instances: instances
follows: Suit
bytes:
B: octets
KB: Ko
MB: Mo
GB: Go
no_quota: Aucun quota
install:
title: Installez la vôtre
text:
@ -269,7 +286,7 @@ faq:
la fédération.
- Mais ceci nest quun début, PeerTube nest pas (encore) parfait, et de nombreuses
fonctionnalités manquent à lappel. Nous comptons bien continuer de laméliorer
pour sortir une version 1 dicifin 2018.
pour sortir une version 1 dici fin 2018.
- 'Mars 2018 représente donc la naissance des fédérations PeerTube: plus ce
logiciel sera utilisé et soutenu, plus des personnes lutiliseront et y contribueront,
et plus vite il évolura vers une alternative concrète aux plateformes telles
@ -339,7 +356,7 @@ faq:
- Il vous faut trouver une instance dhébergement PeerTube en laquelle vous
avez confiance.
- La liste complète des instances <a href="@:data.link.instancesPT"> se trouve
là</a>, et nous faisons apparaître <a href="./#getting-started">ici celles
là</a>, et nous faisons apparaître <a href="../#register">ici celles
qui sont ouvertes aux inscriptions</a>.
- Ensuite, nous vous recommandons daller voir les instances, daller lire leur
page «about» pour découvrir leurs conditions dutilisation (limite despace
@ -348,6 +365,25 @@ faq:
de comprendre leur modèle économique, leur vision, etc. Car seul vous pouvez
déterminer ce qui fait que vous pouvez faire confiance à tel ou tel hébergeur,
et donc lui confier vos vidéos.
pornography:
title: Il y a plein de vidéos porno sur PeerTube !
text:
- Non. En octobre 2018, sur une instance moyenne qui se fédère avec environ 200
autres instances et indexe 16000 vidéos, seules 200 vidéos sont étiquetées NSFW
(c'est à dire dont le contenu est sensible, pouvant d'ailleurs être autre chose que
de la pornographie). Elles représentent donc seulement 1% à 2% de l'ensemble des vidéos.
- "Ensuite, chaque administrateur décide avec quelles instances fédérer. Il a donc le contrôle
total du contenu qu'il affiche sur son instance. De plus, cest lui qui choisit la politique
à appliquer concernant ce genre de vidéo. Il peut décider de :
<ul><li>Les afficher</li><li>Les flouter</li><li>Les cacher</li></ul>"
- Par défaut, cette configuration est "Les cacher". Si certains administrateurs décident de
les afficher avec flou par exemple, c'est <strong>leur</strong> choix.
- Enfin, chaque utilisateur peut redéfinir ce choix, et décider si il veut afficher, flouter
ou cacher ce type de vidéo.
- PeerTube n'est qu'un logiciel, ce n'est donc pas Framasoft (association qui développe PeerTube)
qui est responsable du contenu mis en ligne sur certaines instances.
- "A chacun dêtre responsables : parents, visiteurs, administrateurs dinstances PeerTube pour
respecter la loi et éviter toute situation problématique."
forum: Échanger sur notre forum
tech:
install:
@ -360,6 +396,63 @@ faq:
connexion ADSL): cela pourrait ralentir lensemble des fédérations.'
- 'Ne dérangez pas le développeur pour vous aider à installer votre instance:
notre <a href="@:link.forumPT">forum dentraide</a> est là pour ça.'
moderation:
title: PeerTube v1.0 ne me semble pas contenir tous les outils nécessaires à une bonne gestion de mon instance.
text:
- '<blockquote>« Cest scandaleux et inconscient : vous sortez une version 1 de PeerTube
alors quil ne contient pas les outils nécessaire pour gérer efficacement
les vidéos faisant lobjet dune réclamation par des ayant droits, ou pour gérer
efficacement la question du harcèlement en ligne dans les commentaires, ou
pour gérer efficacement la monétisation par la publicité, ou pour
(insérez ici votre demande vis-à-vis de PeerTube). Cela ne fonctionnera
jamais ! Que comptez-vous faire à ce sujet ? »</blockquote>'
- 'Vous avez raison. PeerTube 1.0 nest pas loutil parfait, loin de là.
Et nous navons jamais promis que cette version 1.0 correspondrait à un outil
qui inclurait toutes les fonctionnalités correspondant à tous les cas de figure.'
- 'PeerTube 1.0 est la concrétisation de lengagement que nous avions pris
en octobre 2017 demmener PeerTube dune version alpha (projet personnel
et preuve de concept quune plateforme vidéo fédérée pouvait fonctionner)
à une version 1.0 en octobre 2018 (ce qui ne signifie pas "version finale",
mais "version considérée comme stable et diffusable").'
- 'Rappelons que PeerTube ne dispose que dun développeur à temps (presque)
plein et dune petite poignée de <span aria-label="contributrices et contributeurs">
contributeur⋅ices</span> bénévoles très <span aria-label="impliquées">impliqué⋅es</span>.
Il ne sagit pas dun produit développé par une startup disposant dune équipe
complète (dév, design, UX, marketing, support, etc) à temps plein et bénéficiant
dun support financier important. Il sagit dun logiciel libre communautaire,
dont le développement va se poursuivre pendant les mois et, nous
lespérons, les années à venir.'
- 'Nous sommes bien conscients des manques de PeerTube 1.0, notamment dans la palette
doutils de modération (de vidéos, de commentaires, etc). Et nous avons bien
lintention de travailler sur ces faiblesses.'
- 'Nous avons choisi de le faire de la façon suivante: dune part nous allons travailler
prioritairement ces prochains mois à lamélioration de ces outils au sein même de
PeerTube (dans le "<i>core</i>" du logiciel). Dautre part, nous allons axer, en parallèle,
une grosse partie de leffort du développement de PeerTube durant lannée 2019 sur
lintégration dun système de plugins, qui pourront être développés par les communautés.'
- 'En effet, nous ne prétendons pas avoir la science infuse et savoir comment gérer
au mieux chacun des outils en fonction de chacun des besoins.'
- 'Par exemple : concernant la question des requêtes DMCA, les cas sont variables
selon les juridictions géographiques (le droit européen est différent du droit
français, lui même différent du droit canadien, lui même différent du droit
états-uniens, etc.). Concernant les outils de modération de commentaires, là encore,
nous ne pouvons nous décréter <span aria-label="expertes ou experts">expert⋅es</span> du sujet,
car cela nest tout simplement pas le cas.'
- 'En agissant à la fois sur le <i>core</i>, mais aussi en permettant le développement de plugins,
nous pensons que PeerTube pourra, à terme, beaucoup mieux répondre à ces problématiques
et permettre aux différentes communautés dadapter PeerTube à leurs besoins.'
- 'Nous travaillons aussi vite que possible à améliorer PeerTube, mais nous le faisons
avec les moyens qui sont les nôtres, cest à dire <strong>très</strong> limités.'
- 'En attendant, en tant qu<span aria-label="utilisatrice ou utilisateur">utilisateur⋅ice</span>
si vous estimez que PeerTube 1.0 ne répond pas actuellement à vos besoins, cest simple :
ne lutilisez pas pour le moment :) (nous vous rappelons que nous ne gagnons pas dargent en
développant PeerTube, et que si nous espérons évidemment son succès, la survie de notre
association nen dépend pas).'
- 'En tant qu<span aria-label="administratrice ou administrateur">administrateur⋅ice</span>,
si vous craignez les requêtes DMCA, il existe une option permettant de limiter louverture
des inscriptions aux personnes que vous connaissez.
Vous pourrez alors rouvrir les inscriptions sans vérification lorsque ces outils de vérification
auront été intégrés, ou que vous les aurez développés.'
code:
title: Comment participer au code de PeerTube?
text:

View file

@ -1,142 +0,0 @@
function randomName() {
const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
const stringLength = 10;
let randomstring = '';
for (let i = 0; i < stringLength; i += 1) {
const rnum = Math.floor(Math.random() * chars.length);
randomstring += chars.substring(rnum, rnum + 1);
}
return randomstring;
}
// <rm diacritics>
// Source http://stackoverflow.com/a/18391901
const defaultDiacriticsRemovalMap = [
{ base: 'A', letters: '\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F' },
{ base: 'AA', letters: '\uA732' },
{ base: 'AE', letters: '\u00C6\u01FC\u01E2' },
{ base: 'AO', letters: '\uA734' },
{ base: 'AU', letters: '\uA736' },
{ base: 'AV', letters: '\uA738\uA73A' },
{ base: 'AY', letters: '\uA73C' },
{ base: 'B', letters: '\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181' },
{ base: 'C', letters: '\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E' },
{ base: 'D', letters: '\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779' },
{ base: 'DZ', letters: '\u01F1\u01C4' },
{ base: 'Dz', letters: '\u01F2\u01C5' },
{ base: 'E', letters: '\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E' },
{ base: 'F', letters: '\u0046\u24BB\uFF26\u1E1E\u0191\uA77B' },
{ base: 'G', letters: '\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E' },
{ base: 'H', letters: '\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D' },
{ base: 'I', letters: '\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197' },
{ base: 'J', letters: '\u004A\u24BF\uFF2A\u0134\u0248' },
{ base: 'K', letters: '\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2' },
{ base: 'L', letters: '\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780' },
{ base: 'LJ', letters: '\u01C7' },
{ base: 'Lj', letters: '\u01C8' },
{ base: 'M', letters: '\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C' },
{ base: 'N', letters: '\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4' },
{ base: 'NJ', letters: '\u01CA' },
{ base: 'Nj', letters: '\u01CB' },
{ base: 'O', letters: '\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C' },
{ base: 'OI', letters: '\u01A2' },
{ base: 'OO', letters: '\uA74E' },
{ base: 'OU', letters: '\u0222' },
{ base: 'OE', letters: '\u008C\u0152' },
{ base: 'oe', letters: '\u009C\u0153' },
{ base: 'P', letters: '\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754' },
{ base: 'Q', letters: '\u0051\u24C6\uFF31\uA756\uA758\u024A' },
{ base: 'R', letters: '\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782' },
{ base: 'S', letters: '\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784' },
{ base: 'T', letters: '\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786' },
{ base: 'TZ', letters: '\uA728' },
{ base: 'U', letters: '\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244' },
{ base: 'V', letters: '\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245' },
{ base: 'VY', letters: '\uA760' },
{ base: 'W', letters: '\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72' },
{ base: 'X', letters: '\u0058\u24CD\uFF38\u1E8A\u1E8C' },
{ base: 'Y', letters: '\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE' },
{ base: 'Z', letters: '\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762' },
{ base: 'a', letters: '\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250' },
{ base: 'aa', letters: '\uA733' },
{ base: 'ae', letters: '\u00E6\u01FD\u01E3' },
{ base: 'ao', letters: '\uA735' },
{ base: 'au', letters: '\uA737' },
{ base: 'av', letters: '\uA739\uA73B' },
{ base: 'ay', letters: '\uA73D' },
{ base: 'b', letters: '\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253' },
{ base: 'c', letters: '\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184' },
{ base: 'd', letters: '\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A' },
{ base: 'dz', letters: '\u01F3\u01C6' },
{ base: 'e', letters: '\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD' },
{ base: 'f', letters: '\u0066\u24D5\uFF46\u1E1F\u0192\uA77C' },
{ base: 'g', letters: '\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F' },
{ base: 'h', letters: '\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265' },
{ base: 'hv', letters: '\u0195' },
{ base: 'i', letters: '\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131' },
{ base: 'j', letters: '\u006A\u24D9\uFF4A\u0135\u01F0\u0249' },
{ base: 'k', letters: '\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3' },
{ base: 'l', letters: '\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747' },
{ base: 'lj', letters: '\u01C9' },
{ base: 'm', letters: '\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F' },
{ base: 'n', letters: '\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5' },
{ base: 'nj', letters: '\u01CC' },
{ base: 'o', letters: '\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275' },
{ base: 'oi', letters: '\u01A3' },
{ base: 'ou', letters: '\u0223' },
{ base: 'oo', letters: '\uA74F' },
{ base: 'p', letters: '\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755' },
{ base: 'q', letters: '\u0071\u24E0\uFF51\u024B\uA757\uA759' },
{ base: 'r', letters: '\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783' },
{ base: 's', letters: '\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B' },
{ base: 't', letters: '\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787' },
{ base: 'tz', letters: '\uA729' },
{ base: 'u', letters: '\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289' },
{ base: 'v', letters: '\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C' },
{ base: 'vy', letters: '\uA761' },
{ base: 'w', letters: '\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73' },
{ base: 'x', letters: '\u0078\u24E7\uFF58\u1E8B\u1E8D' },
{ base: 'y', letters: '\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF' },
{ base: 'z', letters: '\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763' },
];
const diacriticsMap = {};
for (let i = 0; i < defaultDiacriticsRemovalMap.length; i += 1) {
const letters = defaultDiacriticsRemovalMap[i].letters; // eslint-disable-line
for (let j = 0; j < letters.length; j += 1) {
diacriticsMap[letters[j]] = defaultDiacriticsRemovalMap[i].base;
}
}
function rmDiacritics(str) {
const s = str || '';
return s.replace(/[^\u0000-\u007E]/g, function(a) { return diacriticsMap[a] || a; }); // eslint-disable-line
}
function text(html) {
const tmp = document.createElement('div');
tmp.innerHTML = html;
return tmp.textContent || tmp.innerText || '';
}
function sanitize(str) {
const s = str || '';
return s.toLowerCase()
.replace(/@:[.a-z]+ /g, '') // remove vue-i18n var
.replace(/[ ']/g, '-')
.replace(/[^a-zA-Z0-9-_.]/g, '');
}
function noFrama(str) {
const s = str || '';
return s.replace('framand', 'and')
.replace('framage', 'age')
.replace('framae', 'mae')
.replace('framin', 'min')
.replace('frame', 'me')
.replace('frama', '')
.replace('.', '')
.replace('my', 'myframa');
}
export { randomName, rmDiacritics, text, sanitize, noFrama };

View file

@ -5,8 +5,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title></title>
<link rel="shortcut icon" href="icons/favicon.png">
<link rel="apple-touch-icon" href="icons/apple-touch-icon.png" />
<link rel="shortcut icon" href="/icons/favicon.png">
<link rel="apple-touch-icon" href="/icons/apple-touch-icon.png" />
</head>
<body>
<div id="app"></div>

5363
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -11,13 +11,14 @@
"prod": "rm -rf ./public && cross-env NODE_ENV=production webpack --progress --hide-modules --mode production"
},
"dependencies": {
"axios": "^0.18.0",
"bootstrap-sass": "^3.3.7",
"fork-awesome": "^1.1.0",
"jquery": "^3.3.1",
"uiv": "^0.23.1",
"vue": "^2.5.16",
"vue-headful": "^2.0.1",
"vue-i18n": "^7.6.0",
"vue-matomo": "^0.3.2",
"vue-router": "^2.8.1"
},
"devDependencies": {

View file

@ -1,6 +1,6 @@
#!/bin/bash
cp app/locales/*.yml zanata/yml/
yaml2po -P --progress=none -i zanata/yml/en.yml -o zanata/po/${PWD##*/}.pot
yaml2po -P --progress=none -i zanata/yml/en.yml -o zanata/po/${PWD##*/}.pot --duplicates merge
for i in app/locales/*.yml
do
j=$(echo $i | cut -d '.' -f 1 | cut -d '/' -f 3)