Как стать автором
Обновить

Закладки в Media Player Classic Home Cinema

Время на прочтение6 мин
Количество просмотров14K
Если выбрать в настройках ведение истории и сохранение позиций просмотра, MPC HC может автоматически сохранять до 20-ти закладок на последнее место просмотра видеофайлов и столько же закладок для DVD. При возобновлении просмотра плеер будет начинать воспроизведение с последней позиции, если найдёт информацию о файле в своей базе (хранится она вместе с другими настройками или в реестре, или в ini-файле, в зависимости от выбора пользователя). Однако бывают условия, когда 20-ти закладок не хватает. Кто-то любит смотреть много фильмов параллельно, иногда откладывая просмотр на время. Кто-то слушает на MPC HC музыку (а ключи для неё используются те же самые: один большой альбом — и все закладки перезаписаны). Кто-то использует плеер для многократной тестовой проверки кодируемого видео. Наконец, одной учётной записью могут пользоваться сразу несколько членов семьи (например, дети могут смотреть мультфильмы, пока родители заняты). В общем, хотелось бы иметь надёжный способ сохранить закладку на нужный фильм и потом её восстановить.

В реестре данные хранятся в разделе HKEY_CURRENT_USER/Software/Gabest/Media Player Classic/Settings. Для видеофайлов используются пары ключей File Name N / File Position N (c N от 0 до 19). Для DVD используется один ключ DVD Position N (в том же диапазоне; плеер умудряется сохранять в одной загадочной цифровой записи как идентификцию DVD, так и место последнего просмотра).

Мне приходят в голову три способа создания пользовательских закладок при работе с реестрм: от самого простого и наименее гибкого до более сложного и тонкого. Конечно, пост не претендует на уровень rocket science. Описываются простые и удобные практические трюки.

I. Экспорт/импорт настроек при помощи самого плеера




Запускать экспорт приходится после закрытия плеера с фильмом, запустив MPC заново, потому что только перед закрытием обновляются данные о последних файлах в реестре. Создаётся .reg файл со всеми настройками (причём не только нужный нам раздел), и в этом ещё одно неудобство: при импорте настроек будет восстанавливаться не только нужная закладка, но и весь набор прежних настроек.

Попробуем немного улучшить положение (дальнейшие решения тестировались только в Windows XP).

II. Экспорт/импорт при помощи пакетного файла


Поскольку стандартные средства работы с реестром не позволяют экспортировать отдельные записи реестра, нам опять придётся иметь дело с целым разделом, но теперь объём можно сузить до нужного HKEY_CURRENT_USER/Software/Gabest/Media Player Classic/Settings. Дополнительные преимущества также в том, что нам не нужно открывать плеер заново и не нужно вручную вводить имя закладки, всё будет делаться автоматически.

1. Пакетный файл

Проще некуда (сохраните как текстовый файл с расширением .bat):

@echo off
reg export "hkcu\Software\Gabest\Media Player Classic\Settings" "%~dpn1.reg"

Аргументом может быть последний видеофайл или папка с DVD. В той же директории создаётся одноимённый .reg-файл, который удобно потом импортировать одним щелчком перед возвратом к просмотру фильма.

2. Интеграция в системный интерфейс

Чтобы не приходилось каждый раз связываться с командной строкой или перетаскивать видео на ярлычок пакетного файла, реализуем более удобную связь.

а. Реализация для Проводника

Добавим в контекстное меню файлов и папок вызов нашего пакетного файла. Для этого достаточно создать следующий текстовый файл, сохранить его в юникоде с расширением .reg и запустить на интеграцию (только замените пути к программе на ваши, не забывая удваивать слеши).

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\* MPC bookmark]

[HKEY_CLASSES_ROOT\*\shell\* MPC bookmark\command]
@="E:\\DOC\\prg\\bat\\mpc_bm.bat \"%1\""

[HKEY_CLASSES_ROOT\Folder\shell\* MPC bookmark]

[HKEY_CLASSES_ROOT\Folder\shell\* MPC bookmark\command]
@="E:\\DOC\\prg\\bat\\mpc_bm.bat \"%1\""

б. Реализация для Total Commander

Те, кто больше привыкли к этому файловому менеджеру, могут создать кнопку на панели инструментов (можно продублировать её предыдущим рецептом с контекстным меню):



Тогда можно будет создавать ею закладку для того файла, который находится в фокусе активной вкладки после просмотра видео.

II. Экспорт/импорт при помощи скрипта на Perl


Тут мы можем достигнуть ещё большего удобства. Если кто-то не знаком с Perl, это не страшно: просто скачайте и установите реализацию интерпретатора под Windows, всё остальное тоже не составит труда.

При помощи скрипта мы сможем сохранять только нужные ключи. Если делать закладку сразу после просмотра видео, нам нужны будут только самые первые записи в истории, они же последние по времени просмотра: File Name 0 + File Position 0 или DVD Position 0. Вдобавок скрипт будет проверять идентичность файла-аргумента и последнего файла в истории плеера, чтобы мы случайно не оставили ошибочную закладку.

1. Скрипт

Создайте следующий текстовый файл и сохраните его с расширением .pl:

################################################################################
use strict;
use warnings;
use Win32::TieRegistry;
################################################################################
$Registry->Delimiter("/");
my $movie = shift();
################################################################################
if ($movie && -d $movie) {
	open(OUTPUT, '>:raw:encoding(UTF16-LE)', $movie . ".DVD.reg") or die "Cannot create the .reg file: $!\n";
	print OUTPUT
		"\x{FEFF}Windows Registry Editor Version 5.00\r\n\r\n[HKEY_CURRENT_USER\\Software\\Gabest\\Media Player Classic\\Settings]\r\n",
		'"DVD Position 0"="',
		$Registry->{'HKEY_CURRENT_USER/Software/Gabest/Media Player Classic/Settings//DVD Position 0'}, "\"\r\n\r\n";
	close(OUTPUT) or die "Cannot close the .reg file: $!\n";
}
elsif ($movie && -f $movie) {
	my $last_file = $Registry->{'HKEY_CURRENT_USER/Software/Gabest/Media Player Classic/Settings//File Name 0'};
	if (lc($movie) eq lc($last_file)) {
		open(OUTPUT, '>:raw:encoding(UTF16-LE)', $last_file =~ s/\.\w+$/.reg/r) or die "Cannot create the .reg file: $!\n";
		print OUTPUT
			"\x{FEFF}Windows Registry Editor Version 5.00\r\n\r\n[HKEY_CURRENT_USER\\Software\\Gabest\\Media Player Classic\\Settings]\r\n",
			'"File Name 0"="',
			$last_file =~ s/\\/\\\\/gr, "\"\r\n",
			'"File Position 0"="',
			$Registry->{'HKEY_CURRENT_USER/Software/Gabest/Media Player Classic/Settings//File Position 0'}, "\"\r\n\r\n";
		close(OUTPUT) or die "Cannot close the .reg file: $!\n";
	}
	else {
		print "The input file does not match the last played one:\n\n$movie\n\n$last_file\n\n";
		system('pause');
	}
}
else {
	my $last_file = $Registry->{'HKEY_CURRENT_USER/Software/Gabest/Media Player Classic/Settings//File Name 0'};
	open(OUTPUT, '>:raw:encoding(UTF16-LE)', $last_file =~ s/^.+\\//r =~ s/\.\w+$/+Last_DVD.reg/r) or die "Cannot create the .reg file: $!\n";
	print OUTPUT
		"\x{FEFF}Windows Registry Editor Version 5.00\r\n\r\n[HKEY_CURRENT_USER\\Software\\Gabest\\Media Player Classic\\Settings]\r\n",
		'"File Name 0"="',
		$last_file =~ s/\\/\\\\/gr, "\"\r\n",
		'"File Position 0"="',
		$Registry->{'HKEY_CURRENT_USER/Software/Gabest/Media Player Classic/Settings//File Position 0'}, "\"\r\n",
		'"DVD Position 0"="',
		$Registry->{'HKEY_CURRENT_USER/Software/Gabest/Media Player Classic/Settings//DVD Position 0'}, "\"\r\n\r\n";
	close(OUTPUT) or die "Cannot close the .reg file: $!\n";
}
################################################################################

Если скрипту передаётся папка, он сохраняет только закладку на последний DVD в .reg-файле с названием папки (проверить, тот ли это DVD, мне не представляется возможным: если кто-то знает, как это сделать, напишите, пожалуйста, в комментариях; но если делать закладку сразу после просмотра фильма и закрытия плеера, можно не волноваться за её правильность). Если передаётся файл, скрипт проверяет идентичность этого файла и последнего файла в истории; если файлы совпадают, скрипт создаёт одноимённый .reg-файл с двумя нужными ключами, если не совпадают — выдаёт сообщение об ошибке. Если скрипту вообще не передаются аргументы, он создаёт сводный .reg-файл с информацией о последнем DVD и последнем видеофайле в текущей активной папке.

2. Интеграция в системный интерфейс

Всё почти так же с минимальными изменениями (не забывайте прописывать ваши пути к программам).

а. Реализация для Проводника

Почему-то указания одного скрипта недостаточно, приходится задавать ещё и интерпретатор (при том, что расширение .pl добавлено в переменную PATHEXT):

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\* MPC bookmark]

[HKEY_CLASSES_ROOT\*\shell\* MPC bookmark\command]
@="C:\\Perl\\bin\\perl.exe E:\\DOC\\prg\\perl\\var\\mpc_bm.pl \"%1\""

[HKEY_CLASSES_ROOT\Folder\shell\* MPC bookmark]

[HKEY_CLASSES_ROOT\Folder\shell\* MPC bookmark\command]
@="C:\\Perl\\bin\\perl.exe E:\\DOC\\prg\\perl\\var\\mpc_bm.pl \"%1\""

б. Реализация для Total Commander

Похожая кнопка:





Описанный механизм позволяет достичь такого состояния:



P. S. Конечно, есть ещё «Избранное» (Favorites) в самом плеере, но кому-то оно может показаться менее удобным: чтобы обновить закладку, то есть сменить время перехода в одном том же фильме, нужно удалять старую закладку и создавать новую; когда закладки находятся в папках рядом с фильмами, их легче искать и легче удалять за ненадобностью вместе с фильмами после просмотра; такие закладки доступны из всех учётных записей; их легче редактировать (хоть в Блокноте), если меняются имя файла или путь к нему.
Теги:
Хабы:
Всего голосов 12: ↑7 и ↓5+2
Комментарии9

Публикации

Истории

Ближайшие события