Skip to content

Commit d7f2cda

Browse files
committed
Добавляет и обновляет воркфлоу
1 parent f750625 commit d7f2cda

File tree

5 files changed

+137
-35
lines changed

5 files changed

+137
-35
lines changed

README.md

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
# Подкаст «Веб-стандарты»
22

3-
[![Статус тестов EditorConfig](https://github.com/web-standards/podcast/workflows/editorconfig/badge.svg)](https://github.com/web-standards/podcast/actions/workflows/editorconfig.yml)
4-
[![Статус тестов ESLint](https://github.com/web-standards/podcast/workflows/eslint/badge.svg)](https://github.com/web-standards/podcast/actions/workflows/eslint.yml)
5-
6-
Новости фронтенда в еженедельном подкасте сообщества «[Веб-стандарты](https://web-standards.ru/)»
3+
Новости фронтенда в еженедельном подкасте сообщества «[Веб-стандарты](https://web-standards.ru/)».
74

85
## Постоянные ведущие
96

WORKFLOW.md

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# Подготовка эпизода
2+
3+
1. Создайте новый эпизод:
4+
5+
```sh
6+
npm run new
7+
```
8+
9+
На основе шаблонов [index.yml](src/templates/index.yml) и [index.md](src/templates/index.yml) в папке `src/episodes/N` появятся файлы эпизода.
10+
11+
Файл `index.yml` для метаданных, файл `index.md` для ссылок из сценария.
12+
13+
2. Обновите метаданные в файле `index.yml`:
14+
15+
- Удалите ведущих, которые не участвовали в эпизоде.
16+
- Поменяйте порядок ведущих на основе обложки.
17+
18+
3. Добавьте ссылки в файл `index.md` на основе сценария эпизода:
19+
20+
- Добавьте ссылку на лайв.
21+
- Скопируйте ссылки из сценария.
22+
23+
4. Экспортируйте WAV-файл эпизода с именем `N.wav` в папку `src/wav`.
24+
25+
Файл должен быть размечен маркерами глав.
26+
27+
5. Запустите скрипт генерации MP3 и описания эпизода:
28+
29+
```sh
30+
npm run wav N
31+
```
32+
33+
- В папке `src/mp3` появится MP3-файл эпизода.
34+
- В файле `index.yml` обновится длительность эпизода.
35+
- На основе шаблона [index.txt](src/templates/index.txt) в папке `src/episodes/N` появится черновик эпизода.
36+
37+
6. Отредактируйте черновик эпизода в файле `index.txt`:
38+
39+
- Разверните название глав.
40+
- Соберите название эпизода (до 100 символов, включая номер эпизода).
41+
- Заполните оставшиеся поля.
42+
43+
7. Заполните метаданные в файле `index.yml`
44+
45+
- Скопируйте название эпизода из файла `index.txt` без номера.
46+
- Скопирутей названия глав из файла `index.txt`.
47+
48+
8. Обновите ссылки в файле `index.md`:
49+
50+
- Скопируте главы и замените таймкоды на заголовки второго уровня.
51+
- Разделите ссылки на секции с заголовками.
52+
53+
9. Запишите метаданные в MP3-файл:
54+
55+
```sh
56+
npm run mp3 N
57+
```
58+
59+
Данные из файла `index.yml`, а также обложка `src/cover.png` будут записаны в MP3-файл.
60+
61+
10. Закомитьте и запушьте изменения:
62+
63+
```sh
64+
git commit -m "Добавляет N-й"
65+
git push
66+
```
67+
68+
11. Соберите и задеплойте сайт фид:
69+
70+
```sh
71+
npm run build
72+
```
73+
74+
Соберёт `index.xml` и `latest.xml` в `dist`.
75+
76+
```sh
77+
npm run deploy
78+
```
79+
80+
Задеплоит следующие файлы:
81+
82+
- `src/mp3/N.mp3` в `/podcast/episodes/`
83+
- `src/cover.png` в `/podcast/`
84+
- `index.xml` и `latest.xml` в `/podcast/feed/`
85+
86+
12. Запустите сборку сайта в [web-standards/web-standards.ru](https://github.com/web-standards/web-standards.ru)
87+
88+
```sh
89+
gh workflow run deploy
90+
```

scripts/new.js

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,14 @@ if (!fs.existsSync(templateYmlPath)) {
4747
process.exit(1);
4848
}
4949

50-
let readmeContent = fs.readFileSync(readmePath, 'utf-8');
51-
const prevEpisode = Number(
52-
readmeContent.match(/\[(\d+)\]: src\/episodes\/(\d+)\/index.md/)[1]
53-
);
50+
const episode = process.argv[2];
5451

55-
if (!prevEpisode) {
56-
console.error('Не получилось достать номер прошлого эпизода из README.md.');
52+
if (!episode) {
53+
console.error('Укажи номер эпизода: npm run new N');
5754
process.exit(1);
5855
}
5956

60-
const episode = prevEpisode + 1;
57+
let readmeContent = fs.readFileSync(readmePath, 'utf-8');
6158
const episodeDir = path.join('src', 'episodes', String(episode));
6259
const episodeMdPath = path.join(episodeDir, 'index.md');
6360
const episodeYmlPath = path.join(episodeDir, 'index.yml');
@@ -71,16 +68,6 @@ if (!readmeContent.includes(`| ${episode} |`)) {
7168
);
7269
}
7370

74-
readmeContent = readmeContent
75-
.replace(
76-
episodeLinkString(episode - 1),
77-
`${episodeLinkString(episode)}\n${episodeLinkString(episode - 1)}`
78-
)
79-
.replace(`| ${episode} |`, `| [${episode}][] |`);
80-
81-
fs.writeFileSync(readmePath, readmeContent);
82-
console.log(`Обновлён: ${readmePath}`);
83-
8471
fs.mkdirSync(episodeDir, { recursive: true });
8572

8673
const templateMdContent = fs.readFileSync(templateMdPath, 'utf-8');
@@ -95,8 +82,13 @@ const episodeYmlContent = templateYmlContent.replace(
9582
fs.writeFileSync(episodeYmlPath, episodeYmlContent);
9683
console.log(`Создан: ${episodeYmlPath}`);
9784

98-
console.info(`
99-
Теперь заполни:
100-
- ${episodeYmlPath}
101-
- ${episodeMdPath}
102-
`);
85+
const prevEpisode = Number(episode) - 1;
86+
readmeContent = readmeContent
87+
.replace(
88+
episodeLinkString(prevEpisode),
89+
`${episodeLinkString(episode)}\n${episodeLinkString(prevEpisode)}`
90+
)
91+
.replace(`| ${episode} |`, `| [${episode}][] |`);
92+
93+
fs.writeFileSync(readmePath, readmeContent);
94+
console.log(`\nОбновлён: ${readmePath}`);

scripts/wav.js

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,18 @@ function buildMp3(episodeNumber, inputFolder, outputFolder) {
2020
]);
2121
}
2222

23-
function buildChapters(inputFile) {
23+
function getMediaInfo(inputFile) {
24+
return runCommandSync('ffprobe', [
25+
'-i', inputFile,
26+
'-loglevel', '0',
27+
'-hide_banner',
28+
'-print_format', 'json',
29+
'-show_chapters',
30+
'-show_format',
31+
]);
32+
}
33+
34+
function getChapters(inputFile) {
2435
return runCommandSync('ffprobe', [
2536
'-i', inputFile,
2637
'-loglevel', '0',
@@ -31,6 +42,16 @@ function buildChapters(inputFile) {
3142
]);
3243
}
3344

45+
function formatDuration(seconds) {
46+
return new Date(seconds * 1000).toISOString().slice(11, 19);
47+
}
48+
49+
function updateYmlDuration(ymlPath, duration) {
50+
const content = fs.readFileSync(ymlPath, 'utf-8');
51+
const updated = content.replace(/^duration: .*$/m, `duration: ${duration}`);
52+
fs.writeFileSync(ymlPath, updated);
53+
}
54+
3455
function parseTime(str) {
3556
return `0${str}`.split('.')[0];
3657
}
@@ -70,6 +91,7 @@ const mp3Dir = path.join('src', 'mp3');
7091
const mp3Path = path.join(mp3Dir, `${episode}.mp3`);
7192
const episodeDir = path.join('src', 'episodes', episode);
7293
const indexPath = path.join(episodeDir, 'index.txt');
94+
const ymlPath = path.join(episodeDir, 'index.yml');
7395

7496
if (!fs.existsSync(wavPath)) {
7597
console.error(`Файл не найден: ${wavPath}`);
@@ -86,15 +108,20 @@ fs.mkdirSync(mp3Dir, { recursive: true });
86108
buildMp3(episode, path.join('src', 'wav'), mp3Dir);
87109
console.log(`Создан: ${mp3Path}`);
88110

89-
const json = buildChapters(mp3Path);
90-
const parsedJson = JSON.parse(json);
111+
const mediaInfo = JSON.parse(getMediaInfo(mp3Path));
112+
const chaptersInfo = JSON.parse(getChapters(mp3Path));
91113

92-
if (!parsedJson.chapters) {
114+
if (!chaptersInfo.chapters) {
93115
console.error('В файле нет глав');
94116
process.exit(1);
95117
}
96118

97119
fs.mkdirSync(episodeDir, { recursive: true });
98120

99-
writeIndexFile(templatePath, episode, parsedJson.chapters, indexPath);
121+
writeIndexFile(templatePath, episode, chaptersInfo.chapters, indexPath);
100122
console.log(`Создан: ${indexPath}`);
123+
124+
const durationSeconds = parseFloat(mediaInfo.format.duration);
125+
const duration = formatDuration(durationSeconds);
126+
updateYmlDuration(ymlPath, duration);
127+
console.log(`Обновлён: ${ymlPath}`);

src/templates/index.txt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
N. TITLE
22

3-
— HOST
4-
— HOST
5-
— HOST
6-
73
CHAPTERS
84

95
Веб-стандарты: HOSTS_SHORT.

0 commit comments

Comments
 (0)