diff --git a/README.md b/README.md index e89c4f6..bf2dec6 100755 --- a/README.md +++ b/README.md @@ -2,16 +2,17 @@ Platform to manage a radio, schedules, website, and so on. We use the power of great tools like Django or Liquidsoap. -This project is distributed under GPL version 3. More information in the LICENSE file, except for some files whose license is indicated. +This project is distributed under GPL version 3. More information in the LICENSE file, except for some files whose license is indicated inside source code. ## Features * **streams**: multiple random music streams when no program is played. We also can specify a time range and frequency for each; * **diffusions**: generate diffusions time slot for programs that have schedule informations. Check for conflicts and rerun. * **liquidsoap**: create a configuration to use liquidsoap as a stream generator. Also provides interface and control to it; -* **sounds**: each programs have a folder where sounds can be put, that will be detected by the system. Quality can be check and reported for later use. Later, we plan to have uploaders to external plateforms. Sounds can be defined as excerpts or as archives. -* **cms**: application that can be used as basis for website; +* **sounds**: each programs have a folder for its podcast. Aircox detects updates, can run quality check, import related playlist (timestamped or position in track list). Sounds can be defined as excerpts or as archives. * **log**: keep a trace of every played/loaded sounds on the stream generator. +* **admin**: admin user interface. +* **cms**: content management system. ## Scripts @@ -27,8 +28,6 @@ and `gunicorn` in mind. ## Installation -Later we plan to have an installation script to reduce the number of above steps. - ### Dependencies For python dependencies take a peek at the `requirements.txt` file, plus dependencies specific to Django (e.g. for database: `mysqlclient` for MySql @@ -50,7 +49,7 @@ Development dependencies: All scripts and files assumes that: - you have cloned aircox in `/srv/apps/` (such as `/srv/apps/aircox/README.md`) - you have a supervisor running (we have scripts for `supervisord`) -- you want to use `gunicorn` as WSGI server (otherwise, you'll need to remove it from the requirement list) +- you use `gunicorn` as WSGI server (otherwise, you'll need to remove it from the requirement list) This installation process uses a virtualenv, including all provided scripts. @@ -87,8 +86,7 @@ server from this directory: ./manage.py runserver ``` -You can access to the django admin interface at `http://127.0.0.1:8000/admin` -and to the cms interface at `http://127.0.0.1:8000/cms/`. +You can access to the django admin interface at `http://127.0.0.1:8000/admin`. From the admin interface: * create a Station @@ -96,8 +94,6 @@ From the admin interface: * defines Outputs for the streamer (look at Liquidsoap documentation for more information on how to configure it) -TODO: cms related documentation here - Once the configuration is okay, you must start the *controllers monitor*, that creates configuration file for the audio streams using the new information and that runs the appropriate application (note that you dont need to restart it @@ -107,5 +103,5 @@ If you use supervisord and our script with it, you can use the services defined in it instead of running commands manually. ## More informations -There are extra informations in `aircox/README.md`. +There are extra informations in `aircox/README.md` and `aircox_streamer/README.md`. diff --git a/aircox/README.md b/aircox/README.md index 6aeecf5..a8adad7 100755 --- a/aircox/README.md +++ b/aircox/README.md @@ -6,13 +6,11 @@ A Station contains programs that can be scheduled or streamed. A *Scheduled Prog Each program has a directory on the server where user puts its podcasts (in **AIRCOX_PROGRAM_DIR**). It contains the directories **archives** (complete show's podcasts) and **excerpts** (partial or whatever podcasts). - ## manage.py's commands -* **diffusions**: update/create, check and clean diffusions based on programs schedules; -* **import_playlist**: import a playlist from a csv file, and associate it to a sound; -* **sound_monitor**: check for existing and missing sounds files in programs directories and synchronize the database. It can check for the quality of file and update sound info. -* **sound_quality_check**: check for the quality of the file (don't update database); -* **streamer**: audio stream generation and control it; +* `diffusions`: update/create, check and clean diffusions based on programs schedules; +* `import_playlist`: import a playlist from a csv file, and associate it to a sound; +* `sounds_monitor`: check for existing and missing sounds files in programs directories and synchronize the database. It can check for the quality of file and update sound info. +* `sounds_quality_check`: check for the quality of the file (don't update database); ## Requirements diff --git a/aircox/locale/fr/LC_MESSAGES/django.mo b/aircox/locale/fr/LC_MESSAGES/django.mo index b7d3e45..a6a820d 100644 Binary files a/aircox/locale/fr/LC_MESSAGES/django.mo and b/aircox/locale/fr/LC_MESSAGES/django.mo differ diff --git a/aircox/locale/fr/LC_MESSAGES/django.po b/aircox/locale/fr/LC_MESSAGES/django.po index 39ec09a..260d5b3 100644 --- a/aircox/locale/fr/LC_MESSAGES/django.po +++ b/aircox/locale/fr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Aircox 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-30 13:53+0000\n" +"POT-Creation-Date: 2022-05-21 14:30+0000\n" "PO-Revision-Date: 2016-10-10 16:00+02\n" "Last-Translator: Aarys\n" "Language-Team: Aircox's translators team\n" @@ -18,21 +18,41 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: aircox/admin/episode.py:28 aircox/models/episode.py:155 +#: aircox/admin/episode.py:28 aircox/models/episode.py:183 #: aircox/models/log.py:82 msgid "start" msgstr "début" -#: aircox/admin/episode.py:32 aircox/models/episode.py:156 -#: aircox/models/program.py:475 +#: aircox/admin/episode.py:32 aircox/models/episode.py:184 +#: aircox/models/program.py:473 msgid "end" msgstr "fin" +#: aircox/admin/filters.py:21 +msgid "Exact" +msgstr "Exacte" + +#: aircox/admin/filters.py:22 +msgid "Since" +msgstr "Depuis" + +#: aircox/admin/filters.py:23 +msgid "Until" +msgstr "Jusque" + +#: aircox/admin/filters.py:25 +msgid "None" +msgstr "Aucun" + +#: aircox/admin/filters.py:36 +msgid "Any" +msgstr "Tous" + #: aircox/admin/page.py:41 msgid "Publication Settings" msgstr "Paramètre de la publication" -#: aircox/admin/program.py:40 aircox/models/program.py:288 +#: aircox/admin/program.py:40 aircox/models/program.py:286 msgid "Schedule" msgstr "Horaire" @@ -40,7 +60,7 @@ msgstr "Horaire" msgid "Program Settings" msgstr "Paramètres du program" -#: aircox/admin/program.py:64 aircox/models/program.py:125 +#: aircox/admin/program.py:64 aircox/models/program.py:122 msgid "Program" msgstr "Programme" @@ -48,98 +68,121 @@ msgstr "Programme" msgid "Day" msgstr "Jour" -#: aircox/admin/sound.py:36 aircox/models/sound.py:99 -#: aircox/models/station.py:135 -msgid "file" -msgstr "fichier" +#: aircox/admin/sound.py:34 aircox/admin/sound.py:65 +msgid "Audio" +msgstr "Audio" -#: aircox/admin/sound.py:64 aircox/templates/aircox/episode_detail.html:38 +#: aircox/admin/sound.py:61 +#, fuzzy +#| msgid "Programs list" +msgid "Program / Episode" +msgstr "Liste des programmes" + +#: aircox/admin/sound.py:79 aircox/templates/aircox/episode_detail.html:64 msgid "Playlist" msgstr "Playlist" -#: aircox/admin/sound.py:65 +#: aircox/admin/sound.py:80 msgid "Info" msgstr "Info" -#: aircox/admin_site.py:17 aircox/views/admin.py:32 +#: aircox/admin/sound.py:94 aircox/models/sound.py:232 +msgid "timestamp" +msgstr "temps" + +#: aircox/admin_site.py:17 aircox/views/admin.py:36 msgid "Statistics" msgstr "Statistiques" +#: aircox/filters.py:8 aircox/templates/admin/base.html:81 +#: aircox/templates/admin/base.html:95 aircox/templates/admin/base.html:109 +#: aircox/templates/aircox/base.html:78 +#: aircox/templates/aircox/page_list.html:15 +msgid "Search" +msgstr "Chercher" + +#: aircox/filters.py:22 +#, fuzzy +#| msgid "Podcasts" +msgid "Podcast" +msgstr "Podcasts" + +#: aircox/management/commands/sounds_monitor.py:204 +msgid "unknown" +msgstr "inconnu" + #: aircox/models/article.py:14 msgid "Article" -msgstr "" +msgstr "Article" -#: aircox/models/article.py:15 aircox/templates/admin/base.html:73 -#: aircox/templates/aircox/program_detail.html:19 +#: aircox/models/article.py:15 aircox/templates/admin/base.html:92 +#: aircox/templates/aircox/program_detail.html:44 msgid "Articles" -msgstr "" +msgstr "Articles" -#: aircox/models/episode.py:33 +#: aircox/models/episode.py:52 msgid "Episode" msgstr "Épisode" -#: aircox/models/episode.py:34 aircox/templates/admin/base.html:87 +#: aircox/models/episode.py:53 aircox/templates/admin/base.html:106 msgid "Episodes" msgstr "Épisodes" -#: aircox/models/episode.py:140 aircox/models/log.py:83 +#: aircox/models/episode.py:168 aircox/models/log.py:83 msgid "on air" msgstr "à l'antenne" -#: aircox/models/episode.py:141 +#: aircox/models/episode.py:169 msgid "not confirmed" msgstr "non confirmé" -#: aircox/models/episode.py:142 aircox/models/log.py:83 +#: aircox/models/episode.py:170 aircox/models/log.py:83 msgid "cancelled" msgstr "annulé" -#: aircox/models/episode.py:146 aircox/models/sound.py:90 -#: aircox/models/sound.py:280 aircox/templates/admin/aircox/statistics.html:23 +#: aircox/models/episode.py:174 aircox/models/sound.py:98 +#: aircox/models/sound.py:222 aircox/templates/admin/aircox/statistics.html:23 msgid "episode" msgstr "épisode" -#: aircox/models/episode.py:149 +#: aircox/models/episode.py:177 #, fuzzy #| msgid "Schedule" msgid "schedule" msgstr "Horaire" -#: aircox/models/episode.py:153 aircox/models/log.py:91 -#: aircox/models/sound.py:92 aircox/models/station.py:142 +#: aircox/models/episode.py:181 aircox/models/log.py:91 +#: aircox/models/sound.py:101 aircox/models/station.py:142 msgid "type" -msgstr "" +msgstr "type" -#: aircox/models/episode.py:168 aircox/models/log.py:117 +#: aircox/models/episode.py:196 aircox/models/log.py:117 msgid "Diffusion" -msgstr "" +msgstr "Diffusion" -#: aircox/models/episode.py:169 +#: aircox/models/episode.py:197 aircox/templates/aircox/episode_detail.html:15 +#: aircox/templates/aircox/program_detail.html:19 msgid "Diffusions" -msgstr "" +msgstr "Diffusions" -#: aircox/models/episode.py:171 +#: aircox/models/episode.py:199 msgid "edit the diffusion's planification" msgstr "éditer la planification de la diffusion" -#: aircox/models/episode.py:180 aircox/templates/aircox/episode_detail.html:22 +#: aircox/models/episode.py:208 aircox/templates/aircox/episode_detail.html:31 msgid "rerun" msgstr "rediffusion" -#: aircox/templates/aircox/program_header.html:21 -msgid "Rerun" -msgstr "Rediffusion" - #: aircox/models/log.py:82 msgid "stop" msgstr "stop" -#: aircox/models/log.py:84 aircox/models/sound.py:77 +#: aircox/models/log.py:84 aircox/models/sound.py:85 msgid "other" msgstr "autre" -#: aircox/models/log.py:89 aircox/models/page.py:213 -#: aircox/models/program.py:54 aircox/models/station.py:139 +#: aircox/models/log.py:89 aircox/models/page.py:248 +#: aircox/models/program.py:55 aircox/models/station.py:139 msgid "station" msgstr "station" @@ -147,7 +190,7 @@ msgstr "station" msgid "related station" msgstr "station relative" -#: aircox/models/log.py:92 aircox/models/program.py:256 +#: aircox/models/log.py:92 aircox/models/program.py:254 msgid "date" msgstr "date" @@ -163,11 +206,11 @@ msgstr "identifiant de la source relative à ce log" msgid "comment" msgstr "commentaire" -#: aircox/models/log.py:107 aircox/models/sound.py:133 +#: aircox/models/log.py:107 aircox/models/sound.py:137 msgid "Sound" msgstr "Son" -#: aircox/models/log.py:112 aircox/models/sound.py:306 +#: aircox/models/log.py:112 aircox/models/sound.py:248 msgid "Track" msgstr "Morceau" @@ -179,387 +222,375 @@ msgstr "Log" msgid "Logs" msgstr "Logs" -#: aircox/models/page.py:30 aircox/models/page.py:216 -#: aircox/models/sound.py:294 +#: aircox/models/page.py:30 aircox/models/page.py:251 +#: aircox/models/sound.py:236 msgid "title" msgstr "titre" -#: aircox/models/page.py:31 aircox/models/page.py:71 +#: aircox/models/page.py:31 aircox/models/page.py:76 #: aircox/models/station.py:38 msgid "slug" -msgstr "" +msgstr "slug" #: aircox/models/page.py:34 msgid "Category" msgstr "Catégorie" -#: aircox/models/page.py:35 aircox/templates/aircox/page_list.html:30 +#: aircox/models/page.py:35 aircox/templates/aircox/page_list.html:32 msgid "Categories" msgstr "Catégories" -#: aircox/models/page.py:63 +#: aircox/models/page.py:68 msgid "draft" msgstr "brouillon" -#: aircox/models/page.py:64 +#: aircox/models/page.py:69 msgid "published" msgstr "publié" -#: aircox/models/page.py:65 +#: aircox/models/page.py:70 msgid "trash" msgstr "corbeille" -#: aircox/models/page.py:73 +#: aircox/models/page.py:79 msgid "status" msgstr "statut" -#: aircox/models/page.py:77 +#: aircox/models/page.py:83 msgid "cover" msgstr "couverture" -#: aircox/models/page.py:80 aircox/models/page.py:203 +#: aircox/models/page.py:86 aircox/models/page.py:238 msgid "content" msgstr "contenu" -#: aircox/models/page.py:144 +#: aircox/models/page.py:162 msgid "category" msgstr "catégorie" -#: aircox/models/page.py:148 +#: aircox/models/page.py:165 +#, fuzzy +#| msgid "publications/" +msgid "publication date" +msgstr "publications/" + +#: aircox/models/page.py:167 msgid "featured" msgstr "en avant" -#: aircox/models/page.py:151 +#: aircox/models/page.py:170 msgid "allow comments" msgstr "autoriser les commentaires" -#: aircox/models/page.py:155 +#: aircox/models/page.py:176 msgid "Publication" msgstr "Publication" -#: aircox/models/page.py:156 +#: aircox/models/page.py:177 msgid "Publications" msgstr "Publications" -#: aircox/models/page.py:181 +#: aircox/models/page.py:202 msgid "Home page" msgstr "Page d'accueil" -#: aircox/models/page.py:182 +#: aircox/models/page.py:203 msgid "Diffusions page" msgstr "Page des diffusions" -#: aircox/models/page.py:183 +#: aircox/models/page.py:204 msgid "Logs page" msgstr "Page des logs" -#: aircox/models/page.py:184 +#: aircox/models/page.py:205 msgid "Programs list" msgstr "Liste des programmes" -#: aircox/models/page.py:185 +#: aircox/models/page.py:206 msgid "Episodes list" msgstr "Liste des épisodes" -#: aircox/models/page.py:186 +#: aircox/models/page.py:207 msgid "Articles list" msgstr "Liste des articles" -#: aircox/models/page.py:190 +#: aircox/models/page.py:219 msgid "attach to" msgstr "attacher à" -#: aircox/models/page.py:191 +#: aircox/models/page.py:220 msgid "display this page content to related element" msgstr "Afficher le contenu de cette page pour l'élément sélectionné" -#: aircox/models/page.py:197 +#: aircox/models/page.py:231 msgid "related page" msgstr "page liée" -#: aircox/models/page.py:200 +#: aircox/models/page.py:235 msgid "nickname" msgstr "pseudo" -#: aircox/models/page.py:201 +#: aircox/models/page.py:236 msgid "email" msgstr "email" -#: aircox/models/page.py:206 +#: aircox/models/page.py:241 msgid "Comment" msgstr "Commentaire" -#: aircox/templates/aircox/page_detail.html:74 -msgid "Post comment" -msgstr "Commenter" - -#: aircox/models/page.py:207 aircox/templates/aircox/page_detail.html:27 +#: aircox/models/page.py:242 aircox/templates/aircox/page_detail.html:37 msgid "Comments" msgstr "Commentaires" -#: aircox/models/page.py:214 +#: aircox/models/page.py:249 msgid "menu" msgstr "menu" -#: aircox/models/page.py:215 aircox/models/sound.py:94 -#: aircox/models/sound.py:287 +#: aircox/models/page.py:250 aircox/models/sound.py:103 +#: aircox/models/sound.py:229 msgid "order" msgstr "ordre" -#: aircox/models/page.py:217 +#: aircox/models/page.py:252 msgid "url" msgstr "url" -#: aircox/models/page.py:219 +#: aircox/models/page.py:254 msgid "page" msgstr "page" -#: aircox/models/page.py:227 +#: aircox/models/page.py:256 msgid "Menu item" msgstr "Élément du menu" -#: aircox/models/page.py:228 +#: aircox/models/page.py:257 #, fuzzy #| msgid "Menu item" msgid "Menu items" msgstr "Élément du menu" -#: aircox/models/program.py:56 aircox/models/station.py:52 +#: aircox/models/program.py:57 aircox/models/station.py:52 #: aircox/models/station.py:144 msgid "active" msgstr "actif" -#: aircox/models/program.py:58 +#: aircox/models/program.py:59 msgid "if not checked this program is no longer active" msgstr "si selectionné, ce programme n'est plus actif" -#: aircox/models/program.py:61 +#: aircox/models/program.py:62 msgid "syncronise" msgstr "synchroniser" -#: aircox/models/program.py:63 +#: aircox/models/program.py:64 msgid "update later diffusions according to schedule changes" msgstr "met à jour les diffusions à venir lorsque l'horaire change" -#: aircox/models/program.py:126 aircox/templates/admin/base.html:59 +#: aircox/models/program.py:123 aircox/templates/admin/base.html:78 msgid "Programs" msgstr "Programmes" -#: aircox/models/program.py:180 aircox/models/program.py:463 +#: aircox/models/program.py:178 aircox/models/program.py:461 msgid "related program" msgstr "programme apparenté" -#: aircox/models/program.py:184 +#: aircox/models/program.py:182 msgid "rerun of" msgstr "rediffusion de" -#: aircox/models/program.py:228 +#: aircox/models/program.py:226 #, fuzzy #| msgid "rerun must happen after initial" msgid "rerun must happen after original" msgstr "la rediffusion doit se passer après l'original" -#: aircox/models/program.py:256 +#: aircox/models/program.py:254 msgid "date of the first diffusion" msgstr "date de la première diffusion" -#: aircox/models/program.py:259 +#: aircox/models/program.py:257 #: aircox/templates/admin/aircox/statistics.html:22 msgid "time" msgstr "heure" -#: aircox/models/program.py:259 +#: aircox/models/program.py:257 msgid "start time" msgstr "heure de début" -#: aircox/models/program.py:262 +#: aircox/models/program.py:260 msgid "timezone" msgstr "zone horaire" -#: aircox/models/program.py:265 +#: aircox/models/program.py:263 msgid "timezone used for the date" msgstr "zone horaire utilisée pour la date" -#: aircox/models/program.py:268 aircox/models/sound.py:112 +#: aircox/models/program.py:266 aircox/models/sound.py:116 msgid "duration" msgstr "durée" -#: aircox/models/program.py:269 +#: aircox/models/program.py:267 msgid "regular duration" msgstr "durée normale" -#: aircox/models/program.py:272 +#: aircox/models/program.py:270 msgid "frequency" msgstr "fréquence" -#: aircox/models/program.py:274 +#: aircox/models/program.py:272 msgid "ponctual" msgstr "ponctuel" -#: aircox/models/program.py:275 +#: aircox/models/program.py:273 #, python-brace-format msgid "1st {day} of the month" msgstr "1er {day} du mois" -#: aircox/models/program.py:276 +#: aircox/models/program.py:274 #, python-brace-format msgid "2nd {day} of the month" msgstr "2ème {day} du mois" -#: aircox/models/program.py:277 +#: aircox/models/program.py:275 #, python-brace-format msgid "3rd {day} of the month" msgstr "3ème {day} du mois" -#: aircox/models/program.py:278 +#: aircox/models/program.py:276 #, python-brace-format msgid "4th {day} of the month" msgstr "4ème {day} du mois" -#: aircox/models/program.py:279 +#: aircox/models/program.py:277 #, python-brace-format msgid "last {day} of the month" msgstr "dernier {day} du mois" -#: aircox/models/program.py:280 +#: aircox/models/program.py:278 #, python-brace-format msgid "1st and 3rd {day} of the month" msgstr "1er et 3ème {day} du mois" -#: aircox/models/program.py:281 +#: aircox/models/program.py:279 #, python-brace-format msgid "2nd and 4th {day} of the month" msgstr "2ème et 4ème {day} du mois" -#: aircox/models/program.py:282 +#: aircox/models/program.py:280 #, python-brace-format msgid "every {day}" msgstr "chaque {day}" -#: aircox/models/program.py:283 +#: aircox/models/program.py:281 #, python-brace-format msgid "one {day} on two" msgstr "un {day} sur deux" -#: aircox/models/program.py:289 +#: aircox/models/program.py:287 msgid "Schedules" msgstr "Horaires" -#: aircox/models/program.py:466 +#: aircox/models/program.py:464 msgid "delay" msgstr "délai" -#: aircox/models/program.py:467 +#: aircox/models/program.py:465 msgid "minimal delay between two sound plays" msgstr "délai minimum entre deux sons joués" -#: aircox/models/program.py:470 +#: aircox/models/program.py:468 msgid "begin" msgstr "début" -#: aircox/models/program.py:471 aircox/models/program.py:477 -msgid "used to define a time range this stream isplayed" -msgstr "" -"utilisé pour définir un intervalle de temps pendant lequel ce stream est joué" +#: aircox/models/program.py:469 aircox/models/program.py:475 +msgid "used to define a time range this stream is played" +msgstr "utilisé pour définir un intervalle de temps pendant lequel ce stream est joué" -#: aircox/models/sound.py:77 +#: aircox/models/sound.py:85 msgid "archive" msgstr "archive" -#: aircox/models/sound.py:78 +#: aircox/models/sound.py:86 msgid "excerpt" msgstr "extrait" -#: aircox/models/sound.py:78 +#: aircox/models/sound.py:86 msgid "removed" msgstr "supprimé" -#: aircox/models/sound.py:81 aircox/models/station.py:37 +#: aircox/models/sound.py:89 aircox/models/station.py:37 msgid "name" msgstr "nom" -#: aircox/models/sound.py:85 +#: aircox/models/sound.py:92 msgid "program" msgstr "programme" -#: aircox/models/sound.py:86 +#: aircox/models/sound.py:93 msgid "program related to it" msgstr "programme apparenté à celui-ci" -#: aircox/models/sound.py:94 aircox/models/sound.py:287 +#: aircox/models/sound.py:103 aircox/models/sound.py:229 msgid "position in the playlist" msgstr "position dans la playlist" -#: aircox/models/sound.py:107 -msgid "embed" -msgstr "intégrer" +#: aircox/models/sound.py:112 aircox/models/station.py:135 +msgid "file" +msgstr "fichier" -#: aircox/models/sound.py:109 -msgid "HTML code to embed a sound from an external plateform" -msgstr "" -"code HTML utilisé pour intégrer un son depuis une plateforme extérieure" - -#: aircox/models/sound.py:114 +#: aircox/models/sound.py:118 msgid "duration of the sound" msgstr "durée du son" -#: aircox/models/sound.py:117 +#: aircox/models/sound.py:121 msgid "modification time" msgstr "dernière modification" -#: aircox/models/sound.py:119 +#: aircox/models/sound.py:123 msgid "last modification date and time" msgstr "date et heure de la dernière modification" -#: aircox/models/sound.py:122 +#: aircox/models/sound.py:126 msgid "good quality" msgstr "bonne qualité" -#: aircox/models/sound.py:122 +#: aircox/models/sound.py:126 msgid "sound meets quality requirements" msgstr "le son rencontre les exigences de qualité" -#: aircox/models/sound.py:126 +#: aircox/models/sound.py:130 msgid "public" msgstr "publique" -#: aircox/models/sound.py:126 +#: aircox/models/sound.py:130 msgid "if it can be podcasted from the server" msgstr "s'il peut être podcasté depuis le serveur" -#: aircox/models/sound.py:134 +#: aircox/models/sound.py:138 msgid "Sounds" msgstr "Sons" -#: aircox/models/sound.py:205 -msgid "unknown" -msgstr "inconnu" - -#: aircox/models/sound.py:284 +#: aircox/models/sound.py:226 msgid "sound" msgstr "son" -#: aircox/models/sound.py:290 -msgid "timestamp" -msgstr "temps" - -#: aircox/models/sound.py:292 +#: aircox/models/sound.py:234 msgid "position (in seconds)" msgstr "position (en secondes)" -#: aircox/models/sound.py:295 +#: aircox/models/sound.py:237 msgid "artist" msgstr "artiste" -#: aircox/models/sound.py:296 aircox/templates/admin/aircox/statistics.html:25 +#: aircox/models/sound.py:238 aircox/templates/admin/aircox/statistics.html:25 msgid "tags" msgstr "tags" -#: aircox/models/sound.py:298 +#: aircox/models/sound.py:240 msgid "information" msgstr "information" -#: aircox/models/sound.py:301 +#: aircox/models/sound.py:243 msgid "" "additional informations about this track, such as the version, if is it a " "remix, features, etc." @@ -567,7 +598,7 @@ msgstr "" "informations additionnelles à propos de ce morceau, telles que la version, " "s'il s'agit d'un remix, les fonctionnalités, etc" -#: aircox/models/sound.py:307 +#: aircox/models/sound.py:249 msgid "Tracks" msgstr "Morceaux" @@ -645,11 +676,16 @@ msgstr "" "liste des paramètres disponibles séparés par des virgules; placé dans le " "fichier de configuration en tant que code brut; relatif au plugin utilisé" +#: aircox/templates/admin/aircox/filters/filter.html:2 +#, python-format +msgid " By %(filter_title)s " +msgstr "" + #: aircox/templates/admin/aircox/page_change_form.html:9 #: aircox/templates/admin/aircox/page_change_list.html:7 -#: aircox/templates/admin/base.html:144 +#: aircox/templates/admin/base.html:163 #: aircox/templates/admin/change_list.html:30 -#: aircox/templates/aircox/base.html:62 +#: aircox/templates/aircox/base.html:54 msgid "Home" msgstr "Accueil" @@ -686,33 +722,28 @@ msgstr "piste" msgid "Total" msgstr "Total" -#: aircox/templates/admin/base.html:46 aircox/templates/admin/index.html:11 -#: aircox/templates/aircox/home.html:68 +#: aircox/templates/admin/base.html:65 aircox/templates/admin/index.html:11 +#: aircox/templates/aircox/home.html:75 msgid "Today" msgstr "Aujourd'hui" -#: aircox/templates/admin/base.html:62 aircox/templates/admin/base.html:76 -#: aircox/templates/admin/base.html:90 -msgid "Search" -msgstr "Chercher" - -#: aircox/templates/admin/base.html:102 +#: aircox/templates/admin/base.html:121 msgid "Tools" msgstr "Outils" -#: aircox/templates/admin/base.html:118 +#: aircox/templates/admin/base.html:137 msgid "View site" msgstr "Voir le site" -#: aircox/templates/admin/base.html:123 +#: aircox/templates/admin/base.html:142 msgid "Documentation" msgstr "Documentation" -#: aircox/templates/admin/base.html:127 +#: aircox/templates/admin/base.html:146 msgid "Change password" msgstr "Changer le mot de passe" -#: aircox/templates/admin/base.html:130 +#: aircox/templates/admin/base.html:149 msgid "Log out" msgstr "Se déconnecter" @@ -729,18 +760,26 @@ msgid "Filter" msgstr "Filtre" #: aircox/templates/admin/index.html:27 +msgid "Live diffusion" +msgstr "" + +#: aircox/templates/admin/index.html:30 +msgid "Differed diffusion" +msgstr "" + +#: aircox/templates/admin/index.html:51 msgid "Latest comments" msgstr "Derniers commentaires" -#: aircox/templates/admin/index.html:41 aircox/templates/admin/index.html:42 +#: aircox/templates/admin/index.html:65 aircox/templates/admin/index.html:66 msgid "Edit comment" msgstr "Editer le commentaire" -#: aircox/templates/admin/index.html:46 aircox/templates/admin/index.html:47 +#: aircox/templates/admin/index.html:70 aircox/templates/admin/index.html:71 msgid "Delete comment" msgstr "Supprimer le commentaire" -#: aircox/templates/admin/index.html:63 +#: aircox/templates/admin/index.html:87 msgid "All comments" msgstr "Tous les commentaires" @@ -757,47 +796,68 @@ msgstr "Afficher toutes les nouvelles" msgid "More news" msgstr "Plus de nouvelles" -#: aircox/templates/aircox/base.html:118 -msgid "list filters" -msgstr "Filtres" - -#: aircox/templates/aircox/base.html:144 +#: aircox/templates/aircox/base.html:146 msgid "Recently" msgstr "Récemment" +#. Translators: title when pages are filtered for a specific parent page, e.g.: Articles of My Incredible Show +#: aircox/templates/aircox/basepage_list.html:15 +#, python-format +msgid "%(model)s of %(title)s" +msgstr "%(model)s de %(title)s" + +#: aircox/templates/aircox/basepage_list.html:38 +msgid "There is nothing published here..." +msgstr "Il n'y a rien de publié ici..." + +#: aircox/templates/aircox/basepage_list.html:48 +msgid "pagination" +msgstr "pagination" + +#. Translators: Bottom of the list, "previous page" +#: aircox/templates/aircox/basepage_list.html:56 +msgid "Previous" +msgstr "Précédent" + +#. Translators: Bottom of the list, "Nextpage" +#: aircox/templates/aircox/basepage_list.html:64 +msgid "Next" +msgstr "Prochain" + #: aircox/templates/aircox/diffusion_list.html:9 #, python-format msgid "This week on %(station)s" msgstr "Cette semaine sur %(station)s" -#: aircox/templates/aircox/episode_detail.html:21 -#: aircox/templates/aircox/program_header.html:20 -#: aircox/templates/aircox/widgets/episode_item.html:36 +#: aircox/templates/aircox/episode_detail.html:30 +#: aircox/templates/aircox/program_detail.html:32 +#: aircox/templates/aircox/widgets/episode_item.html:40 #, python-format msgid "Rerun of %(date)s" msgstr "Rediffusion du %(date)s" -#: aircox/templates/aircox/episode_detail.html:53 +#: aircox/templates/aircox/episode_detail.html:49 +#: aircox/templates/aircox/episode_list.html:8 msgid "Podcasts" msgstr "Podcasts" -#: aircox/templates/aircox/home.html:24 +#: aircox/templates/aircox/home.html:28 msgid "Currently" msgstr "En ce moment" -#: aircox/templates/aircox/home.html:40 +#: aircox/templates/aircox/home.html:47 msgid "Last publications" msgstr "Dernières publications" -#: aircox/templates/aircox/home.html:51 +#: aircox/templates/aircox/home.html:58 msgid "Show all publication" msgstr "Afficher toute la publication" -#: aircox/templates/aircox/home.html:52 +#: aircox/templates/aircox/home.html:59 msgid "More publications..." msgstr "Plus de publications ..." -#: aircox/templates/aircox/home.html:61 +#: aircox/templates/aircox/home.html:68 msgid "Previously on air" msgstr "Précédemment à l'antenne" @@ -806,70 +866,64 @@ msgstr "Précédemment à l'antenne" msgid "That happened on %(station)s" msgstr "C'est passé sur %(station)s" -#: aircox/templates/aircox/page_detail.html:48 +#: aircox/templates/aircox/page_detail.html:25 +msgid "Edit" +msgstr "" + +#: aircox/templates/aircox/page_detail.html:58 msgid "Post a comment" msgstr "Poster un commentaire" -#: aircox/templates/aircox/page_detail.html:73 +#: aircox/templates/aircox/page_detail.html:83 #: aircox/templates/aircox/page_list.html:57 msgid "Reset" msgstr "Réinitialiser" -#. Translators: title when pages are filtered for a specific parent page, e.g.: Articles of My Incredible Show -#: aircox/templates/aircox/page_list.html:13 -#, python-format -msgid "%(model)s of %(title)s" -msgstr "%(model)s de %(title)s" +#: aircox/templates/aircox/page_detail.html:84 +msgid "Post comment" +msgstr "Commenter" + +#: aircox/templates/aircox/page_list.html:25 +#, fuzzy +#| msgid "content" +msgid "Search content" +msgstr "contenu" #: aircox/templates/aircox/page_list.html:54 msgid "Apply" msgstr "Appliquer" -#: aircox/templates/aircox/page_list.html:77 -msgid "There is nothing published here..." -msgstr "Il n'y a rien de publié ici..." +#: aircox/templates/aircox/program_detail.html:33 +msgid "Rerun" +msgstr "Rediffusion" -#: aircox/templates/aircox/page_list.html:87 -msgid "pagination" -msgstr "pagination" - -#. Translators: Bottom of the list, "previous page" -#: aircox/templates/aircox/page_list.html:95 -msgid "Previous" -msgstr "Précédent" - -#. Translators: Bottom of the list, "Nextpage" -#: aircox/templates/aircox/page_list.html:103 -msgid "Next" -msgstr "Prochain" - -#: aircox/templates/aircox/program_base.html:8 -#, python-format -msgid "Recently on %(program)s" -msgstr "Récemment dans %(program)s" - -#: aircox/templates/aircox/program_detail.html:31 +#: aircox/templates/aircox/program_detail.html:56 msgid "Show all program's articles" msgstr "Afficher tous les articles du programme" -#: aircox/templates/aircox/program_detail.html:32 +#: aircox/templates/aircox/program_detail.html:57 msgid "More articles" msgstr "Plus d'articles" +#: aircox/templates/aircox/program_sidebar.html:4 +#, python-format +msgid "Recently on %(program)s" +msgstr "Récemment dans %(program)s" + #: aircox/templates/aircox/widgets/dates_menu.html:15 msgid "pick a date" msgstr "choisir une date" -#: aircox/templates/aircox/widgets/dates_menu.html:27 +#: aircox/templates/aircox/widgets/dates_menu.html:32 msgid "Jump to date" msgstr "Aller à la date" #. Translators: form button to select a date -#: aircox/templates/aircox/widgets/dates_menu.html:36 +#: aircox/templates/aircox/widgets/dates_menu.html:41 msgid "Go" msgstr "" -#: aircox/templates/aircox/widgets/episode_item.html:37 +#: aircox/templates/aircox/widgets/episode_item.html:41 msgid "(rerun)" msgstr "(rediffusion)" @@ -881,18 +935,32 @@ msgstr "Afficher toutes les publications" msgid "Show more" msgstr "Afficher plus" -#: aircox/templates/aircox/widgets/player.html:10 +#: aircox/templates/aircox/widgets/player.html:9 msgid "player" msgstr "lecteur" -#: aircox/templates/aircox/widgets/player.html:11 +#: aircox/templates/aircox/widgets/player.html:10 msgid "Audio player used to listen to the radio and podcasts" msgstr "Lecteur audio utilisé pour écouter la radio et les podcasts" -#: aircox/templates/aircox/widgets/player.html:23 +#: aircox/templates/aircox/widgets/player.html:22 msgid "Play or pause audio" msgstr "Lire ou suspendre l'audio" +#: aircox/templates/aircox/widgets/player.html:28 +msgid "Track currently on air" +msgstr "Morceau en ce moment sur les ondes" + +#: aircox/templates/aircox/widgets/player.html:37 +msgid "Diffusion currently on air" +msgstr "Diffusion en ce moment sur les ondes" + +#: aircox/templates/aircox/widgets/player.html:42 +#, fuzzy +#| msgid "Currently" +msgid "Currently playing" +msgstr "En ce moment" + #: aircox/urls.py:40 msgid "articles/" msgstr "articles/" @@ -957,10 +1025,20 @@ msgstr "programmes//articles/" msgid "programs//publications/" msgstr "programmes//publications/" -#: aircox/views/page.py:103 +#: aircox/views/page.py:131 msgid "comments are not allowed" msgstr "les commentaires ne sont pas autorisés" +#~ msgid "embed" +#~ msgstr "intégrer" + +#~ msgid "HTML code to embed a sound from an external plateform" +#~ msgstr "" +#~ "code HTML utilisé pour intégrer un son depuis une plateforme extérieure" + +#~ msgid "list filters" +#~ msgstr "Filtres" + #~ msgid "" #~ "Should this article be considered as a page instead of a blog article" #~ msgstr "" diff --git a/aircox/models/program.py b/aircox/models/program.py index 3b02703..4406d34 100644 --- a/aircox/models/program.py +++ b/aircox/models/program.py @@ -466,13 +466,13 @@ class Stream(models.Model): ) begin = models.TimeField( _('begin'), blank=True, null=True, - help_text=_('used to define a time range this stream is' + help_text=_('used to define a time range this stream is ' 'played') ) end = models.TimeField( _('end'), blank=True, null=True, - help_text=_('used to define a time range this stream is' + help_text=_('used to define a time range this stream is ' 'played') ) diff --git a/aircox_streamer/README.md b/aircox_streamer/README.md new file mode 100644 index 0000000..2e12c8b --- /dev/null +++ b/aircox_streamer/README.md @@ -0,0 +1,18 @@ +# Aircox Streamer +This application handles interfacing Aircox with Liquidsoap: + +- generate for each station liquidsoap configuration files; +- handle played diffusions, sounds files and tracks; +- launch program's diffusion from sound files; +- provide admin interface and API in order to control liquidsoap; + +## Architecture +`aircox_streamer` Django application provides management command `streamer`, which +can be run in virtualenv from shell: ``./manage.py streamer``. + +This application allows to: +- launch Liquidsoap; +- generate config file and playlists: regular Django template file in `scripts/station.liq`; +- monitor what is being played and what has to be played using Telnet to communicate + with Liquidsoap process; + diff --git a/aircox_streamer/locale/fr/LC_MESSAGES/django.po b/aircox_streamer/locale/fr/LC_MESSAGES/django.po index 711e40e..07a126d 100644 --- a/aircox_streamer/locale/fr/LC_MESSAGES/django.po +++ b/aircox_streamer/locale/fr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-31 18:34+0000\n" +"POT-Creation-Date: 2022-05-21 14:30+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,91 +18,91 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: controllers.py:75 +#: aircox_streamer/controllers.py:75 msgid "playing" msgstr "en cours de lecture" -#: controllers.py:77 +#: aircox_streamer/controllers.py:77 msgid "paused" msgstr "pause" -#: controllers.py:79 +#: aircox_streamer/controllers.py:79 msgid "stopped" msgstr "arrêt" -#: templates/aircox_streamer/source_item.html:18 +#: aircox_streamer/templates/aircox_streamer/source_item.html:18 msgid "Edit related program" msgstr "Éditer le programme correspondant" -#: templates/aircox_streamer/source_item.html:27 +#: aircox_streamer/templates/aircox_streamer/source_item.html:27 msgid "Synchronize source with Liquidsoap" msgstr "Synchroniser la source avec Liquidsoap" -#: templates/aircox_streamer/source_item.html:31 +#: aircox_streamer/templates/aircox_streamer/source_item.html:31 msgid "Synchronise" msgstr "Synchroniser" -#: templates/aircox_streamer/source_item.html:34 +#: aircox_streamer/templates/aircox_streamer/source_item.html:34 msgid "Restart current track" msgstr "Rejouer le morceau en cours" -#: templates/aircox_streamer/source_item.html:38 +#: aircox_streamer/templates/aircox_streamer/source_item.html:38 msgid "Restart" msgstr "Rejouer" -#: templates/aircox_streamer/source_item.html:41 +#: aircox_streamer/templates/aircox_streamer/source_item.html:41 msgid "Skip current file" msgstr "Passer le fichier actuel" -#: templates/aircox_streamer/source_item.html:42 +#: aircox_streamer/templates/aircox_streamer/source_item.html:42 msgid "Skip" msgstr "Passer" -#: templates/aircox_streamer/source_item.html:51 +#: aircox_streamer/templates/aircox_streamer/source_item.html:51 msgid "Add sound" msgstr "Ajouter un son" -#: templates/aircox_streamer/source_item.html:59 +#: aircox_streamer/templates/aircox_streamer/source_item.html:58 msgid "Select a sound" msgstr "Sélectionner un son" -#: templates/aircox_streamer/source_item.html:61 -msgid "Add a sound to the queue (queue may start playing)" -msgstr "Ajouter un son à la file de lecture (la file de lecture peut démarer)" - -#: templates/aircox_streamer/source_item.html:70 +#: aircox_streamer/templates/aircox_streamer/source_item.html:69 msgid "Add" msgstr "Ajouter" -#: templates/aircox_streamer/source_item.html:76 +#: aircox_streamer/templates/aircox_streamer/source_item.html:74 +msgid "Add a sound to the queue (queue may start playing)" +msgstr "Ajouter un son à la file de lecture (la file de lecture peut démarer)" + +#: aircox_streamer/templates/aircox_streamer/source_item.html:80 msgid "Sounds in queue" msgstr "Sons dans la file de lecture" -#: templates/aircox_streamer/source_item.html:94 +#: aircox_streamer/templates/aircox_streamer/source_item.html:98 msgid "Status" msgstr "Statut" -#: templates/aircox_streamer/source_item.html:104 +#: aircox_streamer/templates/aircox_streamer/source_item.html:108 msgid "Air time" msgstr "En antenne depuis" -#: templates/aircox_streamer/source_item.html:114 +#: aircox_streamer/templates/aircox_streamer/source_item.html:118 msgid "Time left" msgstr "Temps restant" -#: templates/aircox_streamer/source_item.html:122 +#: aircox_streamer/templates/aircox_streamer/source_item.html:126 msgid "Data source" msgstr "Source de donnée" -#: templates/aircox_streamer/streamer.html:19 +#: aircox_streamer/templates/aircox_streamer/streamer.html:23 msgid "Reload" msgstr "Recharger" -#: templates/aircox_streamer/streamer.html:26 -#: templates/aircox_streamer/streamer.html:27 +#: aircox_streamer/templates/aircox_streamer/streamer.html:30 +#: aircox_streamer/templates/aircox_streamer/streamer.html:31 msgid "Select a station" msgstr "Sélectionner une station" -#: urls.py:9 views.py:9 +#: aircox_streamer/urls.py:10 aircox_streamer/views.py:9 msgid "Streamer Monitor" msgstr "Moniteur de stream"