Куча говна / Говнокод #27936 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 CHayT, (Updated )

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

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

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

      https://govnokod.ru/15787
      Ответить
    • >делают архивы с плоской иерарихией файлов, названных "<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
                      Ответить
                      • Есть опция, чтобы сам исправлял?
                        Ответить
                          • Кстати, может можно к 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]
                Ответить
  • Ого, ты тоже поебался с музыкой! Чья теперь очередь?
    Ответить
  • Вас интересует вакансия PHP Middle в Сызрани?
    Ответить
  • Стоимость биткоина упала более чем на 7% — из-за отключения интернета в Казахстане, который является второй страной в мире по добыче криптовалюты
    Ответить
    • Хуясе. Сейчас биткоины разве кто-то майнит?
      Ответить
      • Если бы их никто не майнил, их стало бы проще майнить, чем остальные валюты, поэтому все кинулись бы майнить именно их...
        Ответить
    • Казакстан - столица мировой экономики. Акции российских компаний рухнули после кризиса а Алма-Ате
      Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8