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!

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

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

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

Deleted ()
Ответ на: комментарий от 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_ ()