AIMP Forum

Разное => Архив / Archive => Вопросы (архив) / Questions (archive) => Topic started by: Edward on September 10, 2009, 19:13:00

Title: [Есть ответ] Перемещении файлов без потери оценок и статистики прослушиваний
Post by: Edward on September 10, 2009, 19:13:00
Скажите пожалуйста как перенести папку с mp3-шниками в другое место, не потеряв при этом оценки и статистику прослушиваний ?
Title: Re: Перемещении файлов без потери оценок и статистики прослушиваний
Post by: Юра on September 10, 2009, 19:45:13
Поиск перемещенных файлов
Данная функция выводит список файлов, ссылки в БД на которые некорректны. Это может произойти, если файл был удален или перемещен в другую папку, или просто напросто переименован.

Делается это просто, копируете файлы в нужную папку, затем в окне библиотеки находите
(http://s46.radikal.ru/i114/0909/80/4e61140fff21.png) (http://www.radikal.ru)
В появившемся окне можете воспользоваться функцией автопоиска, которая, основываясь на имени файла, попытается найти файлы, ссылки на которые некорректны, для этого в появившемся окне нажмите
(http://s59.radikal.ru/i166/0909/a6/6cb8d036931f.png) (http://www.radikal.ru)
В окошке выбирете папку с файлами.
В результате будет осуществлён поиск (все найденные файлы будут отмечены галочкой и подсвечены зелёным цветом)
(http://i049.radikal.ru/0909/a1/491f72eff102.png) (http://www.radikal.ru)
для применения новых путей нажмите кнопку "Применить к отмеченным".

Если же файлы всё-таки были перименованы, то можно осуществить поиск файлов в ручную (нужного метода для реализации автоматического поиска пока нет).
Для этого достаточно два раза кликнуть ЛКМ (Левой Кнопкой Мыши) по файлу в списке. В появившемся окне нужно будет указать папку с переименованным файлом, а также указать сам файл.

Если всё это проделать, статстика будет сохранена.

PS: Если какие-то моменты остались непонятными, готов разъяснить, обращайтесь. ;)
Title: Re: Перемещении файлов без потери оценок и статистики прослушиваний
Post by: Edward on September 10, 2009, 21:33:18
Спасибо - полегчало =)
Title: Re: Перемещении файлов без потери оценок и статистики прослушиваний
Post by: zerbino on October 05, 2009, 19:04:27
привет! Кстати есть мысль.. она немного ресурсоёмкая, но зато действенная. Может при добавлении файлов в библиотеку подсчитывать их контрольную сумму каким-либо несложным/быстрым алгоритмом? Тогда перемещенные можно будет найти по чексуммам. Это конечно поднапряжет ПК при обновлении библиотеки полностью, но тогда можно было бы применить опцию для библиотеки, чтобы её включали только те, кто этого захочет.
Title: Re: Перемещении файлов без потери оценок и статистики прослушиваний
Post by: sviperz on October 05, 2009, 19:07:34
Мысль не новая и давно учтена. Но спасибо!
Title: Re: Перемещении файлов без потери оценок и статистики прослушиваний
Post by: pakonick on May 28, 2010, 12:56:23
zerbino, а какой смысл в подчете контрольной суммы? Мне вот лично это вообще не нужно!
Title: Re: Перемещении файлов без потери оценок и статистики прослушиваний
Post by: zerbino on May 28, 2010, 15:38:19
pakonick (http://index.php?action=profile;u=33789) контрольная сумма достаточно точно идентифицирует аналогичные файлы различающиеся хотя бы на байт. Чтобы библиотека не путалась и не надо было запоминать пути, а достаточно было бы только КС.
Title: Re: Перемещении файлов без потери оценок и статистики прослушиваний
Post by: Artem on May 28, 2010, 16:07:46
Вроде уже говорилось, файлы перемещаются по диску просто так крайне редко. Куда чаще мы модифицируем в них теги. Так же не стоит забывать про замену файлов на файлы с более хорошим качеством. Этот подход не решит задачи.
Title: Re: Перемещении файлов без потери оценок и статистики прослушиваний
Post by: zerbino on May 28, 2010, 16:20:39
Артём, я уже писал, что как я понимаю, это может решиться тем, что при первичном добавлении файла в библиотеку будет сумма, при первично добавлении файла в плей лист инфа будет сверяться с библиотекой, и если такой суммы не будет, то будет проверится путь к файлу, если путь нового и старого, а также их названия одинаковые, но суммы разные, то в библиотеке инфа будет обновляться, иначе - нет. Да - это ресурсоёмко, но только при певом добавлении файла. Можно вообще в таком случае оставить режим работы библиотеки такой как есть, и добавить настройку для изменения режима в предложенный.
Ладно, теме 100 лет в обед.. бессмысленно что-то предлагать, когда кодить неохота или нет соответствующих знаний. какой будет плеер - такой будет, все равно всё решается выбором пользователей.
Title: Re: Перемещении файлов без потери оценок и статистики прослушиваний
Post by: Kiborg on August 22, 2010, 07:34:30
Сорри если не в тему, но:
- можно узнать структуру (SQLite format 3 UTF-8) AIMP2.db - а там желающие на свой страх и риск ... :)
PS Можно официально выложить структуру таблицы ? С комментариями на мое мыло...



Добавлено через 7 мин. 5 сек.
CREATE TABLE MAIN (sFileName TEXT, sDrive CHAR, sTitle TEXT, sTrack TEXT, sDisk TEXT, sArtist TEXT, sAlbum TEXT, sAlbumArtist TEXT, sYear TEXT, sGenre TEXT, SampleRate INT, BitRate INT, Channels INT, FileSize INT, Duration INT, Mark INT, LastPlay DOUBLE, Added DOUBLE, PlayCount INT, Flags INT)

PS UTF-16LE
Title: Re: Перемещении файлов без потери оценок и статистики прослушиваний
Post by: Artem on August 22, 2010, 08:19:10
Сорри если не в тему, но:
- можно узнать структуру (SQLite format 3 UTF-8) AIMP2.db - а там желающие на свой страх и риск ... :)
PS Можно официально выложить структуру таблицы ? С комментариями на мое мыло...

