E
E
Evgeny Petryaev2019-06-14 17:05:30
C++ / C#
Evgeny Petryaev, 2019-06-14 17:05:30

To figure out the selection algorithm for the duration?

We need an algorithm for selecting music by duration for such a schedule

9:00-10:00 - музыка
10:00-(зависит от длительности программы)-программа(интервью или что то в этом духе обычно минут 20)
(зависит от длительности программы)-11:30-музыка
11:30-(зависит от длительности программы) - интервью(или образовательная программа
(зависит от длительности программы)-12:00-музыка(иногда может программа быть до 12 часов)

music file path to the file and duration in seconds playlist2.m3u8 https://dropmefiles.com/eYACc
file with interviews for educational programs playlist3.m3u8 https://dropmefiles.com/9rVLu
the program itself
#include <iostream>
#include <fstream>
#include <vector>
#include <Windows.h>
#include <string>
#include <cstdlib>
//#include <sstream>
//#include <locale>
#include <time.h>
#include "mp3.h"
#include "mp3frame.h"
//#define _CRT_SECURE_NO_WARNINGS 
long int rez = 0;
struct Type
{
  std::string filename;
  float length;
};
void GetFileList(LPTSTR sPath, LPTSTR sExt, LPTSTR sEXT, std::vector<Type> *v);

int main(int argc, char* argv[])
{
  
  std::vector<Type> *vector = new std::vector<Type>();
  std::vector<Type> *vectortalk = new std::vector<Type>();
  char sPath[MAX_PATH] = "Z:\\Автоматизация\\музыка для радио от Сергея Косякова";
  char sPath2[MAX_PATH] = "Z:\\Радио";
  char sExt[10] = "mp3";
  char sEXT[10] = "MP3";
  GetFileList(sPath, sExt, sEXT, vector);
  printf("rez= %d\n", rez);
  rez = 0;
  GetFileList(sPath2, sExt, sEXT, vectortalk);
  printf("rez= %d\n", rez);

  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\n", strlen("#EXTM3U\n"));
  fout.write("#EXTINF:", strlen("#EXTINF:"));
  fout.write("12", strlen("12"));
  fout.write(",", strlen(","));
  fout.write((*vector)[0].filename.c_str(), (*vector)[0].filename.size());
  fout.write("\n", strlen("\n"));
  fout.write((*vector)[0].filename.c_str(), (*vector)[0].filename.size());
  fout.write("\n", strlen("\n"));

  /*
  std::string f_str;
  for (int i = 0;i < vector->size();i++)
  {
    fout.write(vector->at(i).filename.c_str(), vector->at(i).filename.size());
    fout.write("\n", 1);
    MP3 mp3(vector->at(i).filename.c_str());
    (*vector)[i].length = mp3.get_len();
    f_str = std::to_string(mp3.get_len());
    fout.write(f_str.c_str(),f_str.size());
    fout.write("\n", 1);
  }
  for (int i = 0;i < vectortalk->size();i++)
  {
    fout.write(vectortalk->at(i).filename.c_str(), vectortalk->at(i).filename.size());
    fout.write("\n", 1);
    MP3 mp3(vectortalk->at(i).filename.c_str());
    (*vectortalk)[i].length = mp3.get_len();
    f_str = std::to_string(mp3.get_len());
    fout.write(f_str.c_str(), f_str.size());
    fout.write("\n", 1);
  }
  */

  fout.close();

  Type elem;
  
  MP3 mp3__("C:\\Users\\User\\Desktop\\РАДИО\\джингл1.mp3");
  std::cout << mp3__.get_name();
  std::cout << mp3__.get_artist();
  std::cout << mp3__.get_len() << " length\n";
  std::cout << mp3__.get_bitrate() << " bitrate\n";
  //cout << mp3.get_pic();
  //mp3.save_pic("where/you/want/to/save.jpg");
  elem.filename = "C:\\Users\\User\\Desktop\\РАДИО\\джингл1.mp3";
  elem.length = mp3__.get_len();
  std::vector<Type> *vector2 = new std::vector<Type>();

  vector2->push_back(elem);
  
  setlocale(LC_ALL, "Russian");

  std::ifstream fin("playlist2.m3u8");
  if (!fin.is_open())
  {
    std::cout << "File not found!" << std::endl;
  }
  std::string str="";
  while (std::getline(fin,elem.filename))
  {
    std::getline(fin, str);
    elem.length = std::stof(str);
    if(elem.length != 0.0)
      vector2->push_back(elem);
  }
  fin.close();
  
  int sum = 0;
  for (int i = 0;i < vector2->size();i++)
    if ((*vector2)[i].length == 0.0)
      sum++;
  
  std::cout <<"size="<< vector2->size() << std::endl<<"0: " <<sum<< std::endl;
  
  std::cout << (*vector2)[0].filename << std::endl << (*vector2)[0].length << std::endl;
  std::cout << (*vector2)[vector2->size()-1].filename << std::endl << (*vector2)[vector2->size() - 1].length << std::endl;
  

  //setlocale(LC_ALL, "ru_RU.UTF-8");
  std::vector<Type> *vector3 = new std::vector<Type>();
  std::ifstream fin2("playlist3.m3u8");
  if (!fin2.is_open())
  {
    std::cout << "File not found!" << std::endl;
  }
  while (std::getline(fin2, elem.filename))
  {
    std::getline(fin2, str);
    elem.length = std::stof(str);
    if (elem.length != 0.0)
      vector3->push_back(elem);
  }
  fin2.close();
  
  sum = 0;
  for (int i = 0;i < vector3->size();i++)
    if ((*vector3)[i].length == 0.0)
      sum++;
  
  std::cout << "size=" << vector3->size() << std::endl << "0: " << sum << std::endl;
  
  std::cout << (*vector3)[0].filename << std::endl << (*vector3)[0].length << std::endl;
  

  
  vector->clear();
  vectortalk->clear();
  std::cin.get();
  return 0;
}
int Random(std::vector<Type> *vector)
{
  int min = 0, max = vector->size()-1;
  srand(time(0));
  return min + rand() % (max - min + 1);
}
void GetFileList(LPTSTR sPath, LPTSTR sExt, LPTSTR sEXT,std::vector<Type> *v) {

  WIN32_FIND_DATA pFILEDATA;
  HANDLE hFile = FindFirstFile(strcat(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) {
        GetFileList(strcat(sPath, pFILEDATA.cFileName), sExt, sEXT,v);

        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!оБЯЗАТЕЛЬН востанавливать дллину пути................................     
        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);
            
            Type type;
            if (rez == 14)
              bool b = true;
            OemToChar(pFILEDATA.cFileName, pFILEDATA.cFileName);
            std::string str = pFILEDATA.cFileName;
            type.filename = sPath + str;
            v->push_back(type);
            //printf("%s\n",v->at(rez).filename);
            //printf("%d\n", rez);
            
            rez++;
          }
        }
      }
    } while (FindNextFile(hFile, &pFILEDATA));
  }
}

and files from the crooked mp3 library https://github.com/TheOnlyCaky/libmp3 the output file of this kind should be playlist.m3u8 https://dropmefiles.com/6sU0G
e. pick up songs for one hour, and the rest of the items will be done similarly

Answer the question

In order to leave comments, you need to log in

1 answer(s)
E
Evgeny Petryaev, 2019-06-16
@Gremlin92

std::sort(vector2->begin(), vector2->end(), [](const Type& a, const Type& b) {return a.length > b.length; });

  for (int i = 0; i < vector2->size(); i++)
    std::cout << vector2->at(i).length << " ";
  float length = 3600.0, currentlength = 0.0f;
  std::vector<Type> *vec = new std::vector<Type>();

  srand(time(0));
  AddMusic(vector3, vec, currentlength, length);
  std::cout <<"vec: "<< std::endl;
  for (int i = 0; i < vec->size(); i++)
    std::cout << vec->at(i).length << " ";
  std::cout << std::endl << "cl:" << currentlength << std::endl;
  
  std::sort(vector3->begin(), vector3->end(), [](const Type& a, const Type& b) {return a.length > b.length; });
  for (int i = 0; i < vector3->size(); i++)
    std::cout << vector3->at(i).length << " ";

  
  length = 2.5 * 3600.0;
  AddTalk(vector3, vec, currentlength, length);
  AddMusic(vector3, vec, currentlength, length);
  std::cout << "vec: " << std::endl;
  for (int i = 0; i < vec->size(); i++)
    std::cout << vec->at(i).length << " ";
  std::cout << std::endl << "cl:" << currentlength << std::endl;

  length = 10800.0;
  //
  AddTalk(vector3, vec, currentlength, length);
  //
  AddMusic(vector3, vec, currentlength, length);
  std::cout << "vec: " << std::endl;
  for (int i = 0; i < vec->size(); i++)
    std::cout << vec->at(i).length << " ";
  std::cout << std::endl << "cl:" << currentlength << std::endl;


  //vector->clear();
  //vectortalk->clear();

  std::cin.get();
  return 0;
}
void AddTalk(std::vector<Type> *src,std::vector<Type> *dst, float &currentlength,float maxlength)
{
  int num;
  bool b = false;
  for (int i = 0; i < 1; i++)
  {
    num = Random(src);
    if (src->at(num).length + currentlength <= maxlength)
    {
      b = true;
      dst->push_back(src->at(num));
      currentlength += dst->back().length;
    }
    if (!b)
      AddTalk(src, dst, currentlength, maxlength);
  }
}
void AddMusic(std::vector<Type> *src, std::vector<Type> *dst, float &currentlength, float maxlength)
{
  int num;
  for (int i = 0; i < 10; i++)
  {
    num = Random(src);
    if (src->at(num).length + currentlength <= maxlength)
    {
      dst->push_back(src->at(num));
      currentlength += dst->back().length;
    }
  }
  for (int i = 0; i < src->size(); i++)
  {
    if (src->at(i).length + currentlength <= maxlength)
    {
      dst->push_back(src->at(i));
      currentlength += dst->back().length;
    }
  }
}

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question