LINUX.ORG.RU

Программка для радио

 ,


0

1

Есть радио программа-плеер которая вещает на сервак, суть в том что нужна программа которая возьмет из определенной директории(их там много) и за рандомит песни и есть вставки из другой директории с болтавней все это в mp3, но есть условия

9:00-10:00 - music
10:00-(dependent from file) болтовня обычная
(dependent from file)-11:30 - music
11:30-(dependent from file) болтовня
(dependent from file)-12:00 - music
сам файл в формате m3u8
#EXTM3U
#EXTINF:12,джингл1
C:\Users\User\Desktop\РАДИО\джингл1.mp3
#EXTINF:438,Relaxea - Sunshine Delight
Z:\Автоматизация\музыка для радио\Chillout after work\After Work Chillout\001_Relaxea_-_Sunshine_Delight.mp3
#EXTINF:222,Minka - Little Cat
Z:\Автоматизация\музыка для радио\Chillout after work\After Work Chillout\002_Minka_-_Little_Cat.mp3
#EXTINF:962,Богданова
Z:\Радио\Рубрика Наперекор судьбе\Богданова.mp3//болтавня
........
нужно по длительности определить и подобрать и желательно чтобы разная была при каждом запуске также есть джингл 12 секундный который можно вставлять по несколько раз есть не хватает например минуты, P.S. вот желательно бы знать на каком языке это сделать и функции рекурсивно обходящие все поддиректории с добавлением всех файлов и определении их длин
Алгоритм такой:
1.Добавляем в вектора всю музыку и во второй болтавню(рекурсивно обходя директории и их поддиректории)
2.Открываем файл fopen(playlist.m3u8,"w");
Вставляем строку fwrite("#EXTM3U@);
Какой-то функцией определяем длину которая тоже в векторе еще одном будет, либо вектор состоящий из 
struct
{
std::string filename;
float length;
}
3 Подбираем длины чтобы был час по длительности с рандомом по выборке
4. Пишем 
frite("#EXTINF:"+vector[i].length.toString()+","+vector[i].filename);
frite(vector[i].filename);
5. Вставляем из вектора с болтавней одну композицию
frite("#EXTINF:"+vectortalk[i].length.toString()+","+vectortalk[i].filename);
frite(vectortalk[i].filename);
6.Повторяем предыдущие шаги с подборкой длин по расписанию
Well done!



Последнее исправление: Gremlin_ (всего исправлений: 4)

Как обычно ничего не понятно, но я рад, что тебя ещё не забанили.

C:\Users\User\Desktop\РАДИО\джингл1.mp3

Это в каком дистрибутиве такие пути странные?

Deleted
()

Для таких постов есть раздел Job

Deleted
()
Ответ на: комментарий от Gremlin_

чтобы понятно было

Спасибо, что б я делал без тебя. С виндовыми путями-то мне все сразу понятно, не то что с богомерзкими юниксовыми.

Makhno
()

Ну и зачем тебе с++, если ты даже в такие примитивные алгоритмы неспособен?

anonymous
()

Мылко

Liquidsoap

anonymous
()
Ответ на: комментарий от jo_b1ack

нужен рекурсивный короче обход директорий и поддиректорий и узнать длину mp3 в секундах и еще алгоритм подборки под условие длительности

Gremlin_
() автор топика
Ответ на: комментарий от Gremlin_

Есть рекурсивный обход

#include <iostream>
#include <fstream>
#include <vector>
#include <Windows.h>
//#define _CRT_SECURE_NO_WARNINGS 
long int rez = 0;

void GetFileList(LPTSTR sPath, LPTSTR sExt, LPTSTR sEXT);
struct Type
{
	std::string filename;
	float length;
};
int main(int argc, char* argv[])
{
	std::ofstream fout;
	fout.open("playlist.m3u8");
	if (!fout.is_open())
	{
		std::cout << "Can't open file" << std::endl;
		exit(EXIT_FAILURE);
	}
	fout.write("#EXTM3U", strlen("#EXTM3U"));
	std::vector<Type> *vector = new std::vector<Type>();
	std::vector<Type> *vectortalk = new std::vector<Type>();
	Type type;
	char sPath[MAX_PATH] = "Z:\\Автоматизация\\музыка для радио";
	//        char sPath[MAX_PATH]= "C:\\vso_moio";
	//        char sPath[MAX_PATH]= "C:\\vso_moio";

	//Обратить  внимание на размер массива!
	char sExt[10] = "mp3";
	char sEXT[10] = "MP3";
	GetFileList(sPath, sExt, sEXT);
	//Портит всё дело: Если перенаправлять в файл с консоли, то полуачается, что в консол ведут 
	//запись два разных потока- тот,который нужент и этот,который записывает "Для продлжения нажмите любую
	//клавишу" и эта надпись вклинивается в серёдку и портит всё дело
	printf("rez= %d\n", rez);
	vector->clear();
	vectortalk->clear();
	fout.close();
	std::cin.get();
	return 0;
}
void GetFileList(LPTSTR sPath, LPTSTR sExt, LPTSTR sEXT) {

	WIN32_FIND_DATA pFILEDATA;
	strcat_s(sPath, MAX_PATH, "\\*.*");
	HANDLE hFile = FindFirstFile(sPath, &pFILEDATA);

	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!Необходимо именно здесь прописывать длину пути!!!!!!!!!!!!!!!!!!!!!!!
	sPath[strlen(sPath) - strlen(strstr(sPath, "*.*"))] = '\0';
	//Если пропишем после if (как предлагает Юра), то тогда, если вдруг натыкаемся на системную директорию
	// или файл, то FindFirstFile возвращает -1. Следовательно, всё, что выплнняется по условию
	//(hFile!=INVALID_HANDLE_VALUE) не выолнится и в частности, не будет поставлен конец строки!
	//А это значит, что по выходу из  рекурсивной функции GetFileList в том месте, где мы восстанавливаем
	//Длину, она будет восстановлена неправильно
	if (hFile != INVALID_HANDLE_VALUE) {
		char * chBuf;
		//sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0';
		do {
			//Пропускаем . и ..
			if (strlen(pFILEDATA.cFileName) == 1 && strchr(pFILEDATA.cFileName, '.') != NULL)
				if (FindNextFile(hFile, &pFILEDATA) == 0)
					break;
			if (strlen(pFILEDATA.cFileName) == 2 && strstr(pFILEDATA.cFileName, "..") != NULL)
				if (FindNextFile(hFile, &pFILEDATA) == 0)
					break;
			//Если нашли директорию, запускаем поиск в ней рекурсивный поиск
			if (pFILEDATA.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
				strcat_s(sPath,MAX_PATH, pFILEDATA.cFileName);
				GetFileList(sPath, sExt, sEXT);

				//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!оБЯЗАТЕЛЬН востанавливать дллину пути................................     
				sPath[strlen(sPath) - strlen(pFILEDATA.cFileName) - 1] = '\0';
			}
			else {
				//Проверяем на соотвествие sExt расширения pFILEDATA.cFileName
				if ((chBuf = strrchr(pFILEDATA.cFileName, '.'))) {
					if (strstr(chBuf + 1, sExt) || strstr(chBuf + 1, sEXT)) {
						//Если не будем использовать CharToOem() то на экране русский шрифт каракулями выйдет
						CharToOem(sPath, sPath);
						printf("%s", sPath);
						OemToChar(sPath, sPath);
						CharToOem(pFILEDATA.cFileName, pFILEDATA.cFileName);
						printf("%s\n", pFILEDATA.cFileName);
						rez++;
					}
				}
			}
		} while (FindNextFile(hFile, &pFILEDATA));
	}
}

Gremlin_
() автор топика

Язабан.

anonymous
()
Ответ на: комментарий от Gremlin_

Ты с нофелета пишешь что ли?

У прогера 1 ноут на всё? Ты точно ITшнег?

HIS
()
Ответ на: комментарий от Gremlin_

это я для примера взял, чтобы понятно было

/home/user... очевиднее. не увиливай, виндузятник

next_time ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.