Зачем? Структура меняется из версии к версии, так что затачиваться под текущую структуру я бы не рекомендовал
Title: Re: Перемещении файлов без потери оценок и статистики прослушиваний
Post by: Kiborg on August 22, 2010, 19:31:50
Зачем ? Хм ... А няхай будзе :)
А когда изменится - тогда и софт перепишем.
Perl + руки + время = чудеса :)
PS Интересно же что делать - я предложил вариант, а воспользоваться им или нет ...
Title: Re: Перемещении файлов без потери оценок и статистики прослушиваний
Post by: Kiborg on August 28, 2010, 13:45:57
Можно уточнить "формулу" вычисления полей
LastPlay=[40402.393851088]
Added=[40400.2969970602]
PS Плиз ! И желательно в обе стороны.
Title: Re: Перемещении файлов без потери оценок и статистики прослушиваний
Post by: Artem on August 28, 2010, 23:46:42
Code: [Select]
const
  MonthDays: array [Boolean] of TDayTable =
    ((31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
     (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31));

function IsLeapYear(Year: Word): Boolean;
begin
  Result := (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0));
end;

function TryEncodeDate(Year, Month, Day: Word; out Date: TDateTime): Boolean;
var
  I: Integer;
  DayTable: PDayTable;
begin
  Result := False;
  DayTable := @MonthDays[IsLeapYear(Year)];
  if (Year >= 1) and (Year <= 9999) and (Month >= 1) and (Month <= 12) and
    (Day >= 1) and (Day <= DayTable^[Month]) then
  begin
    for I := 1 to Month - 1 do Inc(Day, DayTable^[I]);
    I := Year - 1;
    Date := I * 365 + I div 4 - I div 100 + I div 400 + Day - DateDelta;
    Result := True;
  end;
end;

function TryEncodeTime(Hour, Min, Sec, MSec: Word; out Time: TDateTime): Boolean;
begin
  Result := False;
  if (Hour < HoursPerDay) and (Min < MinsPerHour) and (Sec < SecsPerMin) and (MSec < MSecsPerSec) then
  begin
    Time := (Hour * (MinsPerHour * SecsPerMin * MSecsPerSec) +
             Min * (SecsPerMin * MSecsPerSec) +
             Sec * MSecsPerSec +
             MSec) / MSecsPerDay;
    Result := True;
  end;
end;

function EncodeDate(Year, Month, Day: Word): TDateTime;
begin
  if not TryEncodeDate(Year, Month, Day, Result) then
    ConvertError(@SDateEncodeError);
end;

function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;
begin
  if not TryEncodeTime(Hour, Min, Sec, MSec, Result) then
    ConvertError(@STimeEncodeError);
end;

Result := EncodeDate(wYear, wMonth, wDay) + EncodeTime(wHour, wMinute, wSecond, wMilliseconds);

Если Вы используете Delphi, то можно просто заюзать DecodeDate + DecodeTime и EncodeDate + EncodeTime
Title: Re: Перемещении файлов без потери оценок и статистики прослушиваний
Post by: Kiborg on August 29, 2010, 07:19:54
Code: [Select]
#!Perl -w
use DBI qw(:sql_types);
use Encode;
use strict;

my $fn = 'c:\Documents and Settings\My User\Application Data\AIMP\ML\AIMP2.db';
# CREATE TABLE MAIN (sFileName TEXT, sDrive CHAR, sTitle TEXT, sTrack TEXT, sDisk TEXT,
# sArtist TEXT, sAlbum TEXT, sAlbumArtist TEXT, sYear TEXT, sGenre TEXT, SampleRate INT,
# BitRate INT, Channels INT, FileSize INT, Duration INT, Mark INT, LastPlay DOUBLE, Added DOUBLE, PlayCount INT, Flags INT)

my @field = qw(sFileName sDrive sTitle sTrack sDisk sArtist sAlbum
sAlbumArtist sYear sGenre SampleRate BitRate Channels FileSize
Duration Mark LastPlay Added PlayCount Flags);

sub en{ # В какой кодировке вернуть
encode("cp1251", $_[0]);
}

sub DecodeTime{ # Без поправок на ветер
my $t = shift;
my $delta_day = (1970-1900)*365+17; # С учетом високосных(17) лет! В Delphi с 1900, а у меня с 1970
$t = int (($t-$delta_day) * 24 * 60 * 60);
scalar (localtime $t);
}

my $dbh = DBI->connect("dbi:SQLite:dbname=".$fn,"","");
$dbh->{unicode} = 1; # Обязательно !

my $all = $dbh->selectall_arrayref("SELECT * FROM MAIN");

foreach my $row (@$all) {
for (my $f = 0; $f< @field; $f++){
print $field[$f],"=";
if ($f == 16 || $f == 17){
if ($$row[$f]!=0){
print DecodeTime($$row[$f]);
}
}else{
print en($$row[$f]);
}
print "\n";
}
print "\n";
}


Это так на коленках :)
PS Спасибо. AIMP + SlyControl + Perl + nncron = Rulezzzz!