mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-11-03 19:07:00 -05:00 
			
		
		
		
	Using cron-parse lib to parse the cron expression. Cron-parse can handle with more scenarios.
This commit is contained in:
		
							parent
							
								
									e56164aa5a
								
							
						
					
					
						commit
						7c7a6df6e4
					
				@ -16,6 +16,7 @@
 | 
			
		||||
    "@nuxtjs/axios": "^5.13.6",
 | 
			
		||||
    "@nuxtjs/proxy": "^2.1.0",
 | 
			
		||||
    "core-js": "^3.16.0",
 | 
			
		||||
    "cron-parser": "^4.7.1",
 | 
			
		||||
    "date-fns": "^2.25.0",
 | 
			
		||||
    "epubjs": "^0.3.88",
 | 
			
		||||
    "hls.js": "^1.0.7",
 | 
			
		||||
@ -36,4 +37,4 @@
 | 
			
		||||
    "postcss": "^8.3.6",
 | 
			
		||||
    "tailwindcss": "^3.1.4"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,5 @@
 | 
			
		||||
import Vue from 'vue'
 | 
			
		||||
import cronParser from 'cron-parser'
 | 
			
		||||
 | 
			
		||||
Vue.prototype.$bytesPretty = (bytes, decimals = 2) => {
 | 
			
		||||
  if (isNaN(bytes) || bytes == 0) {
 | 
			
		||||
@ -137,44 +138,8 @@ Vue.prototype.$parseCronExpression = (expression) => {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Vue.prototype.$getNextScheduledDate = (expression) => {
 | 
			
		||||
  const cronFields = expression.split(' ');
 | 
			
		||||
  const currentDate = new Date();
 | 
			
		||||
  const nextDate = new Date();
 | 
			
		||||
 | 
			
		||||
  // Calculate next minute
 | 
			
		||||
  const minute = cronFields[0];
 | 
			
		||||
  const currentMinute = currentDate.getMinutes();
 | 
			
		||||
  const nextMinute = getNextValue(minute, currentMinute, 59);
 | 
			
		||||
  nextDate.setMinutes(nextMinute);
 | 
			
		||||
 | 
			
		||||
  // Calculate next hour
 | 
			
		||||
  const hour = cronFields[1];
 | 
			
		||||
  const currentHour = currentDate.getHours();
 | 
			
		||||
  const nextHour = getNextValue(hour, currentHour, 23);
 | 
			
		||||
  nextDate.setHours(nextHour);
 | 
			
		||||
 | 
			
		||||
  // Calculate next day of month
 | 
			
		||||
  const dayOfMonth = cronFields[2];
 | 
			
		||||
  const currentDayOfMonth = currentDate.getDate();
 | 
			
		||||
  const lastDayOfMonth = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 0).getDate();
 | 
			
		||||
  const nextDayOfMonth = getNextValue(dayOfMonth, currentDayOfMonth, lastDayOfMonth);
 | 
			
		||||
  nextDate.setDate(nextDayOfMonth);
 | 
			
		||||
 | 
			
		||||
  // Calculate next month
 | 
			
		||||
  const month = cronFields[3];
 | 
			
		||||
  const currentMonth = currentDate.getMonth() + 1;
 | 
			
		||||
  const nextMonth = getNextValue(month, currentMonth, 12);
 | 
			
		||||
  nextDate.setMonth(nextMonth - 1);
 | 
			
		||||
 | 
			
		||||
  // Calculate next day of week
 | 
			
		||||
  const dayOfWeek = cronFields[4];
 | 
			
		||||
  const currentDayOfWeek = currentDate.getDay();
 | 
			
		||||
  const nextDayOfWeek = getNextValue(dayOfWeek, currentDayOfWeek, 6);
 | 
			
		||||
  const daysUntilNextDayOfWeek = getNextDaysUntilDayOfWeek(currentDate, nextDayOfWeek);
 | 
			
		||||
  nextDate.setDate(currentDate.getDate() + daysUntilNextDayOfWeek);
 | 
			
		||||
 | 
			
		||||
  // Return the next scheduled date
 | 
			
		||||
  return nextDate;
 | 
			
		||||
  const interval = cronParser.parseExpression(expression);
 | 
			
		||||
  return interval.next().toDate()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function supplant(str, subs) {
 | 
			
		||||
@ -186,25 +151,3 @@ export function supplant(str, subs) {
 | 
			
		||||
    }
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getNextValue(cronField, currentValue, maxValue) {
 | 
			
		||||
  if (cronField === '*') {
 | 
			
		||||
    return currentValue + 1 <= maxValue ? currentValue + 1 : 0;
 | 
			
		||||
  }
 | 
			
		||||
  const values = cronField.split(',');
 | 
			
		||||
  const len = values.length;
 | 
			
		||||
  let nextValue = parseInt(values[0]);
 | 
			
		||||
  for (let i = 0; i < len; i++) {
 | 
			
		||||
    const value = parseInt(values[i]);
 | 
			
		||||
    if (value > currentValue) {
 | 
			
		||||
      nextValue = value;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return nextValue <= maxValue ? nextValue : parseInt(values[0]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getNextDaysUntilDayOfWeek(currentDate, nextDayOfWeek) {
 | 
			
		||||
  const daysUntilNextDayOfWeek = (nextDayOfWeek + 7 - currentDate.getDay()) % 7;
 | 
			
		||||
  return daysUntilNextDayOfWeek === 0 ? 7 : daysUntilNextDayOfWeek;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user