The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Создать новую тему
 - Свернуть нити
Пометить прочитанным
Архив | Избранное | Мое | Новое | | |  
Форум Программирование под UNIX
Сообразить алгоритм подбора по длительности?, !*! Gremlin_Rage, 14-Июн-19, 20:23  [ | | | ] [линейный вид] [смотреть все] [раскрыть новое]
  • gt оверквотинг удален include iostream include fstream include vector i, !*! Gremlin_Rage (ok), 23:40 , 16-Июн-19 (1)
    >[оверквотинг удален]
    > << sum << std::endl;
    >   std::cout << (*vector3)[0].filename << std::endl << (*vector3)[0].length << std::endl;
    >   std::cin.get();
    >   return 0;
    > }
    > и файлы из кривой библиотеки mp3 https://github.com/TheOnlyCaky/libmp3 выходной файл
    > такого вида должен быть playlist.m3u8 https://dropmefiles.com/6sU0G
    > P.S. В принципе я думаю можно упростить алгоритм до подбора 1го пункта
    > расписания т.е. подобрать песен на один час,а остальные пункты будут аналогично
    > делаться

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <Windows.h>
    #include <string>
    #include <cstdlib>
    #include <algorithm>
    //#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);

    void AddTalk(std::vector<Type> *src, std::vector<Type> *dst, float ¤tlength, float maxlength);
    void AddMusic(std::vector<Type> *src, std::vector<Type> *dst, float ¤tlength, float maxlength);
    int Random(std::vector<Type> *vector);
    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;
        
        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(vector2, 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(vector2, 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(vector2, 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::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"));
        for (int i = 0; i < vec->size(); i++)
        {
            fout.write("#EXTINF:", strlen("#EXTINF:"));
            str = std::to_string((*vec)[i].length);
            fout.write(str.c_str(), strlen(str.c_str()));
            fout.write(",", strlen(","));
            fout.write((*vec)[i].filename.c_str(), (*vec)[i].filename.size());
            fout.write("\n", strlen("\n"));
            fout.write((*vec)[i].filename.c_str(), (*vec)[i].filename.size());
            fout.write("\n", strlen("\n"));
        }
        fout.close();
        //vector->clear();
        //vectortalk->clear();

        std::cin.get();
        return 0;
    }
    void AddTalk(std::vector<Type> *src,std::vector<Type> *dst, float ¤tlength,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 ¤tlength, 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;
            }
        }
    }
    int Random(std::vector<Type> *vector)
    {
        int min = 0, max = vector->size()-1;
        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));
        }
    }

    сообщить модератору +/ответить
 
Пометить прочитанным Создать тему
Архив | Избранное | Мое | Новое | | |



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру