1. Куча / Говнокод #27936

    +3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    #!/usr/bin/env escript
    -mode(compile).
    
    main(["-p"|Filenames]) ->
      put(pretend, true),
      main(Filenames);
    main(Filenames) ->
      case get(pretend) of
        true -> ok;
        _    -> put(pretend, false)
      end,
      Albums = lists:filtermap(fun parse_name/1, Filenames),
      lists:foreach(fun process_album/1, Albums).
    
    process_album({Zip, Artist, Album}) ->
      Dir = filename:absname(filename:join(Artist, Album)),
      case filelib:wildcard(Dir ++ "/cover.*") of
        [] ->
          io:format("Will create ~p~n", [Dir]),
          get(pretend) orelse do_process_album(Dir, Zip, Album);
        _ ->
          io:format("Ignoring ~p : ~p~n", [Artist, Album])
      end.
    
    do_process_album(Dir, Zip, Album) ->
      ok = filelib:ensure_dir(Dir ++ "/fake"),
      0 = exec(Dir, "/usr/bin/unzip", [Zip, "-d", Dir]),
      postprocess(Album, Dir).
    
    postprocess(Album, Dir) ->
      Files = filelib:wildcard(Dir ++ "/*-*[0-9]*.flac"),
      lists:foreach(fun(I) -> rename_flac(Album, I) end, Files).
    
    rename_flac(Album, OldFile) ->
      Dir = filename:dirname(OldFile),
      OldName = filename:basename(OldFile),
      Options = [{capture, all_but_first, list}],
      {ok, RE} = re:compile(Album ++ " - ([0-9]+.*\\.flac)", [unicode]),
      case re:run(OldName, RE, Options) of
        {match, [NewName]} ->
          io:format("New name: ~p~n", [NewName]),
          NewFile = filename:join(Dir, NewName),
          ok = file:rename(OldFile, NewFile);
        nomatch ->
          ok
      end.
    
    parse_name(Filename) ->
      Opts = [{capture, ['band', album], list}],
      case re:run(filename:basename(Filename), "(?<band>[^-]+) - (?<album>.*)\\.zip", Opts) of
        {match, [Band, Album]} ->
          {true, {filename:absname(Filename), Band, Album}};
        nomatch ->
          false
      end.
    
    -spec exec(file:filename(), file:filename(), [string() | binary()]) -> integer().
    exec(Dir, CMD, Args) ->
      Port = open_port( {spawn_executable, CMD}
                      , [ exit_status
                        , binary
                        , stderr_to_stdout
                        , {args, Args}
                        , {cd, Dir}
                        , {line, 300}
                        ]
                      ),
      collect_port_output(Port, filename:basename(CMD)).
    
    -spec collect_port_output(port(), string()) -> integer().
    collect_port_output(Port, CMD) ->
      receive
        {Port, {data, {_, Data}}} ->
          io:format("~s: ~s~n", [CMD, Data]),
          collect_port_output(Port, CMD);
        {Port, {exit_status, ExitStatus}} ->
          ExitStatus
      end.

    Запостил: CHayT, 08 Января 2022

    Комментарии (88) RSS

    • SEO: Умельцы из bandcamp делают архивы с плоской иерарихией файлов, названных "<bandname> - <album> 02 <title>.flac", вместо вменяемого формата "<bandname>/<album>/02 <title>.flac", который можно было бы просто распаковать в ~/Music. Пришлось построить такую пирдоль скорби.
      Ответить
      • > пирдоль скорби

        Напомнило о том, как мне когда-то захотелось почитать мангу, но лень было искать читалку.

        https://govnokod.ru/15787
        Ответить
      • А тегов внутри нету?
        Ответить
        • Внутри flac'а есть какая-то метушня.
          Ответить
        • В разных кодировках: windows-1251, koi8-r, utf8, UCS-2, причём сама кодировка нигде не указана.
          Ответить
      • >делают архивы с плоской иерарихией файлов, названных "<bandname> - <album> 02 <title>.flac"
        > вместо вменяемого формата "<bandname>/<album>/02 <title>.flac", который можно было бы просто распаковать

        man rename
        
        NAME
               rename - renames multiple files
        
        SYNOPSIS
               rename [ -h|-m|-V ] [ -v ] [ -0 ] [ -n ] [ -f ] [ -d ] [ -e|-E perlexpr]*|perlexpr [ files ]
        
        DESCRIPTION
               "rename" renames the filenames supplied according to the rule specified as the first argument.  The perlexpr argument is a Perl expression which is expected
               to modify the $_ string in Perl for at least some of the filenames specified.  If a given filename is not modified by the expression, it will not be
               renamed.  If no filenames are given on the command line, filenames will be read via standard input.


        Единственная проблема этой и похожих утилит (вроде mv) что они не умеют создавать несуществующие директории.
        А mkdir не умеет заходить в созданную директорию.
        Ответить
        • > Единственная проблема этой и похожих утилит (вроде mv) что они не умеют создавать несуществующие директории.

          That is precisely the idea, General.
          Ответить
        • > Единственная

          И самая фундаментальная. В чём смысл масс-ренеймилки, которая не умеет создавать каталоги по необходимости?
          Ответить
          • В чём смысл «mkdir», который не умеет заходить в созданные им каталоги?
            Ответить
            • ККОКОКОКОКОКОКО
              ЖМУ/ПИНУС, ШВАБОДКА, UNIX WAY,
              КОКОКОКОКОКОКО
              Ответить
              • В чём смысл «git clone», если он не умеет заходить в склонированный репозиторий?
                Ответить
                • В чём смысл «gcc», если он не умеет сам исправлять ошибки в коде?
                  Ответить
                  • Я программист, я так вижу.
                    Ответить
                  • > «gcc», если он не умеет сам исправлять ошибки в коде?

                    А тут мимо.

                    gcc умеет. error: X; did you mean to use Y
                    Ответить
                    • Но он же сам не исправляет
                      Ответить
                      • Ну он по крайней мере предлагает решение:

                        <source>: In function 'int main()':
                        <source>:12:5: error: 'bugor' was not declared in this scope; did you mean 'bagor'?
                           12 |     bugor kakoi={0};
                              |     ^~~~~
                              |     bagor
                        
                        https://godbolt.org/z/eMne4j9f5
                        Ответить
                        • Есть опция, чтобы сам исправлял?
                          Ответить
                          • make zaebis
                            Ответить
                            • Кстати, может можно к GCC прикрутить какой-нибудь ворециализатор кода, чтобы если юнит-тесты не проходятся и в valgrind какие-то ошибки с памятью обнаруживаются, то чтобы там что-то модифицировалось и перекомпилировалось, пока все не заработает как надо? Может где-то уже есть такие разработки?
                              Ответить
                              • Собачку в юнит-тест автоматически добавлять?
                                Ответить
                                • Не, юнит-тест надо запретить вореционировать особыми прагмами.
                                  Ответить
                                  • Что если тест неправильный, а код правильный?
                                    Ответить
                                    • Что, если код правильный, тест правильный, а заказчик сам не знает, чего хочет требования неправильные?
                                      Ответить
                                      • GCC пошлёт к заказчику робота-переговорщика, который будет удерживать его голову в унитазе до тех пор, пока код не будет соответствовать спеке.
                                        Ответить
                              • > ворециализатор кода
                                > чтобы там что-то модифицировалось и перекомпилировалось, пока все не заработает как надо
                                На Malbolge так первые программы и писались.
                                Ответить
                              • Вообще это в супероптимизации применяется, https://en.wikipedia.org/wiki/Superoptimization - там перебирается питушня чтоб наиболее царский оптимальный код получить. Но это только для маленьких кусков, потому что на больших получается кобенаторный взрыв

                                > Typically, superoptimizing is performed via exhaustive brute-force search in the space of valid instruction sequences. This is a costly method, and thus impractical for general-purpose compilers. Yet, it has been shown to be useful in optimizing performance-critical inner loops. It is also possible to use a SMT solver to approach the problem.
                                Ответить
        • Проще через find exec, sed и mkdir нахерачить, ей-богу, чем это юзать.
          Ответить
          • А потом в каком-нибудь имени файла встретится пробел или какая-нибудь другая хуита, и баш распидорасит. Именно поэтому я за ``escript'' для чего либо длиннее 5 строчек, что должно работать с произвольными данными из сети.
            Ответить
            • Вдруг появится post-rock группа с названием "Backing up data with `rm -rf /*` command"
              Ответить
            • А как у тебя скрипт отнесётся к песенке в духе ".. - .. 02 something" от группы с многозначительным названием ".."?
              Ответить
              • Крашнется, и я эту песенку переименую просто. Главное 99% случаев автоматизировать, остальное можно ручками.
                Ответить
              • А какие ещё инъекции тут возможны?
                Ответить
                • Вообще, если Album содержит регулярочные спецсимволы, типа []*, то регулярку в строке 38 может разнести. Надо тупо на string:split какой-нибудь заменить.
                  Ответить
                • [color=java]Исполнение произвольного кода при логировании названия песни.[/color]
                  Ответить
    • Ого, ты тоже поебался с музыкой! Чья теперь очередь?
      Ответить
      • бантик_который_чистит_обрыганскую_RG_из_ имен_файлов.cmd у всех есть
        Ответить
      • Я уже поебался:
        https://govnokod.ru/27135

        Кажется, уже нужно новую версию выкладывать.
        Ответить
    • Отменное говно. Въебал плюс.
      Ответить
    • Вас интересует вакансия PHP Middle в Сызрани?
      Ответить
    • Стоимость биткоина упала более чем на 7% — из-за отключения интернета в Казахстане, который является второй страной в мире по добыче криптовалюты
      Ответить
      • Desktop, ты тут? Срочно продавай!
        Ответить
      • Хуясе. Сейчас биткоины разве кто-то майнит?
        Ответить
        • Если бы их никто не майнил, их стало бы проще майнить, чем остальные валюты, поэтому все кинулись бы майнить именно их...
          Ответить
          • А почему минус 7%, а не плюс? Казаки перестали майнить, зато остальным проще стало майнить. Типа они и спрос генерили?
            Ответить
      • Казакстан - столица мировой экономики. Акции российских компаний рухнули после кризиса а Алма-Ате
        Ответить
    • Кокой постморденизм )))

      https://pbs.twimg.com/media/FIl42j6XIAcQDYN?format=jpg&name=large
      Ответить
    • Перепиши на "Haskell"
      Ответить

    Добавить комментарий