Added an "advanced" option to apply the original file's "creation" and "last modified" date/time to the output file.
This commit is contained in:
parent
2645f40ea2
commit
83ef96701a
@ -84,6 +84,7 @@
|
||||
<h2 id="lamexp-v4.13-xxxx-xx-xx" class="unnumbered">LameXP v4.13 [xxxx-xx-xx]</h2>
|
||||
<ul>
|
||||
<li>Upgraded build environment to Microsoft Visual Studio 2015<br /></li>
|
||||
<li>Apply the original file's "creation" and "last modified" date/time to the output file (optional)<br /></li>
|
||||
<li>Updated Vorbis encoder to OggEnc v2.88 (2015-09-10), using libvorbis v1.3.5 and aoTuV b6.03_2015<br /></li>
|
||||
<li>Updated MediaInfo to v0.7.78 (2015-10-02), compiled with ICL 15.0 and MSVC 12.0<br /></li>
|
||||
<li>Fixed resampling bug with Vorbis encoder, regression in OggEnc v2.87<br /></li>
|
||||
|
@ -5,6 +5,7 @@
|
||||
## LameXP v4.13 [xxxx-xx-xx] ## {-}
|
||||
|
||||
* Upgraded build environment to Microsoft Visual Studio 2015
|
||||
* Apply the original file's "creation" and "last modified" date/time to the output file (optional)
|
||||
* Updated Vorbis encoder to OggEnc v2.88 (2015-09-10), using libvorbis v1.3.5 and aoTuV b6.03_2015
|
||||
* Updated MediaInfo to v0.7.78 (2015-10-02), compiled with ICL 15.0 and MSVC 12.0
|
||||
* Fixed resampling bug with Vorbis encoder, regression in OggEnc v2.87
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -31,7 +31,7 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message numerus="yes">
|
||||
<location filename="../../src/Dialog_MainWindow.cpp" line="830"/>
|
||||
<location filename="../../src/Dialog_MainWindow.cpp" line="832"/>
|
||||
<source>%n file(s) have been rejected, because read access was not granted!</source>
|
||||
<translation>
|
||||
<numerusform>%n file have been rejected, because read access was not granted!</numerusform>
|
||||
@ -39,7 +39,7 @@
|
||||
</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../../src/Dialog_MainWindow.cpp" line="834"/>
|
||||
<location filename="../../src/Dialog_MainWindow.cpp" line="836"/>
|
||||
<source>%n file(s) have been rejected, because they are dummy CDDA files!</source>
|
||||
<translation>
|
||||
<numerusform>%n file have been rejected, because they are dummy CDDA files!</numerusform>
|
||||
@ -47,7 +47,7 @@
|
||||
</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../../src/Dialog_MainWindow.cpp" line="838"/>
|
||||
<location filename="../../src/Dialog_MainWindow.cpp" line="840"/>
|
||||
<source>%n file(s) have been rejected, because they appear to be Cue Sheet images!</source>
|
||||
<translation>
|
||||
<numerusform>%n file have been rejected, because they appear to be Cue Sheet images!</numerusform>
|
||||
@ -55,7 +55,7 @@
|
||||
</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../../src/Dialog_MainWindow.cpp" line="842"/>
|
||||
<location filename="../../src/Dialog_MainWindow.cpp" line="844"/>
|
||||
<source>%n file(s) have been rejected, because the file format could not be recognized!</source>
|
||||
<translation>
|
||||
<numerusform>%n file have been rejected, because the file format could not be recognized!</numerusform>
|
||||
@ -63,7 +63,7 @@
|
||||
</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../../src/Dialog_MainWindow.cpp" line="4228"/>
|
||||
<location filename="../../src/Dialog_MainWindow.cpp" line="4230"/>
|
||||
<source>%n Instance(s)</source>
|
||||
<translation>
|
||||
<numerusform>%n Instance</numerusform>
|
||||
@ -74,7 +74,7 @@
|
||||
<context>
|
||||
<name>ProcessingDialog</name>
|
||||
<message numerus="yes">
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="663"/>
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="667"/>
|
||||
<source>Encoding: %n file(s) of %1 completed so far, please wait...</source>
|
||||
<translation>
|
||||
<numerusform>Encoding: %n file of %1 completed so far, please wait...</numerusform>
|
||||
@ -82,7 +82,7 @@
|
||||
</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="695"/>
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="699"/>
|
||||
<source>Process was aborted by the user after %n file(s)!</source>
|
||||
<translation>
|
||||
<numerusform>Process was aborted by the user after %n file!</numerusform>
|
||||
@ -90,7 +90,7 @@
|
||||
</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="716"/>
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="720"/>
|
||||
<source>Error: %1 of %n file(s) failed (%2). Double-click failed items for detailed information!</source>
|
||||
<translation>
|
||||
<numerusform>Error: %1 of %n file failed (%2). Double-click failed items for detailed information!</numerusform>
|
||||
@ -98,7 +98,7 @@
|
||||
</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="716"/>
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="720"/>
|
||||
<source>%n file(s) skipped</source>
|
||||
<translation>
|
||||
<numerusform>%n file skipped</numerusform>
|
||||
@ -106,7 +106,7 @@
|
||||
</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="720"/>
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="724"/>
|
||||
<source>Error: %1 of %n file(s) failed. Double-click failed items for detailed information!</source>
|
||||
<translation>
|
||||
<numerusform>Error: %1 of %n file failed. Double-click failed items for detailed information!</numerusform>
|
||||
@ -114,7 +114,7 @@
|
||||
</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="734"/>
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="738"/>
|
||||
<source>All files completed successfully. Skipped %n file(s).</source>
|
||||
<translation>
|
||||
<numerusform>All files completed successfully. Skipped %n file.</numerusform>
|
||||
@ -122,7 +122,7 @@
|
||||
</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="1153"/>
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="1157"/>
|
||||
<source>%n hour(s)</source>
|
||||
<translation>
|
||||
<numerusform>%n hour</numerusform>
|
||||
@ -130,8 +130,8 @@
|
||||
</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="1154"/>
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="1158"/>
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="1162"/>
|
||||
<source>%n minute(s)</source>
|
||||
<translation>
|
||||
<numerusform>%n minute</numerusform>
|
||||
@ -139,8 +139,8 @@
|
||||
</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="1159"/>
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="1163"/>
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="1167"/>
|
||||
<source>%n second(s)</source>
|
||||
<translation>
|
||||
<numerusform>%n second</numerusform>
|
||||
@ -148,7 +148,7 @@
|
||||
</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="1164"/>
|
||||
<location filename="../../src/Dialog_Processing.cpp" line="1168"/>
|
||||
<source>%n millisecond(s)</source>
|
||||
<translation>
|
||||
<numerusform>%n millisecond</numerusform>
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1509,8 +1509,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>602</width>
|
||||
<height>1840</height>
|
||||
<width>613</width>
|
||||
<height>1881</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_22">
|
||||
@ -4326,7 +4326,7 @@
|
||||
</font>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string> Overwrite Mode </string>
|
||||
<string> File Operations </string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_42">
|
||||
<item row="0" column="0">
|
||||
@ -4404,7 +4404,7 @@
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="2" column="1" colspan="7">
|
||||
<item row="4" column="1" colspan="7">
|
||||
<spacer name="verticalSpacer_37">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
@ -4436,7 +4436,7 @@
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="9" rowspan="3">
|
||||
<item row="0" column="9" rowspan="5">
|
||||
<spacer name="horizontalSpacer_62">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
@ -4452,7 +4452,7 @@
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="0" rowspan="3">
|
||||
<item row="0" column="0" rowspan="5">
|
||||
<spacer name="horizontalSpacer_61">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
@ -4468,7 +4468,7 @@
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="8">
|
||||
<item row="1" column="8" rowspan="3">
|
||||
<spacer name="horizontalSpacer_66">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
@ -4481,6 +4481,29 @@
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="3" column="1" colspan="7">
|
||||
<widget class="QCheckBox" name="checkBoxKeepOriginalDateTime">
|
||||
<property name="text">
|
||||
<string>Apply the "creation" and "last modified" date/time of the original file to the converted file</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1" colspan="7">
|
||||
<spacer name="verticalSpacer_43">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>3</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -33,9 +33,9 @@
|
||||
#define VER_LAMEXP_MAJOR 4
|
||||
#define VER_LAMEXP_MINOR_HI 1
|
||||
#define VER_LAMEXP_MINOR_LO 3
|
||||
#define VER_LAMEXP_TYPE Alpha
|
||||
#define VER_LAMEXP_PATCH 2
|
||||
#define VER_LAMEXP_BUILD 1828
|
||||
#define VER_LAMEXP_TYPE RC
|
||||
#define VER_LAMEXP_PATCH 1
|
||||
#define VER_LAMEXP_BUILD 1830
|
||||
#define VER_LAMEXP_CONFG 1818
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -504,6 +504,7 @@ MainWindow::MainWindow(MUtils::IPCChannel *const ipcChannel, FileListModel *cons
|
||||
SET_CHECKBOX_STATE(ui->checkBoxRename_RegExp, m_settings->renameFiles_regExpEnabled());
|
||||
SET_CHECKBOX_STATE(ui->checkBoxForceStereoDownmix, m_settings->forceStereoDownmix());
|
||||
SET_CHECKBOX_STATE(ui->checkBoxOpusDisableResample, m_settings->opusDisableResample());
|
||||
SET_CHECKBOX_STATE(ui->checkBoxKeepOriginalDateTime, m_settings->keepOriginalDataTime());
|
||||
|
||||
ui->checkBoxNeroAAC2PassMode->setEnabled(aacEncoder == SettingsModel::AAC_ENCODER_NERO);
|
||||
|
||||
@ -593,6 +594,7 @@ MainWindow::MainWindow(MUtils::IPCChannel *const ipcChannel, FileListModel *cons
|
||||
connect(ui->buttonRename_FileEx, SIGNAL(clicked(bool)), this, SLOT(renameButtonClicked(bool)));
|
||||
connect(ui->buttonFileExts_Add, SIGNAL(clicked()), this, SLOT(fileExtAddButtonClicked()));
|
||||
connect(ui->buttonFileExts_Remove, SIGNAL(clicked()), this, SLOT(fileExtRemoveButtonClicked()));
|
||||
connect(ui->checkBoxKeepOriginalDateTime, SIGNAL(clicked(bool)), this, SLOT(keepOriginalDateTimeChanged(bool)));
|
||||
connect(m_overwriteButtonGroup.data(), SIGNAL(buttonClicked(int)), this, SLOT(overwriteModeChanged(int)));
|
||||
connect(m_evenFilterCustumParamsHelp.data(), SIGNAL(eventOccurred(QWidget*, QEvent*)), this, SLOT(customParamsHelpRequested(QWidget*, QEvent*)));
|
||||
connect(fileExtModel, SIGNAL(modelReset()), this, SLOT(fileExtModelChanged()));
|
||||
@ -4398,6 +4400,10 @@ void MainWindow::showCustomParamsHelpScreen(const QString &toolName, const QStri
|
||||
dialog->exec(output);
|
||||
}
|
||||
|
||||
/*
|
||||
* File overwrite mode has changed
|
||||
*/
|
||||
|
||||
void MainWindow::overwriteModeChanged(int id)
|
||||
{
|
||||
if((id == SettingsModel::Overwrite_Replaces) && (m_settings->overwriteMode() != SettingsModel::Overwrite_Replaces))
|
||||
@ -4413,6 +4419,14 @@ void MainWindow::overwriteModeChanged(int id)
|
||||
m_settings->overwriteMode(id);
|
||||
}
|
||||
|
||||
/*
|
||||
* Keep original date/time opertion changed
|
||||
*/
|
||||
void MainWindow::keepOriginalDateTimeChanged(bool checked)
|
||||
{
|
||||
m_settings->keepOriginalDataTime(checked);
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset all advanced options to their defaults
|
||||
*/
|
||||
@ -4448,6 +4462,7 @@ void MainWindow::resetAdvancedOptionsButtonClicked(void)
|
||||
SET_CHECKBOX_STATE(ui->checkBoxRename_RegExp, m_settings->renameFiles_regExpEnabledDefault());
|
||||
SET_CHECKBOX_STATE(ui->checkBoxForceStereoDownmix, m_settings->forceStereoDownmixDefault());
|
||||
SET_CHECKBOX_STATE(ui->checkBoxOpusDisableResample, m_settings->opusDisableResampleDefault());
|
||||
SET_CHECKBOX_STATE(ui->checkBoxKeepOriginalDateTime, m_settings->keepOriginalDataTimeDefault());
|
||||
|
||||
ui->lineEditCustomParamLAME ->setText(m_settings->customParametersLAMEDefault());
|
||||
ui->lineEditCustomParamOggEnc ->setText(m_settings->customParametersOggEncDefault());
|
||||
|
@ -125,6 +125,7 @@ private slots:
|
||||
void importCsvContextActionTriggered(void);
|
||||
void initOutputFolderModel(void);
|
||||
void initOutputFolderModel_doAsync(void);
|
||||
void keepOriginalDateTimeChanged(bool checked);
|
||||
void languageActionActivated(QAction *action);
|
||||
void languageFromFileActionActivated(bool checked);
|
||||
void makeFolderButtonClicked(void);
|
||||
|
@ -620,6 +620,10 @@ void ProcessingDialog::startNextJob(void)
|
||||
{
|
||||
thread->setOverwriteMode((m_settings->overwriteMode() == SettingsModel::Overwrite_SkipFile), (m_settings->overwriteMode() == SettingsModel::Overwrite_Replaces));
|
||||
}
|
||||
if (m_settings->keepOriginalDataTime())
|
||||
{
|
||||
thread->setKeepDateTime(m_settings->keepOriginalDataTime());
|
||||
}
|
||||
|
||||
m_allJobs.append(thread->getId());
|
||||
|
||||
|
@ -253,6 +253,7 @@ LAMEXP_MAKE_ID(favoriteOutputFolders, "OutputDirectory/Favorites");
|
||||
LAMEXP_MAKE_ID(forceStereoDownmix, "AdvancedOptions/StereoDownmix/Force");
|
||||
LAMEXP_MAKE_ID(hibernateComputer, "AdvancedOptions/HibernateComputerOnShutdown");
|
||||
LAMEXP_MAKE_ID(interfaceStyle, "InterfaceStyle");
|
||||
LAMEXP_MAKE_ID(keepOriginalDataTime, "AdvancedOptions/FileOperations/KeepOriginalDataTime");
|
||||
LAMEXP_MAKE_ID(lameAlgoQuality, "AdvancedOptions/LAME/AlgorithmQuality");
|
||||
LAMEXP_MAKE_ID(lameChannelMode, "AdvancedOptions/LAME/ChannelMode");
|
||||
LAMEXP_MAKE_ID(licenseAccepted, "LicenseAccepted");
|
||||
@ -272,7 +273,7 @@ LAMEXP_MAKE_ID(opusFramesize, "AdvancedOptions/Opus/FrameSize");
|
||||
LAMEXP_MAKE_ID(opusOptimizeFor, "AdvancedOptions/Opus/OptimizeForSignalType");
|
||||
LAMEXP_MAKE_ID(outputDir, "OutputDirectory/SelectedPath");
|
||||
LAMEXP_MAKE_ID(outputToSourceDir, "OutputDirectory/OutputToSourceFolder");
|
||||
LAMEXP_MAKE_ID(overwriteMode, "AdvancedOptions/OverwriteMode");
|
||||
LAMEXP_MAKE_ID(overwriteMode, "AdvancedOptions/FileOperations/OverwriteMode");
|
||||
LAMEXP_MAKE_ID(prependRelativeSourcePath, "OutputDirectory/PrependRelativeSourcePath");
|
||||
LAMEXP_MAKE_ID(renameFiles_regExpEnabled, "AdvancedOptions/RenameOutputFiles/RegExp/Enabled");
|
||||
LAMEXP_MAKE_ID(renameFiles_regExpSearch, "AdvancedOptions/RenameOutputFiles/RegExp/SearchPattern");
|
||||
@ -652,6 +653,7 @@ LAMEXP_MAKE_OPTION_S(favoriteOutputFolders, QString())
|
||||
LAMEXP_MAKE_OPTION_B(forceStereoDownmix, false)
|
||||
LAMEXP_MAKE_OPTION_B(hibernateComputer, false)
|
||||
LAMEXP_MAKE_OPTION_I(interfaceStyle, 0)
|
||||
LAMEXP_MAKE_OPTION_B(keepOriginalDataTime, false)
|
||||
LAMEXP_MAKE_OPTION_I(lameAlgoQuality, 2)
|
||||
LAMEXP_MAKE_OPTION_I(lameChannelMode, 0)
|
||||
LAMEXP_MAKE_OPTION_I(licenseAccepted, 0)
|
||||
|
@ -171,6 +171,7 @@ public:
|
||||
LAMEXP_MAKE_OPTION_B(forceStereoDownmix)
|
||||
LAMEXP_MAKE_OPTION_B(hibernateComputer)
|
||||
LAMEXP_MAKE_OPTION_I(interfaceStyle)
|
||||
LAMEXP_MAKE_OPTION_B(keepOriginalDataTime)
|
||||
LAMEXP_MAKE_OPTION_I(lameAlgoQuality)
|
||||
LAMEXP_MAKE_OPTION_I(lameChannelMode)
|
||||
LAMEXP_MAKE_OPTION_I(licenseAccepted)
|
||||
|
@ -72,6 +72,7 @@ ProcessThread::ProcessThread(const AudioFileModel &audioFile, const QString &out
|
||||
m_prependRelativeSourcePath(prependRelativeSourcePath),
|
||||
m_renamePattern("<BaseName>"),
|
||||
m_overwriteMode(OverwriteMode_KeepBoth),
|
||||
m_keepDateTime(false),
|
||||
m_initialized(-1),
|
||||
m_aborted(false),
|
||||
m_propDetect(new WaveProperties())
|
||||
@ -340,7 +341,7 @@ void ProcessThread::processFile()
|
||||
// Finalize
|
||||
//-----------------------------------------------------
|
||||
|
||||
if (bSuccess && (!m_aborted))
|
||||
if (bSuccess && (!m_aborted) && m_keepDateTime)
|
||||
{
|
||||
updateFileTime(m_audioFile.filePath(), m_outFileName);
|
||||
}
|
||||
@ -750,6 +751,11 @@ void ProcessThread::setOverwriteMode(const bool &bSkipExistingFile, const bool &
|
||||
}
|
||||
}
|
||||
|
||||
void ProcessThread::setKeepDateTime(const bool &keepDateTime)
|
||||
{
|
||||
m_keepDateTime = keepDateTime;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// EVENTS
|
||||
////////////////////////////////////////////////////////////
|
||||
|
@ -50,6 +50,7 @@ public:
|
||||
void setRenameRegExp(const QString &search, const QString &replace);
|
||||
void setRenameFileExt(const QString &fileExtension);
|
||||
void setOverwriteMode(const bool &bSkipExistingFile, const bool &bReplacesExisting = false);
|
||||
void setKeepDateTime(const bool &keepDateTime);
|
||||
void addFilter(AbstractFilter *filter);
|
||||
|
||||
public slots:
|
||||
@ -112,6 +113,7 @@ private:
|
||||
QString m_renameRegExp_Replace;
|
||||
QString m_renameFileExt;
|
||||
int m_overwriteMode;
|
||||
bool m_keepDateTime;
|
||||
WaveProperties *m_propDetect;
|
||||
QString m_outFileName;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user