Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 104 additions & 11 deletions src/lib/handler/funscripthandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,33 @@ void FunscriptHandler::jsonToFunscript(QJsonObject json)
}
}
}

// Parse "axes" format (array of {id, actions} objects)
if(json.contains(m_axesJSONObjectName) && json[m_axesJSONObjectName].isArray())
{
auto jsonAxes = json[m_axesJSONObjectName].toArray();
for(auto val : jsonAxes)
{
QJsonObject axisObj = val.toObject();
if(axisObj.contains("id") && axisObj.contains("actions"))
{
Track track = trackFromTCodeChannel(axisObj["id"].toString());
if(track != Track::None && track != Track::Stroke)
{
ChannelModel33* channel = TCodeChannelLookup::getChannel(TCodeChannelLookup::ToString(track));
if(channel && channel->Type != ChannelType::HalfOscillate)
{
Funscript funscript;
jsonToFunscript(axisObj, funscript);
setFunscriptSettings(track, funscript);
m_funscripts.insert(track, funscript);
SettingsHandler::setFunscriptLoaded(TCodeChannelLookup::ToString(track), true);
}
}
}
}
}

if(!m_funscripts.contains(Track::Stroke))
{
Funscript funscript;
Expand Down Expand Up @@ -630,9 +657,11 @@ QList<ScriptInfo> FunscriptHandler::getSFMATracks(QString libraryItemMediaPath)
return scriptInfos;

// scriptInfos.append({"Default", libraryItemMediaPathNoExt, scriptPath, TCodeChannelLookup::ToString(Track::Stroke), ScriptType::MAIN, ScriptContainerType::BASE, "" });
if(!json[m_sfmaJSONObjectName].isNull())
QString libraryItemMediaNameNoExt = XFileUtil::getNameNoExtension(libraryItemMediaPath);

// Check "channels" format (object with track name keys)
if(!json[m_sfmaJSONObjectName].isNull() && json[m_sfmaJSONObjectName].isObject())
{
QString libraryItemMediaNameNoExt = XFileUtil::getNameNoExtension(libraryItemMediaPath);
auto jsonTracks = json[m_sfmaJSONObjectName].toObject();
auto channels = TCodeChannelLookup::getChannels();
foreach(QString channelName, channels)
Expand All @@ -645,29 +674,93 @@ QList<ScriptInfo> FunscriptHandler::getSFMATracks(QString libraryItemMediaPath)
}
}
}

// Check "axes" format (array of {id, actions} objects)
if(json.contains(m_axesJSONObjectName) && json[m_axesJSONObjectName].isArray())
{
auto jsonAxes = json[m_axesJSONObjectName].toArray();
for(auto val : jsonAxes)
{
QJsonObject axisObj = val.toObject();
if(axisObj.contains("id") && axisObj.contains("actions"))
{
Track track = trackFromTCodeChannel(axisObj["id"].toString());
if(track != Track::None && track != Track::Stroke)
{
ChannelModel33* channel = TCodeChannelLookup::getChannel(TCodeChannelLookup::ToString(track));
if(channel && channel->Type != ChannelType::HalfOscillate)
scriptInfos.append({libraryItemMediaNameNoExt, libraryItemMediaNameNoExt, scriptPath, channel->trackName.isEmpty() ? axisObj["id"].toString() : channel->trackName, ScriptType::MAIN, ScriptContainerType::SFMA, "" });
}
}
}
}

return scriptInfos;
}

Track FunscriptHandler::trackFromTCodeChannel(const QString& tcodeChannel)
{
// Strip modifier suffix (+/-) to get base channel name
QString base = tcodeChannel;
if(base.endsWith('+') || base.endsWith('-'))
base.chop(1);

// Search the TCode version map for the matching Track
auto values = TCodeChannelLookup::GetSelectedVersionMap().values();
auto keys = TCodeChannelLookup::GetSelectedVersionMap().keys();
for(int i = 0; i < keys.length(); i++)
{
QString val = values[i];
// Strip modifiers from map value too for comparison
if(val.endsWith('+') || val.endsWith('-'))
val.chop(1);
if(val == base)
return keys[i];
}
return Track::None;
}

