diff options
author | arnova <arnova77@gmail.com> | 2012-03-26 22:21:06 -0700 |
---|---|---|
committer | arnova <arnova77@gmail.com> | 2012-03-26 22:21:06 -0700 |
commit | 0a7ce638a8b49b7ccea4aecd399dda8306dd7d65 (patch) | |
tree | 8c4958cd8fa900b4a8d1c0dde7d9b7afe3181308 | |
parent | 84d1d8d24451106898974c180a0d7688d2a7f9ab (diff) | |
parent | a2e188cd0731dd54b422dacd75d37649c03cb397 (diff) |
Merge pull request #736 from dez-dk/master
Add dates to files and directories listed from an HTTP source
-rw-r--r-- | xbmc/XBDateTime.cpp | 12 | ||||
-rw-r--r-- | xbmc/XBDateTime.h | 1 | ||||
-rw-r--r-- | xbmc/filesystem/HTTPDirectory.cpp | 55 |
3 files changed, 60 insertions, 8 deletions
diff --git a/xbmc/XBDateTime.cpp b/xbmc/XBDateTime.cpp index 5e97385d5d..e01e17d0dc 100644 --- a/xbmc/XBDateTime.cpp +++ b/xbmc/XBDateTime.cpp @@ -1286,3 +1286,15 @@ CStdString CDateTime::GetAsRFC1123DateTime() const result.Format("%s, %02i %s %04i %02i:%02i:%02i GMT", DAY_NAMES[time.GetDayOfWeek()], time.GetDay(), MONTH_NAMES[time.GetMonth()-1], time.GetYear(), time.GetHour(), time.GetMinute(), time.GetSecond()); return result; } + +int CDateTime::MonthStringToMonthNum(const CStdString& month) +{ + const char* months[] = {"january","february","march","april","may","june","july","august","september","october","november","december"}; + const char* abr_months[] = {"jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"}; + + int i = 0; + for (; i < 12 && month.CompareNoCase(months[i]) != 0 && month.CompareNoCase(abr_months[i]) != 0; i++); + i++; + + return i; +} diff --git a/xbmc/XBDateTime.h b/xbmc/XBDateTime.h index d4a36fea13..ee48ddd289 100644 --- a/xbmc/XBDateTime.h +++ b/xbmc/XBDateTime.h @@ -99,6 +99,7 @@ public: static CDateTime GetCurrentDateTime(); static CDateTime GetUTCDateTime(); + static int MonthStringToMonthNum(const CStdString& month); const CDateTime& operator =(const SYSTEMTIME& right); const CDateTime& operator =(const FILETIME& right); diff --git a/xbmc/filesystem/HTTPDirectory.cpp b/xbmc/filesystem/HTTPDirectory.cpp index 2a0b97b0bb..d60636aa2c 100644 --- a/xbmc/filesystem/HTTPDirectory.cpp +++ b/xbmc/filesystem/HTTPDirectory.cpp @@ -54,6 +54,18 @@ bool CHTTPDirectory::GetDirectory(const CStdString& strPath, CFileItemList &item CRegExp reItem(true); // HTML is case-insensitive reItem.RegComp("<a href=\"(.*)\">(.*)</a>"); + CRegExp reDateTime(true); + reDateTime.RegComp("<td align=\"right\">([0-9]{2})-([A-Z]{3})-([0-9]{4}) ([0-9]{2}):([0-9]{2}) +</td>"); + + CRegExp reDateTimeNginx(true); + reDateTimeNginx.RegComp("</a> +([0-9]{2})-([A-Z]{3})-([0-9]{4}) ([0-9]{2}):([0-9]{2}) "); + + CRegExp reSize(true); + reSize.RegComp(">*([0-9.]+)(B|K|M|G| )</td>"); + + CRegExp reSizeNginx; + reSizeNginx.RegComp("([0-9]+)$"); + /* read response from server into string buffer */ char buffer[MAX_PATH + 1024]; while(http.ReadString(buffer, sizeof(buffer)-1)) @@ -98,18 +110,32 @@ bool CHTTPDirectory::GetDirectory(const CStdString& strPath, CFileItemList &item if(URIUtils::HasSlashAtEnd(pItem->GetPath())) pItem->m_bIsFolder = true; - if (!pItem->m_bIsFolder && g_advancedSettings.m_bHTTPDirectoryStatFilesize) + CStdString day, month, year, hour, minute; + + if (reDateTime.RegFind(strBuffer.c_str()) >= 0) { - CFileCurl file; - file.Open(url); - pItem->m_dwSize= file.GetLength(); - file.Close(); + day = reDateTime.GetReplaceString("\\1"); + month = reDateTime.GetReplaceString("\\2"); + year = reDateTime.GetReplaceString("\\3"); + hour = reDateTime.GetReplaceString("\\4"); + minute = reDateTime.GetReplaceString("\\5"); + } + else if (reDateTimeNginx.RegFind(strBuffer.c_str()) >= 0) + { + day = reDateTimeNginx.GetReplaceString("\\1"); + month = reDateTimeNginx.GetReplaceString("\\2"); + year = reDateTimeNginx.GetReplaceString("\\3"); + hour = reDateTimeNginx.GetReplaceString("\\4"); + minute = reDateTimeNginx.GetReplaceString("\\5"); + } + + if (day.length() > 0 && month.length() > 0 && year.length() > 0) + { + pItem->m_dateTime = CDateTime(atoi(year.c_str()), CDateTime::MonthStringToMonthNum(month), atoi(day.c_str()), atoi(hour.c_str()), atoi(minute.c_str()), 0); } - if (!pItem->m_bIsFolder && pItem->m_dwSize == 0) + if (!pItem->m_bIsFolder) { - CRegExp reSize(true); - reSize.RegComp(">*([0-9.]+)(B|K|M|G| )</td>"); if (reSize.RegFind(strBuffer.c_str()) >= 0) { double Size = atof(reSize.GetReplaceString("\\1")); @@ -124,6 +150,19 @@ bool CHTTPDirectory::GetDirectory(const CStdString& strPath, CFileItemList &item pItem->m_dwSize = (int64_t)Size; } + else if (reSizeNginx.RegFind(strBuffer.c_str()) >= 0) + { + double Size = atof(reSizeNginx.GetReplaceString("\\1")); + pItem->m_dwSize = (int64_t)Size; + } + } + + if (!pItem->m_bIsFolder && pItem->m_dwSize == 0 && g_advancedSettings.m_bHTTPDirectoryStatFilesize) + { + CFileCurl file; + file.Open(url); + pItem->m_dwSize= file.GetLength(); + file.Close(); } items.Add(pItem); |