bool FunscriptHandler::isSFMA(QString libraryItemMediaPath)
{
QString scriptPath = XFileUtil::getPathNoExtension(libraryItemMediaPath) + ".funscript";
QByteArray bytes = readFile(scriptPath);
if(bytes.isEmpty())
return false;
QJsonObject json = readJson(bytes);
if(json.isEmpty() || json[m_sfmaJSONObjectName].isNull())
if(json.isEmpty())
return false;

auto jsonTracks = json[m_sfmaJSONObjectName].toObject();
auto channels = TCodeChannelLookup::getChannels();
foreach(QString channelName, channels)
// Check "channels" format
if(!json[m_sfmaJSONObjectName].isNull() && json[m_sfmaJSONObjectName].isObject())
{
ChannelModel33* channel = TCodeChannelLookup::getChannel(channelName);
if(channel->Type == ChannelType::HalfOscillate || channel->track == Track::Stroke)
continue;
if(jsonTracks.contains(channel->trackName))
return true;
auto jsonTracks = json[m_sfmaJSONObjectName].toObject();
auto channels = TCodeChannelLookup::getChannels();
foreach(QString channelName, channels)
{
ChannelModel33* channel = TCodeChannelLookup::getChannel(channelName);
if(channel->Type == ChannelType::HalfOscillate || channel->track == Track::Stroke)
continue;
if(jsonTracks.contains(channel->trackName))
return true;
}
}

// Check "axes" format
if(json.contains(m_axesJSONObjectName) && json[m_axesJSONObjectName].isArray())
{
auto jsonAxes = json[m_axesJSONObjectName].toArray();
for(auto val : jsonAxes)
{
QJsonObject axisObj = val.toObject();
if(axisObj.contains("id") && axisObj.contains("actions"))
{
Track track = trackFromTCodeChannel(axisObj["id"].toString());
if(track != Track::None && track != Track::Stroke)
return true;
}
}
}

return false;
}

Expand Down
2 changes: 2 additions & 0 deletions src/lib/handler/funscripthandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,14 @@ public slots:
static QList<ScriptInfo> getSFMATracks(QString libraryItemMediaPath);
static bool isMFS(QString libraryItemMediaPath);
static QList<ScriptInfo> getMFSTracks(QString libraryItemMediaPath);
static Track trackFromTCodeChannel(const QString& tcodeChannel);


private:
static inline QMutex mutex;
static inline QHash<Track, Funscript> m_funscripts;
static inline const QString m_sfmaJSONObjectName = "channels";
static inline const QString m_axesJSONObjectName = "axes";
bool m_loaded = false;
bool _firstActionExecuted;
static inline int m_offset;
Expand Down
3 changes: 2 additions & 1 deletion src/lib/handler/medialibraryhandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -677,7 +677,7 @@ void MediaLibraryHandler::processMetadata(LibraryListItem27 &item, bool &metadat
if(item.type != LibraryListItemType::PlaylistInternal)
{
auto isMFS = item.metadata.isMFS;
auto isSFMA = item.metadata.isMFS;
auto isSFMA = item.metadata.isSFMA;
if(discoverMultiAxis(item))
{
if((isMFS != item.metadata.isMFS) || (isSFMA != item.metadata.isSFMA))
Expand Down Expand Up @@ -1690,6 +1690,7 @@ bool MediaLibraryHandler::discoverMultiAxis(LibraryListItem27 &item) {
LogHandler::Debug("Discover MFS: "+item.ID);
QStringList funscripts = TCodeChannelLookup::getValidMFSExtensions();
item.metadata.isMFS = false;
item.metadata.isSFMA = false;
item.metadata.toolTip.clear();
item.metadata.MFSScripts.clear();
item.metadata.MFSTracks.clear();
Expand Down
2 changes: 2 additions & 0 deletions src/lib/handler/settingshandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
#include "../tool/migration.h"


MediaLibrarySettings* SettingsHandler::mediaLibrarySettings = nullptr;

const QString SettingsHandler::XTEVersion = "0.6b";
const float SettingsHandler::XTEVersionNum = 0.6f;
const QString SettingsHandler::XTEVersionTimeStamp = QString(XTEVersion +" %1T%2").arg(__DATE__).arg(__TIME__);
Expand Down
2 changes: 1 addition & 1 deletion src/lib/handler/settingshandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ public slots:
static const float XTEVersionNum;
static bool getSettingsChanged();

static inline MediaLibrarySettings* mediaLibrarySettings = 0;
static MediaLibrarySettings* mediaLibrarySettings;

static bool getHideWelcomeScreen();
static void setHideWelcomeScreen(bool value);
Expand Down